MCPcopy
hub / github.com/gildas-lormeau/zip.js / SplitDataReader

Class SplitDataReader

index-native.cjs:2993–3050  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2991}
2992
2993class SplitDataReader extends Reader {
2994
2995 constructor(readers) {
2996 super();
2997 this.readers = readers;
2998 }
2999
3000 async init() {
3001 const reader = this;
3002 const { readers } = reader;
3003 reader.lastDiskNumber = 0;
3004 reader.lastDiskOffset = 0;
3005 await Promise.all(readers.map(async (diskReader, indexDiskReader) => {
3006 await diskReader.init();
3007 if (indexDiskReader != readers.length - 1) {
3008 reader.lastDiskOffset += diskReader.size;
3009 }
3010 reader.size += diskReader.size;
3011 }));
3012 super.init();
3013 }
3014
3015 async readUint8Array(offset, length, diskNumber = 0) {
3016 const reader = this;
3017 const { readers } = this;
3018 let result;
3019 let currentDiskNumber = diskNumber;
3020 if (currentDiskNumber == -1) {
3021 currentDiskNumber = readers.length - 1;
3022 }
3023 let currentReaderOffset = offset;
3024 while (readers[currentDiskNumber] && currentReaderOffset >= readers[currentDiskNumber].size) {
3025 currentReaderOffset -= readers[currentDiskNumber].size;
3026 currentDiskNumber++;
3027 }
3028 const currentReader = readers[currentDiskNumber];
3029 if (currentReader) {
3030 const currentReaderSize = currentReader.size;
3031 if (currentReaderOffset + length <= currentReaderSize) {
3032 result = await readUint8Array(currentReader, currentReaderOffset, length);
3033 } else {
3034 const chunkLength = currentReaderSize - currentReaderOffset;
3035 result = new Uint8Array(length);
3036 const firstPart = await readUint8Array(currentReader, currentReaderOffset, chunkLength);
3037 result.set(firstPart, 0);
3038 const secondPart = await reader.readUint8Array(offset + chunkLength, length - chunkLength, diskNumber);
3039 result.set(secondPart, chunkLength);
3040 if (firstPart.length + secondPart.length < length) {
3041 result = result.subarray(0, firstPart.length + secondPart.length);
3042 }
3043 }
3044 } else {
3045 result = new Uint8Array();
3046 }
3047 reader.lastDiskNumber = Math.max(currentDiskNumber, reader.lastDiskNumber);
3048 return result;
3049 }
3050}

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…