221 lines
6.2 KiB
JavaScript
221 lines
6.2 KiB
JavaScript
/* MochiKit.JsonRpc */
|
|
|
|
if (typeof(dojo) != 'undefined') {
|
|
dojo.provide("MochiKit.JsonRpc");
|
|
dojo.require("MochiKit.Base");
|
|
dojo.require("MochiKit.DOM");
|
|
dojo.require("MochiKit.Async");
|
|
}
|
|
|
|
if (typeof(JSAN) != 'undefined') {
|
|
JSAN.use("MochiKit.Base", []);
|
|
JSAN.use("MochiKit.DOM", []);
|
|
JSAN.use("MochiKit.Async", []);
|
|
}
|
|
|
|
try {
|
|
if (typeof(MochiKit.Base) == 'undefined' ||
|
|
typeof(MochiKit.DOM) == 'undefined' ||
|
|
typeof(MochiKit.Async) == 'undefined') {
|
|
throw "";
|
|
}
|
|
} catch (e) {
|
|
throw "MochiKit.JsonRpc depends on MochiKit.Base, MochiKit.DOM and MochiKit.Async";
|
|
}
|
|
|
|
if (typeof(MochiKit.JsonRpc) == 'undefined') {
|
|
MochiKit.JsonRpc = {};
|
|
}
|
|
|
|
MochiKit.JsonRpc.NAME = "MochiKit.JsonRpc";
|
|
MochiKit.JsonRpc.VERSION = "0.90";
|
|
|
|
MochiKit.JsonRpc.__repr__ = function () {
|
|
return "[" + this.NAME + " " + this.VERSION + "]";
|
|
}
|
|
|
|
MochiKit.JsonRpc.toString = function () {
|
|
return this.__repr__();
|
|
}
|
|
|
|
MochiKit.JsonRpc.JsonRpcError = function (message) {
|
|
this.message = message;
|
|
this.name = 'JsonRpcError';
|
|
}
|
|
|
|
MochiKit.JsonRpc.JsonRpcError.prototype = new Error();
|
|
MochiKit.JsonRpc.JsonRpcError.prototype.repr = function () {
|
|
return 'JsonRpcError(' + this.message + ')';
|
|
}
|
|
|
|
MochiKit.JsonRpc.JsonRpcError.prototype.toString = function () {
|
|
return this.repr();
|
|
}
|
|
|
|
MochiKit.JsonRpc.jsonObject = function (o) {
|
|
var attrs=[];
|
|
for(attr in o){
|
|
if(typeof o[attr] != "function"){
|
|
attrs.push('"' + attr + '": ' + json(o[attr]));
|
|
}
|
|
}
|
|
return "{" + attrs.join(", ") + "}";
|
|
}
|
|
|
|
MochiKit.JsonRpc.isObject = function (o) {
|
|
return true;
|
|
}
|
|
|
|
MochiKit.JsonRpc.jsonArray = function (o) {
|
|
return "[" + MochiKit.Base.map(json, o).join(", ") + "]";
|
|
}
|
|
|
|
var MB = MochiKit.Base
|
|
|
|
MochiKit.JsonRpc.jsonRegistry = new MochiKit.Base.AdapterRegistry();
|
|
MochiKit.JsonRpc.jsonRegistry.register('arrayLike',MB.isArrayLike,MochiKit.JsonRpc.jsonArray);
|
|
MochiKit.JsonRpc.jsonRegistry.register("string", MB.typeMatcher("string"), MB.reprString);
|
|
MochiKit.JsonRpc.jsonRegistry.register("numbers", MB.typeMatcher("number", "boolean"), MB.reprNumber);
|
|
MochiKit.JsonRpc.jsonRegistry.register("undefined", MB.isUndefined, MB.reprUndefined);
|
|
MochiKit.JsonRpc.jsonRegistry.register("null", MB.isNull, MB.reprNull);
|
|
MochiKit.JsonRpc.jsonRegistry.register("objectLike", MochiKit.JsonRpc.isObject, MochiKit.JsonRpc.jsonObject);
|
|
|
|
MochiKit.JsonRpc.json = function (o) {
|
|
try {
|
|
if (typeof(o.__json__) == 'function') {
|
|
return o.__json__();
|
|
} else if (typeof(o.json) == 'function' && o.json != arguments.callee) {
|
|
return o.json();
|
|
}
|
|
return jsonRegistry.match(o);
|
|
} catch (e) {
|
|
if (typeof(o.NAME) == 'string' && (
|
|
o.toString == Function.prototype.toString ||
|
|
o.toString == Object.prototype.toString
|
|
)) {
|
|
return o.NAME;
|
|
}
|
|
return o;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
MochiKit.JsonRpc.JsonRpcCall = function (method,params) {
|
|
this.method = method;
|
|
this.params = params;
|
|
this.id = '0';
|
|
}
|
|
|
|
MochiKit.JsonRpc.JsonRpcProxy = function (url,methNames) {
|
|
MochiKit.Base.bindMethods(this);
|
|
this.url = url;
|
|
if (methNames) {
|
|
MochiKit.Base.map(this._proxyMethod,methNames);
|
|
}
|
|
}
|
|
|
|
update(MochiKit.JsonRpc.JsonRpcProxy.prototype, {
|
|
'call': function () {
|
|
var arglist = MochiKit.Base.map(null,arguments)
|
|
var methname = arglist.shift()
|
|
log(arglist);
|
|
var callobj = new MochiKit.JsonRpc.JsonRpcCall(methname,arglist);
|
|
var callstr = json(callobj);
|
|
var req = MochiKit.Async.getXMLHttpRequest();
|
|
req.open("POST",this.url,true);
|
|
req.setRequestHeader("Content-Type","text/plain");
|
|
req.setRequestHeader("Content-Length",callstr.length);
|
|
var d = MochiKit.Async.sendXMLHttpRequest(req,callstr);
|
|
d.addCallback(MochiKit.Async.evalJSONRequest);
|
|
d.addCallback(this._extractResult);
|
|
|
|
return d
|
|
},
|
|
'addSingleMethod': function (methName) {
|
|
if (methName) {
|
|
this._proxyMethod(methName);
|
|
}
|
|
},
|
|
'addMethods': function (methNames) {
|
|
if (methNames) {
|
|
MochiKit.Base.map(this._proxyMethod,methNames);
|
|
}
|
|
},
|
|
'_extractResult': function (resp) {
|
|
if (!resp.error){
|
|
return resp.result;
|
|
} else {
|
|
throw new MochiKit.JsonRpc.JsonRpcError(resp.error);
|
|
}
|
|
},
|
|
'_proxyMethod': function (methname) {
|
|
this[methname] = MochiKit.Base.partial(this.call,methname);
|
|
}
|
|
});
|
|
|
|
MochiKit.JsonRpc.DomObjectFromJson = function (){
|
|
var retval = false;
|
|
if (arguments.length == 1) {
|
|
var arg = arguments[0];
|
|
if (typeof(arg) == 'string'){
|
|
retval = MochiKit.DOM.SPAN(null,arg);
|
|
} else {
|
|
var objrepr = arguments[0];
|
|
var elem = document.createElement(objrepr[0]);
|
|
var attrs = objrepr[1];
|
|
if (attrs) {
|
|
MochiKit.DOM.updateNodeAttributes(elem, attrs);
|
|
}
|
|
if (objrepr.length >= 3){
|
|
var extraobj = objrepr[2]
|
|
for (var i=0;i<extraobj.length;i++) {
|
|
var value = MochiKit.JsonRpc.DomObjectFromJson(extraobj[i]);
|
|
if (value) {
|
|
elem.appendChild(value);
|
|
}
|
|
}
|
|
}
|
|
retval = elem;
|
|
}
|
|
}
|
|
return retval;
|
|
};
|
|
|
|
MochiKit.JsonRpc.EXPORT = [
|
|
"JsonRpcError",
|
|
"JsonRpcProxy",
|
|
];
|
|
|
|
MochiKit.JsonRpc.EXPORT_OK = [
|
|
"jsonObject",
|
|
"jsonArray",
|
|
"jsonRegistry",
|
|
"json",
|
|
"JsonRpcCall",
|
|
"DomObjectFromJson",
|
|
];
|
|
|
|
MochiKit.JsonRpc.__new__ = function () {
|
|
|
|
this.EXPORT_TAGS = {
|
|
":common": this.EXPORT,
|
|
":all": MochiKit.Base.concat(this.EXPORT, this.EXPORT_OK)
|
|
};
|
|
|
|
MochiKit.Base.nameFunctions(this);
|
|
|
|
};
|
|
|
|
MochiKit.JsonRpc.__new__();
|
|
|
|
if ((typeof(JSAN) == 'undefined' && typeof(dojo) == 'undefined')
|
|
|| (typeof(MochiKit.__compat__) == 'boolean' && MochiKit.__compat__)) {
|
|
(function (self) {
|
|
var all = self.EXPORT_TAGS[":all"];
|
|
for (var i = 0; i < all.length; i++) {
|
|
this[all[i]] = self[all[i]];
|
|
}
|
|
})(MochiKit.JsonRpc);
|
|
}
|