comic-vine-sdk
Version:
A JS/TS client for the Comic Vine API
54 lines • 8.87 kB
JavaScript
export class BaseResource {
constructor(httpClient, urlBuilder) {
this.httpClient = httpClient;
this.urlBuilder = urlBuilder;
}
async retrieve(id, options) {
const url = this.urlBuilder.retrieve(this.resourceType, id, options);
const _fieldList = options?.fieldList;
const response = await this.httpClient.get(url);
return response.results;
}
async fetchPage(options) {
const url = this.urlBuilder.list(this.resourceType, options);
const _fieldList = options?.fieldList;
const response = await this.httpClient.get(url);
return {
limit: response.limit,
numberOfPageResults: response.numberOfPageResults,
numberOfTotalResults: response.numberOfTotalResults,
offset: response.offset,
data: response.results,
};
}
list(options) {
// Proxy the call to this.fetchPage so that we can close over `this`, allowing access in the iterator
const fetchPage = (opts) => this.fetchPage.call(this, opts);
const fetchPagePromise = fetchPage(options);
const asyncIterator = {
async *[Symbol.asyncIterator]() {
const defaultPageSize = 100;
const limit = options?.limit ?? defaultPageSize;
let page = options?.offset ? options.offset / limit + 1 : 1;
let hasMoreResults = true;
let response = await fetchPagePromise;
do {
for (const resource of response.data) {
yield resource;
}
hasMoreResults =
response.limit + response.offset < response.numberOfTotalResults;
if (hasMoreResults) {
response = await fetchPage({
limit,
offset: response.numberOfPageResults * page++,
});
}
} while (hasMoreResults);
},
};
const promiseWithAsyncIterator = Object.assign(fetchPagePromise, asyncIterator);
return promiseWithAsyncIterator;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1yZXNvdXJjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZXNvdXJjZXMvYmFzZS1yZXNvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFTQSxNQUFNLE9BQWdCLFlBQVk7SUFHaEMsWUFDVSxVQUFzQixFQUN0QixVQUFzQjtRQUR0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGVBQVUsR0FBVixVQUFVLENBQVk7SUFDN0IsQ0FBQztJQUVKLEtBQUssQ0FBQyxRQUFRLENBQ1osRUFBVSxFQUNWLE9BQW1DO1FBSW5DLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sVUFBVSxHQUFHLE9BQU8sRUFBRSxTQUFTLENBQUM7UUFFdEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBZSxHQUFHLENBQUMsQ0FBQztRQUU5RCxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUM7SUFDMUIsQ0FBQztJQUVPLEtBQUssQ0FBQyxTQUFTLENBQ3JCLE9BQThEO1FBTTlELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0QsTUFBTSxVQUFVLEdBQUcsT0FBTyxFQUFFLFNBQVMsQ0FBQztRQUV0QyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFpQixHQUFHLENBQUMsQ0FBQztRQUVoRSxPQUFPO1lBQ0wsS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO1lBQ3JCLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxtQkFBbUI7WUFDakQsb0JBQW9CLEVBQUUsUUFBUSxDQUFDLG9CQUFvQjtZQUNuRCxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07WUFDdkIsSUFBSSxFQUFFLFFBQVEsQ0FBQyxPQUFPO1NBQ3ZCLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxDQUNGLE9BQThEO1FBRTlELHFHQUFxRztRQUNyRyxNQUFNLFNBQVMsR0FBRyxDQUFDLElBQTJDLEVBQUUsRUFBRSxDQUNoRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEMsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFNUMsTUFBTSxhQUFhLEdBQUc7WUFDcEIsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDO2dCQUMzQixNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7Z0JBQzVCLE1BQU0sS0FBSyxHQUFHLE9BQU8sRUFBRSxLQUFLLElBQUksZUFBZSxDQUFDO2dCQUNoRCxJQUFJLElBQUksR0FBRyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUQsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDO2dCQUMxQixJQUFJLFFBQVEsR0FBRyxNQUFNLGdCQUFnQixDQUFDO2dCQUV0QyxHQUFHLENBQUM7b0JBQ0YsS0FBSyxNQUFNLFFBQVEsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ3JDLE1BQU0sUUFBUSxDQUFDO29CQUNqQixDQUFDO29CQUVELGNBQWM7d0JBQ1osUUFBUSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQztvQkFFbkUsSUFBSSxjQUFjLEVBQUUsQ0FBQzt3QkFDbkIsUUFBUSxHQUFHLE1BQU0sU0FBUyxDQUFDOzRCQUN6QixLQUFLOzRCQUNMLE1BQU0sRUFBRSxRQUFRLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxFQUFFO3lCQUM5QyxDQUFDLENBQUM7b0JBQ0wsQ0FBQztnQkFDSCxDQUFDLFFBQVEsY0FBYyxFQUFFO1lBQzNCLENBQUM7U0FDRixDQUFDO1FBRUYsTUFBTSx3QkFBd0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUM1QyxnQkFBZ0IsRUFDaEIsYUFBYSxDQUNkLENBQUM7UUFFRixPQUFPLHdCQUF3QixDQUFDO0lBQ2xDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc291cmNlVHlwZSB9IGZyb20gJy4vcmVzb3VyY2UtdHlwZS5qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIFJldHJpZXZlT3B0aW9ucyxcbiAgTGlzdE9wdGlvbnMsXG4gIEh0dHBDbGllbnQsXG4gIFVybEJ1aWxkZXIsXG4gIFBpY2tGaWx0ZXJzLFxufSBmcm9tICcuLi90eXBlcy9pbmRleC5qcyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlUmVzb3VyY2U8UmVzb3VyY2UsIFJlc291cmNlTGlzdEl0ZW0+IHtcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlc291cmNlVHlwZTogUmVzb3VyY2VUeXBlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cENsaWVudDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIHVybEJ1aWxkZXI6IFVybEJ1aWxkZXIsXG4gICkge31cblxuICBhc3luYyByZXRyaWV2ZTxGaWVsZEtleSBleHRlbmRzIGtleW9mIFJlc291cmNlPihcbiAgICBpZDogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBSZXRyaWV2ZU9wdGlvbnM8RmllbGRLZXk+LFxuICApIHtcbiAgICB0eXBlIFJldHVyblR5cGU8VD4gPSBUIGV4dGVuZHMgb2JqZWN0ID8gUGljazxSZXNvdXJjZSwgRmllbGRLZXk+IDogUmVzb3VyY2U7XG5cbiAgICBjb25zdCB1cmwgPSB0aGlzLnVybEJ1aWxkZXIucmV0cmlldmUodGhpcy5yZXNvdXJjZVR5cGUsIGlkLCBvcHRpb25zKTtcbiAgICBjb25zdCBfZmllbGRMaXN0ID0gb3B0aW9ucz8uZmllbGRMaXN0O1xuICAgIHR5cGUgUmVzcG9uc2VUeXBlID0gUmV0dXJuVHlwZTx0eXBlb2YgX2ZpZWxkTGlzdD47XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmh0dHBDbGllbnQuZ2V0PFJlc3BvbnNlVHlwZT4odXJsKTtcblxuICAgIHJldHVybiByZXNwb25zZS5yZXN1bHRzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmZXRjaFBhZ2U8RmllbGRLZXkgZXh0ZW5kcyBrZXlvZiBSZXNvdXJjZUxpc3RJdGVtPihcbiAgICBvcHRpb25zPzogTGlzdE9wdGlvbnM8RmllbGRLZXksIFBpY2tGaWx0ZXJzPFJlc291cmNlTGlzdEl0ZW0+PixcbiAgKSB7XG4gICAgdHlwZSBSZXR1cm5UeXBlPFQ+ID0gVCBleHRlbmRzIG9iamVjdFxuICAgICAgPyBQaWNrPFJlc291cmNlTGlzdEl0ZW0sIEZpZWxkS2V5PlxuICAgICAgOiBSZXNvdXJjZUxpc3RJdGVtO1xuXG4gICAgY29uc3QgdXJsID0gdGhpcy51cmxCdWlsZGVyLmxpc3QodGhpcy5yZXNvdXJjZVR5cGUsIG9wdGlvbnMpO1xuICAgIGNvbnN0IF9maWVsZExpc3QgPSBvcHRpb25zPy5maWVsZExpc3Q7XG4gICAgdHlwZSBSZXNwb25zZVR5cGUgPSBSZXR1cm5UeXBlPHR5cGVvZiBfZmllbGRMaXN0PjtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuaHR0cENsaWVudC5nZXQ8UmVzcG9uc2VUeXBlW10+KHVybCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGltaXQ6IHJlc3BvbnNlLmxpbWl0LFxuICAgICAgbnVtYmVyT2ZQYWdlUmVzdWx0czogcmVzcG9uc2UubnVtYmVyT2ZQYWdlUmVzdWx0cyxcbiAgICAgIG51bWJlck9mVG90YWxSZXN1bHRzOiByZXNwb25zZS5udW1iZXJPZlRvdGFsUmVzdWx0cyxcbiAgICAgIG9mZnNldDogcmVzcG9uc2Uub2Zmc2V0LFxuICAgICAgZGF0YTogcmVzcG9uc2UucmVzdWx0cyxcbiAgICB9O1xuICB9XG5cbiAgbGlzdDxGaWVsZEtleSBleHRlbmRzIGtleW9mIFJlc291cmNlTGlzdEl0ZW0+KFxuICAgIG9wdGlvbnM/OiBMaXN0T3B0aW9uczxGaWVsZEtleSwgUGlja0ZpbHRlcnM8UmVzb3VyY2VMaXN0SXRlbT4+LFxuICApIHtcbiAgICAvLyBQcm94eSB0aGUgY2FsbCB0byB0aGlzLmZldGNoUGFnZSBzbyB0aGF0IHdlIGNhbiBjbG9zZSBvdmVyIGB0aGlzYCwgYWxsb3dpbmcgYWNjZXNzIGluIHRoZSBpdGVyYXRvclxuICAgIGNvbnN0IGZldGNoUGFnZSA9IChvcHRzPzogUGFyYW1ldGVyczx0eXBlb2YgdGhpcy5mZXRjaFBhZ2U+WzBdKSA9PlxuICAgICAgdGhpcy5mZXRjaFBhZ2UuY2FsbCh0aGlzLCBvcHRzKTtcbiAgICBjb25zdCBmZXRjaFBhZ2VQcm9taXNlID0gZmV0Y2hQYWdlKG9wdGlvbnMpO1xuXG4gICAgY29uc3QgYXN5bmNJdGVyYXRvciA9IHtcbiAgICAgIGFzeW5jICpbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICBjb25zdCBkZWZhdWx0UGFnZVNpemUgPSAxMDA7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gb3B0aW9ucz8ubGltaXQgPz8gZGVmYXVsdFBhZ2VTaXplO1xuICAgICAgICBsZXQgcGFnZSA9IG9wdGlvbnM/Lm9mZnNldCA/IG9wdGlvbnMub2Zmc2V0IC8gbGltaXQgKyAxIDogMTtcbiAgICAgICAgbGV0IGhhc01vcmVSZXN1bHRzID0gdHJ1ZTtcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hQYWdlUHJvbWlzZTtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgICB5aWVsZCByZXNvdXJjZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBoYXNNb3JlUmVzdWx0cyA9XG4gICAgICAgICAgICByZXNwb25zZS5saW1pdCArIHJlc3BvbnNlLm9mZnNldCA8IHJlc3BvbnNlLm51bWJlck9mVG90YWxSZXN1bHRzO1xuXG4gICAgICAgICAgaWYgKGhhc01vcmVSZXN1bHRzKSB7XG4gICAgICAgICAgICByZXNwb25zZSA9IGF3YWl0IGZldGNoUGFnZSh7XG4gICAgICAgICAgICAgIGxpbWl0LFxuICAgICAgICAgICAgICBvZmZzZXQ6IHJlc3BvbnNlLm51bWJlck9mUGFnZVJlc3VsdHMgKiBwYWdlKyssXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGhhc01vcmVSZXN1bHRzKTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IHByb21pc2VXaXRoQXN5bmNJdGVyYXRvciA9IE9iamVjdC5hc3NpZ24oXG4gICAgICBmZXRjaFBhZ2VQcm9taXNlLFxuICAgICAgYXN5bmNJdGVyYXRvcixcbiAgICApO1xuXG4gICAgcmV0dXJuIHByb21pc2VXaXRoQXN5bmNJdGVyYXRvcjtcbiAgfVxufVxuIl19