1 | 'use strict';
|
2 |
|
3 | var _Object$setPrototypeO;
|
4 |
|
5 | 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; }
|
6 |
|
7 | var finished = require('./end-of-stream');
|
8 |
|
9 | var kLastResolve = Symbol('lastResolve');
|
10 | var kLastReject = Symbol('lastReject');
|
11 | var kError = Symbol('error');
|
12 | var kEnded = Symbol('ended');
|
13 | var kLastPromise = Symbol('lastPromise');
|
14 | var kHandlePromise = Symbol('handlePromise');
|
15 | var kStream = Symbol('stream');
|
16 |
|
17 | function createIterResult(value, done) {
|
18 | return {
|
19 | value: value,
|
20 | done: done
|
21 | };
|
22 | }
|
23 |
|
24 | function readAndResolve(iter) {
|
25 | var resolve = iter[kLastResolve];
|
26 |
|
27 | if (resolve !== null) {
|
28 | var data = iter[kStream].read();
|
29 |
|
30 |
|
31 |
|
32 | if (data !== null) {
|
33 | iter[kLastPromise] = null;
|
34 | iter[kLastResolve] = null;
|
35 | iter[kLastReject] = null;
|
36 | resolve(createIterResult(data, false));
|
37 | }
|
38 | }
|
39 | }
|
40 |
|
41 | function onReadable(iter) {
|
42 |
|
43 |
|
44 | process.nextTick(readAndResolve, iter);
|
45 | }
|
46 |
|
47 | function wrapForNext(lastPromise, iter) {
|
48 | return function (resolve, reject) {
|
49 | lastPromise.then(function () {
|
50 | if (iter[kEnded]) {
|
51 | resolve(createIterResult(undefined, true));
|
52 | return;
|
53 | }
|
54 |
|
55 | iter[kHandlePromise](resolve, reject);
|
56 | }, reject);
|
57 | };
|
58 | }
|
59 |
|
60 | var AsyncIteratorPrototype = Object.getPrototypeOf(function () {});
|
61 | var ReadableStreamAsyncIteratorPrototype = Object.setPrototypeOf((_Object$setPrototypeO = {
|
62 | get stream() {
|
63 | return this[kStream];
|
64 | },
|
65 |
|
66 | next: function next() {
|
67 | var _this = this;
|
68 |
|
69 |
|
70 |
|
71 | var error = this[kError];
|
72 |
|
73 | if (error !== null) {
|
74 | return Promise.reject(error);
|
75 | }
|
76 |
|
77 | if (this[kEnded]) {
|
78 | return Promise.resolve(createIterResult(undefined, true));
|
79 | }
|
80 |
|
81 | if (this[kStream].destroyed) {
|
82 |
|
83 |
|
84 |
|
85 |
|
86 | return new Promise(function (resolve, reject) {
|
87 | process.nextTick(function () {
|
88 | if (_this[kError]) {
|
89 | reject(_this[kError]);
|
90 | } else {
|
91 | resolve(createIterResult(undefined, true));
|
92 | }
|
93 | });
|
94 | });
|
95 | }
|
96 |
|
97 |
|
98 |
|
99 |
|
100 |
|
101 | var lastPromise = this[kLastPromise];
|
102 | var promise;
|
103 |
|
104 | if (lastPromise) {
|
105 | promise = new Promise(wrapForNext(lastPromise, this));
|
106 | } else {
|
107 |
|
108 |
|
109 | var data = this[kStream].read();
|
110 |
|
111 | if (data !== null) {
|
112 | return Promise.resolve(createIterResult(data, false));
|
113 | }
|
114 |
|
115 | promise = new Promise(this[kHandlePromise]);
|
116 | }
|
117 |
|
118 | this[kLastPromise] = promise;
|
119 | return promise;
|
120 | }
|
121 | }, _defineProperty(_Object$setPrototypeO, Symbol.asyncIterator, function () {
|
122 | return this;
|
123 | }), _defineProperty(_Object$setPrototypeO, "return", function _return() {
|
124 | var _this2 = this;
|
125 |
|
126 |
|
127 |
|
128 |
|
129 | return new Promise(function (resolve, reject) {
|
130 | _this2[kStream].destroy(null, function (err) {
|
131 | if (err) {
|
132 | reject(err);
|
133 | return;
|
134 | }
|
135 |
|
136 | resolve(createIterResult(undefined, true));
|
137 | });
|
138 | });
|
139 | }), _Object$setPrototypeO), AsyncIteratorPrototype);
|
140 |
|
141 | var createReadableStreamAsyncIterator = function createReadableStreamAsyncIterator(stream) {
|
142 | var _Object$create;
|
143 |
|
144 | var iterator = Object.create(ReadableStreamAsyncIteratorPrototype, (_Object$create = {}, _defineProperty(_Object$create, kStream, {
|
145 | value: stream,
|
146 | writable: true
|
147 | }), _defineProperty(_Object$create, kLastResolve, {
|
148 | value: null,
|
149 | writable: true
|
150 | }), _defineProperty(_Object$create, kLastReject, {
|
151 | value: null,
|
152 | writable: true
|
153 | }), _defineProperty(_Object$create, kError, {
|
154 | value: null,
|
155 | writable: true
|
156 | }), _defineProperty(_Object$create, kEnded, {
|
157 | value: stream._readableState.endEmitted,
|
158 | writable: true
|
159 | }), _defineProperty(_Object$create, kHandlePromise, {
|
160 | value: function value(resolve, reject) {
|
161 | var data = iterator[kStream].read();
|
162 |
|
163 | if (data) {
|
164 | iterator[kLastPromise] = null;
|
165 | iterator[kLastResolve] = null;
|
166 | iterator[kLastReject] = null;
|
167 | resolve(createIterResult(data, false));
|
168 | } else {
|
169 | iterator[kLastResolve] = resolve;
|
170 | iterator[kLastReject] = reject;
|
171 | }
|
172 | },
|
173 | writable: true
|
174 | }), _Object$create));
|
175 | iterator[kLastPromise] = null;
|
176 | finished(stream, function (err) {
|
177 | if (err && err.code !== 'ERR_STREAM_PREMATURE_CLOSE') {
|
178 | var reject = iterator[kLastReject];
|
179 |
|
180 |
|
181 | if (reject !== null) {
|
182 | iterator[kLastPromise] = null;
|
183 | iterator[kLastResolve] = null;
|
184 | iterator[kLastReject] = null;
|
185 | reject(err);
|
186 | }
|
187 |
|
188 | iterator[kError] = err;
|
189 | return;
|
190 | }
|
191 |
|
192 | var resolve = iterator[kLastResolve];
|
193 |
|
194 | if (resolve !== null) {
|
195 | iterator[kLastPromise] = null;
|
196 | iterator[kLastResolve] = null;
|
197 | iterator[kLastReject] = null;
|
198 | resolve(createIterResult(undefined, true));
|
199 | }
|
200 |
|
201 | iterator[kEnded] = true;
|
202 | });
|
203 | stream.on('readable', onReadable.bind(null, iterator));
|
204 | return iterator;
|
205 | };
|
206 |
|
207 | module.exports = createReadableStreamAsyncIterator; |
\ | No newline at end of file |