scryfall-sdk
Version:
A Node.js SDK for https://scryfall.com/docs/api written in Typescript.
110 lines (109 loc) • 4.66 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); }
var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) {
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
var g = generator.apply(thisArg, _arguments || []), i, q = [];
return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }
function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
function fulfill(value) { resume("next", value); }
function reject(value) { resume("throw", value); }
function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }
};
Object.defineProperty(exports, "__esModule", { value: true });
const EventEmitter_1 = require("./EventEmitter");
class MagicEmitter extends EventEmitter_1.default {
get ended() {
return this._ended;
}
get cancelled() {
return this._cancelled;
}
get willCancelAfterPage() {
return this._willCancelAfterPage;
}
constructor() {
super();
this._ended = false;
this._cancelled = false;
this._willCancelAfterPage = false;
this.mappers = [];
this.on("end", () => { this._ended = true; });
this.on("cancel", () => { this._ended = true; });
}
on(event, listener) {
super.on(event, listener);
return this;
}
emit(event, ...data) {
if (event === "data")
return super.emit(event, this.mappers.reduce((current, mapper) => mapper(current), data[0]));
return super.emit(event, ...data);
}
emitAll(event, ...data) {
for (const item of data) {
super.emit(event, event !== "data" ? item : this.mappers.reduce((current, mapper) => mapper(current), item));
if (this._cancelled)
break;
}
}
cancel() {
this._cancelled = true;
this.emit("cancel");
return this;
}
cancelAfterPage() {
this._willCancelAfterPage = true;
return this;
}
waitForAll() {
return __awaiter(this, void 0, void 0, function* () {
return new Promise((resolve, reject) => {
const results = [];
results.not_found = [];
this.on("data", result => { results.push(result); });
this.on("not_found", notFound => { results.not_found.push(notFound); });
this.on("done", () => resolve(results));
this.on("error", reject);
});
});
}
[Symbol.asyncIterator]() {
return this.generate("data");
}
all() {
return this.generate("data");
}
notFound() {
return this.generate("not_found");
}
map(mapper) {
this.mappers.push(mapper);
return this;
}
generate(event) {
return __asyncGenerator(this, arguments, function* generate_1() {
// save the new data on each event
const unyielded = [];
this.on(event, data => unyielded.push(data));
while (!this._ended) {
// wait for the next event before yielding any new data
yield __await(new Promise(resolve => this.once(event, resolve)));
let data;
while (data = unyielded.shift())
yield yield __await(data);
}
});
}
}
exports.default = MagicEmitter;