@ezdevlol/memfs
Version:
In-memory file-system with Node's fs API.
60 lines (59 loc) • 2.14 kB
JavaScript
import { Defer } from '../../thingies/Defer';
import { SyncMessenger } from './SyncMessenger';
import { decoder, encoder } from '../json';
let rootId = 0;
export class FsaNodeSyncAdapterWorker {
messenger;
root;
static async start(url, dir) {
const worker = new Worker(url);
const future = new Defer();
let id = rootId++;
let messenger = undefined;
const _dir = await dir;
worker.onmessage = e => {
const data = e.data;
if (!Array.isArray(data))
return;
const msg = data;
const code = msg[0];
switch (code) {
case 0 /* FsaNodeWorkerMessageCode.Init */: {
const [, sab] = msg;
messenger = new SyncMessenger(sab);
const setRootMessage = [1 /* FsaNodeWorkerMessageCode.SetRoot */, id, _dir];
worker.postMessage(setRootMessage);
break;
}
case 2 /* FsaNodeWorkerMessageCode.RootSet */: {
const [, rootId] = msg;
if (id !== rootId)
return;
const adapter = new FsaNodeSyncAdapterWorker(messenger, _dir);
future.resolve(adapter);
break;
}
}
};
return await future.promise;
}
constructor(messenger, root) {
this.messenger = messenger;
this.root = root;
}
call(method, payload) {
const request = [3 /* FsaNodeWorkerMessageCode.Request */, method, payload];
const encoded = encoder.encode(request);
const encodedResponse = this.messenger.callSync(encoded);
const [code, data] = decoder.decode(encodedResponse);
switch (code) {
case 4 /* FsaNodeWorkerMessageCode.Response */:
return data;
case 5 /* FsaNodeWorkerMessageCode.ResponseError */:
throw data;
default: {
throw new Error('Invalid response message code');
}
}
}
}