@swordev/php-unserialize
Version:
PHP unserialize function
136 lines (135 loc) • 4.27 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.unserialize = void 0;
function readUntil(array, keywords) {
var value = "";
while (array.offset < array.length &&
keywords.indexOf(array[array.offset]) === -1) {
value += array[array.offset];
array.offset += 1;
}
if (array.offset < array.length)
array.offset += 1;
return value;
}
function readString(array) {
readUntil(array, ":");
readUntil(array, '"');
var string = readUntil(array, '"');
readUntil(array, ";");
return string;
}
function readNumber(array, keyword) {
if (keyword === void 0) { keyword = ";"; }
var numberString = readUntil(array, keyword);
var number = Number(numberString);
if (Number.isNaN(number))
throw new Error("Parse error: \"" + numberString + "\" is not a number.");
return number;
}
function readBoolean(array) {
var booleanString = readUntil(array, ";");
if (booleanString !== "0" && booleanString !== "1")
throw new Error("Parse error: \"" + booleanString + "\" is not a boolean number.");
var boolean = !!+booleanString;
return boolean;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
function readNull(array) {
return null;
}
function readArray(array) {
var length = readNumber(array, ":");
var resultArray = [];
// Shift out first bracket.
readUntil(array, "{");
for (var i = 0; i < length; i++) {
var key = readValue(array);
var value = readValue(array);
resultArray[key] = value;
}
readUntil(array, "}");
return resultArray;
}
function readName(array) {
readUntil(array, ":");
readUntil(array, '"');
var name = readUntil(array, '"');
readUntil(array, ":");
return name;
}
function readObject(array) {
var resultObjectName = readName(array);
var resultObject = {};
var insideResultObject = (resultObject[resultObjectName] = {});
var length = readNumber(array, ":");
readUntil(array, "{");
for (var i = 0; i < length; i++) {
var key = readValue(array);
var value = readValue(array);
insideResultObject[key] = value;
}
readUntil(array, "}");
return resultObject;
}
function readClass(array) {
var resultClassName = readName(array);
var resultClass = {};
var insideResultClass = (resultClass[resultClassName] = []);
var length = readNumber(array, ":");
readUntil(array, "{");
for (var i = 0; i < length; i++) {
var value = readValue(array);
insideResultClass.push(value);
}
readUntil(array, "}");
return resultClass;
}
function readValue(array) {
var type = readUntil(array, ":;");
switch (type.toLowerCase()) {
case "s": // s:len<string>:"<string>";
return readString(array);
case "i": // i:<integer>;
case "d": // d:<float>;
case "r": // r:<integer>;
return readNumber(array);
case "a": // a:len<array>:{<key>;<val>.....}
return readArray(array);
case "o": // o:len<object_class_name>:<object_class_name>:len<object>:{<key>;<val>....}
return readObject(array);
case "c": // c:len<class_name>:"<class_name>":len<val>:{<val>}
return readClass(array);
case "b": // b:<digit>; digit is either 1 or 0
return readBoolean(array);
case "n": // n; null
return readNull(array);
default:
throw new Error("Unknown type: \"" + type + "\" at offset " + array.offset);
}
}
function read(array) {
var key = readUntil(array, "|");
var value = readValue(array);
var result = {};
result[key] = value;
return result;
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function unserialize(text) {
var result = {};
var array = Array.from(text);
array.offset = 0;
do {
try {
Object.assign(result, read(array));
}
catch (err) {
err.message +=
', Left text: "' + array.slice(array.offset).join("") + '"';
throw err;
}
} while (array.offset < array.length);
return result;
}
exports.unserialize = unserialize;