From e213df2255878e8f2d3c42331f8d10dbddff3ab2 Mon Sep 17 00:00:00 2001 From: Andris Reinman Date: Tue, 20 Sep 2022 15:49:14 +0300 Subject: [PATCH] started with import stream parser --- lib/api/users.js | 61 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/lib/api/users.js b/lib/api/users.js index 49ef758..8dfb52c 100644 --- a/lib/api/users.js +++ b/lib/api/users.js @@ -104,6 +104,67 @@ class ExportStream extends Transform { } } +class ImportStream extends Transform { + constructor() { + super({ readableObjectMode: true, writableObjectMode: false }); + this.TYPE_HEADER = 0x01; + this.TYPE_CONTENT = 0x02; + + this.magickBuffer = []; + this.magickFound = false; + + this.entryBuffer = false; + } + + readMagick(data) { + if (this.magickFound) { + return data; + } + + let removeSuffix = 0; + for (let i = 0; i < data.length; i++) { + this.magickBuffer.push(data[i]); + removeSuffix++; + if (this.magickBuffer.length === 3) { + if (Buffer.concat(this.magickBuffer).compare(Buffer.from([0x09, 0x06, 0x82]))) { + this.magickFound = true; + break; + } else { + let error = new Error('Invalid content sequence'); + error.code = 'INVALID_SEQUENCE'; + throw error; + } + } + } + + if (removeSuffix) { + return data.slice(removeSuffix); + } + + return data; + } + + async readRecords(data) {} + + _transform(data, encoding, done) { + try { + data = this.readMagick(data); + } catch (err) { + if (err) { + return done(err); + } + } + + this.readRecords(data) + .then(() => done()) + .catch(err => done(err)); + } + + _flush(done) { + done(); + } +} + module.exports = (db, server, userHandler, settingsHandler) => { const taskHandler = new TaskHandler({ database: db.database });