JavaScript: File System Access API:不能将一个块队列到一个关闭的可读流中



我正在使用JavaScript文件系统访问API流式传输可读流的输出到FileSystemWritableFileStream。我创建了一个可写流包装器来使用writeStream.pipeTo(readStream)方法,但是在使用从ReadableStream读取并写入FileSystemWritableFileStream的手动方式执行相同的过程时,我得到了相同的错误。我使用seek跳过头,因为它包含文件大小,并开始写入数据。下面是代码:

function fileWritableStreamToWritableStream(fileStream, headerWriteMethod, headerLengthBytes) {
let writer = fileStream;
let bytesWritten = 0;
const writableStream = new WritableStream({
// Implement the sink
async start(controller) {
if(headerLengthBytes) {
// returns a promise that resolves when the writer is ready for another operation
return writer.seek(headerLengthBytes);
}
},
async write(chunk) {
bytesWritten += chunk.length;
// returns a promise that resolves when the writer is ready for another operation
return writer.write({ type: 'write', data: chunk });
},
async close() {
let promise = Promise.resolve();
if(headerWriteMethod) {
let headerBuffer = new ArrayBuffer(headerLengthBytes);
let view = new DataView(headerBuffer);
let headerBytes = headerWriteMethod(view, bytesWritten);
promise = writer.seek(0)
.then(() => writer.write({type: 'write', data: headerBytes.buffer }));
}
return promise.then(() => writer.close());
}
});
return writableStream;
}

在其他地方这样使用:

audioStream.pipeTo(writableStream);

一开始写,我就在控制台中得到以下错误:

Errors: Uncaught (in promise) TypeError: Failed to execute 'write' on
'UnderlyingSinkBase': required member type is undefined.
wav-recording.service.js:262 Uncaught TypeError: Failed to execute 'enqueue' on 'ReadableStreamDefaultController': Cannot enqueue a chunk into a closed readable stream
at MessagePort.port.onmessage

由于错误导致流关闭:文件系统访问API目前不支持查找文件末尾以外的内容。解决方案是使用truncate来调整文件的大小:

async start(controller) {
if(headerLengthBytes) {
//this call will resize the file to headerLengthBytes so that seek doesn't go past the end of the file.
await writer.truncate(headerLengthBytes);
return writer.seek(headerLengthBytes);
}
}
我将注意到开发人员已经意识到这个问题,并计划在未来解决这个问题。然而,我认为这篇文章将是有用的任何人得到相同的控制台错误的原因,而不是这里的具体一个。

相关内容

最新更新