2018-10-09 20:30:59 +08:00
|
|
|
const path = require("path");
|
|
|
|
const BinaryMiddleware = require("../lib/serialization/BinaryMiddleware");
|
|
|
|
const FileMiddleware = require("../lib/serialization/FileMiddleware");
|
|
|
|
const Serializer = require("../lib/serialization/Serializer");
|
|
|
|
|
|
|
|
const serializer = new Serializer([
|
|
|
|
new BinaryMiddleware(),
|
|
|
|
new FileMiddleware()
|
|
|
|
]);
|
|
|
|
|
|
|
|
const ESCAPE = null;
|
2018-10-10 15:55:06 +08:00
|
|
|
const ESCAPE_ESCAPE_VALUE = null;
|
|
|
|
const ESCAPE_END_OBJECT = true;
|
|
|
|
const ESCAPE_UNDEFINED = false;
|
2018-10-09 20:30:59 +08:00
|
|
|
|
|
|
|
const printData = async (data, indent) => {
|
|
|
|
if (!Array.isArray(data)) throw new Error("Not an array");
|
|
|
|
if (Buffer.isBuffer(data[0])) {
|
|
|
|
for (const b of data) {
|
|
|
|
if (typeof b === "function") {
|
|
|
|
const innerData = await b();
|
|
|
|
console.log(`${indent}= lazy {`);
|
|
|
|
await printData(innerData, indent + " ");
|
|
|
|
console.log(`${indent}}`);
|
|
|
|
} else {
|
|
|
|
console.log(`${indent}= ${b.toString("hex")}`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
2018-10-10 15:54:13 +08:00
|
|
|
let currentReference = 0;
|
|
|
|
let currentTypeReference = 0;
|
2018-10-09 20:30:59 +08:00
|
|
|
let i = 0;
|
|
|
|
const read = () => {
|
|
|
|
return data[i++];
|
|
|
|
};
|
2018-10-10 15:55:06 +08:00
|
|
|
const printLine = content => {
|
|
|
|
console.log(`${indent}${content}`);
|
|
|
|
};
|
|
|
|
printLine(`Version: ${read()}`);
|
2018-10-09 20:30:59 +08:00
|
|
|
while (i < data.length) {
|
|
|
|
const item = read();
|
|
|
|
if (item === ESCAPE) {
|
|
|
|
const nextItem = read();
|
|
|
|
if (nextItem === ESCAPE_ESCAPE_VALUE) {
|
2018-10-10 16:25:05 +08:00
|
|
|
printLine("null");
|
2018-10-09 20:30:59 +08:00
|
|
|
} else if (nextItem === ESCAPE_UNDEFINED) {
|
2018-10-10 16:25:05 +08:00
|
|
|
printLine("undefined");
|
2018-10-09 20:30:59 +08:00
|
|
|
} else if (nextItem === ESCAPE_END_OBJECT) {
|
|
|
|
indent = indent.slice(0, indent.length - 2);
|
2018-10-10 15:55:06 +08:00
|
|
|
printLine(`} = #${currentReference++}`);
|
|
|
|
} else if (typeof nextItem === "number" && nextItem < 0) {
|
2018-10-10 16:25:05 +08:00
|
|
|
printLine(`Reference ${nextItem} => #${currentReference + nextItem}`);
|
2018-10-09 20:30:59 +08:00
|
|
|
} else {
|
2018-10-10 15:54:13 +08:00
|
|
|
const request = nextItem;
|
2018-10-10 15:55:06 +08:00
|
|
|
if (typeof request === "number") {
|
|
|
|
printLine(
|
2018-10-10 16:25:05 +08:00
|
|
|
`Object (Reference ${request} => @${currentTypeReference -
|
2018-10-10 15:55:06 +08:00
|
|
|
request}) {`
|
2018-10-10 15:54:13 +08:00
|
|
|
);
|
|
|
|
} else {
|
2018-10-10 15:55:06 +08:00
|
|
|
const name = read();
|
|
|
|
printLine(
|
2018-10-10 16:25:05 +08:00
|
|
|
`Object (${request} / ${name} @${currentTypeReference++}) {`
|
2018-10-10 15:54:13 +08:00
|
|
|
);
|
|
|
|
}
|
2018-10-09 20:30:59 +08:00
|
|
|
indent += " ";
|
|
|
|
}
|
|
|
|
} else if (typeof item === "string") {
|
2018-10-10 16:24:44 +08:00
|
|
|
if (item !== "") {
|
2018-10-10 16:25:05 +08:00
|
|
|
printLine(`${JSON.stringify(item)} = #${currentReference++}`);
|
2018-10-10 16:24:44 +08:00
|
|
|
} else {
|
2018-10-10 16:25:05 +08:00
|
|
|
printLine('""');
|
2018-10-10 16:24:44 +08:00
|
|
|
}
|
2018-10-09 20:30:59 +08:00
|
|
|
} else if (Buffer.isBuffer(item)) {
|
2018-10-10 16:25:05 +08:00
|
|
|
printLine(`buffer ${item.toString("hex")} = #${currentReference++}`);
|
2018-10-09 20:30:59 +08:00
|
|
|
} else if (typeof item === "function") {
|
|
|
|
const innerData = await item();
|
2018-10-10 16:25:05 +08:00
|
|
|
printLine(`lazy {`);
|
2018-10-09 20:30:59 +08:00
|
|
|
await printData(innerData, indent + " ");
|
2018-10-10 15:55:06 +08:00
|
|
|
printLine(`}`);
|
2018-10-10 15:54:13 +08:00
|
|
|
} else {
|
2018-10-10 16:25:05 +08:00
|
|
|
printLine(`${item}`);
|
2018-10-09 20:30:59 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const filename = process.argv[2];
|
|
|
|
|
|
|
|
console.log(`Printing content of ${filename}`);
|
|
|
|
|
|
|
|
serializer
|
2019-01-24 23:54:56 +08:00
|
|
|
.deserialize({ filename: path.resolve(filename) })
|
2018-10-09 20:30:59 +08:00
|
|
|
.then(data => printData(data, ""));
|