UNPKG

@grammyjs/storage-free

Version:

Storage adapter for grammY's free sessions

103 lines 8.58 kB
class Storage { constructor(token, rootUrl = 'https://grammy-free-session.deno.dev/api') { this.token = token; this.rootUrl = rootUrl; } async login() { if (this.jwt === undefined) { const url = `${this.rootUrl}/login`; const body = JSON.stringify({ token: this.token }); const response = await retryFetch(url, { method: 'POST', body }); const { token } = await response.json(); if (typeof token !== 'string') { throw new Error('Cannot use free session, invalid bot token!'); } this.jwt = token; } return this.jwt; } logout() { this.jwt = undefined; } async call(method, key, // make key optional to allow global calls body) { // perform request const url = key !== undefined ? `${this.rootUrl}/session/${key}` : `${this.rootUrl}/sessions`; // define url based on key const jwt = await this.login(); const headers = { 'Authorization': `Bearer ${jwt}` }; const response = await retryFetch(url, { method, body, headers }); // handle response if (response.status === 401) { // token was revoked, must login again this.logout(); return await this.call(method, key, body); } else if (response.status === 404) { // empty session return undefined; } else if (200 <= response.status && response.status < 300) { // success return method === 'GET' ? await response.text() : undefined; } else { // error throw new Error(`${response.status}: ${(await response.json()).error}`); } } } /** * @param token The bot token of your bot. * @param opts Further configuration options * @returns An adapter to grammY's free session storage */ export function freeStorage(token, opts) { const storage = new Storage(token, opts === null || opts === void 0 ? void 0 : opts.rootUrl); if ((opts === null || opts === void 0 ? void 0 : opts.jwt) !== undefined) storage.jwt = opts.jwt; return { async readAllKeys() { const keys = await storage.call('GET'); return keys === undefined ? undefined : JSON.parse(keys); }, async read(key) { const session = await storage.call('GET', key); return session === undefined ? undefined : JSON.parse(session); }, async write(key, data) { await storage.call('POST', key, JSON.stringify(data)); }, async delete(key) { await storage.call('DELETE', key); }, /** * Returns the storage authentication token which is used to store the * session data. Only useful if you want to avoid the login call that will * be performed automatically when the storage adapter contacts its backend * for the first time. This can improve startup performance and is * especially useful in serverless environments. */ async getToken() { return await storage.login(); }, }; } async function retryFetch(...args) { let res; let delay = 10; // ms do { res = await fetch(...args); if (res.status >= 500) { console.error(`${res.status} in free session service, retrying!`); await sleep(delay); delay += delay; // exponential back-off delay = Math.min(delay, 1000 * 60 * 60); // cap at 1 hour } } while (res.status >= 500); return res; } async function sleep(ms) { await new Promise((r) => setTimeout(r, ms)); } import { fetch } from "./shim.node.js"; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTztJQUVYLFlBQ21CLEtBQWEsRUFDYixVQUFVLDBDQUEwQztRQURwRCxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsWUFBTyxHQUFQLE9BQU8sQ0FBNkM7SUFDcEUsQ0FBQztJQUVKLEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sUUFBUSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDbkQsTUFBTSxRQUFRLEdBQUcsTUFBTSxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7WUFDakUsQ0FBQztZQUNELElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDO1FBQ25CLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FDUixNQUFpQyxFQUNqQyxHQUFZLEVBQUUsMENBQTBDO0lBQ3hELElBQWE7UUFFYixrQkFBa0I7UUFDbEIsTUFBTSxHQUFHLEdBQUcsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxZQUFZLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLFdBQVcsQ0FBQyxDQUFDLDBCQUEwQjtRQUN6SCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvQixNQUFNLE9BQU8sR0FBRyxFQUFFLGVBQWUsRUFBRSxVQUFVLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDckQsTUFBTSxRQUFRLEdBQUcsTUFBTSxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLGtCQUFrQjtRQUNsQixJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDNUIsc0NBQXNDO1lBQ3RDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLE9BQU8sTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUMsQ0FBQzthQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUNuQyxnQkFBZ0I7WUFDaEIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQzthQUFNLElBQUksR0FBRyxJQUFJLFFBQVEsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUMzRCxVQUFVO1lBQ1YsT0FBTyxNQUFNLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzlELENBQUM7YUFBTSxDQUFDO1lBQ04sUUFBUTtZQUNSLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFtQkQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUksS0FBYSxFQUFFLElBQXFCO0lBQ2pFLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEQsSUFBSSxDQUFBLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxHQUFHLE1BQUssU0FBUztRQUFFLE9BQU8sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNwRCxPQUFPO1FBQ0wsS0FBSyxDQUFDLFdBQVc7WUFDZixNQUFNLElBQUksR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkMsT0FBTyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBVztZQUNwQixNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQy9DLE9BQU8sT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQVcsRUFBRSxJQUFPO1lBQzlCLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFXO1lBQ3RCLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNEOzs7Ozs7V0FNRztRQUNILEtBQUssQ0FBQyxRQUFRO1lBQ1osT0FBTyxNQUFNLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMvQixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxLQUFLLFVBQVUsVUFBVSxDQUN2QixHQUFHLElBQThCO0lBRWpDLElBQUksR0FBc0MsQ0FBQztJQUMzQyxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLO0lBQ3JCLEdBQUcsQ0FBQztRQUNGLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztZQUN0QixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0scUNBQXFDLENBQUMsQ0FBQztZQUNsRSxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQixLQUFLLElBQUksS0FBSyxDQUFDLENBQUMsdUJBQXVCO1lBQ3ZDLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO1FBQzNELENBQUM7SUFDSCxDQUFDLFFBQVEsR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUU7SUFDNUIsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsS0FBSyxVQUFVLEtBQUssQ0FBQyxFQUFVO0lBQzdCLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDIn0=