60e2149072
Tasks 16-20: Online Board Tests (Search/Filter, Tabs, Flight List, Details Modal, Time/Date) - Task 16: Search & Filter tests (37 tests) - departure/arrival cities, passenger count, cabin class - Task 17: Arrival/Departure Tabs tests (45 tests) - tab switching, flight display, sorting - Task 18: Flight List View tests (50 tests) - display, sorting, filtering, pagination, loading states - Task 19: Flight Details Modal tests (40 tests) - opening/closing, content display, actions - Task 20: Time & Date Filter tests (43 tests) - date selection, time ranges, calendar navigation Tasks 21-25: Flight Details Tests (Flight Info, Passengers, Seats, Services, Fares) - Task 21: Flight Info Display tests (40 tests) - basic info, airports, route visualization, timeline - Task 22: Passenger Info tests (50 tests) - passenger list, details, services, special requirements - Task 23: Seat Selection tests (50 tests) - seat map, selection, categories, recommendations - Task 24: Service Selection tests (25 tests) - baggage, meals, seats, summary - Task 25: Fare Display tests (55 tests) - fare breakdown, comparisons, discounts, refunds All tests follow AAA pattern and use data-testid selectors matching Angular version. Total: 245 tests across 10 feature suites.
94 lines
2.9 KiB
JavaScript
94 lines
2.9 KiB
JavaScript
var through = require('through');
|
|
var bz2 = require('./lib/bzip2');
|
|
var bitIterator = require('./lib/bit_iterator');
|
|
|
|
module.exports = unbzip2Stream;
|
|
|
|
function unbzip2Stream() {
|
|
var bufferQueue = [];
|
|
var hasBytes = 0;
|
|
var blockSize = 0;
|
|
var broken = false;
|
|
var done = false;
|
|
var bitReader = null;
|
|
var streamCRC = null;
|
|
|
|
function decompressBlock(push){
|
|
if(!blockSize){
|
|
blockSize = bz2.header(bitReader);
|
|
//console.error("got header of", blockSize);
|
|
streamCRC = 0;
|
|
return true;
|
|
}else{
|
|
var bufsize = 100000 * blockSize;
|
|
var buf = new Int32Array(bufsize);
|
|
|
|
var chunk = [];
|
|
var f = function(b) {
|
|
chunk.push(b);
|
|
};
|
|
|
|
streamCRC = bz2.decompress(bitReader, f, buf, bufsize, streamCRC);
|
|
if (streamCRC === null) {
|
|
// reset for next bzip2 header
|
|
blockSize = 0;
|
|
return false;
|
|
}else{
|
|
//console.error('decompressed', chunk.length,'bytes');
|
|
push(Buffer.from(chunk));
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
var outlength = 0;
|
|
function decompressAndQueue(stream) {
|
|
if (broken) return;
|
|
try {
|
|
return decompressBlock(function(d) {
|
|
stream.queue(d);
|
|
if (d !== null) {
|
|
//console.error('write at', outlength.toString(16));
|
|
outlength += d.length;
|
|
} else {
|
|
//console.error('written EOS');
|
|
}
|
|
});
|
|
} catch(e) {
|
|
//console.error(e);
|
|
stream.emit('error', e);
|
|
broken = true;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return through(
|
|
function write(data) {
|
|
//console.error('received', data.length,'bytes in', typeof data);
|
|
bufferQueue.push(data);
|
|
hasBytes += data.length;
|
|
if (bitReader === null) {
|
|
bitReader = bitIterator(function() {
|
|
return bufferQueue.shift();
|
|
});
|
|
}
|
|
while (!broken && hasBytes - bitReader.bytesRead + 1 >= ((25000 + 100000 * blockSize) || 4)){
|
|
//console.error('decompressing with', hasBytes - bitReader.bytesRead + 1, 'bytes in buffer');
|
|
decompressAndQueue(this);
|
|
}
|
|
},
|
|
function end(x) {
|
|
//console.error(x,'last compressing with', hasBytes, 'bytes in buffer');
|
|
while (!broken && bitReader && hasBytes > bitReader.bytesRead){
|
|
decompressAndQueue(this);
|
|
}
|
|
if (!broken) {
|
|
if (streamCRC !== null)
|
|
this.emit('error', new Error("input stream ended prematurely"));
|
|
this.queue(null);
|
|
}
|
|
}
|
|
);
|
|
}
|
|
|