UNPKG

dune-ts

Version:

Unofficial Dune Analytics Typescript Client

140 lines 15.7 kB
import { __decorate, __metadata } from "tslib"; import { EXECUTE_QUERY_BODY, HEADERS, QUERY_BODY, URLS } from './constants'; import { Cookies } from './Cookies'; import { isCookiesPresent, isCsrfPresent, isTokenPresent, maybeLogin, } from './decorators'; import { Parameters } from './Parameters'; import { delay } from './utils'; export class Dune { password; username; cookies; csrf; token; executionId; loggedAt; constructor(credentials = {}) { let { password, username } = credentials; password ??= process.env.DUNE_PASSWORD; username ??= process.env.DUNE_USERNAME; Object.entries(credentials).forEach(([key, value]) => { if (typeof value !== 'string') throw new Error(`${key} should be a string`); if (value === '') throw new Error(`${key} should be a non empty string`); }); this.password = password; this.username = username; this.cookies = new Cookies(); } async getCsrfToken() { const response = await fetch(URLS.CSRF, { method: 'POST' }); this.csrf = (await response.json()).csrf; this.cookies.set(response); } async getAuthCookies() { await fetch(URLS.AUTH, { body: new URLSearchParams({ action: 'login', csrf: this.csrf, next: URLS.BASE, password: this.password, username: this.username, }), headers: { ...HEADERS, 'Content-Type': 'application/x-www-form-urlencoded', cookie: `csrf=${this.csrf}`, }, method: 'POST', redirect: 'manual', }).then((res) => { this.cookies.set(res); }); } async getAuthToken() { const response = await fetch(URLS.SESSION, { body: 'false', headers: { ...HEADERS, cookie: this.cookies.toString(), }, method: 'POST', }); this.token = (await response.json()).token; } async login() { await this.getCsrfToken(); await this.getAuthCookies(); await this.getAuthToken(); this.loggedAt = new Date(); } async executeQuery(queryId, parameters = []) { const res = await fetch(URLS.GRAPH_EXEC_ID, { body: JSON.stringify({ ...EXECUTE_QUERY_BODY, variables: { parameters, query_id: queryId }, }), headers: { ...HEADERS, authorization: `Bearer ${this.token}`, 'Content-Type': 'application/json', }, method: 'POST', }); this.executionId = (await res.json()).data.execute_query_v2.job_id; } async query(queryId, parameterDatas) { const parameters = Parameters.create(parameterDatas); await this.executeQuery(queryId, parameters); let executionSucceeded = null; while (executionSucceeded === null) { const res = await fetch(URLS.GRAPH_QUERY, { body: JSON.stringify({ ...QUERY_BODY, variables: { execution_id: this.executionId, parameters, query_id: queryId, }, }), headers: { ...HEADERS, authorization: `Bearer ${this.token}`, 'Content-Type': 'application/json', }, method: 'POST', }); executionSucceeded = (await res.json()).data.get_execution .execution_succeeded; await delay(1500); } const { columns, data } = executionSucceeded; return { columns, data }; } } __decorate([ isCsrfPresent, __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", Promise) ], Dune.prototype, "getAuthCookies", null); __decorate([ isCookiesPresent, __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", Promise) ], Dune.prototype, "getAuthToken", null); __decorate([ isTokenPresent, __metadata("design:type", Function), __metadata("design:paramtypes", [Number, void 0]), __metadata("design:returntype", Promise) ], Dune.prototype, "executeQuery", null); __decorate([ maybeLogin(), __metadata("design:type", Function), __metadata("design:paramtypes", [Number, Array]), __metadata("design:returntype", Promise) ], Dune.prototype, "query", null); export const dune = new Dune(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHVuZS5qcyIsInNvdXJjZVJvb3QiOiJzcmMvIiwic291cmNlcyI6WyJEdW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDM0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQTtBQUNuQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixjQUFjLEVBQ2QsVUFBVSxHQUNYLE1BQU0sY0FBYyxDQUFBO0FBQ3JCLE9BQU8sRUFBa0IsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ3pELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFFL0IsTUFBTSxPQUFPLElBQUk7SUFDRSxRQUFRLENBQVE7SUFDaEIsUUFBUSxDQUFRO0lBQ2hCLE9BQU8sQ0FBUztJQUN6QixJQUFJLENBQW9CO0lBQ3hCLEtBQUssQ0FBb0I7SUFDMUIsV0FBVyxDQUFvQjtJQUM5QixRQUFRLENBQWtCO0lBRWxDLFlBQVksY0FBd0QsRUFBRTtRQUNwRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLFdBQVcsQ0FBQTtRQUN4QyxRQUFRLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUE7UUFDdEMsUUFBUSxLQUFLLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFBO1FBRXRDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUNuRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7Z0JBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxHQUFHLHFCQUFxQixDQUFDLENBQUE7WUFDOUMsSUFBSSxLQUFLLEtBQUssRUFBRTtnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcs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Q0FBQTtJQUMxQixDQUFDO0NBQ0Y7QUFwR2U7SUFEYixhQUFhOzs7OzBDQXNCYjtBQUdhO0lBRGIsZ0JBQWdCOzs7O3dDQVloQjtBQVVhO0lBRGIsY0FBYzs7Ozt3Q0FvQmQ7QUFHWTtJQURaLFVBQVUsRUFBRTs7OztpQ0FpQ1o7QUFHSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVYRUNVVEVfUVVFUllfQk9EWSwgSEVBREVSUywgUVVFUllfQk9EWSwgVVJMUyB9IGZyb20gJy4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgQ29va2llcyB9IGZyb20gJy4vQ29va2llcydcbmltcG9ydCB7XG4gIGlzQ29va2llc1ByZXNlbnQsXG4gIGlzQ3NyZlByZXNlbnQsXG4gIGlzVG9rZW5QcmVzZW50LFxuICBtYXliZUxvZ2luLFxufSBmcm9tICcuL2RlY29yYXRvcnMnXG5pbXBvcnQgeyBQYXJhbWV0ZXJEYXRhcywgUGFyYW1ldGVycyB9IGZyb20gJy4vUGFyYW1ldGVycydcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSAnLi91dGlscydcblxuZXhwb3J0IGNsYXNzIER1bmUge1xuICBwcml2YXRlIHJlYWRvbmx5IHBhc3N3b3JkOiBzdHJpbmdcbiAgcHJpdmF0ZSByZWFkb25seSB1c2VybmFtZTogc3RyaW5nXG4gIHByaXZhdGUgcmVhZG9ubHkgY29va2llczogQ29va2llc1xuICBwcml2YXRlIGNzcmY6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBwcml2YXRlIHRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgcHVibGljIGV4ZWN1dGlvbklkOiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgcHJpdmF0ZSBsb2dnZWRBdDogRGF0ZSB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0cnVjdG9yKGNyZWRlbnRpYWxzOiB7IHBhc3N3b3JkPzogc3RyaW5nOyB1c2VybmFtZT86IHN0cmluZyB9ID0ge30pIHtcbiAgICBsZXQgeyBwYXNzd29yZCwgdXNlcm5hbWUgfSA9IGNyZWRlbnRpYWxzXG4gICAgcGFzc3dvcmQgPz89IHByb2Nlc3MuZW52LkRVTkVfUEFTU1dPUkRcbiAgICB1c2VybmFtZSA/Pz0gcHJvY2Vzcy5lbnYuRFVORV9VU0VSTkFNRVxuXG4gICAgT2JqZWN0LmVudHJpZXMoY3JlZGVudGlhbHMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtrZXl9IHNob3VsZCBiZSBhIHN0cmluZ2ApXG4gICAgICBpZiAodmFsdWUgPT09ICcnKSB0aHJvdyBuZXcgRXJyb3IoYCR7a2V5fSBzaG91bGQgYmUgYSBub24gZW1wdHkgc3RyaW5nYClcbiAgICB9KVxuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWVcbiAgICB0aGlzLmNvb2tpZXMgPSBuZXcgQ29va2llcygpXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldENzcmZUb2tlbigpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFVSTFMuQ1NSRiwgeyBtZXRob2Q6ICdQT1NUJyB9KVxuXG4gICAgdGhpcy5jc3JmID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkuY3NyZlxuICAgIHRoaXMuY29va2llcy5zZXQocmVzcG9uc2UpXG4gIH1cblxuICBAaXNDc3JmUHJlc2VudFxuICBwcml2YXRlIGFzeW5jIGdldEF1dGhDb29raWVzKCkge1xuICAgIGF3YWl0IGZldGNoKFVSTFMuQVVUSCwge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAgLSBkZWNvcmF0b3IgYWxyZWFkeSBjaGVja3MgaWYgY3NyZiBpcyBkZWZpbmVkXG4gICAgICBib2R5OiBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgYWN0aW9uOiAnbG9naW4nLFxuICAgICAgICBjc3JmOiB0aGlzLmNzcmYsXG4gICAgICAgIG5leHQ6IFVSTFMuQkFTRSxcbiAgICAgICAgcGFzc3dvcmQ6IHRoaXMucGFzc3dvcmQsXG4gICAgICAgIHVzZXJuYW1lOiB0aGlzLnVzZXJuYW1lLFxuICAgICAgfSksXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIC4uLkhFQURFUlMsXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICBjb29raWU6IGBjc3JmPSR7dGhpcy5jc3JmfWAsXG4gICAgICB9LFxuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICByZWRpcmVjdDogJ21hbnVhbCcsXG4gICAgfSkudGhlbigocmVzKSA9PiB7XG4gICAgICB0aGlzLmNvb2tpZXMuc2V0KHJlcylcbiAgICB9KVxuICB9XG5cbiAgQGlzQ29va2llc1ByZXNlbnRcbiAgcHJpdmF0ZSBhc3luYyBnZXRBdXRoVG9rZW4oKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChVUkxTLlNFU1NJT04sIHtcbiAgICAgIGJvZHk6ICdmYWxzZScsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIC4uLkhFQURFUlMsXG4gICAgICAgIGNvb2tpZTogdGhpcy5jb29raWVzLnRvU3RyaW5nKCksXG4gICAgICB9LFxuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgfSlcblxuICAgIHRoaXMudG9rZW4gPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKS50b2tlblxuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvZ2luKCkge1xuICAgIGF3YWl0IHRoaXMuZ2V0Q3NyZlRva2VuKClcbiAgICBhd2FpdCB0aGlzLmdldEF1dGhDb29raWVzKClcbiAgICBhd2FpdCB0aGlzLmdldEF1dGhUb2tlbigpXG4gICAgdGhpcy5sb2dnZWRBdCA9IG5ldyBEYXRlKClcbiAgfVxuXG4gIEBpc1Rva2VuUHJlc2VudFxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVRdWVyeShcbiAgICBxdWVyeUlkOiBudW1iZXIsXG4gICAgcGFyYW1ldGVyczogUmV0dXJuVHlwZTx0eXBlb2YgUGFyYW1ldGVycy5jcmVhdGU+ID0gW10sXG4gICkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFVSTFMuR1JBUEhfRVhFQ19JRCwge1xuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAuLi5FWEVDVVRFX1FVRVJZX0JPRFksXG4gICAgICAgIHZhcmlhYmxlczogeyBwYXJhbWV0ZXJzLCBxdWVyeV9pZDogcXVlcnlJZCB9LFxuICAgICAgfSksXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIC4uLkhFQURFUlMsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMudG9rZW59YCxcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIH0sXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICB9KVxuXG4gICAgdGhpcy5leGVjdXRpb25JZCA9IChhd2FpdCByZXMuanNvbigpKS5kYXRhLmV4ZWN1dGVfcXVlcnlfdjIuam9iX2lkXG4gIH1cblxuICBAbWF5YmVMb2dpbigpXG4gIHB1YmxpYyBhc3luYyBxdWVyeShxdWVyeUlkOiBudW1iZXIsIHBhcmFtZXRlckRhdGFzPzogUGFyYW1ldGVyRGF0YXMpIHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gUGFyYW1ldGVycy5jcmVhdGUocGFyYW1ldGVyRGF0YXMpXG4gICAgYXdhaXQgdGhpcy5leGVjdXRlUXVlcnkocXVlcnlJZCwgcGFyYW1ldGVycylcblxuICAgIGxldCBleGVjdXRpb25TdWNjZWVkZWQ6IG51bGwgfCB7IGNvbHVtbnM6IHN0cmluZ1tdOyBkYXRhOiBhbnlbXSB9ID0gbnVsbFxuXG4gICAgd2hpbGUgKGV4ZWN1dGlvblN1Y2NlZWRlZCA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goVVJMUy5HUkFQSF9RVUVSWSwge1xuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgLi4uUVVFUllfQk9EWSxcbiAgICAgICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgICAgIGV4ZWN1dGlvbl9pZDogdGhpcy5leGVjdXRpb25JZCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnMsXG4gICAgICAgICAgICBxdWVyeV9pZDogcXVlcnlJZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIC4uLkhFQURFUlMsXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICAgIGF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLnRva2VufWAsXG4gICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICB9KVxuICAgICAgZXhlY3V0aW9uU3VjY2VlZGVkID0gKGF3YWl0IHJlcy5qc29uKCkpLmRhdGEuZ2V0X2V4ZWN1dGlvblxuICAgICAgICAuZXhlY3V0aW9uX3N1Y2NlZWRlZFxuXG4gICAgICBhd2FpdCBkZWxheSgxNTAwKVxuICAgIH1cblxuICAgIGNvbnN0IHsgY29sdW1ucywgZGF0YSB9ID0gZXhlY3V0aW9uU3VjY2VlZGVkXG4gICAgcmV0dXJuIHsgY29sdW1ucywgZGF0YSB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGR1bmUgPSBuZXcgRHVuZSgpXG4iXX0=