npm i
node untitled.js
and on the client
curl localhost:8000 | vlc -
{ | |
"name": "learnmp3", | |
"version": "1.0.0", | |
"description": "", | |
"main": "index.js", | |
"scripts": { | |
"test": "echo \"Error: no test specified\" && exit 1" | |
}, | |
"author": "", | |
"license": "ISC", | |
"dependencies": { | |
"lame": "^1.2.3", | |
"readable-stream": "^2.0.6" | |
} | |
} |
var lame = require('lame'); | |
var http = require('http'); | |
// var Readable = require('stream').Readable; | |
var clients = {}; | |
function writeBits(readable) { | |
for (var i = 0; i < 100; i++) { | |
readable.push(new Buffer()) | |
} | |
} | |
var makeclientstore = function () { | |
var store = {}; | |
var counter = 0; | |
function storeClient(rr) { | |
console.log("counter is ", counter); | |
store[counter++] = rr; | |
return counter; | |
} | |
function delClient(counter) { | |
console.log("deleting counter"); | |
delete store[counter-1]; | |
return counter; | |
} | |
function getStore() { | |
return store; | |
} | |
return ({ | |
storeClient: storeClient, | |
delClient: delClient, | |
getStore: getStore | |
}); | |
} | |
var getEncoder = function () { | |
return new lame.Encoder({ | |
// input | |
channels: 2, // 2 channels (left and right) | |
bitDepth: 16, // 16-bit samples | |
sampleRate: 44100, // 44,100 Hz sample rate | |
// output | |
bitRate: 128, | |
outSampleRate: 22050, | |
mode: lame.STEREO // STEREO (default), JOINTSTEREO, DUALCHANNEL or MONO | |
}); | |
} | |
var clientstore = makeclientstore(); | |
// Listen on a web port and respond with a chunked response header. | |
var server = http.createServer(function(req, res){ | |
res.writeHead(200,{ | |
"Content-Type": "audio/mpeg", | |
'Transfer-Encoding': 'chunked' | |
}); | |
var counter = clientstore.storeClient({r: req, s: res }); | |
var rs = new (require('stream')).Readable; | |
rs._read = function () { | |
var i = 0; | |
rs.push("hello"); | |
if (i++>100) | |
rs.push(null); | |
} | |
var e = getEncoder() | |
rs.pipe(e); | |
e.pipe(res); | |
console.log('Client connected; streaming'); | |
res.on("close", function () { | |
console.log("from: ", Object.keys(clientstore.getStore())); | |
clientstore.delClient(counter); | |
console.log("to: ", Object.keys(clientstore.getStore())); | |
}); | |
}); | |
server.listen("8000", "127.0.0.1"); | |
console.log('Server running at http://127.0.0.1:8000'); |