tools/node-hermes/nodelib/internal/fs/read_file_context.js (108 lines of code) (raw):

// @nolint 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var _primordials = primordials, ArrayPrototypePush = _primordials.ArrayPrototypePush, MathMin = _primordials.MathMin, ReflectApply = _primordials.ReflectApply; var _require = require('internal/fs/utils'), _require$constants = _require.constants, kReadFileBufferLength = _require$constants.kReadFileBufferLength, kReadFileUnknownBufferLength = _require$constants.kReadFileUnknownBufferLength; var _require2 = require('buffer'), Buffer = _require2.Buffer; var _internalBinding = internalBinding('fs'), FSReqCallback = _internalBinding.FSReqCallback, _close = _internalBinding.close, _read = _internalBinding.read; var _require3 = require('internal/errors'), AbortError = _require3.AbortError, aggregateTwoErrors = _require3.aggregateTwoErrors; function readFileAfterRead(err, bytesRead) { var context = this.context; if (err) return context.close(err); context.pos += bytesRead; if (context.pos === context.size || bytesRead === 0) { context.close(); } else { if (context.size === 0) { // Unknown size, just read until we don't get bytes. var buffer = bytesRead === kReadFileUnknownBufferLength ? context.buffer : context.buffer.slice(0, bytesRead); ArrayPrototypePush(context.buffers, buffer); } context.read(); } } function readFileAfterClose(err) { var context = this.context; var callback = context.callback; var buffer = null; if (context.err || err) return callback(aggregateTwoErrors(err, context.err)); try { if (context.size === 0) buffer = Buffer.concat(context.buffers, context.pos);else if (context.pos < context.size) buffer = context.buffer.slice(0, context.pos);else buffer = context.buffer; if (context.encoding) buffer = buffer.toString(context.encoding); } catch (err) { return callback(err); } callback(null, buffer); } var ReadFileContext = /*#__PURE__*/function () { function ReadFileContext(callback, encoding) { _classCallCheck(this, ReadFileContext); this.fd = undefined; this.isUserFd = undefined; this.size = 0; this.callback = callback; this.buffers = null; this.buffer = null; this.pos = 0; this.encoding = encoding; this.err = null; this.signal = undefined; } _createClass(ReadFileContext, [{ key: "read", value: function read() { var _this$signal; var buffer; var offset; var length; if ((_this$signal = this.signal) !== null && _this$signal !== void 0 && _this$signal.aborted) { return this.close(new AbortError()); } if (this.size === 0) { buffer = Buffer.allocUnsafeSlow(kReadFileUnknownBufferLength); offset = 0; length = kReadFileUnknownBufferLength; this.buffer = buffer; } else { buffer = this.buffer; offset = this.pos; length = MathMin(kReadFileBufferLength, this.size - this.pos); } var req = new FSReqCallback(); req.oncomplete = readFileAfterRead; req.context = this; _read(this.fd, buffer, offset, length, -1, req); } }, { key: "close", value: function close(err) { if (this.isUserFd) { process.nextTick(function tick(context) { ReflectApply(readFileAfterClose, { context: context }, [null]); }, this); return; } var req = new FSReqCallback(); req.oncomplete = readFileAfterClose; req.context = this; this.err = err; _close(this.fd, req); } }]); return ReadFileContext; }(); module.exports = ReadFileContext;