import got from 'got'; const stringify = (obj) => JSON.stringify(obj, null, 2); const parse = (str) => JSON.parse(str, (_, v) => { if ( v !== null && typeof v === 'object' && 'type' in v && v.type === 'Buffer' && 'data' in v && Array.isArray(v.data)) { return Buffer.from(v.data); } return v; }); class CloudDBAdapter { constructor(url, { serialize = stringify, deserialize = parse, fetchOptions = {}, } = {}) { this.url = url; this.serialize = serialize; this.deserialize = deserialize; this.fetchOptions = fetchOptions; } async read() { try { const res = await got(this.url, { method: 'GET', headers: { 'Accept': 'application/json;q=0.9,text/plain', }, ...this.fetchOptions, }); if (res.statusCode !== 200) throw res.statusMessage; return this.deserialize(res.body); } catch (e) { return null; } } async write(obj) { const res = await got(this.url, { method: 'POST', headers: { 'Content-Type': 'application/json', }, ...this.fetchOptions, body: this.serialize(obj), }); if (res.statusCode !== 200) throw res.statusMessage; return res.body; } } export default CloudDBAdapter;