sp-streams
Version:
Streamplace Streams for Piping Video Around and Stuff
76 lines (59 loc) • 1.94 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = dashServer;
var _express = require("express");
var _express2 = _interopRequireDefault(_express);
var _debug = require("debug");
var _debug2 = _interopRequireDefault(_debug);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// maybe this shouldn't be in this package idk
var log = (0, _debug2.default)("sp:dash-server");
function dashServer(dashStream) {
var app = (0, _express2.default)();
var manifest = void 0;
var files = {};
app.use(function (req, res, next) {
log(req.method + " " + req.url);
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
var keepFileDuration = (dashStream.windowSize + 1) * dashStream.segDuration * 10;
log("keeping segments for " + keepFileDuration);
dashStream.on("manifest", function (data) {
manifest = data;
});
dashStream.on("chunk", function (fileName, fileStream) {
var chunks = [];
fileStream.on("data", function (chunk) {
return chunks.push(chunk);
});
fileStream.on("end", function () {
files[fileName] = Buffer.concat(chunks);
// Maintain the init streams, otherwise dump after the window
if (fileName.startsWith("init") || fileName.endsWith("m3u8")) {
return;
}
setTimeout(function () {
log("removing " + fileName);
delete files[fileName];
}, keepFileDuration);
});
});
app.get("/manifest.mpd", function (req, res) {
if (!manifest) {
return res.sendStatus(404);
}
res.end(manifest);
});
app.get("*", function (req, res) {
var fileName = req.url.slice(1);
if (!files[fileName]) {
return res.sendStatus(404);
}
res.end(files[fileName]);
});
return app;
}