UNPKG

tus-js-client

Version:

A pure JavaScript client for the tus resumable upload protocol

150 lines (147 loc) 4.79 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } 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, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function len(blobOrArray) { if (blobOrArray === undefined) return 0; if (blobOrArray.size !== undefined) return blobOrArray.size; return blobOrArray.length; } /* Typed arrays and blobs don't have a concat method. This function helps StreamSource accumulate data to reach chunkSize. */ function concat(a, b) { if (a.concat) { // Is `a` an Array? return a.concat(b); } if (a instanceof Blob) { return new Blob([a, b], { type: a.type }); } if (a.set) { // Is `a` a typed array? var c = new a.constructor(a.length + b.length); c.set(a); c.set(b, a.length); return c; } throw new Error('Unknown data type'); } var StreamSource = exports.default = /*#__PURE__*/function () { function StreamSource(reader) { _classCallCheck(this, StreamSource); this._buffer = undefined; this._bufferOffset = 0; this._reader = reader; this._done = false; } return _createClass(StreamSource, [{ key: "slice", value: function slice(start, end) { if (start < this._bufferOffset) { return Promise.reject(new Error("Requested data is before the reader's current offset")); } return this._readUntilEnoughDataOrDone(start, end); } }, { key: "_readUntilEnoughDataOrDone", value: function _readUntilEnoughDataOrDone(start, end) { var _this = this; var hasEnoughData = end <= this._bufferOffset + len(this._buffer); if (this._done || hasEnoughData) { var value = this._getDataFromBuffer(start, end); var done = value == null ? this._done : false; return Promise.resolve({ value: value, done: done }); } return this._reader.read().then(function (_ref) { var value = _ref.value, done = _ref.done; if (done) { _this._done = true; } else if (_this._buffer === undefined) { _this._buffer = value; } else { _this._buffer = concat(_this._buffer, value); } return _this._readUntilEnoughDataOrDone(start, end); }); } }, { key: "_getDataFromBuffer", value: function _getDataFromBuffer(start, end) { // Remove data from buffer before `start`. // Data might be reread from the buffer if an upload fails, so we can only // safely delete data when it comes *before* what is currently being read. if (start > this._bufferOffset) { this._buffer = this._buffer.slice(start - this._bufferOffset); this._bufferOffset = start; } // If the buffer is empty after removing old data, all data has been read. var hasAllDataBeenRead = len(this._buffer) === 0; if (this._done && hasAllDataBeenRead) { return null; } // We already removed data before `start`, so we just return the first // chunk from the buffer. return this._buffer.slice(0, end - start); } }, { key: "close", value: function close() { if (this._reader.cancel) { this._reader.cancel(); } } }]); }();