formdata-node
Version:
FormData implementation for Node.js. Built over Readable stream and async generators. Can be used to communicate between servers with multipart/form-data format.
115 lines (89 loc) • 3.38 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _symbol = _interopRequireDefault(require("@babel/runtime/core-js/symbol"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _promise = _interopRequireDefault(require("@babel/runtime/core-js/promise"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _nextTick = _interopRequireDefault(require("./nextTick"));
var _Symbol$asyncIterator = _symbol.default.asyncIterator;
/**
* StreamIterator helps with getting data from a Readable stream using an
* async iterator
*
* @api private
*/
class StreamIterator {
/**
* @param {stream.Readable} stream
*/
constructor(stream) {
var _this = this;
(0, _defineProperty2.default)(this, "__setState", state => void (this.__state = state));
(0, _defineProperty2.default)(this, "__isState", state => this.__state === state);
(0, _defineProperty2.default)(this, "__isPendingState", () => this.__isState(this.__states.pending));
(0, _defineProperty2.default)(this, "__isEndState", () => {
// Temporarily hack while waiting for new public APIs of streams:
// See for more info: https://github.com/nodejs/node/issues/445
// eslint-disable-next-line
const state = this.__stream._readableState;
return state.ended && state.endEmitted;
});
(0, _defineProperty2.default)(this, "__isErrorState", () => this.__isState(this.__states.error));
(0, _defineProperty2.default)(this, "__onError", err => {
this.__error = err;
this.__setState(this.__states.error);
});
(0, _defineProperty2.default)(this, "__ensureRead", () => new _promise.default(resolve => {
const fulfill = () => resolve(this.__setState(this.__states.read));
this.__stream.once("readable", fulfill);
}));
(0, _defineProperty2.default)(this, "next",
/*#__PURE__*/
(0, _asyncToGenerator2.default)(function* () {
while (true) {
yield (0, _nextTick.default)();
if (_this.__isErrorState()) {
throw _this.__error;
} // Ensure of a Readable ending
if (_this.__isEndState()) {
return {
value: undefined,
done: true
};
} // Set the "readable" event listener (using once method)
// and wait for the event emitting
if (_this.__isPendingState()) {
yield _this.__ensureRead();
continue;
}
const value = _this.__stream.read(); // Back to the "pending" state if given value is nullish
if (value == null) {
_this.__setState(_this.__states.pending);
continue;
}
return {
value,
done: false
};
}
}));
this.__stream = stream;
this.__states = {
pending: (0, _symbol.default)("pending"),
read: (0, _symbol.default)("read"),
error: (0, _symbol.default)("error")
};
this.__state = this.__states.pending;
this.__error = null;
this.__stream.on("error", this.__onError);
}
[_Symbol$asyncIterator]() {
return this;
}
}
var _default = StreamIterator;
exports.default = _default;