| 2991 | } |
| 2992 | |
| 2993 | class 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 | } |
nothing calls this directly
no outgoing calls
no test coverage detected
searching dependent graphs…