Skip to content

Instantly share code, notes, and snippets.

@suxue
Created April 13, 2014 04:35
Show Gist options
  • Save suxue/10569342 to your computer and use it in GitHub Desktop.
Save suxue/10569342 to your computer and use it in GitHub Desktop.
MPD Proxy
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();
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