Skip to content

Instantly share code, notes, and snippets.

@jlongster
Created December 2, 2015 15:48
Show Gist options
  • Save jlongster/c2892b26b101d21a3e43 to your computer and use it in GitHub Desktop.
Save jlongster/c2892b26b101d21a3e43 to your computer and use it in GitHub Desktop.
var http = require('http');
var express = require('express');
var WebSocketServer = require('ws').Server;
var Net = require('net');
var Protocol = require('_debugger').Protocol;
var config = {
port: 9222,
nodeDebugPort: 5858
}
function jsonAction(req, res) {
res.json([{
'description': 'Node.js app (powered by node-websocket-proxy)',
'devtoolsFrontendUrl': 'http://example.com/not-supported',
'id': process.pid,
'title': process.title ||'',
'type': 'page',
'url': '',
'webSocketDebuggerUrl': 'ws://localhost:' + config.port + '/'
}]);
}
function jsonVersionAction(req, res) {
res.json({
'browser': 'Node ' + process.version,
'protocol-version': '1.1',
'user-agent': 'Node ' + process.version,
// webKit-version is a dummy value as it's used to match compatible DevTools front-ends
'webKit-version': '537.36 (@181352)'
});
}
var noopCommands = [
'Network.enable',
'Network.setCacheDisabled',
'Console.enable',
'Console.setMonitoringXHREnabled',
'Console.addInspectedHeapObject',
'Database.enable',
'DOMDebugger.setXHRBreakpoint',
'DOMDebugger.removeXHRBreakpoint',
'DOMDebugger.setInstrumentationBreakpoint',
'DOMDebugger.removeInstrumentationBreakpoint',
'DOMStorage.enable',
'DOM.hideHighlight',
'Inspector.enable',
'Page.addScriptToEvaluateOnLoad',
'Page.removeScriptToEvaluateOnLoad',
'Page.setDeviceOrientationOverride',
'Page.clearDeviceOrientationOverride',
'Page.setGeolocationOverride',
'Page.clearGeolocationOverride',
'Page.setContinuousPaintingEnabled',
'Page.setEmulatedMedia',
'Page.setDeviceMetricsOverride',
'Page.setScriptExecutionDisabled',
'Page.setShowDebugBorders',
'Page.setShowFPSCounter',
'Page.setShowScrollBottleneckRects',
'Page.setShowViewportSizeOnResize',
'Page.setShowPaintRects',
'Page.setForceCompositingMode',
'CSS.enable',
'CSS.disable',
'DOM.enable',
'DOM.disable',
'Runtime.run',
'IndexedDB.enable',
'HeapProfiler.enable',
'Debugger.setAsyncCallStackDepth',
'Debugger.skipStackFrames',
'Console.setTracingBasedTimeline',
'Profiler.setSamplingInterval',
'Worker.setAutoconnectToWorkers'
]
function handleConnection(server, socket) {
var connection = Net.createConnection(config.nodeDebugPort);
var protocol = new Protocol();
var isConnected = false;
var queuedMessages = [];
function sendMessage(message) {
// Some special commands must be ignored
if(noopCommands.indexOf(message.method) !== -1) {
socket.send(JSON.stringify({
id: message.id,
success: true
}));
return;
}
var outgoing = {
seq: message.id,
type: 'request',
command: message.method
}
if(message.params) {
Object.keys(message.params).forEach(function(key) {
outgoing[key] = message.params[key];
});
}
var str = JSON.stringify(outgoing);
console.log('sending to server:', outgoing);
connection.write(
'Content-Length: ' + Buffer.byteLength(str, 'utf8') +
'\r\n\r\n' + str
);
}
socket.on('message', function(message) {
message = JSON.parse(message);
if(!isConnected) {
queuedMessages.push(message);
return;
}
sendMessage(message);
});
protocol.onResponse = function(message) {
console.log('got from server:', message);
socket.send(JSON.stringify(message.body));
if(message.raw.indexOf('Type: connect') !== -1) {
isConnected = true;
queuedMessages.forEach(function(message) {
sendMessage(message);
});
queuedMessages = [];
}
}
connection.on('data', protocol.execute.bind(protocol));
connection.on('error', function(err) { console.log('TCP error:', error); });
connection.on('end', function() { console.log('TCP end') });
connection.on('close', function() { console.log('TCP closed') });
connection.setEncoding('utf8');
}
function createServer() {
var app = express();
var httpServer = http.createServer(app);
var wsServer = new WebSocketServer({
server: httpServer
});
var server = {
http: httpServer,
ws: wsServer
};
app.get('/json', jsonAction);
app.get('/json/list', jsonAction);
app.get('/json/version', jsonVersionAction);
wsServer.on('connection', handleConnection.bind(null, server));
httpServer.listen(config.port);
}
createServer();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment