first
This commit is contained in:
commit
860ad33a70
8 changed files with 120 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
node_modules
|
4
app/index.html
Normal file
4
app/index.html
Normal file
|
@ -0,0 +1,4 @@
|
|||
<!doctype html>
|
||||
<html>
|
||||
<script type="module" src="js/app.js"></script>
|
||||
</html>
|
10
app/js/app.js
Normal file
10
app/js/app.js
Normal file
|
@ -0,0 +1,10 @@
|
|||
import * as mpd from "./mpd.js";
|
||||
import * as status from "./status.js";
|
||||
|
||||
async function init() {
|
||||
await mpd.init();
|
||||
status.init();
|
||||
window.mpd = mpd;
|
||||
}
|
||||
|
||||
init();
|
55
app/js/mpd.js
Normal file
55
app/js/mpd.js
Normal file
|
@ -0,0 +1,55 @@
|
|||
import * as parser from "./parser.js";
|
||||
|
||||
let ws;
|
||||
let commandQueue = [];
|
||||
let pendingResolve;
|
||||
|
||||
function onMessage(e) {
|
||||
if (pendingResolve) {
|
||||
pendingResolve(JSON.parse(e.data)); // FIXME tady test na ACK
|
||||
pendingResolve = null;
|
||||
}
|
||||
processQueue();
|
||||
}
|
||||
|
||||
function onError(e) {
|
||||
console.error(e);
|
||||
ws = null; // fixme
|
||||
}
|
||||
|
||||
function onClose(e) {
|
||||
console.warn(e);
|
||||
ws = null; // fixme
|
||||
}
|
||||
|
||||
function processQueue() {
|
||||
if (pendingResolve || commandQueue.length == 0) { return; }
|
||||
let cmd = commandQueue.shift();
|
||||
if (cmd instanceof Array) { cmd = ["command_list_begin", ...cmd, "command_list_end"].join("\n"); }
|
||||
ws.send(cmd);
|
||||
}
|
||||
|
||||
export async function command(cmd) {
|
||||
commandQueue.push(cmd);
|
||||
processQueue();
|
||||
|
||||
return new Promise(resolve => pendingResolve = resolve);
|
||||
}
|
||||
|
||||
export async function getStatus() {
|
||||
let lines = await command(["status", "currentsong"]);
|
||||
return parser.linesToStruct(lines);
|
||||
}
|
||||
|
||||
export async function init() {
|
||||
return new Promise((resolve, reject) => {
|
||||
try {
|
||||
ws = new WebSocket("ws://localhost:8080?server=0:6600");
|
||||
} catch (e) { reject(e); }
|
||||
pendingResolve = resolve;
|
||||
|
||||
ws.addEventListener("error", onError);
|
||||
ws.addEventListener("message", onMessage);
|
||||
ws.addEventListener("close", onClose);
|
||||
});
|
||||
}
|
11
app/js/parser.js
Normal file
11
app/js/parser.js
Normal file
|
@ -0,0 +1,11 @@
|
|||
export function linesToStruct(lines) {
|
||||
lines.pop(); // "OK"
|
||||
let result = {};
|
||||
lines.forEach(line => {
|
||||
let cindex = line.indexOf(":");
|
||||
if (cindex == -1) { throw new Error(`Malformed line "${line}"`); }
|
||||
result[line.substring(0, cindex)] = line.substring(cindex+2);
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
13
app/js/status.js
Normal file
13
app/js/status.js
Normal file
|
@ -0,0 +1,13 @@
|
|||
import * as mpd from "./mpd.js";
|
||||
|
||||
const DELAY = 2000;
|
||||
|
||||
async function tick() {
|
||||
let data = await mpd.getStatus();
|
||||
console.log(data);
|
||||
setTimeout(tick, DELAY);
|
||||
}
|
||||
|
||||
export function init() {
|
||||
tick();
|
||||
}
|
10
index.js
Normal file
10
index.js
Normal file
|
@ -0,0 +1,10 @@
|
|||
const static = require("node-static");
|
||||
const app = new static.Server("./app");
|
||||
const port = 8080;
|
||||
|
||||
let httpServer = require("http").createServer((request, response) => {
|
||||
request.on("end", () => app.serve(request, response)).resume();
|
||||
});
|
||||
httpServer.listen(port);
|
||||
|
||||
require("ws2mpd").ws2mpd(httpServer, `http://localhost:${port}`);
|
16
package.json
Normal file
16
package.json
Normal file
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"name": "0",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"dependencies": {
|
||||
"node-static": "^0.7.11",
|
||||
"ws2mpd": "^1.0.0"
|
||||
},
|
||||
"devDependencies": {},
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC"
|
||||
}
|
Loading…
Reference in a new issue