mudb
Version:
Real-time database for multiplayer games
118 lines • 3.21 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
function equal(a, b) {
if (a === b) {
return true;
}
if (a && b && typeof a === 'object' && typeof b === 'object') {
const aIsArr = Array.isArray(a);
const bIsArr = Array.isArray(b);
if (aIsArr !== bIsArr) {
return false;
}
if (aIsArr) {
const leng = a.length;
if (leng !== b.length) {
return false;
}
for (let i = leng - 1; i >= 0; --i) {
if (!equal(a[i], b[i])) {
return false;
}
}
return true;
}
const keys = Object.keys(a);
if (keys.length !== Object.keys(b).length) {
return false;
}
for (let i = 0; i < keys.length; ++i) {
const key = keys[i];
if (!b.hasOwnProperty(key) || !equal(a[key], b[key])) {
return false;
}
}
return true;
}
return a !== a && b !== b;
}
function clone(x) {
if (typeof x !== 'object' || x === null) {
return x;
}
const copy = Array.isArray(x) ? [] : {};
if (Array.isArray(copy)) {
copy.length = x.length;
for (let i = 0; i < x.length; ++i) {
copy[i] = clone(x[i]);
}
}
else {
const keys = Object.keys(x);
for (let i = 0; i < keys.length; ++i) {
const key = keys[i];
copy[key] = clone(x[key]);
}
}
return copy;
}
exports.deepEqual = equal;
exports.deepClone = clone;
class MuJSON {
constructor(identity) {
this.muType = 'json';
this.identity = identity && clone(identity);
this.identity = this.identity || {};
this.json = {
type: 'json',
identity: this.identity,
};
}
alloc() { return {}; }
free() { }
equal(a, b) {
return exports.deepEqual(a, b);
}
clone(obj) {
return exports.deepClone(obj);
}
assign(dst, src) {
if (Array.isArray(dst) && Array.isArray(src)) {
dst.length = src.length;
for (let i = 0; i < dst.length; ++i) {
dst[i] = exports.deepClone(src[i]);
}
return dst;
}
const dKeys = Object.keys(dst);
for (let i = 0; i < dKeys.length; ++i) {
const key = dKeys[i];
if (!(key in src)) {
delete dst[key];
}
}
const sKeys = Object.keys(src);
for (let i = 0; i < sKeys.length; ++i) {
const key = sKeys[i];
dst[key] = exports.deepClone(src[key]);
}
return dst;
}
diff(base, target, out) {
const str = JSON.stringify(target);
out.writeString(str);
return true;
}
patch(base, inp) {
return JSON.parse(inp.readString());
}
toJSON(obj) { return obj; }
fromJSON(x) {
if (typeof x === 'object' && x) {
return x;
}
return this.clone(this.identity);
}
}
exports.MuJSON = MuJSON;
//# sourceMappingURL=json.js.map