diff --git a/app/imports/api/engine/computation/writeComputation/writeScope.js b/app/imports/api/engine/computation/writeComputation/writeScope.js index 18d93373..a25e9ba0 100644 --- a/app/imports/api/engine/computation/writeComputation/writeScope.js +++ b/app/imports/api/engine/computation/writeComputation/writeScope.js @@ -62,3 +62,13 @@ export default function writeScope(creatureId, computation) { Creatures.update({ _id: creatureId }, { $unset: { dirty: 1 } }); } } +/* +function calculateSize(computation) { + const sizeEstimator = { + creature: computation.creature, + variables: computation.variables, + props: computation.originalPropsById, + }; + return MongoInternals.NpmModule.BSON.calculateObjectSize(sizeEstimator, { checkKeys: false }) +} +*/ diff --git a/app/imports/api/engine/computeCreature.js b/app/imports/api/engine/computeCreature.js index d0a3d469..b6dba147 100644 --- a/app/imports/api/engine/computeCreature.js +++ b/app/imports/api/engine/computeCreature.js @@ -4,7 +4,7 @@ import writeAlteredProperties from './computation/writeComputation/writeAlteredP import writeScope from './computation/writeComputation/writeScope.js'; import writeErrors from './computation/writeComputation/writeErrors.js'; -export default function computeCreature(creatureId){ +export default function computeCreature(creatureId) { if (Meteor.isClient) return; // console.log('compute ' + creatureId); const computation = buildCreatureComputation(creatureId); @@ -16,7 +16,7 @@ function computeComputation(computation, creatureId) { computeCreatureComputation(computation); writeAlteredProperties(computation); writeScope(creatureId, computation); - } catch (e){ + } catch (e) { const errorText = e.reason || e.message || e.toString(); computation.errors.push({ type: 'crash', @@ -32,6 +32,19 @@ function computeComputation(computation, creatureId) { console.error(logError); throw e; } finally { + checkPropertyCount(computation) writeErrors(creatureId, computation.errors); } } + +const MAX_PROPS = 1000; +function checkPropertyCount(computation) { + const count = computation.props.length; + if (count <= MAX_PROPS) return; + computation.errors.push({ + type: 'warning', + details: { + error: `This character sheet has too many properties and may perform poorly ( ${count} / ${MAX_PROPS} )` + }, + }); +} diff --git a/app/imports/client/ui/creature/character/errors/CharacterErrors.vue b/app/imports/client/ui/creature/character/errors/CharacterErrors.vue index 130144f3..5c2452da 100644 --- a/app/imports/client/ui/creature/character/errors/CharacterErrors.vue +++ b/app/imports/client/ui/creature/character/errors/CharacterErrors.vue @@ -34,6 +34,16 @@ :key="index + 'dependencyLoopError'" :model="error" /> + + {{ error.details.error }} +