UNPKG

30.3 kBJavaScriptView Raw
1"use strict";
2var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3 function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4 return new (P || (P = Promise))(function (resolve, reject) {
5 function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6 function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7 function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8 step((generator = generator.apply(thisArg, _arguments || [])).next());
9 });
10};
11var __generator = (this && this.__generator) || function (thisArg, body) {
12 var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13 return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14 function verb(n) { return function (v) { return step([n, v]); }; }
15 function step(op) {
16 if (f) throw new TypeError("Generator is already executing.");
17 while (g && (g = 0, op[0] && (_ = 0)), _) try {
18 if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19 if (y = 0, t) op = [op[0] & 2, t.value];
20 switch (op[0]) {
21 case 0: case 1: t = op; break;
22 case 4: _.label++; return { value: op[1], done: false };
23 case 5: _.label++; y = op[1]; op = [0]; continue;
24 case 7: op = _.ops.pop(); _.trys.pop(); continue;
25 default:
26 if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27 if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28 if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29 if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30 if (t[2]) _.ops.pop();
31 _.trys.pop(); continue;
32 }
33 op = body.call(thisArg, _);
34 } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35 if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36 }
37};
38var __values = (this && this.__values) || function(o) {
39 var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
40 if (m) return m.call(o);
41 if (o && typeof o.length === "number") return {
42 next: function () {
43 if (o && i >= o.length) o = void 0;
44 return { value: o && o[i++], done: !o };
45 }
46 };
47 throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
48};
49var __read = (this && this.__read) || function (o, n) {
50 var m = typeof Symbol === "function" && o[Symbol.iterator];
51 if (!m) return o;
52 var i = m.call(o), r, ar = [], e;
53 try {
54 while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
55 }
56 catch (error) { e = { error: error }; }
57 finally {
58 try {
59 if (r && !r.done && (m = i["return"])) m.call(i);
60 }
61 finally { if (e) throw e.error; }
62 }
63 return ar;
64};
65Object.defineProperty(exports, "__esModule", { value: true });
66exports.Union = void 0;
67var stream_1 = require("stream");
68var _a = require('fs-monkey/lib/util/lists'), fsAsyncMethods = _a.fsAsyncMethods, fsSyncMethods = _a.fsSyncMethods;
69var SPECIAL_METHODS = new Set([
70 'existsSync',
71 'readdir',
72 'readdirSync',
73 'createReadStream',
74 'createWriteStream',
75 'watch',
76 'watchFile',
77 'unwatchFile',
78]);
79var createFSProxy = function (watchers) {
80 return new Proxy({}, {
81 get: function (_obj, property) {
82 var e_1, _a;
83 var funcCallers = [];
84 var prop;
85 try {
86 for (var watchers_1 = __values(watchers), watchers_1_1 = watchers_1.next(); !watchers_1_1.done; watchers_1_1 = watchers_1.next()) {
87 var watcher = watchers_1_1.value;
88 prop = watcher[property];
89 // if we're a function we wrap it in a bigger caller;
90 if (typeof prop === 'function') {
91 funcCallers.push([watcher, prop]);
92 }
93 }
94 }
95 catch (e_1_1) { e_1 = { error: e_1_1 }; }
96 finally {
97 try {
98 if (watchers_1_1 && !watchers_1_1.done && (_a = watchers_1.return)) _a.call(watchers_1);
99 }
100 finally { if (e_1) throw e_1.error; }
101 }
102 if (funcCallers.length) {
103 return function () {
104 var e_2, _a;
105 var args = [];
106 for (var _i = 0; _i < arguments.length; _i++) {
107 args[_i] = arguments[_i];
108 }
109 try {
110 for (var funcCallers_1 = __values(funcCallers), funcCallers_1_1 = funcCallers_1.next(); !funcCallers_1_1.done; funcCallers_1_1 = funcCallers_1.next()) {
111 var _b = __read(funcCallers_1_1.value, 2), watcher = _b[0], func = _b[1];
112 func.apply(watcher, args);
113 }
114 }
115 catch (e_2_1) { e_2 = { error: e_2_1 }; }
116 finally {
117 try {
118 if (funcCallers_1_1 && !funcCallers_1_1.done && (_a = funcCallers_1.return)) _a.call(funcCallers_1);
119 }
120 finally { if (e_2) throw e_2.error; }
121 }
122 };
123 }
124 else {
125 return prop;
126 }
127 },
128 });
129};
130var fsPromisesMethods = [
131 'access',
132 'copyFile',
133 'open',
134 'opendir',
135 'rename',
136 'truncate',
137 'rmdir',
138 'mkdir',
139 'readdir',
140 'readlink',
141 'symlink',
142 'lstat',
143 'stat',
144 'link',
145 'unlink',
146 'chmod',
147 'lchmod',
148 'lchown',
149 'chown',
150 'utimes',
151 'realpath',
152 'mkdtemp',
153 'writeFile',
154 'appendFile',
155 'readFile',
156];
157/**
158 * Union object represents a stack of filesystems
159 */
160var Union = /** @class */ (function () {
161 function Union() {
162 var e_3, _a, e_4, _b, e_5, _c, e_6, _d;
163 var _this = this;
164 this.fss = [];
165 this.ReadStream = stream_1.Readable;
166 this.WriteStream = stream_1.Writable;
167 this.promises = {};
168 this.unwatchFile = function () {
169 var e_7, _a;
170 var args = [];
171 for (var _i = 0; _i < arguments.length; _i++) {
172 args[_i] = arguments[_i];
173 }
174 try {
175 for (var _b = __values(_this.fss), _c = _b.next(); !_c.done; _c = _b.next()) {
176 var fs = _c.value;
177 try {
178 fs.unwatchFile.apply(fs, args);
179 }
180 catch (e) {
181 // dunno what to do here...
182 }
183 }
184 }
185 catch (e_7_1) { e_7 = { error: e_7_1 }; }
186 finally {
187 try {
188 if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
189 }
190 finally { if (e_7) throw e_7.error; }
191 }
192 };
193 this.watch = function () {
194 var e_8, _a;
195 var args = [];
196 for (var _i = 0; _i < arguments.length; _i++) {
197 args[_i] = arguments[_i];
198 }
199 var watchers = [];
200 try {
201 for (var _b = __values(_this.fss), _c = _b.next(); !_c.done; _c = _b.next()) {
202 var fs = _c.value;
203 try {
204 var watcher = fs.watch.apply(fs, args);
205 watchers.push(watcher);
206 }
207 catch (e) {
208 // dunno what to do here...
209 }
210 }
211 }
212 catch (e_8_1) { e_8 = { error: e_8_1 }; }
213 finally {
214 try {
215 if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
216 }
217 finally { if (e_8) throw e_8.error; }
218 }
219 // return a proxy to call functions on these props
220 return createFSProxy(watchers);
221 };
222 this.watchFile = function () {
223 var e_9, _a;
224 var args = [];
225 for (var _i = 0; _i < arguments.length; _i++) {
226 args[_i] = arguments[_i];
227 }
228 try {
229 for (var _b = __values(_this.fss), _c = _b.next(); !_c.done; _c = _b.next()) {
230 var fs = _c.value;
231 try {
232 fs.watchFile.apply(fs, args);
233 }
234 catch (e) {
235 // dunno what to do here...
236 }
237 }
238 }
239 catch (e_9_1) { e_9 = { error: e_9_1 }; }
240 finally {
241 try {
242 if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
243 }
244 finally { if (e_9) throw e_9.error; }
245 }
246 };
247 this.existsSync = function (path) {
248 var e_10, _a;
249 try {
250 for (var _b = __values(_this.fss), _c = _b.next(); !_c.done; _c = _b.next()) {
251 var fs = _c.value;
252 try {
253 if (fs.existsSync(path)) {
254 return true;
255 }
256 }
257 catch (e) {
258 // ignore
259 }
260 }
261 }
262 catch (e_10_1) { e_10 = { error: e_10_1 }; }
263 finally {
264 try {
265 if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
266 }
267 finally { if (e_10) throw e_10.error; }
268 }
269 return false;
270 };
271 this.readdir = function () {
272 var args = [];
273 for (var _i = 0; _i < arguments.length; _i++) {
274 args[_i] = arguments[_i];
275 }
276 var lastarg = args.length - 1;
277 var cb = args[lastarg];
278 if (typeof cb !== 'function') {
279 cb = null;
280 lastarg++;
281 }
282 var lastError = null;
283 var result = new Map();
284 var iterate = function (i, error) {
285 if (i === void 0) { i = 0; }
286 if (error) {
287 error.prev = lastError;
288 lastError = error;
289 }
290 // Already tried all file systems, return the last error.
291 if (i >= _this.fss.length) {
292 // last one
293 if (cb) {
294 cb(error || Error('No file systems attached.'));
295 }
296 return;
297 }
298 // Replace `callback` with our intermediate function.
299 args[lastarg] = function (err, resArg) {
300 var e_11, _a;
301 if (result.size === 0 && err) {
302 return iterate(i + 1, err);
303 }
304 if (resArg) {
305 try {
306 for (var resArg_1 = __values(resArg), resArg_1_1 = resArg_1.next(); !resArg_1_1.done; resArg_1_1 = resArg_1.next()) {
307 var res = resArg_1_1.value;
308 result.set(_this.pathFromReaddirEntry(res), res);
309 }
310 }
311 catch (e_11_1) { e_11 = { error: e_11_1 }; }
312 finally {
313 try {
314 if (resArg_1_1 && !resArg_1_1.done && (_a = resArg_1.return)) _a.call(resArg_1);
315 }
316 finally { if (e_11) throw e_11.error; }
317 }
318 }
319 if (i === _this.fss.length - 1) {
320 return cb(null, _this.sortedArrayFromReaddirResult(result));
321 }
322 else {
323 return iterate(i + 1, error);
324 }
325 };
326 var j = _this.fss.length - i - 1;
327 var fs = _this.fss[j];
328 var func = fs.readdir;
329 if (!func)
330 iterate(i + 1, Error('Method not supported: readdir'));
331 else
332 func.apply(fs, args);
333 };
334 iterate();
335 };
336 this.readdirSync = function () {
337 var e_12, _a;
338 var args = [];
339 for (var _i = 0; _i < arguments.length; _i++) {
340 args[_i] = arguments[_i];
341 }
342 var lastError = null;
343 var result = new Map();
344 for (var i = _this.fss.length - 1; i >= 0; i--) {
345 var fs = _this.fss[i];
346 try {
347 if (!fs.readdirSync)
348 throw Error("Method not supported: \"readdirSync\" with args \"".concat(args, "\""));
349 try {
350 for (var _b = (e_12 = void 0, __values(fs.readdirSync.apply(fs, args))), _c = _b.next(); !_c.done; _c = _b.next()) {
351 var res = _c.value;
352 result.set(_this.pathFromReaddirEntry(res), res);
353 }
354 }
355 catch (e_12_1) { e_12 = { error: e_12_1 }; }
356 finally {
357 try {
358 if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
359 }
360 finally { if (e_12) throw e_12.error; }
361 }
362 }
363 catch (err) {
364 err.prev = lastError;
365 lastError = err;
366 if (result.size === 0 && !i) {
367 // last one
368 throw err;
369 }
370 else {
371 // Ignore error...
372 // continue;
373 }
374 }
375 }
376 return _this.sortedArrayFromReaddirResult(result);
377 };
378 this.readdirPromise = function () {
379 var args = [];
380 for (var _i = 0; _i < arguments.length; _i++) {
381 args[_i] = arguments[_i];
382 }
383 return __awaiter(_this, void 0, void 0, function () {
384 var lastError, result, i, fs, _a, _b, res, e_13_1, err_1;
385 var e_13, _c;
386 return __generator(this, function (_d) {
387 switch (_d.label) {
388 case 0:
389 lastError = null;
390 result = new Map();
391 i = this.fss.length - 1;
392 _d.label = 1;
393 case 1:
394 if (!(i >= 0)) return [3 /*break*/, 13];
395 fs = this.fss[i];
396 _d.label = 2;
397 case 2:
398 _d.trys.push([2, 11, , 12]);
399 if (!fs.promises || !fs.promises.readdir)
400 throw Error("Method not supported: \"readdirSync\" with args \"".concat(args, "\""));
401 _d.label = 3;
402 case 3:
403 _d.trys.push([3, 8, 9, 10]);
404 e_13 = void 0;
405 return [4 /*yield*/, fs.promises.readdir.apply(fs, args)];
406 case 4:
407 _a = (__values.apply(void 0, [_d.sent()])), _b = _a.next();
408 _d.label = 5;
409 case 5:
410 if (!!_b.done) return [3 /*break*/, 7];
411 res = _b.value;
412 result.set(this.pathFromReaddirEntry(res), res);
413 _d.label = 6;
414 case 6:
415 _b = _a.next();
416 return [3 /*break*/, 5];
417 case 7: return [3 /*break*/, 10];
418 case 8:
419 e_13_1 = _d.sent();
420 e_13 = { error: e_13_1 };
421 return [3 /*break*/, 10];
422 case 9:
423 try {
424 if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
425 }
426 finally { if (e_13) throw e_13.error; }
427 return [7 /*endfinally*/];
428 case 10: return [3 /*break*/, 12];
429 case 11:
430 err_1 = _d.sent();
431 err_1.prev = lastError;
432 lastError = err_1;
433 if (result.size === 0 && !i) {
434 // last one
435 throw err_1;
436 }
437 else {
438 // Ignore error...
439 // continue;
440 }
441 return [3 /*break*/, 12];
442 case 12:
443 i--;
444 return [3 /*break*/, 1];
445 case 13: return [2 /*return*/, this.sortedArrayFromReaddirResult(result)];
446 }
447 });
448 });
449 };
450 this.pathFromReaddirEntry = function (readdirEntry) {
451 if (readdirEntry instanceof Buffer || typeof readdirEntry === 'string') {
452 return String(readdirEntry);
453 }
454 return readdirEntry.name;
455 };
456 this.sortedArrayFromReaddirResult = function (readdirResult) {
457 var e_14, _a;
458 var array = [];
459 try {
460 for (var _b = __values(Array.from(readdirResult.keys()).sort()), _c = _b.next(); !_c.done; _c = _b.next()) {
461 var key = _c.value;
462 var value = readdirResult.get(key);
463 if (value !== undefined)
464 array.push(value);
465 }
466 }
467 catch (e_14_1) { e_14 = { error: e_14_1 }; }
468 finally {
469 try {
470 if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
471 }
472 finally { if (e_14) throw e_14.error; }
473 }
474 return array;
475 };
476 this.createReadStream = function (path) {
477 var e_15, _a;
478 var lastError = null;
479 try {
480 for (var _b = __values(_this.fss), _c = _b.next(); !_c.done; _c = _b.next()) {
481 var fs = _c.value;
482 try {
483 if (!fs.createReadStream)
484 throw Error("Method not supported: \"createReadStream\"");
485 if (fs.existsSync && !fs.existsSync(path)) {
486 throw new Error("file \"".concat(path, "\" does not exists"));
487 }
488 var stream = fs.createReadStream(path);
489 if (!stream) {
490 throw new Error('no valid stream');
491 }
492 _this.ReadStream = fs.ReadStream;
493 return stream;
494 }
495 catch (err) {
496 lastError = err;
497 }
498 }
499 }
500 catch (e_15_1) { e_15 = { error: e_15_1 }; }
501 finally {
502 try {
503 if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
504 }
505 finally { if (e_15) throw e_15.error; }
506 }
507 throw lastError;
508 };
509 this.createWriteStream = function (path) {
510 var e_16, _a;
511 var lastError = null;
512 try {
513 for (var _b = __values(_this.fss), _c = _b.next(); !_c.done; _c = _b.next()) {
514 var fs = _c.value;
515 try {
516 if (!fs.createWriteStream)
517 throw Error("Method not supported: \"createWriteStream\"");
518 fs.statSync(path); //we simply stat first to exit early for mocked fs'es
519 //TODO which filesystem to write to?
520 var stream = fs.createWriteStream(path);
521 if (!stream) {
522 throw new Error('no valid stream');
523 }
524 _this.WriteStream = fs.WriteStream;
525 return stream;
526 }
527 catch (err) {
528 lastError = err;
529 }
530 }
531 }
532 catch (e_16_1) { e_16 = { error: e_16_1 }; }
533 finally {
534 try {
535 if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
536 }
537 finally { if (e_16) throw e_16.error; }
538 }
539 throw lastError;
540 };
541 var _loop_1 = function (method) {
542 if (!SPECIAL_METHODS.has(method)) {
543 // check we don't already have a property for this method
544 this_1[method] = function () {
545 var args = [];
546 for (var _i = 0; _i < arguments.length; _i++) {
547 args[_i] = arguments[_i];
548 }
549 return _this.syncMethod(method, args);
550 };
551 }
552 };
553 var this_1 = this;
554 try {
555 for (var fsSyncMethods_1 = __values(fsSyncMethods), fsSyncMethods_1_1 = fsSyncMethods_1.next(); !fsSyncMethods_1_1.done; fsSyncMethods_1_1 = fsSyncMethods_1.next()) {
556 var method = fsSyncMethods_1_1.value;
557 _loop_1(method);
558 }
559 }
560 catch (e_3_1) { e_3 = { error: e_3_1 }; }
561 finally {
562 try {
563 if (fsSyncMethods_1_1 && !fsSyncMethods_1_1.done && (_a = fsSyncMethods_1.return)) _a.call(fsSyncMethods_1);
564 }
565 finally { if (e_3) throw e_3.error; }
566 }
567 var _loop_2 = function (method) {
568 if (!SPECIAL_METHODS.has(method)) {
569 // check we don't already have a property for this method
570 this_2[method] = function () {
571 var args = [];
572 for (var _i = 0; _i < arguments.length; _i++) {
573 args[_i] = arguments[_i];
574 }
575 return _this.asyncMethod(method, args);
576 };
577 }
578 };
579 var this_2 = this;
580 try {
581 for (var fsAsyncMethods_1 = __values(fsAsyncMethods), fsAsyncMethods_1_1 = fsAsyncMethods_1.next(); !fsAsyncMethods_1_1.done; fsAsyncMethods_1_1 = fsAsyncMethods_1.next()) {
582 var method = fsAsyncMethods_1_1.value;
583 _loop_2(method);
584 }
585 }
586 catch (e_4_1) { e_4 = { error: e_4_1 }; }
587 finally {
588 try {
589 if (fsAsyncMethods_1_1 && !fsAsyncMethods_1_1.done && (_b = fsAsyncMethods_1.return)) _b.call(fsAsyncMethods_1);
590 }
591 finally { if (e_4) throw e_4.error; }
592 }
593 var _loop_3 = function (method) {
594 if (method === 'readdir') {
595 this_3.promises[method] = this_3.readdirPromise;
596 return "continue";
597 }
598 this_3.promises[method] = function () {
599 var args = [];
600 for (var _i = 0; _i < arguments.length; _i++) {
601 args[_i] = arguments[_i];
602 }
603 return _this.promiseMethod(method, args);
604 };
605 };
606 var this_3 = this;
607 try {
608 for (var fsPromisesMethods_1 = __values(fsPromisesMethods), fsPromisesMethods_1_1 = fsPromisesMethods_1.next(); !fsPromisesMethods_1_1.done; fsPromisesMethods_1_1 = fsPromisesMethods_1.next()) {
609 var method = fsPromisesMethods_1_1.value;
610 _loop_3(method);
611 }
612 }
613 catch (e_5_1) { e_5 = { error: e_5_1 }; }
614 finally {
615 try {
616 if (fsPromisesMethods_1_1 && !fsPromisesMethods_1_1.done && (_c = fsPromisesMethods_1.return)) _c.call(fsPromisesMethods_1);
617 }
618 finally { if (e_5) throw e_5.error; }
619 }
620 try {
621 for (var _e = __values(SPECIAL_METHODS.values()), _f = _e.next(); !_f.done; _f = _e.next()) {
622 var method = _f.value;
623 // bind special methods to support
624 // const { method } = ufs;
625 this[method] = this[method].bind(this);
626 }
627 }
628 catch (e_6_1) { e_6 = { error: e_6_1 }; }
629 finally {
630 try {
631 if (_f && !_f.done && (_d = _e.return)) _d.call(_e);
632 }
633 finally { if (e_6) throw e_6.error; }
634 }
635 }
636 /**
637 * Adds a filesystem to the list of filesystems in the union
638 * The new filesystem object is added as the last filesystem used
639 * when searching for a file.
640 *
641 * @param fs the filesystem interface to be added to the queue of FS's
642 * @returns this instance of a unionFS
643 */
644 Union.prototype.use = function (fs) {
645 this.fss.push(fs);
646 return this;
647 };
648 Union.prototype.syncMethod = function (method, args) {
649 var lastError = null;
650 for (var i = this.fss.length - 1; i >= 0; i--) {
651 var fs = this.fss[i];
652 try {
653 if (!fs[method])
654 throw Error("Method not supported: \"".concat(method, "\" with args \"").concat(args, "\""));
655 return fs[method].apply(fs, args);
656 }
657 catch (err) {
658 err.prev = lastError;
659 lastError = err;
660 if (!i) {
661 // last one
662 throw err;
663 }
664 else {
665 // Ignore error...
666 // continue;
667 }
668 }
669 }
670 };
671 Union.prototype.asyncMethod = function (method, args) {
672 var _this = this;
673 var lastarg = args.length - 1;
674 var cb = args[lastarg];
675 if (typeof cb !== 'function') {
676 cb = null;
677 lastarg++;
678 }
679 var lastError = null;
680 var iterate = function (i, err) {
681 if (i === void 0) { i = 0; }
682 if (err) {
683 err.prev = lastError;
684 lastError = err;
685 }
686 // Already tried all file systems, return the last error.
687 if (i >= _this.fss.length) {
688 // last one
689 if (cb)
690 cb(err || Error('No file systems attached.'));
691 return;
692 }
693 // Replace `callback` with our intermediate function.
694 args[lastarg] = function (err) {
695 if (err)
696 return iterate(i + 1, err);
697 if (cb)
698 cb.apply(cb, arguments);
699 };
700 var j = _this.fss.length - i - 1;
701 var fs = _this.fss[j];
702 var func = fs[method];
703 if (!func)
704 iterate(i + 1, Error('Method not supported: ' + method));
705 else
706 func.apply(fs, args);
707 };
708 iterate();
709 };
710 Union.prototype.promiseMethod = function (method, args) {
711 return __awaiter(this, void 0, void 0, function () {
712 var lastError, i, theFs, promises, err_2;
713 return __generator(this, function (_a) {
714 switch (_a.label) {
715 case 0:
716 lastError = null;
717 i = this.fss.length - 1;
718 _a.label = 1;
719 case 1:
720 if (!(i >= 0)) return [3 /*break*/, 6];
721 theFs = this.fss[i];
722 promises = theFs.promises;
723 _a.label = 2;
724 case 2:
725 _a.trys.push([2, 4, , 5]);
726 if (!promises || !promises[method]) {
727 throw Error("Promise of method not supported: \"".concat(String(method), "\" with args \"").concat(args, "\""));
728 }
729 return [4 /*yield*/, promises[method].apply(promises, args)];
730 case 3:
731 // return promises[method](...args);
732 return [2 /*return*/, _a.sent()];
733 case 4:
734 err_2 = _a.sent();
735 err_2.prev = lastError;
736 lastError = err_2;
737 if (!i) {
738 // last one
739 throw err_2;
740 }
741 else {
742 // Ignore error...
743 // continue;
744 }
745 return [3 /*break*/, 5];
746 case 5:
747 i--;
748 return [3 /*break*/, 1];
749 case 6: return [2 /*return*/];
750 }
751 });
752 });
753 };
754 return Union;
755}());
756exports.Union = Union;