/* import fs from 'fs' import path from 'path' import * as encoding from '../lib/encoding.mjs' import * as decoding from '../lib/decoding.mjs' import { createMutex } from '../lib/mutex.mjs' import { encodeUpdate, encodeStructsDS, decodePersisted } from './decodePersisted.mjs' function createFilePath (persistence, roomName) { // TODO: filename checking! return path.join(persistence.dir, roomName) } export class FilePersistence { constructor (dir) { this.dir = dir this._mutex = createMutex() } setRemoteUpdateCounter (roomName, remoteUpdateCounter) { // TODO: implement // nop } saveUpdate (room, y, encodedStructs) { return new Promise((resolve, reject) => { this._mutex(() => { const filePath = createFilePath(this, room) const updateMessage = encoding.createEncoder() encodeUpdate(y, encodedStructs, updateMessage) fs.appendFile(filePath, Buffer.from(encoding.toBuffer(updateMessage)), (err) => { if (err !== null) { reject(err) } else { resolve() } }) }, resolve) }) } saveState (roomName, y) { return new Promise((resolve, reject) => { const encoder = encoding.createEncoder() encodeStructsDS(y, encoder) const filePath = createFilePath(this, roomName) fs.writeFile(filePath, Buffer.from(encoding.toBuffer(encoder)), (err) => { if (err !== null) { reject(err) } else { resolve() } }) }) } readState (roomName, y) { // Check if the file exists in the current directory. return new Promise((resolve, reject) => { const filePath = path.join(this.dir, roomName) fs.readFile(filePath, (err, data) => { if (err !== null) { resolve() // reject(err) } else { this._mutex(() => { console.info(`unpacking data (${data.length})`) console.time('unpacking') decodePersisted(y, decoding.createDecoder(data.buffer)) console.timeEnd('unpacking') }) resolve() } }) }) } } */