setTimeout(function () { var r = new RFB({ port : port, password : '******', securityType : 'vnc', }); r.on('unknownRect', function () { assert.fail('caught on unknownRect'); }); r.requestRedraw(); r.dimensions(function (dims) { clearTimeout(to.dimensions); assert.eql(dims, { width : 720, height : 400 }); setTimeout(function () { q.stdin.write('quit\n'); }, 500); }); }, 15000);
var vncbot = function(cfg, onReadyCb) { var r = new RFB(cfg); r.on('raw', function(rect) { assert.equal(rect.bitsPerPixel, 32); var k = [rect.x, rect.y, rect.width, rect.height].join('|'); if (DEBUG) { console.log('-> RAW ' + k); } var cb = pendingScreens[k]; if (cb) { if (DEBUG) { console.log('w/ cb'); } var result = cb(rect); if (result) { saveRect(rect, result); } } else { if (DEBUG) { console.log('wo/ cb'); } } }); r.on('error', function(err) { console.error('ERROR', err); }); r.on('end', function() { console.log('ENDED'); }); r.dimensions(function(_dims) { dims[0] = _dims.width; dims[1] = _dims.height; if (DEBUG) { console.log('DIMS: ' + dims.join('x')); } if (onReadyCb) { onReadyCb(dims); } }); var api = { // KEY INPUT sendKeysNow: function(queue) { queue.forEach(function(k) { if (DEBUG_LOW) { console.log('KEY: ' + k); } var kk = keyToHex(k); r.sendKey(kk, 1); r.sendKey(kk, 0); }); }, sendKeys: function(queue, dt, cb) { //console.log('QUEUE: ' + JSON.stringify(queue)); var timer; if (!dt) { dt = 25; } var onTimer = function() { var k = queue.shift(); var isDown; if (k === undefined) { clearInterval(timer); if (cb) { return cb(); } else { return; } } if (typeof k !== 'string' && k.length) { isDown = !!k[1]; k = k[0]; } if (DEBUG_LOW) { if (isDown !== undefined) { console.log('KEY: ' + k + ' ' + (isDown ? 1 : 0)); } else { console.log('KEY: ' + k); } } k = keyToHex(k); if (isDown !== undefined) { r.sendKey(k, isDown); } else { r.sendKey(k, 1); r.sendKey(k, 0); } }; timer = setInterval(onTimer, dt); }, sendKeyCommand: function(s, dt, cb) { var a = s.split('+'); var b = clone(a).reverse(); a = a.map(function(i) { return [i, 1]; }); b = b.map(function(i) { return [i, 0]; }); a = a.concat(b); api.sendKeys(a, dt, cb); }, sendKey: function(k, isDown) { if (DEBUG_LOW) { console.log('KEY: ' + k + ' ' + (isDown ? 1 : 0) ); } if (typeof k === 'string') { k = keyToHex(k); } r.sendKey(k, isDown); }, // POINTER INPUT sendPointers: function(queue, dt, cb) { var timer; var onTimer = function() { var p = queue.shift(); if (p === undefined) { clearInterval(timer); if (cb) { return cb(); } else { return; } } if (DEBUG_LOW) { console.log('POINTER: ' + p); } r.sendPointer(p[0], p[1], p[2]); // x, y, mask }; timer = setInterval(onTimer, dt); }, sendPointer: function(x, y, mask) { r.sendPointer(x, y, mask); }, sendClick: function(x, y) { r.sendPointer(x, y, 1); r.sendPointer(x, y, 0); }, // SCREEN OUTPUT redraw: function(cb) { if (cb) { var k = [0, 0, dims[0], dims[1]].join('|'); pendingScreens[k] = cb; } r.requestRedraw(); }, update: function(x, y, w, h, cb) { if (cb) { var k = [x, y, w, h].join('|'); pendingScreens[k] = cb; } r.requestUpdate({x:x, y:y, width:w, height:h}); }, copyText: function(text) { r.copyText(text); }, // WAITING wait: function(dt, cb) { if (!DEBUG_WAITS) { return setTimeout(cb, dt); } console.log('waiting ' + dt + ' ms...'); setTimeout(function() { console.log('resuming'); cb(); }, dt); }, // TERMINATE SESSION end: function() { r.end(); } }; return api; };