UNPKG

@nymphjs/client

Version:

Nymph.js - Client

75 lines 2.76 kB
import Entity from './Entity.js'; // Save referenced entities in an entity's data. export function saveEntities(entity) { let savedEntities = {}; // @ts-ignore: Accessing a protected property. for (let [_key, value] of Object.entries(entity.$dataStore)) { addEntitiesToObject(value, savedEntities); } return savedEntities; } const addEntitiesToObject = (item, entitiesObject) => { // @ts-ignore: Accessing a private property. if (item instanceof Entity && !item.$isASleepingReference) { // Convert entities to references. if (item.guid) { entitiesObject[item.guid] = item; } } else if (Array.isArray(item)) { // Recurse into lower arrays. item.forEach((item) => addEntitiesToObject(item, entitiesObject)); } else if (item instanceof Object) { for (let [_key, value] of Object.entries(item)) { addEntitiesToObject(value, entitiesObject); } } }; // Restore referenced entities into an entity's data. // Returns true if there are any sleeping references still in the entity's data // after the restore. export function restoreEntities(entity, savedEntities) { let data = { containsSleepingReference: false, }; // @ts-ignore: Accessing a protected property. for (let [key, value] of Object.entries(entity.$dataStore)) { // @ts-ignore: Accessing a protected property. entity.$dataStore[key] = retoreEntitiesFromObject(value, savedEntities, data); } return data.containsSleepingReference; } const retoreEntitiesFromObject = (item, entitiesObject, data) => { if (item instanceof Entity) { // @ts-ignore: Accessing a private property. if (item.$isASleepingReference) { if (item.guid && entitiesObject.hasOwnProperty(item.guid)) { return entitiesObject[item.guid]; } else { // Couldn't find the entity in saved entities. data.containsSleepingReference = true; return item; } } else { // Leave entities alone. return item; } } else if (Array.isArray(item)) { // Recurse into lower arrays. return item.map((item) => retoreEntitiesFromObject(item, entitiesObject, data)); } else if (item instanceof Object) { for (let [key, value] of Object.entries(item)) { // @ts-ignore: The key comes from the object. It can definitely be used to index it. item[key] = retoreEntitiesFromObject(value, entitiesObject, data); } return item; } // Not an array, just return it. return item; }; //# sourceMappingURL=entityRefresh.js.map