dl
Version:
DreamLab Libs
130 lines (108 loc) • 3.89 kB
JavaScript
var core = require('core');
var OpalRequest = require('./OpalRequest').OpalRequest;
var OpalLoader = require('./OpalLoader').OpalLoader;
var Loader = core.http.Loader;
var Types = core.common.Types;
var OpalError = function (message) {
this.name = "OpalClientError";
this.message = message;
};
OpalError.prototype = new Error();
OpalError.prototype.constructor = OpalError;
/**
* @class: OpalFactory
* @description: Factory with default dependencies. Used for easy dependency injection.
* @author: ssyta
*/
var OpalFactory = function (gateway){
this.OpalRequest = OpalRequest;
this.OpalLoader = OpalLoader;
this.Loader = Loader;
this.OpalError = OpalError;
this.createOpalRequest = function (request_data){
var request = new this.OpalRequest(request_data);
if (gateway) {
request.setConnectionHost(gateway);
}
return request;
};
this.createOpalLoader = function (request) {
return new this.OpalLoader(request);
};
this.createLoader = function () {
return new Loader();
};
this.createError = function (message) {
return new OpalError(message);
};
};
/**
* @class: OpalClientPrototype
* @description: Abstract OpalClient. It doesn't provide auto-registration of methods.
* @author: ssyta
*/
var OpalClientPrototype = function(service, _timeout, _OpalFactory){
this._OpalFactory = _OpalFactory || new OpalFactory();
this.service = service;
this.timeout = (_timeout || 1) * 1000;
};
/**
* @function: _register_methods
* @description: Register methods for opalrpc invocation.
*
* @author: ssyta
*/
OpalClientPrototype.prototype._register_methods = function (method_names) {
var that = this;
method_names.forEach(function (name) {
that[name] = function (params, callback) {
if (callback === undefined) {
throw that._OpalFactory.createError("No callback specified")
}
var request_data = {
url: that.service,
method: name,
params: params || null
};
console.log('Calling', name, 'on', that.service);
var request = that._OpalFactory.createOpalRequest(request_data);
var loader = that._OpalFactory.createOpalLoader(request);
loader.setTimeout(that.timeout);
loader.addEventListener(that._OpalFactory.OpalLoader.Event.JSON_RESPONSE, on_response);
loader.addEventListener(that._OpalFactory.Loader.Event.ERROR, on_error);
try {
loader.load();
} catch (err) {
return callback(err);
}
function on_response(response) {
callback(response.data.getBody().getError(), response.data.getBody().getResult());
}
function on_error(err) {
callback(err);
}
};
});
};
/**
* @class: OpalClient
* @description: Easy to use opalrpc client. Callback function is necessary!
* @example: var ws = new OpalClient('http://workspace.pulscms.onetapi.pl', ['get', 'read_attr']);
* ws.get([...args...], callback);
* or
* ws.get({arg1: 1, arg2: 2, ... }, callback);
* @author: ssyta
*/
var OpalClient = function(service, methods, _timeout, _OpalFactory){
if (Types.isObject(service)) {
OpalClientPrototype.apply(this, [service.INTERFACE, service.TIMEOUT, _OpalFactory]);
this._register_methods(service.METHODS);
} else {
OpalClientPrototype.apply(this, [service, _timeout, _OpalFactory]);
this._register_methods(methods);
}
};
OpalClient.prototype = Object.create(OpalClientPrototype.prototype);
exports.OpalClient = OpalClient;
exports.OpalFactory = OpalFactory;
exports.OpalError = OpalError;