I am using https://github.com/jimmywarting/StreamSaver.js to stream some geometry data into file, however I cannot get it to work with my limited Promise knowledge
const fileStream = streamSaver.createWriteStream('export.obj')
const writer = fileStream.getWriter()
const encoder = new TextEncoder
object.streamExportGeometry(async data => { //Callback from streamExportGeometry with data to write. Called many times
console.log("writerQueued");
await new Promise((resolve, reject) => {
writer.write(encoder.encode(data)).then(() => { setTimeout(resolve) })
});
console.log("writerDone");
}, onProgress);
writer.close()
I tried many variants of await, but it never waits for writer.write to finish. Console output looks like this
24x writerQueued
24x writerQueued
exported finished
24x writerDone
24x writerDone
writerDone
There are examples provided with this tool, but I cannot figure out how would I place promises for my code
Edit: added streamExportGeometry
streamExportOBJ(writer, onProgressCallback) {
var i, j, k, l, x, y, z;
var vertices = this._vertices ? this._vertices.array : null;
//Buffer object, to optimize amount of lines per write
var writeBuffer = {
_outputBuffer: "",
_currBuffer: 0,
_bufferLineLimit: 10000,
_progress: 0,
_expectedProgress: 1 + (vertices ? vertices.length / 3 : 0) + (uvs ? uvs.length / 2 : 0) + (normals ? normals.length / 3 : 0) + (indices ? indices.length / 3 : vertices.length / 3),
writeLine: function (data) {
this._outputBuffer += data;
this._currBuffer++;
if (this._currBuffer >= this._bufferLineLimit)
this.flush();
},
flush: function () {
if (this._outputBuffer) {
writer(this._outputBuffer);
this._outputBuffer = "";
this._progress += this._currBuffer;
this._currBuffer = 0;
onProgressCallback(this._progress / this._expectedProgress * 100);
}
}
}
writeBuffer.writeLine('o export\n');
//vertices
if (vertices !== undefined && vertices && vertices.length >= 3) {
for (i = 0; i < vertices.length; i += 3) {
x = vertices[i];
y = vertices[i + 1];
z = vertices[i + 2];
writeBuffer.writeLine('v ' + x + ' ' + y + ' ' + z + '\n');
}
}
//Some more data..
writeBuffer.flush();
}