dune-ts
Version:
Unofficial Dune Analytics Typescript Client
128 lines • 16.2 kB
JavaScript
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==
;