61 lines
1.5 KiB
JavaScript
61 lines
1.5 KiB
JavaScript
// src/writers/buffer-implementation/writer.ts
|
|
var createContent = ({
|
|
filename,
|
|
mimeType
|
|
}) => {
|
|
const buf = new ArrayBuffer(0, {
|
|
maxByteLength: 2000000000
|
|
});
|
|
if (!buf.resize) {
|
|
throw new Error("Could not create buffer writer");
|
|
}
|
|
const write = (newData) => {
|
|
const oldLength = buf.byteLength;
|
|
const newLength = oldLength + newData.byteLength;
|
|
buf.resize(newLength);
|
|
const newArray = new Uint8Array(buf);
|
|
newArray.set(newData, oldLength);
|
|
};
|
|
const updateDataAt = (position, newData) => {
|
|
const newArray = new Uint8Array(buf);
|
|
newArray.set(newData, position);
|
|
};
|
|
let writPromise = Promise.resolve();
|
|
let removed = false;
|
|
const writer = {
|
|
write: (arr) => {
|
|
writPromise = writPromise.then(() => write(arr));
|
|
return writPromise;
|
|
},
|
|
finish: async () => {
|
|
await writPromise;
|
|
if (removed) {
|
|
return Promise.reject(new Error("Already called .remove() on the result"));
|
|
}
|
|
return Promise.resolve();
|
|
},
|
|
getBlob() {
|
|
const arr = new Uint8Array(buf);
|
|
return Promise.resolve(new File([arr.slice()], filename, { type: mimeType }));
|
|
},
|
|
remove() {
|
|
removed = true;
|
|
return Promise.resolve();
|
|
},
|
|
getWrittenByteCount: () => buf.byteLength,
|
|
updateDataAt: (position, newData) => {
|
|
writPromise = writPromise.then(() => updateDataAt(position, newData));
|
|
return writPromise;
|
|
}
|
|
};
|
|
return Promise.resolve(writer);
|
|
};
|
|
|
|
// src/writers/buffer.ts
|
|
var bufferWriter = {
|
|
createContent
|
|
};
|
|
export {
|
|
bufferWriter
|
|
};
|