Created
April 13, 2014 04:35
-
-
Save suxue/10569342 to your computer and use it in GitHub Desktop.
MPD Proxy
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
MPDProxy = require('./MPDProxy'); | |
p = new MPDProxy(); | |
p.on("frame", function(data) { | |
console.log("================="); | |
console.dir(data); | |
console.log(); | |
p.send("idle\n"); | |
}); | |
p.on("accepted", function() { | |
console.log("VERSION: " + p.version); | |
p.send("idle\n"); | |
}); | |
p.connect(); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var events = require("events"); | |
var net = require("net"); | |
var util = require("util"); | |
function make_line_reader(line_consumer) { | |
var buffer = []; | |
function parser(char) { | |
if (char !== '\n') { | |
buffer.push(char); | |
return parser; | |
} else { | |
return line_consumer(buffer.join("")); | |
} | |
} | |
return parser; | |
} | |
function make_frame_reader(state) { | |
var lines = [[]]; | |
function parser(char) { | |
if (char !== '\n') { | |
lines[lines.length - 1].push(char); | |
} else { | |
lines[lines.length - 1] = lines[lines.length - 1].join(""); | |
if (lines[lines.length - 1] === "OK") { | |
// end of frame | |
lines.pop(); | |
state.emit("frame", lines); | |
lines = [[]]; | |
} else { | |
// frame continues | |
lines[lines.length] = []; | |
} | |
} | |
return parser; | |
} | |
return parser; | |
} | |
function make_greeting_reader(state) { | |
var buffer = []; | |
function parser(char) { | |
buffer.push(char); | |
if (buffer.length === 7) { | |
if (buffer.join("") === "OK MPD ") { | |
return make_line_reader(function(version_number) { | |
state.version = version_number; | |
state.emit("accepted"); | |
return make_frame_reader(state); | |
}); | |
} else { | |
throw new Error("Invalid protocal greeting"); | |
} | |
} else { | |
return parser; | |
} | |
} | |
return parser; | |
} | |
// events: | |
// * accepted: after welcome message is received | |
// * close: after mpd socket is closed | |
// * frame: a frame of data is received | |
function MPDProxy(port, host) { | |
var self = this; | |
var parser; | |
var sock; | |
function make_parser() { | |
var state = self; | |
return make_greeting_reader(state); | |
} | |
if (host === undefined) { | |
host = '127.0.0.1'; | |
} | |
if (port === undefined) { | |
port = 6600; | |
} | |
parser = make_parser(); | |
sock = new net.Socket({readable: true, writable: true}); | |
sock.setEncoding('utf8'); | |
sock.on('data', function(data) { | |
var t; | |
for (var i=0; i < data.length; i++) { | |
t = parser(data[i]); | |
parser = t; | |
} | |
}); | |
sock.on("connect", function() { | |
self.send = function send(msg) { | |
sock.write(msg); | |
}; | |
self.close = function close() { | |
sock.write("close"); | |
}; | |
sock.on("close", function() { | |
self.emit("close"); | |
}); | |
}); | |
events.EventEmitter.call(this); | |
self.connect = function connect() { sock.connect(port, host); }; | |
} | |
util.inherits(MPDProxy, events.EventEmitter); | |
module.exports = MPDProxy; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment