UNPKG

dune-ts

Version:

Unofficial Dune Analytics Typescript Client

128 lines 16.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.dune = exports.Dune = void 0; const tslib_1 = require("tslib"); const constants_1 = require("./constants"); const Cookies_1 = require("./Cookies"); const decorators_1 = require("./decorators"); const Parameters_1 = require("./Parameters"); const utils_1 = require("./utils"); class Dune { constructor(credentials = {}) { let { password, username } = credentials; password !== null && password !== void 0 ? password : (password = process.env.DUNE_PASSWORD); username !== null && username !== void 0 ? username : (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_1.Cookies(); } getCsrfToken() { return tslib_1.__awaiter(this, void 0, void 0, function* () { const response = yield fetch(constants_1.URLS.CSRF, { method: 'POST' }); this.csrf = (yield response.json()).csrf; this.cookies.set(response); }); } getAuthCookies() { return tslib_1.__awaiter(this, void 0, void 0, function* () { yield fetch(constants_1.URLS.AUTH, { body: new URLSearchParams({ action: 'login', csrf: this.csrf, next: constants_1.URLS.BASE, password: this.password, username: this.username, }), headers: Object.assign(Object.assign({}, constants_1.HEADERS), { 'Content-Type': 'application/x-www-form-urlencoded', cookie: `csrf=${this.csrf}` }), method: 'POST', redirect: 'manual', }).then((res) => { this.cookies.set(res); }); }); } getAuthToken() { return tslib_1.__awaiter(this, void 0, void 0, function* () { const response = yield fetch(constants_1.URLS.SESSION, { body: 'false', headers: Object.assign(Object.assign({}, constants_1.HEADERS), { cookie: this.cookies.toString() }), method: 'POST', }); this.token = (yield response.json()).token; }); } login() { return tslib_1.__awaiter(this, void 0, void 0, function* () { yield this.getCsrfToken(); yield this.getAuthCookies(); yield this.getAuthToken(); this.loggedAt = new Date(); }); } executeQuery(queryId, parameters = []) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const res = yield fetch(constants_1.URLS.GRAPH_EXEC_ID, { body: JSON.stringify(Object.assign(Object.assign({}, constants_1.EXECUTE_QUERY_BODY), { variables: { parameters, query_id: queryId } })), headers: Object.assign(Object.assign({}, constants_1.HEADERS), { authorization: `Bearer ${this.token}`, 'Content-Type': 'application/json' }), method: 'POST', }); this.executionId = (yield res.json()).data.execute_query_v2.job_id; }); } query(queryId, parameterDatas) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const parameters = Parameters_1.Parameters.create(parameterDatas); yield this.executeQuery(queryId, parameters); let executionSucceeded = null; while (executionSucceeded === null) { const res = yield fetch(constants_1.URLS.GRAPH_QUERY, { body: JSON.stringify(Object.assign(Object.assign({}, constants_1.QUERY_BODY), { variables: { execution_id: this.executionId, parameters, query_id: queryId, } })), headers: Object.assign(Object.assign({}, constants_1.HEADERS), { authorization: `Bearer ${this.token}`, 'Content-Type': 'application/json' }), method: 'POST', }); executionSucceeded = (yield res.json()).data.get_execution .execution_succeeded; yield (0, utils_1.delay)(1500); } const { columns, data } = executionSucceeded; return { columns, data }; }); } } tslib_1.__decorate([ decorators_1.isCsrfPresent, tslib_1.__metadata("design:type", Function), tslib_1.__metadata("design:paramtypes", []), tslib_1.__metadata("design:returntype", Promise) ], Dune.prototype, "getAuthCookies", null); tslib_1.__decorate([ decorators_1.isCookiesPresent, tslib_1.__metadata("design:type", Function), tslib_1.__metadata("design:paramtypes", []), tslib_1.__metadata("design:returntype", Promise) ], Dune.prototype, "getAuthToken", null); tslib_1.__decorate([ decorators_1.isTokenPresent, tslib_1.__metadata("design:type", Function), tslib_1.__metadata("design:paramtypes", [Number, void 0]), tslib_1.__metadata("design:returntype", Promise) ], Dune.prototype, "executeQuery", null); tslib_1.__decorate([ (0, decorators_1.maybeLogin)(), tslib_1.__metadata("design:type", Function), tslib_1.__metadata("design:paramtypes", [Number, Array]), tslib_1.__metadata("design:returntype", Promise) ], Dune.prototype, "query", null); exports.Dune = Dune; exports.dune = new Dune(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHVuZS5qcyIsInNvdXJjZVJvb3QiOiJzcmMvIiwic291cmNlcyI6WyJEdW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSwyQ0FBMkU7QUFDM0UsdUNBQW1DO0FBQ25DLDZDQUtxQjtBQUNyQiw2Q0FBeUQ7QUFDekQsbUNBQStCO0FBRS9CLE1BQWEsSUFBSTtJQVNmLFlBQVksY0FBd0QsRUFBRTtRQUNwRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxHQUFHLFdBQVcsQ0FBQTtRQUN4QyxRQUFRLGFBQVIsUUFBUSxjQUFSLFFBQVEsSUFBUixRQUFRLEdBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUE7UUFDdEMsUUFBUSxhQUFSLFFBQVEsY0FBUixRQUFRLElBQVIsUUFBUSxHQUFLLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFBO1FBRXRDLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUNuRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7Z0JBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxHQUFHLHFCQUFxQixDQUFDLENBQUE7WUFDOUMsSUFBSSxLQUFLLEtBQUssRUFBRTtnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsR0FBRywrQkFBK0IsQ0FBQyxDQUFBO1FBQzFFLENBQUMsQ0FBQyxDQUFBO1FBR0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7UUFFeEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7UUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLGlCQUFPLEVBQUUsQ0FBQTtJQUM5QixDQUFDO0lBRWEsWUFBWTs7WUFDeEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsZ0JBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFF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R0FBRyxHQUFHLE1BQU0sS0FBSyxDQUFDLGdCQUFJLENBQUMsV0FBVyxFQUFFO29CQUN4QyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsaUNBQ2Ysc0JBQVUsS0FDYixTQUFTLEVBQUU7NEJBQ1QsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXOzRCQUM5QixVQUFVOzRCQUNWLFFBQVEsRUFBRSxPQUFPO3lCQUNsQixJQUNEO29CQUNGLE9BQU8sa0NBQ0YsbUJBQU8sS0FFVixhQUFhLEVBQUUsVUFBVSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQ3JDLGNBQWMsRUFBRSxrQkFBa0IsR0FDbkM7b0JBQ0QsTUFBTSxFQUFFLE1BQU07aUJBQ2YsQ0FBQyxDQUFBO2dCQUNGLGtCQUFrQixHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYTtxQkFDdkQsbUJBQW1CLENBQUE7Z0JBRXRCLE1BQU0sSUFBQSxhQUFLLEVBQUMsSUFBSSxDQUFDLENBQUE7YUFDbEI7WUFFRCxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLGtCQUFrQixDQUFBO1lBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUE7UUFDMUIsQ0FBQztLQUFBO0NBQ0Y7QUFwR2U7SUFEYiwwQkFBYTs7OzswQ0FzQmI7QUFHYTtJQURiLDZCQUFnQjs7Ozt3Q0FZaEI7QUFVYTtJQURiLDJCQUFjOzs7O3dDQW9CZDtBQUdZO0lBRFosSUFBQSx1QkFBVSxHQUFFOzs7O2lDQWlDWjtBQXRJSCxvQkF1SUM7QUFFWSxRQUFBLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRVhFQ1VURV9RVUVSWV9CT0RZLCBIRUFERVJTLCBRVUVSWV9CT0RZLCBVUkxTIH0gZnJvbSAnLi9jb25zdGFudHMnXG5pbXBvcnQgeyBDb29raWVzIH0gZnJvbSAnLi9Db29raWVzJ1xuaW1wb3J0IHtcbiAgaXNDb29raWVzUHJlc2VudCxcbiAgaXNDc3JmUHJlc2VudCxcbiAgaXNUb2tlblByZXNlbnQsXG4gIG1heWJlTG9naW4sXG59IGZyb20gJy4vZGVjb3JhdG9ycydcbmltcG9ydCB7IFBhcmFtZXRlckRhdGFzLCBQYXJhbWV0ZXJzIH0gZnJvbSAnLi9QYXJhbWV0ZXJzJ1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tICcuL3V0aWxzJ1xuXG5leHBvcnQgY2xhc3MgRHVuZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFzc3dvcmQ6IHN0cmluZ1xuICBwcml2YXRlIHJlYWRvbmx5IHVzZXJuYW1lOiBzdHJpbmdcbiAgcHJpdmF0ZSByZWFkb25seSBjb29raWVzOiBDb29raWVzXG4gIHByaXZhdGUgY3NyZjogc3RyaW5nIHwgdW5kZWZpbmVkXG4gIHByaXZhdGUgdG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZFxuICBwdWJsaWMgZXhlY3V0aW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuICBwcml2YXRlIGxvZ2dlZEF0OiBEYXRlIHwgdW5kZWZpbmVkXG5cbiAgY29uc3RydWN0b3IoY3JlZGVudGlhbHM6IHsgcGFzc3dvcmQ/OiBzdHJpbmc7IHVzZXJuYW1lPzogc3RyaW5nIH0gPSB7fSkge1xuICAgIGxldCB7IHBhc3N3b3JkLCB1c2VybmFtZSB9ID0gY3JlZGVudGlhbHNcbiAgICBwYXNzd29yZCA/Pz0gcHJvY2Vzcy5lbnYuRFVORV9QQVNTV09SRFxuICAgIHVzZXJuYW1lID8/PSBwcm9jZXNzLmVudi5EVU5FX1VTRVJOQU1FXG5cbiAgICBPYmplY3QuZW50cmllcyhjcmVkZW50aWFscykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2tleX0gc2hvdWxkIGJlIGEgc3RyaW5nYClcbiAgICAgIGlmICh2YWx1ZSA9PT0gJycpIHRocm93IG5ldyBFcnJvcihgJHtrZXl9IHNob3VsZCBiZSBhIG5vbiBlbXB0eSBzdHJpbmdgKVxuICAgIH0pXG5cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIHRoaXMudXNlcm5hbWUgPSB1c2VybmFtZVxuICAgIHRoaXMuY29va2llcyA9IG5ldyBDb29raWVzKClcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q3NyZlRva2VuKCkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goVVJMUy5DU1JGLCB7IG1ldGhvZDogJ1BPU1QnIH0pXG5cbiAgICB0aGlzLmNzcmYgPSAoYXdhaXQgcmVzcG9uc2UuanNvbigpKS5jc3JmXG4gICAgdGhpcy5jb29raWVzLnNldChyZXNwb25zZSlcbiAgfVxuXG4gIEBpc0NzcmZQcmVzZW50XG4gIHByaXZhdGUgYXN5bmMgZ2V0QXV0aENvb2tpZXMoKSB7XG4gICAgYXdhaXQgZmV0Y2goVVJMUy5BVVRILCB7XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yICAtIGRlY29yYXRvciBhbHJlYWR5IGNoZWNrcyBpZiBjc3JmIGlzIGRlZmluZWRcbiAgICAgIGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICBhY3Rpb246ICdsb2dpbicsXG4gICAgICAgIGNzcmY6IHRoaXMuY3NyZixcbiAgICAgICAgbmV4dDogVVJMUy5CQVNFLFxuICAgICAgICBwYXNzd29yZDogdGhpcy5wYXNzd29yZCxcbiAgICAgICAgdXNlcm5hbWU6IHRoaXMudXNlcm5hbWUsXG4gICAgICB9KSxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgLi4uSEVBREVSUyxcbiAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgIGNvb2tpZTogYGNzcmY9JHt0aGlzLmNzcmZ9YCxcbiAgICAgIH0sXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIHJlZGlyZWN0OiAnbWFudWFsJyxcbiAgICB9KS50aGVuKChyZXMpID0+IHtcbiAgICAgIHRoaXMuY29va2llcy5zZXQocmVzKVxuICAgIH0pXG4gIH1cblxuICBAaXNDb29raWVzUHJlc2VudFxuICBwcml2YXRlIGFzeW5jIGdldEF1dGhUb2tlbigpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKFVSTFMuU0VTU0lPTiwge1xuICAgICAgYm9keTogJ2ZhbHNlJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgLi4uSEVBREVSUyxcbiAgICAgICAgY29va2llOiB0aGlzLmNvb2tpZXMudG9TdHJpbmcoKSxcbiAgICAgIH0sXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICB9KVxuXG4gICAgdGhpcy50b2tlbiA9IChhd2FpdCByZXNwb25zZS5qc29uKCkpLnRva2VuXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9naW4oKSB7XG4gICAgYXdhaXQgdGhpcy5nZXRDc3JmVG9rZW4oKVxuICAgIGF3YWl0IHRoaXMuZ2V0QXV0aENvb2tpZXMoKVxuICAgIGF3YWl0IHRoaXMuZ2V0QXV0aFRva2VuKClcbiAgICB0aGlzLmxvZ2dlZEF0ID0gbmV3IERhdGUoKVxuICB9XG5cbiAgQGlzVG9rZW5QcmVzZW50XG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZVF1ZXJ5KFxuICAgIHF1ZXJ5SWQ6IG51bWJlcixcbiAgICBwYXJhbWV0ZXJzOiBSZXR1cm5UeXBlPHR5cGVvZiBQYXJhbWV0ZXJzLmNyZWF0ZT4gPSBbXSxcbiAgKSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goVVJMUy5HUkFQSF9FWEVDX0lELCB7XG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIC4uLkVYRUNVVEVfUVVFUllfQk9EWSxcbiAgICAgICAgdmFyaWFibGVzOiB7IHBhcmFtZXRlcnMsIHF1ZXJ5X2lkOiBxdWVyeUlkIH0sXG4gICAgICB9KSxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgLi4uSEVBREVSUyxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9yZXN0cmljdC10ZW1wbGF0ZS1leHByZXNzaW9uc1xuICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy50b2tlbn1gLFxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIH0pXG5cbiAgICB0aGlzLmV4ZWN1dGlvbklkID0gKGF3YWl0IHJlcy5qc29uKCkpLmRhdGEuZXhlY3V0ZV9xdWVyeV92Mi5qb2JfaWRcbiAgfVxuXG4gIEBtYXliZUxvZ2luKClcbiAgcHVibGljIGFzeW5jIHF1ZXJ5KHF1ZXJ5SWQ6IG51bWJlciwgcGFyYW1ldGVyRGF0YXM/OiBQYXJhbWV0ZXJEYXRhcykge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBQYXJhbWV0ZXJzLmNyZWF0ZShwYXJhbWV0ZXJEYXRhcylcbiAgICBhd2FpdCB0aGlzLmV4ZWN1dGVRdWVyeShxdWVyeUlkLCBwYXJhbWV0ZXJzKVxuXG4gICAgbGV0IGV4ZWN1dGlvblN1Y2NlZWRlZDogbnVsbCB8IHsgY29sdW1uczogc3RyaW5nW107IGRhdGE6IGFueVtdIH0gPSBudWxsXG5cbiAgICB3aGlsZSAoZXhlY3V0aW9uU3VjY2VlZGVkID09PSBudWxsKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChVUkxTLkdSQVBIX1FVRVJZLCB7XG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAuLi5RVUVSWV9CT0RZLFxuICAgICAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICAgICAgZXhlY3V0aW9uX2lkOiB0aGlzLmV4ZWN1dGlvbklkLFxuICAgICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICAgIHF1ZXJ5X2lkOiBxdWVyeUlkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgLi4uSEVBREVSUyxcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3Jlc3RyaWN0LXRlbXBsYXRlLWV4cHJlc3Npb25zXG4gICAgICAgICAgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke3RoaXMudG9rZW59YCxcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9LFxuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIH0pXG4gICAgICBleGVjdXRpb25TdWNjZWVkZWQgPSAoYXdhaXQgcmVzLmpzb24oKSkuZGF0YS5nZXRfZXhlY3V0aW9uXG4gICAgICAgIC5leGVjdXRpb25fc3VjY2VlZGVkXG5cbiAgICAgIGF3YWl0IGRlbGF5KDE1MDApXG4gICAgfVxuXG4gICAgY29uc3QgeyBjb2x1bW5zLCBkYXRhIH0gPSBleGVjdXRpb25TdWNjZWVkZWRcbiAgICByZXR1cm4geyBjb2x1bW5zLCBkYXRhIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZHVuZSA9IG5ldyBEdW5lKClcbiJdfQ==