qliksense-api
Version:
Best Wrapper For Qlik Sense API, This package is designed to be the simplest way possible to connect to Qlik Sense.
263 lines (232 loc) • 10.2 kB
JavaScript
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"
const unifyOptions = require('./libs/createClient');
const requestOptions = require('./libs/requestOptions');
const socket = require('./libs/socketConnection');
const https = require('https');
const path = require('path');
const fs = require('fs');
const helpers = require('./libs/helpers')
const querystring = require('querystring');
function QlikConnection (options) {
this.options = options
this.options.certPath = path.join('C:', 'ProgramData', 'Qlik', 'Sense', 'Repository', 'Exported Certificates', '.Local Certificates');
}
QlikConnection.prototype.getAbout = async function () {
let reqOptions = requestOptions.getOptions('about', this.options)
let res = await requestGetDispatcher(reqOptions)
return res
}
QlikConnection.prototype.getApps = async function () {
let reqOptions = requestOptions.getOptions('apps', this.options)
let res = await requestGetDispatcher(reqOptions)
return res
}
QlikConnection.prototype.getEngine = async function () {
let reqOptions = requestOptions.getOptions('engine', this.options)
let res = await requestGetDispatcher(reqOptions)
return res
}
QlikConnection.prototype.getHealthCheck = async function () {
let reqOptions = requestOptions.getOptions('healthcheck', this.options)
let res = await requestGetDispatcher(reqOptions)
return res
}
QlikConnection.prototype.doReloadTask = async function (taskName) {
if (!taskName) throw new Error('No taskName or file Reference Id declared')
let reqOptions = requestOptions.getOptions('doReloadTask', this.options)
reqOptions.path = reqOptions.path.replace('##path##', encodeURIComponent(taskName))
let res = await requestGetDispatcher(reqOptions)
return res
}
QlikConnection.prototype.getReloadTaskToken = async function (id, fileId) {
if(!id || !fileId) throw new Error('No taskId or file Reference Id declared')
let path = `ReloadTask/${id}/scriptlog?fileReferenceId=${fileId}`
let reqOptions = requestOptions.getOptions('reloadTask', this.options)
reqOptions.path = reqOptions.path.replace('##path##', path)
let res = await requestGetDispatcher(reqOptions)
return res
}
QlikConnection.prototype.getTaskLog = async function (taskId) {
if(!taskId) throw new Error('No taskId or file Reference Id declared')
let task = await this.getQsr(`ReloadTask/${taskId}`)
let token = await this.getReloadTaskToken(task.id, task.operational.lastExecutionResult.fileReferenceID)
let log = await this.getExeutionLog(token.value, task.name)
return log
}
QlikConnection.prototype.getExecutionResult = async function () {
let reqOptions = requestOptions.getOptions('executionresult', this.options)
let res = await requestGetDispatcher(reqOptions)
return res
}
QlikConnection.prototype.getQsr = async function (path) {
let reqOptions = requestOptions.getOptions('qrs', this.options)
reqOptions.path = reqOptions.path.replace('##path##', path)
let res = await requestGetDispatcher(reqOptions)
return res
}
QlikConnection.prototype.postQsr = async function (path) {
let reqOptions = requestOptions.getOptions('postQrs', this.options)
reqOptions.path = reqOptions.path.replace('##path##', path)
let res = await requestGetDispatcher(reqOptions)
return res
}
QlikConnection.prototype.getExeutionLog = async function (referenceId, taskName) {
let path = `download/reloadtask/${referenceId}/${querystring.escape(taskName)}.log`
let reqOptions = requestOptions.getOptions('qrs', this.options)
reqOptions.path = reqOptions.path.replace('##path##', path)
let res = await requestGetDispatcher(reqOptions)
return res
}
QlikConnection.prototype.engine = async function (method, params) {
if (!params) params = []
let ws = await socket.creatSocket(this.options)
return new Promise((resolve, reject)=>{
ws.onopen = async function (event) {
let msg = helpers.buildMessage(method, -1, params, 2)
ws.send(msg);
ws.onmessage = function (event) {
let parsedAwnser = JSON.parse(event.data)
if(parsedAwnser.error) resolve(parsedAwnser.error)
if(parsedAwnser.method != 'OnConnected'){
resolve(parsedAwnser.result)
ws.close()
}
}
}
})
}
QlikConnection.prototype.openDoc = async function (docId, method, params) {
if (!params) params = []
if (!method || !docId) throw new Error('No method or docId declared')
let ws = await socket.creatSocket(this.options)
return new Promise((resolve, reject)=>{
ws.onopen = async function (event) {
let msg = helpers.buildMessage('OpenDoc', -1, [docId], 2)
ws.send(msg);
ws.onmessage = function (event) {
let parsedAwnser = JSON.parse(event.data)
if(parsedAwnser.method != 'OnConnected'){
let msg = helpers.buildMessage(method, 1, params, 5)
ws.send(msg);
ws.onmessage = function (event) {
let parsedAwnser = JSON.parse(event.data)
resolve(parsedAwnser)
ws.close()
}
}
}
}
})
}
QlikConnection.prototype.generateSession = async function (userdirectory, userName) {
let reqOptions = requestOptions.getOptions('createSession', this.options)
let bodyOptions = { 'UserDirectory': userdirectory.toString() , 'UserId': userName.toString(), "SessionId": helpers.generateUUID() }
let res = await requestPostDispatcher(reqOptions, bodyOptions)
return res
}
QlikConnection.prototype.uploadApp= async function (name, filePath) {
let reqOptions = requestOptions.getOptions('uploadApp', this.options)
reqOptions.path = reqOptions.path.replace('##path##', `name=${name}&keepdata=true&excludeConnections=false`)
let res = await requestPostApp(reqOptions, filePath)
return res
}
QlikConnection.prototype.replaceApp= async function (id,appid) {
let reqOptions = requestOptions.getOptions('replaceApp', this.options)
reqOptions.path = reqOptions.path.replace('##path##', `${id}/replace?app=${appid}`)
let res = await requestPostDispatcher(reqOptions, {})
return res
}
QlikConnection.prototype.publishApp= async function (id,streamId, name) {
let reqOptions = requestOptions.getOptions('replaceApp', this.options)
reqOptions.path = reqOptions.path.replace('##path##', `${id}/publish?stream=${streamId}&name=${name}`)
let res = await requestPostDispatcher(reqOptions, {})
return res
}
QlikConnection.prototype.deleteApp= async function (id) {
let reqOptions = requestOptions.getOptions('deleteApp', this.options)
reqOptions.path = reqOptions.path.replace('##path##', `${id}`)
let res = await requestPostDispatcher(reqOptions, {})
return res
}
QlikConnection.prototype.getSession = async function (sessionId) {
let reqOptions = requestOptions.getOptions('getSession', this.options)
reqOptions.path = reqOptions.path.replace('##path##', sessionId)
let res = await requestGetDispatcher(reqOptions)
return res
}
QlikConnection.prototype.deleteSession = async function (sessionId) {
let reqOptions = requestOptions.getOptions('deleteSession', this.options)
reqOptions.path = reqOptions.path.replace('##path##', sessionId)
let res = await requestGetDispatcher(reqOptions)
return res
}
async function requestGetDispatcher(reqOptions){
return new Promise(async function(resolve, reject){
https.get(reqOptions, function(res) {
let body = '';
res.on("data", function(chunk) {
body += chunk;
});
res.on('end', function () {
try{
resolve(JSON.parse(body.toString()))
}catch(e){
resolve(body.toString())
}
});
}).on('error', function(e) {
reject(e)
});
})
}
async function requestPostDispatcher(reqOptions, bodyOptions){
reqOptions.headers = {...reqOptions.headers, 'Content-Type': 'application/json'}
return new Promise((resolve, reject) => {
let sessionreq = https.request(reqOptions, async function (sessionres) {
let body = '';
sessionres.on("data", function(chunk) {
body += chunk;
});
sessionres.on('end', function () {
try{
resolve(JSON.parse(body.toString()))
} catch(e){
resolve(body.toString())
}
});
}).on('error', function(e) {
reject(e)
});
let jsonrequest = JSON.stringify(bodyOptions);
sessionreq.write(jsonrequest);
sessionreq.end();
sessionreq.on('error', function (e) {
reject('Error' + e);
});
})
}
async function requestPostApp(reqOptions, bodyOptions){
reqOptions.headers = {...reqOptions.headers, 'Content-Type': 'application/vnd.qlik.sense.app'}
return new Promise((resolve, reject) => {
let sessionreq = https.request(reqOptions, async function (sessionres) {
let body = '';
sessionres.on("data", function(chunk) {
body += chunk;
});
sessionres.on('end', function () {
resolve(JSON.parse(body.toString()))
});
}).on('error', function(e) {
reject(e)
});
sessionreq.write(fs.readFileSync(bodyOptions));
sessionreq.end();
sessionreq.on('error', function (e) {
reject('Error' + e);
});
})
}
exports.createClient = function () {
return new QlikConnection(unifyOptions.apply(null,arguments));
};