-
Notifications
You must be signed in to change notification settings - Fork 1
/
websessionmanager.js
169 lines (138 loc) · 3.71 KB
/
websessionmanager.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
var net= require('net');
var fs= require('fs');
var child_process = require('child_process');
var Base64 = require('base64-arraybuffer');
require('sugar');
var homedir=process.env.HOME;
if (homedir)process.chdir(homedir);
var socketpath=process.env.WEBSESSION;
var connection = net.connect({path:socketpath});
var buf=" ";
var bufDepth=0;
function replacer(key,value) {
if (ArrayBuffer.isView(value)) {
var result = {
base64 : Base64.encode(value)
}
return result;
}
return value;
}
function reviver(key,value) {
if (typeof value === "object") {
if (value.hasOwnProperty("base64")) {
return new Buffer(Base64.decode(value.base64));
}
}
return value;
}
function sendObject(ob) {
connection.write(JSON.stringify(ob,replacer)+"\n");
}
function respond(request,ob) {
var response = Object.clone(ob);
response.operation="response";
response.responseId=request.responseId;
sendObject(response);
}
function failCall(request,errorText) {
respond(request,{"error":errorText});
}
var callHandlers = {};
function standardResponse(err,result) {
//this function expects the request to be bound in this.
if (err) {
failCall(this,"something bad!?!");
return;
}
respond(this,{"result":result});
}
function noErrorPossibleResponse(result) {
//this function expects the request to be bound in this.
respond(this,{"result":result});
}
callHandlers.stat=function(request) {
fs.stat(request.args.path,standardResponse.bind(request));
}
callHandlers.exists=function(request) {
fs.exists(request.args.path,noErrorPossibleResponse.bind(request));
}
callHandlers.rename=function(request) {
var a=request.args;
fs.rename(a.oldPath,a.newPath,standardResponse.bind(request));
}
callHandlers.symlink=function(request) {
var a=request.args;
fs.symlink(a.srcPath,a.dstPath,standardResponse.bind(request));
}
callHandlers.mkdir=function(request) {
var a=request.args;
fs.mkdir(a.path,a.mode,standardResponse.bind(request));
}
callHandlers.readlink=function(request) {
var a=request.args;
fs.readlink(a.path,standardResponse.bind(request));
}
callHandlers.readFile=function(request) {
var a=request.args;
fs.readFile(a.filename,a.options,standardResponse.bind(request));
}
callHandlers.writeFile=function(request) {
var a=request.args;
console.log("writing file with args of", a);
fs.writeFile(a.filename,a.data,a.options,standardResponse.bind(request));
}
callHandlers.appendFile=function(request) {
var a=request.args;
fs.appendFile(a.filename,a.data,a.options,standardResponse.bind(request));
}
callHandlers.exec=function(request) {
var a=request.args;
child_process.exec(a.command,a.options,standardResponse.bind(request));
}
callHandlers.spawn=function(request) {
var a=request.args;
var spawnling = child_process.spawn(a.command,a.args,a.options);
spawnling.on('exit' , function(e) {
failCall (request,"exit code: "+e.code+" signal: "+e.signal);
});
}
function handleCall(request){
var call=callHandlers[request.callName];
if (typeof(call) === 'function') {
call(request);
} else {
failCall (request,"no such function");
}
}
function processBatch(batch) {
var ob=JSON.parse(batch,reviver);
console.log("batch received of length:"+batch.length);
console.log(batch);
//sendObject(ob);
if (ob.operation=="call") {
handleCall(ob);
}
}
function pushData(data) {
buf+=data;
var nl;
while ((nl=buf.indexOf('\n')) >=0) {
if (nl === 0) {
buf=buf.slice(1);
} else {
var batch=buf.slice(0,nl);
buf=buf.slice(nl+1);
processBatch(batch);
}
}
}
connection.on('data', function(data) {
pushData(data.toString());
});
connection.on('connect', function() {
sendObject({"protocol":"SessionManager"});
});
connection.on('end', function() {
console.log('client disconnected');
});