stardog-js
Version:
Node.js library for communicating with the Stardog HTTP server.
323 lines (271 loc) • 9.41 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _commonTags = require('common-tags');
var commonTags = _interopRequireWildcard(_commonTags);
var _clone = require('clone');
var _clone2 = _interopRequireDefault(_clone);
var _requestPromiseNative = require('request-promise-native');
var _requestPromiseNative2 = _interopRequireDefault(_requestPromiseNative);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
const { stripIndent } = commonTags;
class Stardog {
constructor(options) {
this._endpoint = options.endpoint;
this._options = {
headers: {
connection: 'close'
},
qsStringifyOptions: {
arrayFormat: 'repeat'
},
resolveWithFullResponse: true
};
if (options.auth) {
this._options.auth = options.auth;
}
if (options.database) {
this._database = options.database;
}
}
async createDatabase(options) {
const resp = await this._post('/admin/databases', {
auth: options.auth,
formData: {
root: JSON.stringify({
dbname: options.database,
options: options.options || {},
files: options.files || []
})
}
});
}
async dropDatabase(options) {
const resp = await this._delete(`/admin/databases/${options.database}`, {
auth: options.auth
});
}
async sizeDatabase(options) {
return parseInt((await this._get(`/${options.database}/size`, {
auth: options.auth
})));
}
async listDatabases(options = {}) {
return (await this._get('/admin/databases', {
auth: options.auth
})).databases;
}
async existsDatabase(options) {
return (await this.listDatabases({
auth: options.auth
})).includes(options.database);
}
metaDatabase(options) {
const fields = {};
if (options.fields) {
options.fields.forEach(item => {
fields[item] = '';
});
}
return this._put(`/admin/databases/${options.database}/options`, {
auth: options.auth,
json: Object.keys(fields).length ? fields : {
'database.archetypes': '',
'database.connection.timeout': '',
'database.name': '',
'database.namespaces': '',
'database.online': '',
'database.time.creation': '',
'database.time.modification': '',
'icv.active.graphs': '',
'icv.consistency.automatic': '',
'icv.enabled': '',
'icv.reasoning.enabled': '',
'index.differential.enable.limit': '',
'index.differential.merge.limit': '',
'index.differential.size': '',
'index.literals.canonical': '',
'index.named.graphs': '',
'index.persist': '',
'index.persist.sync': '',
'index.size': '',
'index.statistics.update.automatic': '',
'index.type': '',
'preserve.bnode.ids': '',
'query.all.graphs': '',
'query.timeout': '',
'reasoning.approximate': '',
'reasoning.consistency.automatic': '',
'reasoning.punning.enabled': '',
'reasoning.sameas': '',
'reasoning.schema.graphs': '',
'reasoning.schema.timeout': '',
'reasoning.type': '',
'reasoning.virtual.graph.enabled': '',
'search.enabled': '',
'search.reindex.mode': '',
'spatial.enabled': '',
'strict.parsing': '',
'transaction.isolation': '',
'transaction.logging': ''
}
});
}
onDatabase(options) {
return this._put(`/admin/databases/${options.database}/online`, {
auth: options.auth
});
}
offDatabase(options) {
return this._put(`/admin/databases/${options.database}/offline`, {
auth: options.auth
});
}
copyDatabase(options) {
return this._put(`/admin/databases/${options.from}/copy?to=${options.to}`, {
auth: options.auth
});
}
exportDatabase(options) {
return this._get(`/${options.database}/export`, {
auth: options.auth,
accept: options.accept
});
}
dropGraph(options) {
return this.update({
database: options.database,
auth: options.auth,
query: `drop graph <${options.graph}>`
});
}
copyGraph(options) {
return this.update({
database: options.database,
auth: options.auth,
query: `copy <${options.from}> to <${options.to}>`
});
}
moveGraph(options) {
return this.update({
database: options.database,
auth: options.auth,
query: `move <${options.from}> to <${options.to}>`
});
}
addGraph(options) {
return this.update({
database: options.database,
auth: options.auth,
query: `add <${options.from}> to <${options.to}>`
});
}
async listGraphs(options = {}) {
const resp = await this.query({
database: options.database,
auth: options.auth,
accept: 'text/csv',
query: stripIndent`
select distinct ?g where {
graph ?g {?s ?p ?o}
}
`
});
const graphs = resp.split(/\r?\n/);
graphs.shift();
graphs.pop();
return graphs;
}
async existsGraph(options) {
return (await this.listGraphs({
database: options.database,
auth: options.auth
})).includes(options.graph);
}
ask(options) {
return this._queryUpdate('query', Object.assign({
accept: 'text/boolean'
}, options));
}
query(options) {
return this._queryUpdate('query', Object.assign({
accept: 'application/sparql-results+json, text/turtle'
}, options));
}
update(options) {
return this._queryUpdate('update', options);
}
_queryUpdate(type, options) {
const database = this._database || options.database;
const url = options.tid ? `/${database}/${options.tid}/` : `/${database}/`;
return this._post(url + type, {
auth: options.auth,
accept: options.accept,
form: {
query: options.query,
offset: options.offset,
limit: options.limit,
timeout: options.timeout,
reasoning: options.reasoning,
'using-graph-uri': options.graph,
'insert-graph-uri': options.insertGraph,
'remove-graph-uri': options.removeGraph
}
});
}
async _request(url, options) {
const data = (0, _clone2.default)(Object.assign({}, options, this._options));
url = this._endpoint + url;
if (data.accept) {
data.headers.accept = data.accept;
delete data.accept;
}
if (data.contentType) {
data.headers['content-type'] = data.contentType;
delete data.contentType;
}
data.headers.accept = data.headers.accept || '*/*';
const resp = await (0, _requestPromiseNative2.default)(url, data);
const contentType = resp.headers['content-type'];
if (!contentType || !resp.body) {
return;
}
if (typeof resp.body !== 'string') {
return resp.body;
}
if (contentType.includes('application/sparql-results+json') || contentType.includes('application/json')) {
try {
return JSON.parse(resp.body);
} catch (err) {
return Promise.reject(new Error(err));
}
} else if (contentType.includes('text/boolean')) {
return resp.body === 'true';
}
return resp.body;
}
_get(url, options) {
return this._request(url, Object.assign({}, options, {
method: 'GET'
}));
}
_post(url, options) {
return this._request(url, Object.assign({}, options, {
method: 'POST'
}));
}
_put(url, options) {
return this._request(url, Object.assign({}, options, {
method: 'PUT'
}));
}
_delete(url, options) {
return this._request(url, Object.assign({}, options, {
method: 'DELETE'
}));
}
}
exports.default = Stardog;
module.exports = exports['default'];