Files
turso/bindings/wasm/web/src/opfs-interface.js
Elijah Morgan 02e4104932 reorg package structure
src moved under web/ to make it cleaner
build does less moving of files, mostly just moves the wasm-pack
into dist for node and web
2025-01-16 21:29:19 -05:00

68 lines
1.7 KiB
JavaScript

export class VFSInterface {
constructor(workerUrl) {
this.worker = new Worker(workerUrl, { type: "module" });
this.nextMessageId = 1;
this.pendingRequests = new Map();
this.worker.onmessage = (event) => {
console.log("interface onmessage: ", event.data);
let { id, result, error } = event.data;
const resolver = this.pendingRequests.get(id);
if (event.data?.buffer && event.data?.size) {
result = { size: event.data.size, buffer: event.data.buffer };
}
if (resolver) {
this.pendingRequests.delete(id);
if (error) {
resolver.reject(new Error(error));
} else {
resolver.resolve(result);
}
}
};
}
_sendMessage(method, args) {
const id = this.nextMessageId++;
return new Promise((resolve, reject) => {
this.pendingRequests.set(id, { resolve, reject });
this.worker.postMessage({ id, method, args });
});
}
async open(path, flags) {
return await this._sendMessage("open", { path, flags });
}
async close(fd) {
return await this._sendMessage("close", { fd });
}
async pwrite(fd, buffer, offset) {
return await this._sendMessage("pwrite", { fd, buffer, offset }, [
buffer.buffer,
]);
}
async pread(fd, buffer, offset) {
console.log("interface in buffer: ", [...buffer]);
const result = await this._sendMessage("pread", {
fd,
buffer: buffer,
offset,
}, []);
console.log("interface out buffer: ", [...buffer]);
buffer.set(new Uint8Array(result.buffer));
return buffer.length;
}
async size(fd) {
return await this._sendMessage("size", { fd });
}
async sync(fd) {
return await this._sendMessage("sync", { fd });
}
}