manuscript-api
Version:
A lightweight wrapper for the Manuscript API
72 lines (58 loc) • 1.51 kB
JavaScript
/* global Proxy */
var rp = require('request-promise-native');
var urljoin = require('url-join');
var util = require('util');
module.exports = init;
function init(site, token) {
return new Manuscript(site, token).proxify();
}
class Manuscript {
constructor(site, token) {
Object.assign(this, {token:token, site:site, url: urljoin(site + "/api/")});
}
//
// Core ES6 Proxy wrapper for the Manuscript JSON API
//
proxify() {
let handler = {
get(target, property, receiver) {
return function() {
if (property == util.inspect.custom){
// See https://stackoverflow.com/a/46928371/864027
return target;
}
if (property in target) {
return target[property](...arguments);
}
return target.makeRequest(property, ...arguments);
};
}
};
return new Proxy(this, handler);
}
async makeRequest(command, options = {}) {
options.token = this.token;
try {
let body = await rp({
method: 'POST',
url: `${this.url}${command}`,
json: options,
});
return body.data;
} catch(ex) {
let errors = ex.error && ex.error.errors || [];
throw {errors: errors};
}
}
//
// Utility functions for common API interactions
//
async isValid() {
try {
let data = await this.makeRequest('logon');
return data.token === this.token;
} catch (err) {
return false;
}
}
}