'use strict'; const { Buffer } = require('buffer'); const { Writable } = require('stream'); const errors = require('internal/errors'); const fs = require('fs'); const util = require('util'); const { O_APPEND, O_CREAT, O_EXCL, O_RDONLY, O_RDWR, O_SYNC, O_TRUNC, O_WRONLY } = process.binding('constants').fs; function assertEncoding(encoding) { if (encoding && !Buffer.isEncoding(encoding)) { throw new errors.TypeError('ERR_INVALID_OPT_VALUE_ENCODING', encoding); } } function stringToFlags(flags) { if (typeof flags === 'number') { return flags; } switch (flags) { case 'r' : return O_RDONLY; case 'rs' : // Fall through. case 'sr' : return O_RDONLY | O_SYNC; case 'r+' : return O_RDWR; case 'rs+' : // Fall through. case 'sr+' : return O_RDWR | O_SYNC; case 'w' : return O_TRUNC | O_CREAT | O_WRONLY; case 'wx' : // Fall through. case 'xw' : return O_TRUNC | O_CREAT | O_WRONLY | O_EXCL; case 'w+' : return O_TRUNC | O_CREAT | O_RDWR; case 'wx+': // Fall through. case 'xw+': return O_TRUNC | O_CREAT | O_RDWR | O_EXCL; case 'a' : return O_APPEND | O_CREAT | O_WRONLY; case 'ax' : // Fall through. case 'xa' : return O_APPEND | O_CREAT | O_WRONLY | O_EXCL; case 'a+' : return O_APPEND | O_CREAT | O_RDWR; case 'ax+': // Fall through. case 'xa+': return O_APPEND | O_CREAT | O_RDWR | O_EXCL; } throw new errors.TypeError('ERR_INVALID_OPT_VALUE', 'flags', flags); } // Temporary hack for process.stdout and process.stderr when piped to files. function SyncWriteStream(fd, options) { Writable.call(this); options = options || {}; this.fd = fd; this.readable = false; this.autoClose = options.autoClose === undefined ? true : options.autoClose; this.on('end', () => this._destroy()); } util.inherits(SyncWriteStream, Writable); SyncWriteStream.prototype._write = function(chunk, encoding, cb) { fs.writeSync(this.fd, chunk, 0, chunk.length); cb(); return true; }; SyncWriteStream.prototype._destroy = function() { if (this.fd === null) // already destroy()ed return; if (this.autoClose) fs.closeSync(this.fd); this.fd = null; return true; }; SyncWriteStream.prototype.destroySoon = SyncWriteStream.prototype.destroy = function() { this._destroy(); this.emit('close'); return true; }; module.exports = { assertEncoding, stringToFlags, SyncWriteStream, realpathCacheKey: Symbol('realpathCacheKey') };