bandcamp-fetch
Version:
Scrape Bandcamp content
122 lines • 5.14 kB
JavaScript
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
if (kind === "m") throw new TypeError("Private method is not writable");
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
};
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
};
var _Fetcher_cookie, _Fetcher_cache;
import { URL } from 'url';
import { CacheDataType } from './Cache.js';
export var FetchMethod;
(function (FetchMethod) {
FetchMethod["GET"] = "GET";
FetchMethod["POST"] = "POST";
FetchMethod["HEAD"] = "HEAD";
})(FetchMethod || (FetchMethod = {}));
class Fetcher {
constructor(params) {
_Fetcher_cookie.set(this, void 0);
_Fetcher_cache.set(this, void 0);
__classPrivateFieldSet(this, _Fetcher_cache, params.cache, "f");
this.setCookie(params.cookie);
}
setCookie(value) {
__classPrivateFieldSet(this, _Fetcher_cookie, value, "f");
const valueChanged = ((__classPrivateFieldGet(this, _Fetcher_cookie, "f") || null) !== (value || null));
if (valueChanged) {
__classPrivateFieldGet(this, _Fetcher_cache, "f").clear();
}
}
get cookie() {
return __classPrivateFieldGet(this, _Fetcher_cookie, "f");
}
fetch(url, jsonResponse, method, payload) {
if (jsonResponse === undefined) {
jsonResponse = false;
}
return __classPrivateFieldGet(this, _Fetcher_cache, "f").getOrSet(CacheDataType.Page, getCacheKey(url, jsonResponse, payload), async () => {
if (method === undefined) {
method = FetchMethod.GET;
}
if (method === FetchMethod.HEAD) {
const response = await fetch(url, { method: 'HEAD' });
return {
ok: response.ok,
status: response.status
};
}
let response;
if (method === FetchMethod.GET) {
const urlObj = new URL(url);
if (payload) {
for (const [key, value] of Object.entries(payload)) {
urlObj.searchParams.set(key, value);
}
}
try {
const request = new Request(urlObj.toString());
if (__classPrivateFieldGet(this, _Fetcher_cookie, "f")) {
request.headers.set('Cookie', __classPrivateFieldGet(this, _Fetcher_cookie, "f"));
}
response = await fetch(request);
}
catch (error) {
throw new FetchError(error);
}
}
else {
const init = {
method: 'POST',
body: payload ? JSON.stringify(payload) : undefined
};
const request = new Request(url);
request.headers.set('Content-Type', 'application/json');
if (__classPrivateFieldGet(this, _Fetcher_cookie, "f")) {
request.headers.set('Cookie', __classPrivateFieldGet(this, _Fetcher_cookie, "f"));
}
try {
response = await fetch(request, init);
}
catch (error) {
throw new FetchError(error);
}
}
if (response.status === 429) {
throw new FetchError({
message: '429 Too Many Requests',
code: 429
});
}
if (jsonResponse) {
return response.json();
}
return response.text();
});
}
}
_Fetcher_cookie = new WeakMap(), _Fetcher_cache = new WeakMap();
export default Fetcher;
function getCacheKey(url, jsonResponse, payload) {
return url + (jsonResponse ? ':json' : ':html') +
(payload ? `:${JSON.stringify(payload)}` : '');
}
export class FetchError extends Error {
constructor(payload) {
super();
if (payload?.message) {
this.message = payload.message;
}
if (payload?.code) {
this.code = payload.code;
}
if (payload?.stack) {
this.stack = payload.stack;
}
}
}
//# sourceMappingURL=Fetcher.js.map