tools/node-hermes/nodelib/internal/blob.js (271 lines of code) (raw):
// @nolint
'use strict';
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
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; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
var _primordials = primordials,
ArrayFrom = _primordials.ArrayFrom,
MathMax = _primordials.MathMax,
MathMin = _primordials.MathMin,
ObjectDefineProperty = _primordials.ObjectDefineProperty,
ObjectSetPrototypeOf = _primordials.ObjectSetPrototypeOf,
PromiseResolve = _primordials.PromiseResolve,
RegExpPrototypeTest = _primordials.RegExpPrototypeTest,
StringPrototypeToLowerCase = _primordials.StringPrototypeToLowerCase,
_Symbol = _primordials.Symbol,
SymbolIterator = _primordials.SymbolIterator,
SymbolToStringTag = _primordials.SymbolToStringTag,
Uint8Array = _primordials.Uint8Array;
var _internalBinding = internalBinding('buffer'),
createBlob = _internalBinding.createBlob,
FixedSizeBlobCopyJob = _internalBinding.FixedSizeBlobCopyJob;
// var _require = require('internal/encoding'),
// TextDecoder = _require.TextDecoder;
// var _require2 = require('internal/worker/js_transferable'),
// JSTransferable = _require2.JSTransferable,
// kClone = _require2.kClone,
// kDeserialize = _require2.kDeserialize;
var _require3 = require('internal/util/types'),
isAnyArrayBuffer = _require3.isAnyArrayBuffer,
isArrayBufferView = _require3.isArrayBufferView;
var _require4 = require('internal/util'),
createDeferredPromise = _require4.createDeferredPromise,
kInspect = _require4.customInspectSymbol,
emitExperimentalWarning = _require4.emitExperimentalWarning;
var _require5 = require('internal/util/inspect'),
inspect = _require5.inspect;
var _require6 = require('internal/errors'),
AbortError = _require6.AbortError,
_require6$codes = _require6.codes,
ERR_INVALID_ARG_TYPE = _require6$codes.ERR_INVALID_ARG_TYPE,
ERR_BUFFER_TOO_LARGE = _require6$codes.ERR_BUFFER_TOO_LARGE;
var _require7 = require('internal/validators'),
validateObject = _require7.validateObject,
isUint32 = _require7.isUint32;
var kHandle = _Symbol('kHandle');
var kType = _Symbol('kType');
var kLength = _Symbol('kLength');
var disallowedTypeCharacters = /(?:(?![ -~])[\s\S])/;
var Buffer;
function lazyBuffer() {
if (Buffer === undefined) Buffer = require('buffer').Buffer;
return Buffer;
}
function isBlob(object) {
return (object === null || object === void 0 ? void 0 : object[kHandle]) !== undefined;
}
function getSource(source, encoding) {
if (isBlob(source)) return [source.size, source[kHandle]];
if (isAnyArrayBuffer(source)) {
source = new Uint8Array(source);
} else if (!isArrayBufferView(source)) {
source = lazyBuffer().from("".concat(source), encoding);
} // We copy into a new Uint8Array because the underlying
// BackingStores are going to be detached and owned by
// the Blob. We also don't want to have to worry about
// byte offsets.
source = new Uint8Array(source);
return [source.byteLength, source];
}
var InternalBlob = /*#__PURE__*/function (_JSTransferable) {
_inherits(InternalBlob, _JSTransferable);
var _super = _createSuper(InternalBlob);
function InternalBlob(handle, length) {
var _this;
var type = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
_classCallCheck(this, InternalBlob);
_this = _super.call(this);
_this[kHandle] = handle;
_this[kType] = type;
_this[kLength] = length;
return _this;
}
return InternalBlob;
}(JSTransferable);
var Blob = /*#__PURE__*/function (_JSTransferable2) {
_inherits(Blob, _JSTransferable2);
var _super2 = _createSuper(Blob);
function Blob() {
var _this2;
var sources = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
_classCallCheck(this, Blob);
emitExperimentalWarning('buffer.Blob');
if (sources === null || typeof sources[SymbolIterator] !== 'function' || typeof sources === 'string') {
throw new ERR_INVALID_ARG_TYPE('sources', 'Iterable', sources);
}
validateObject(options, 'options');
var _options$encoding = options.encoding,
encoding = _options$encoding === void 0 ? 'utf8' : _options$encoding;
var _options$type = options.type,
type = _options$type === void 0 ? '' : _options$type;
var length = 0;
var sources_ = ArrayFrom(sources, function (source) {
var _getSource = getSource(source, encoding),
len = _getSource[0],
src = _getSource[1];
length += len;
return src;
});
if (!isUint32(length)) throw new ERR_BUFFER_TOO_LARGE(0xFFFFFFFF);
_this2 = _super2.call(this);
_this2[kHandle] = createBlob(sources_, length);
_this2[kLength] = length;
type = "".concat(type);
_this2[kType] = RegExpPrototypeTest(disallowedTypeCharacters, type) ? '' : StringPrototypeToLowerCase(type);
return _this2;
}
_createClass(Blob, [{
key: kInspect,
value: function value(depth, options) {
if (depth < 0) return this;
var opts = _objectSpread(_objectSpread({}, options), {}, {
depth: options.depth == null ? null : options.depth - 1
});
return "Blob ".concat(inspect({
size: this.size,
type: this.type
}, opts));
}
}, {
key: kClone,
value: function value() {
var handle = this[kHandle];
var type = this[kType];
var length = this[kLength];
return {
data: {
handle: handle,
type: type,
length: length
},
deserializeInfo: 'internal/blob:InternalBlob'
};
}
}, {
key: kDeserialize,
value: function value(_ref) {
var handle = _ref.handle,
type = _ref.type,
length = _ref.length;
this[kHandle] = handle;
this[kType] = type;
this[kLength] = length;
}
}, {
key: "type",
get: function get() {
return this[kType];
}
}, {
key: "size",
get: function get() {
return this[kLength];
}
}, {
key: "slice",
value: function slice() {
var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
var end = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this[kLength];
var contentType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
if (start < 0) {
start = MathMax(this[kLength] + start, 0);
} else {
start = MathMin(start, this[kLength]);
}
start |= 0;
if (end < 0) {
end = MathMax(this[kLength] + end, 0);
} else {
end = MathMin(end, this[kLength]);
}
end |= 0;
contentType = "".concat(contentType);
if (RegExpPrototypeTest(disallowedTypeCharacters, contentType)) {
contentType = '';
} else {
contentType = StringPrototypeToLowerCase(contentType);
}
var span = MathMax(end - start, 0);
return new InternalBlob(this[kHandle].slice(start, start + span), span, contentType);
}
}, {
key: "arrayBuffer",
value: function () {
var _arrayBuffer = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
var job, ret, _createDeferredPromis, promise, resolve, reject;
return regeneratorRuntime.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
job = new FixedSizeBlobCopyJob(this[kHandle]);
ret = job.run();
if (!(ret !== undefined)) {
_context.next = 4;
break;
}
return _context.abrupt("return", PromiseResolve(ret));
case 4:
_createDeferredPromis = createDeferredPromise(), promise = _createDeferredPromis.promise, resolve = _createDeferredPromis.resolve, reject = _createDeferredPromis.reject;
job.ondone = function (err, ab) {
if (err !== undefined) return reject(new AbortError());
resolve(ab);
};
return _context.abrupt("return", promise);
case 7:
case "end":
return _context.stop();
}
}
}, _callee, this);
}));
function arrayBuffer() {
return _arrayBuffer.apply(this, arguments);
}
return arrayBuffer;
}()
}, {
key: "text",
value: function () {
var _text = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
var dec;
return regeneratorRuntime.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
dec = new TextDecoder();
_context2.t0 = dec;
_context2.next = 4;
return this.arrayBuffer();
case 4:
_context2.t1 = _context2.sent;
return _context2.abrupt("return", _context2.t0.decode.call(_context2.t0, _context2.t1));
case 6:
case "end":
return _context2.stop();
}
}
}, _callee2, this);
}));
function text() {
return _text.apply(this, arguments);
}
return text;
}()
}]);
return Blob;
}(JSTransferable);
ObjectDefineProperty(Blob.prototype, SymbolToStringTag, {
configurable: true,
value: 'Blob'
});
InternalBlob.prototype.constructor = Blob;
ObjectSetPrototypeOf(InternalBlob.prototype, Blob.prototype);
module.exports = {
Blob: Blob,
InternalBlob: InternalBlob,
isBlob: isBlob
};