TrinetraLabs/Placebo_AI
0
1// Copyright Joyent, Inc. and other Node contributors.2//3// Permission is hereby granted, free of charge, to any person obtaining a4// copy of this software and associated documentation files (the5// "Software"), to deal in the Software without restriction, including6// without limitation the rights to use, copy, modify, merge, publish,7// distribute, sublicense, and/or sell copies of the Software, and to permit8// persons to whom the Software is furnished to do so, subject to the9// following conditions:10//11// The above copyright notice and this permission notice shall be included12// in all copies or substantial portions of the Software.13//14// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS15// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF16// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN17// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,18// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR19// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE20// USE OR OTHER DEALINGS IN THE SOFTWARE.21 22// a duplex stream is just a stream that is both readable and writable.23// Since JS doesn't have multiple prototypal inheritance, this class24// prototypally inherits from Readable, and then parasitically from25// Writable.26 27'use strict';28 29/*<replacement>*/30 31var pna = require('process-nextick-args');32/*</replacement>*/33 34/*<replacement>*/35var objectKeys = Object.keys || function (obj) {36 var keys = [];37 for (var key in obj) {38 keys.push(key);39 }return keys;40};41/*</replacement>*/42 43module.exports = Duplex;44 45/*<replacement>*/46var util = Object.create(require('core-util-is'));47util.inherits = require('inherits');48/*</replacement>*/49 50var Readable = require('./_stream_readable');51var Writable = require('./_stream_writable');52 53util.inherits(Duplex, Readable);54 55{56 // avoid scope creep, the keys array can then be collected57 var keys = objectKeys(Writable.prototype);58 for (var v = 0; v < keys.length; v++) {59 var method = keys[v];60 if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];61 }62}63 64function Duplex(options) {65 if (!(this instanceof Duplex)) return new Duplex(options);66 67 Readable.call(this, options);68 Writable.call(this, options);69 70 if (options && options.readable === false) this.readable = false;71 72 if (options && options.writable === false) this.writable = false;73 74 this.allowHalfOpen = true;75 if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;76 77 this.once('end', onend);78}79 80Object.defineProperty(Duplex.prototype, 'writableHighWaterMark', {81 // making it explicit this property is not enumerable82 // because otherwise some prototype manipulation in83 // userland will fail84 enumerable: false,85 get: function () {86 return this._writableState.highWaterMark;87 }88});89 90// the no-half-open enforcer91function onend() {92 // if we allow half-open state, or if the writable side ended,93 // then we're ok.94 if (this.allowHalfOpen || this._writableState.ended) return;95 96 // no more data can be written.97 // But allow more writes to happen in this tick.98 pna.nextTick(onEndNT, this);99}100 101function onEndNT(self) {102 self.end();103}104 105Object.defineProperty(Duplex.prototype, 'destroyed', {106 get: function () {107 if (this._readableState === undefined || this._writableState === undefined) {108 return false;109 }110 return this._readableState.destroyed && this._writableState.destroyed;111 },112 set: function (value) {113 // we ignore the value if the stream114 // has not been initialized yet115 if (this._readableState === undefined || this._writableState === undefined) {116 return;117 }118 119 // backward compatibility, the user is explicitly120 // managing destroyed121 this._readableState.destroyed = value;122 this._writableState.destroyed = value;123 }124});125 126Duplex.prototype._destroy = function (err, cb) {127 this.push(null);128 this.end();129 130 pna.nextTick(cb, err);131};