Advertisement
Guest User

Custom Storage Format

a guest
Oct 22nd, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Serializer = (function () {
  2.     SerializableParentClass = {};
  3.     return {
  4.         addDeserializationPassin(name, func) {
  5.             if (name) {
  6.                 SerializableParentClass[name] = func;
  7.             }
  8.             return SerializableParentClass;
  9.         },
  10.         Serializer: function Serializer(obj, seperator, parent) {
  11.             var SEPERATOR = seperator || "￾";
  12.             return {
  13.                 serialize(final, itt, arr) {
  14.                     itt = itt || 0;
  15.                     if (itt > 10) {
  16.                         return ["U￿￿"];
  17.                     }
  18.                     var raw = [""];
  19.                     var key = Object.keys(obj);
  20.                     var bottom = 0;
  21.                     for (const item of key) {
  22.                         if (obj.constructor === Window) {
  23.                             if (item === "frames" || item === "self" || (obj[item] && obj[item].window != undefined))
  24.                                 continue;
  25.                         }
  26.                         if (obj[item] === undefined) {
  27.                             raw.push(`U￿${item}`);
  28.                         } else if (obj[item] === null) {
  29.                             raw.push(`N￿${item}`);
  30.                         } else if (obj[item].constructor === Function) {
  31.                             // console.log("F", obj[item]);
  32.                             var code = obj[item].toString();
  33.                             if (code.match(/\) { \[native code\] }/)) {
  34.                                 console.log("NOT LOADING", item, code);
  35.                             } else {
  36.                                 raw.push(`F￿${item}￿${escape(code)}`);
  37.                             }
  38.                         } else if (obj[item].constructor === String) {
  39.                             raw.push(`S￿${item}￿${escape(obj[item])}`);
  40.                         } else if (obj[item].constructor === Number) {
  41.                             raw.push(`N￿${item}￿${obj[item]}`);
  42.                         } else if (obj[item].constructor === Boolean) {
  43.                             raw.push(`B￿${item}￿${1 - obj[item]}`);
  44.                         } else if (obj[item] === obj) {
  45.                             raw.push(`IN￿${item}`);
  46.                         } else {
  47.                             var subobject = Serializer(obj[item], SEPERATOR).serialize(true, itt + 1);
  48.                             var size = subobject.length;
  49.                             raw.push(`I￿${item}￿${size}`);
  50.                             subobject.forEach(element => {
  51.                                 raw.push(element);
  52.                             });
  53.                         }
  54.                     }
  55.                     if (raw.length > 1)
  56.                         raw[0] = "SC￿" + (raw.length - 1);
  57.                     return final ? raw : raw.join(SEPERATOR);
  58.                 },
  59.                 deserialize(isobj) {
  60.                     var raw = obj.split(SEPERATOR);
  61.                     var out = !isobj ? {} : [];
  62.                     var express_array = true;
  63.                     for (var i = 1; i < raw.length; i++) {
  64.                         var parts = raw[i].split("￿");
  65.                         switch (parts[0]) {
  66.                             case "I":
  67.                                 var section = [];
  68.                                 for (var j = 1; j < 1 + Number(parts[2]); j++) {
  69.                                     section.push(raw[i + j]);
  70.                                 }
  71.                                 i += Number(parts[2]);
  72.                                 var result = Serializer(section.join(SEPERATOR), SEPERATOR).deserialize();
  73.                                 // debugger;
  74.                                 if (!Object.keys(result).join("").match(/[^0-9]/)) {
  75.                                     result = Object.assign([], result);
  76.                                 }
  77.                                 out[parts[1]] = result;
  78.                                 break;
  79.                             case "N":
  80.                                 out[parts[1]] = Number(parts[2]);
  81.                                 break;
  82.                             case "U":
  83.                                 out[parts[1]] = undefined;
  84.                                 break;
  85.                             case "B":
  86.                                 out[parts[1]] = !Number(parts[2]);
  87.                                 break;
  88.                             case "N":
  89.                                 out[parts[1]] = null;
  90.                                 break;
  91.                             case "S":
  92.                                 out[parts[1]] = unescape(parts[2]);
  93.                                 break;
  94.                             case "F":
  95.                                 try {
  96.                                     var keys = Object.keys(SerializableParentClass);
  97.                                     var func = Function.apply(Function, [...keys, "return " + unescape(parts[2])]);
  98.                                     var args = [];
  99.                                     for (var j = 0; j < keys.length; j++) {
  100.                                         args.push(SerializableParentClass[keys[i]]);
  101.                                     }
  102.                                     // console.log(func);
  103.                                     out[parts[1]] = func.apply({}, args);
  104.                                 } catch (e) {
  105.                                     console.warn("FAILED TO LOAD SCRIPT\n", unescape(parts[2]), "\n", e);
  106.                                 }
  107.                                 break;
  108.                             case "IN":
  109.                                 out[parts[1]] = out;
  110.                         }
  111.                     }
  112.                     if (!Object.keys(out).join("").match(/[^0-9]/g)) {
  113.                         out = Object.assign({}, out);
  114.                     }
  115.                     return out;
  116.                 }
  117.             };
  118.         }
  119.     }
  120. })();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement