Index: tools/vulcanize/node_modules/vulcanize/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_writable.js |
diff --git a/tools/vulcanize/node_modules/vulcanize/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_writable.js b/tools/vulcanize/node_modules/vulcanize/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_writable.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..56ca47ddfe6d74aaf92b31baa96223ca72142af8 |
--- /dev/null |
+++ b/tools/vulcanize/node_modules/vulcanize/node_modules/cheerio/node_modules/htmlparser2/node_modules/readable-stream/lib/_stream_writable.js |
@@ -0,0 +1,367 @@ |
+// Copyright Joyent, Inc. and other Node contributors. |
+// |
+// Permission is hereby granted, free of charge, to any person obtaining a |
+// copy of this software and associated documentation files (the |
+// "Software"), to deal in the Software without restriction, including |
+// without limitation the rights to use, copy, modify, merge, publish, |
+// distribute, sublicense, and/or sell copies of the Software, and to permit |
+// persons to whom the Software is furnished to do so, subject to the |
+// following conditions: |
+// |
+// The above copyright notice and this permission notice shall be included |
+// in all copies or substantial portions of the Software. |
+// |
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN |
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, |
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR |
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE |
+// USE OR OTHER DEALINGS IN THE SOFTWARE. |
+ |
+// A bit simpler than readable streams. |
+// Implement an async ._write(chunk, cb), and it'll handle all |
+// the drain event emission and buffering. |
+ |
+module.exports = Writable; |
+Writable.WritableState = WritableState; |
+ |
+var util = require('util'); |
+var assert = require('assert'); |
+var Stream = require('stream'); |
+ |
+util.inherits(Writable, Stream); |
+ |
+function WriteReq(chunk, encoding, cb) { |
+ this.chunk = chunk; |
+ this.encoding = encoding; |
+ this.callback = cb; |
+} |
+ |
+function WritableState(options, stream) { |
+ options = options || {}; |
+ |
+ // the point at which write() starts returning false |
+ // Note: 0 is a valid value, means that we always return false if |
+ // the entire buffer is not flushed immediately on write() |
+ var hwm = options.highWaterMark; |
+ this.highWaterMark = (hwm || hwm === 0) ? hwm : 16 * 1024; |
+ |
+ // object stream flag to indicate whether or not this stream |
+ // contains buffers or objects. |
+ this.objectMode = !!options.objectMode; |
+ |
+ // cast to ints. |
+ this.highWaterMark = ~~this.highWaterMark; |
+ |
+ this.needDrain = false; |
+ // at the start of calling end() |
+ this.ending = false; |
+ // when end() has been called, and returned |
+ this.ended = false; |
+ // when 'finish' is emitted |
+ this.finished = false; |
+ |
+ // should we decode strings into buffers before passing to _write? |
+ // this is here so that some node-core streams can optimize string |
+ // handling at a lower level. |
+ var noDecode = options.decodeStrings === false; |
+ this.decodeStrings = !noDecode; |
+ |
+ // Crypto is kind of old and crusty. Historically, its default string |
+ // encoding is 'binary' so we have to make this configurable. |
+ // Everything else in the universe uses 'utf8', though. |
+ this.defaultEncoding = options.defaultEncoding || 'utf8'; |
+ |
+ // not an actual buffer we keep track of, but a measurement |
+ // of how much we're waiting to get pushed to some underlying |
+ // socket or file. |
+ this.length = 0; |
+ |
+ // a flag to see when we're in the middle of a write. |
+ this.writing = false; |
+ |
+ // a flag to be able to tell if the onwrite cb is called immediately, |
+ // or on a later tick. We set this to true at first, becuase any |
+ // actions that shouldn't happen until "later" should generally also |
+ // not happen before the first write call. |
+ this.sync = true; |
+ |
+ // a flag to know if we're processing previously buffered items, which |
+ // may call the _write() callback in the same tick, so that we don't |
+ // end up in an overlapped onwrite situation. |
+ this.bufferProcessing = false; |
+ |
+ // the callback that's passed to _write(chunk,cb) |
+ this.onwrite = function(er) { |
+ onwrite(stream, er); |
+ }; |
+ |
+ // the callback that the user supplies to write(chunk,encoding,cb) |
+ this.writecb = null; |
+ |
+ // the amount that is being written when _write is called. |
+ this.writelen = 0; |
+ |
+ this.buffer = []; |
+} |
+ |
+function Writable(options) { |
+ // Writable ctor is applied to Duplexes, though they're not |
+ // instanceof Writable, they're instanceof Readable. |
+ if (!(this instanceof Writable) && !(this instanceof require('./_stream_duplex'))) |
+ return new Writable(options); |
+ |
+ this._writableState = new WritableState(options, this); |
+ |
+ // legacy. |
+ this.writable = true; |
+ |
+ Stream.call(this); |
+} |
+ |
+// Otherwise people can pipe Writable streams, which is just wrong. |
+Writable.prototype.pipe = function() { |
+ this.emit('error', new Error('Cannot pipe. Not readable.')); |
+}; |
+ |
+ |
+function writeAfterEnd(stream, state, cb) { |
+ var er = new Error('write after end'); |
+ // TODO: defer error events consistently everywhere, not just the cb |
+ stream.emit('error', er); |
+ process.nextTick(function() { |
+ cb(er); |
+ }); |
+} |
+ |
+// If we get something that is not a buffer, string, null, or undefined, |
+// and we're not in objectMode, then that's an error. |
+// Otherwise stream chunks are all considered to be of length=1, and the |
+// watermarks determine how many objects to keep in the buffer, rather than |
+// how many bytes or characters. |
+function validChunk(stream, state, chunk, cb) { |
+ var valid = true; |
+ if (!Buffer.isBuffer(chunk) && |
+ 'string' !== typeof chunk && |
+ chunk !== null && |
+ chunk !== undefined && |
+ !state.objectMode) { |
+ var er = new TypeError('Invalid non-string/buffer chunk'); |
+ stream.emit('error', er); |
+ process.nextTick(function() { |
+ cb(er); |
+ }); |
+ valid = false; |
+ } |
+ return valid; |
+} |
+ |
+Writable.prototype.write = function(chunk, encoding, cb) { |
+ var state = this._writableState; |
+ var ret = false; |
+ |
+ if (typeof encoding === 'function') { |
+ cb = encoding; |
+ encoding = null; |
+ } |
+ |
+ if (Buffer.isBuffer(chunk)) |
+ encoding = 'buffer'; |
+ else if (!encoding) |
+ encoding = state.defaultEncoding; |
+ |
+ if (typeof cb !== 'function') |
+ cb = function() {}; |
+ |
+ if (state.ended) |
+ writeAfterEnd(this, state, cb); |
+ else if (validChunk(this, state, chunk, cb)) |
+ ret = writeOrBuffer(this, state, chunk, encoding, cb); |
+ |
+ return ret; |
+}; |
+ |
+function decodeChunk(state, chunk, encoding) { |
+ if (!state.objectMode && |
+ state.decodeStrings !== false && |
+ typeof chunk === 'string') { |
+ chunk = new Buffer(chunk, encoding); |
+ } |
+ return chunk; |
+} |
+ |
+// if we're already writing something, then just put this |
+// in the queue, and wait our turn. Otherwise, call _write |
+// If we return false, then we need a drain event, so set that flag. |
+function writeOrBuffer(stream, state, chunk, encoding, cb) { |
+ chunk = decodeChunk(state, chunk, encoding); |
+ var len = state.objectMode ? 1 : chunk.length; |
+ |
+ state.length += len; |
+ |
+ var ret = state.length < state.highWaterMark; |
+ state.needDrain = !ret; |
+ |
+ if (state.writing) |
+ state.buffer.push(new WriteReq(chunk, encoding, cb)); |
+ else |
+ doWrite(stream, state, len, chunk, encoding, cb); |
+ |
+ return ret; |
+} |
+ |
+function doWrite(stream, state, len, chunk, encoding, cb) { |
+ state.writelen = len; |
+ state.writecb = cb; |
+ state.writing = true; |
+ state.sync = true; |
+ stream._write(chunk, encoding, state.onwrite); |
+ state.sync = false; |
+} |
+ |
+function onwriteError(stream, state, sync, er, cb) { |
+ if (sync) |
+ process.nextTick(function() { |
+ cb(er); |
+ }); |
+ else |
+ cb(er); |
+ |
+ stream.emit('error', er); |
+} |
+ |
+function onwriteStateUpdate(state) { |
+ state.writing = false; |
+ state.writecb = null; |
+ state.length -= state.writelen; |
+ state.writelen = 0; |
+} |
+ |
+function onwrite(stream, er) { |
+ var state = stream._writableState; |
+ var sync = state.sync; |
+ var cb = state.writecb; |
+ |
+ onwriteStateUpdate(state); |
+ |
+ if (er) |
+ onwriteError(stream, state, sync, er, cb); |
+ else { |
+ // Check if we're actually ready to finish, but don't emit yet |
+ var finished = needFinish(stream, state); |
+ |
+ if (!finished && !state.bufferProcessing && state.buffer.length) |
+ clearBuffer(stream, state); |
+ |
+ if (sync) { |
+ process.nextTick(function() { |
+ afterWrite(stream, state, finished, cb); |
+ }); |
+ } else { |
+ afterWrite(stream, state, finished, cb); |
+ } |
+ } |
+} |
+ |
+function afterWrite(stream, state, finished, cb) { |
+ if (!finished) |
+ onwriteDrain(stream, state); |
+ cb(); |
+ if (finished) |
+ finishMaybe(stream, state); |
+} |
+ |
+// Must force callback to be called on nextTick, so that we don't |
+// emit 'drain' before the write() consumer gets the 'false' return |
+// value, and has a chance to attach a 'drain' listener. |
+function onwriteDrain(stream, state) { |
+ if (state.length === 0 && state.needDrain) { |
+ state.needDrain = false; |
+ stream.emit('drain'); |
+ } |
+} |
+ |
+ |
+// if there's something in the buffer waiting, then process it |
+function clearBuffer(stream, state) { |
+ state.bufferProcessing = true; |
+ |
+ for (var c = 0; c < state.buffer.length; c++) { |
+ var entry = state.buffer[c]; |
+ var chunk = entry.chunk; |
+ var encoding = entry.encoding; |
+ var cb = entry.callback; |
+ var len = state.objectMode ? 1 : chunk.length; |
+ |
+ doWrite(stream, state, len, chunk, encoding, cb); |
+ |
+ // if we didn't call the onwrite immediately, then |
+ // it means that we need to wait until it does. |
+ // also, that means that the chunk and cb are currently |
+ // being processed, so move the buffer counter past them. |
+ if (state.writing) { |
+ c++; |
+ break; |
+ } |
+ } |
+ |
+ state.bufferProcessing = false; |
+ if (c < state.buffer.length) |
+ state.buffer = state.buffer.slice(c); |
+ else |
+ state.buffer.length = 0; |
+} |
+ |
+Writable.prototype._write = function(chunk, encoding, cb) { |
+ cb(new Error('not implemented')); |
+}; |
+ |
+Writable.prototype.end = function(chunk, encoding, cb) { |
+ var state = this._writableState; |
+ |
+ if (typeof chunk === 'function') { |
+ cb = chunk; |
+ chunk = null; |
+ encoding = null; |
+ } else if (typeof encoding === 'function') { |
+ cb = encoding; |
+ encoding = null; |
+ } |
+ |
+ if (typeof chunk !== 'undefined' && chunk !== null) |
+ this.write(chunk, encoding); |
+ |
+ // ignore unnecessary end() calls. |
+ if (!state.ending && !state.finished) |
+ endWritable(this, state, cb); |
+}; |
+ |
+ |
+function needFinish(stream, state) { |
+ return (state.ending && |
+ state.length === 0 && |
+ !state.finished && |
+ !state.writing); |
+} |
+ |
+function finishMaybe(stream, state) { |
+ var need = needFinish(stream, state); |
+ if (need) { |
+ state.finished = true; |
+ stream.emit('finish'); |
+ } |
+ return need; |
+} |
+ |
+function endWritable(stream, state, cb) { |
+ state.ending = true; |
+ finishMaybe(stream, state); |
+ if (cb) { |
+ if (state.finished) |
+ process.nextTick(cb); |
+ else |
+ stream.once('finish', cb); |
+ } |
+ state.ended = true; |
+} |