@grammyjs/storage-free
Version:
Storage adapter for grammY's free sessions
103 lines • 8.58 kB
JavaScript
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTztJQUVYLFlBQ21CLEtBQWEsRUFDYixVQUFVLDBDQUEwQztRQURwRCxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsWUFBTyxHQUFQLE9BQU8sQ0FBNkM7SUFDcEUsQ0FBQztJQUVKLEtBQUssQ0FBQyxLQUFLO1FBQ1QsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sUUFBUSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDbkQsTUFBTSxRQUFRLEdBQUcsTUFBTSxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2pFLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7WUFDakUsQ0FBQztZQUNELElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDO1FBQ25CLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FDUixNQUFpQyxFQUNqQyxHQUFZLEVBQUUsMENBQTBDO0lBQ3hELElBQWE7UUFFYixrQkFBa0I7UUFDbEIsTUFBTSxH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