node-peercast
Version:
PeerCast client for node.js
77 lines (76 loc) • 2.46 kB
JavaScript
var log4js = require('log4js');
var Atom = require('./atom');
var logger = log4js.getLogger();
var AtomReader = (function () {
function AtomReader() {
}
AtomReader.prototype.read = function (stream) {
if (this.name == null) {
var headerBuffer = stream.read(8);
if (headerBuffer == null) {
return null;
}
this.name = headerBuffer.toString('ascii', 0, 4);
this.length = headerBuffer.readUInt32LE(4);
}
logger.debug('Atom reading: ' + this.name);
if ((this.length & 0x80000000) !== 0) {
if (this.containerReader == null) {
this.containerReader = new AtomContainerReader(this.length & 0x7FFFFFFF);
}
var children = this.containerReader.read(stream);
if (children == null) {
logger.debug('no children.');
return null;
}
var container = Atom.createContainer(this.name, children);
this.clear();
return container;
}
else {
var contentBuffer;
if (this.length === 0) {
contentBuffer = null;
}
else {
contentBuffer = stream.read(this.length);
if (contentBuffer == null) {
logger.debug('no data: ' + this.length);
return null;
}
}
var content = Atom.createContent(this.name, contentBuffer);
this.clear();
return content;
}
};
AtomReader.prototype.clear = function () {
this.name = null;
this.length = 0;
this.containerReader = null;
};
return AtomReader;
})();
var AtomContainerReader = (function () {
function AtomContainerReader(length) {
this.length = length;
this.children = [];
}
AtomContainerReader.prototype.read = function (stream) {
for (;;) {
if (this.reader == null) {
this.reader = new AtomReader();
}
var atom = this.reader.read(stream);
if (atom == null) {
return null;
}
this.children.push(atom);
if (this.children.length >= this.length) {
return this.children;
}
}
};
return AtomContainerReader;
})();
module.exports = AtomReader;