UNPKG

@ezdevlol/memfs

Version:

In-memory file-system with Node's fs API.

60 lines (59 loc) 2.14 kB
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'); } } } }