jamp3
Version:
mp3, id3v1, id3v2 - reader & writer
238 lines • 8.05 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ReaderStream = void 0;
const fs_1 = __importDefault(require("fs"));
const buffer_1 = require("./buffer");
class ReaderStream {
constructor() {
this.readableStream = null;
this.buffers = [];
this.buffersLength = 0;
this.waiting = null;
this.streamEnd = false;
this.streamOnData = null;
this.end = false;
this.pos = 0;
this.streamOnData = this.onData;
}
onData(chunk) {
if (this.readableStream) {
this.readableStream.pause();
}
this.buffers.push(chunk);
this.buffersLength = this.getBufferLength();
if (this.waiting) {
const w = this.waiting;
this.waiting = null;
w();
}
}
onSkip(chunk) {
this.pos += chunk.length;
}
openStream(stream) {
return __awaiter(this, void 0, void 0, function* () {
this.readableStream = stream;
return new Promise((resolve, reject) => {
if (!this.readableStream) {
return Promise.reject('Invalid Stream');
}
this.readableStream.on('error', (err) => {
return reject(err);
});
this.readableStream.on('end', () => {
this.end = true;
this.streamEnd = true;
if (this.waiting) {
const w = this.waiting;
this.waiting = null;
w();
}
});
this.readableStream.on('data', (chunk) => {
if (this.streamOnData) {
this.streamOnData(chunk);
}
});
this.waiting = () => {
resolve();
};
});
});
}
open(filename) {
return __awaiter(this, void 0, void 0, function* () {
try {
this.readableStream = fs_1.default.createReadStream(filename);
}
catch (err) {
return Promise.reject(err);
}
if (!this.readableStream) {
return Promise.reject(Error('Could not open file ' + filename));
}
yield this.openStream(this.readableStream);
});
}
consumeToEnd() {
return __awaiter(this, void 0, void 0, function* () {
this.pos += this.buffersLength;
this.buffers = [];
this.streamOnData = this.onSkip;
while (!this.streamEnd) {
yield this.resume();
}
});
}
close() {
const stream = this.readableStream;
this.readableStream = null;
if (stream) {
if (typeof stream.close === 'function') {
stream.close();
}
stream.destroy();
}
}
getBufferLength() {
let result = 0;
this.buffers.forEach(buf => {
result += buf.length;
});
return result;
}
resume() {
return __awaiter(this, void 0, void 0, function* () {
if (!this.readableStream) {
this.streamEnd = true;
return;
}
return new Promise((resolve, reject) => {
this.waiting = () => {
resolve();
};
if (this.readableStream) {
this.readableStream.resume();
}
});
});
}
get(amount) {
return this.getAndPrepend(amount, []);
}
skip(amount) {
let givenLength = 0;
let i = 0;
while (i < this.buffers.length) {
const b = this.buffers[i];
const need = amount - givenLength;
if (need < b.length) {
givenLength += need;
this.buffers[i] = b.slice(need);
break;
}
else {
givenLength += b.length;
i++;
}
}
this.pos += givenLength;
this.buffers = this.buffers.slice(i);
this.buffersLength = this.getBufferLength();
}
getAndPrepend(amount, prepend) {
const destBuffers = prepend;
let givenLength = 0;
let i = 0;
while (i < this.buffers.length) {
const b = this.buffers[i];
const need = amount - givenLength;
if (need < b.length) {
destBuffers.push(b.slice(0, need));
this.buffers[i] = b.slice(need);
break;
}
else {
destBuffers.push(b);
givenLength += b.length;
i++;
}
}
this.buffers = this.buffers.slice(i);
this.buffersLength = this.getBufferLength();
const result = buffer_1.BufferUtils.concatBuffers(destBuffers);
this.pos += amount;
return result;
}
read(amount) {
return __awaiter(this, void 0, void 0, function* () {
amount = Math.max(1, amount);
if ((this.buffersLength >= amount)) {
const result = this.get(amount);
this.end = this.streamEnd && this.buffersLength === 0;
return result;
}
if (!this.streamEnd) {
yield this.resume();
return yield this.read(amount);
}
else {
if (this.buffersLength === 0) {
return buffer_1.BufferUtils.zeroBuffer(0);
}
const result = buffer_1.BufferUtils.concatBuffers(this.buffers);
this.buffers = [];
this.buffersLength = 0;
this.pos += result.length;
this.end = this.streamEnd;
return result;
}
});
}
unshift(buffer) {
if (buffer.length > 0) {
this.buffers.unshift(buffer);
this.buffersLength = this.getBufferLength();
this.pos -= buffer.length;
this.end = this.streamEnd && this.buffersLength === 0;
}
}
scan(buffer) {
return __awaiter(this, void 0, void 0, function* () {
if (this.end) {
return -1;
}
const result = buffer_1.BufferUtils.concatBuffers(this.buffers);
const index = buffer_1.BufferUtils.indexOfBuffer(result, buffer);
if (index >= 0) {
this.pos += index;
this.buffers = [result.slice(index)];
return this.pos;
}
else {
if (this.end) {
return -1;
}
this.pos += result.length;
this.buffers = [];
this.buffersLength = 0;
yield this.resume();
return this.scan(buffer);
}
});
}
}
exports.ReaderStream = ReaderStream;
//# sourceMappingURL=stream-reader.js.map