-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathqisession.js
117 lines (98 loc) · 3.2 KB
/
qisession.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
var log = require('humix-logger').createLogger('qiproxy')
.child({loc: 'qisession'});
var host = "http://192.168.1.118/libs/qimessaging/2/socket.io";
var io = require('socket.io-client');
var Deferred = require('deferred-js');
function QiSession(host, resource) {
/*
if (host == undefined)
host = window.location.host;
if (resource == undefined)
resource = "libs/qimessaging/1.0/socket.io";
if (host.substring(0, 7) != "http://")
host = "http://" + host;
*/
// var _socket = io.connect(host, { resource: resource });
var _socket = io.connect("127.0.0.1",
{ resource: "libs/qimessaging/1.0/socket.io",
'force new connection': true });
var _dfd = new Array();
var _sigs = new Array();
var _idm = 0;
_socket.on('reply', function (data) {
var idm = data["idm"];
if (data["result"] != null && data["result"]["metaobject"] != undefined) {
var o = new Object();
o.__MetaObject = data["result"]["metaobject"];
var pyobj = data["result"]["pyobject"];
_sigs[pyobj] = new Array();
var methods = o.__MetaObject["methods"];
for (var i in methods) {
var methodName = methods[i]["name"];
o[methodName] = createMetaCall(pyobj, methodName);
}
var signals = o.__MetaObject["signals"];
for (var i in signals) {
var signalName = signals[i]["name"];
o[signalName] = createMetaSignal(pyobj, signalName);
}
_dfd[idm].resolve(o);
} else {
if (_dfd[idm].__cbi != undefined) {
var cbi = _dfd[idm].__cbi;
_sigs[cbi["obj"]][cbi["signal"]][data["result"]] = cbi["cb"];
}
_dfd[idm].resolve(data["result"]);
}
delete _dfd[idm];
});
_socket.on('error', function (data) {
log.error("socket error, data:", data);
if (data["idm"] != undefined) {
_dfd[data["idm"]].reject(data["result"]);
delete _dfd[data["idm"]];
}
});
_socket.on('signal', function (data) {
var res = data["result"];
var callback = _sigs[res["obj"]][res["signal"]][res["link"]];
if (callback != undefined) {
callback.apply(this, res["data"]);
}
});
_socket.on('disconnect', function(data) {
for (var idm in _dfd) {
_dfd[idm].reject("Call " + idm + " canceled: disconnected");
delete _dfd[idm];
}
});
function createMetaCall(obj, method, data) {
return function() {
var idm = ++_idm;
var args = Array.prototype.slice.call(arguments, 0);
_dfd[idm] = new Deferred();
if (method == "registerEvent") {
_dfd[idm].__cbi = data;
}
_socket.emit('call', { idm: idm, params: { obj: obj, method: method, args: args } });
return _dfd[idm].promise();
}
}
function createMetaSignal(obj, signal) {
var s = new Object();
_sigs[obj][signal] = new Array();
s.connect = function(cb) {
return createMetaCall(obj, "registerEvent", { obj: obj, signal: signal, cb: cb })(signal);
}
s.disconnect = function(l) {
delete _sigs[obj][signal][l];
return createMetaCall(obj, "unregisterEvent")(signal, l);
}
return s;
}
this.service = createMetaCall("ServiceDirectory", "service");
this.socket = function() {
return _socket;
}
}
module.exports = QiSession;