fix: net
This commit is contained in:
parent
c4e9cc9cd2
commit
42a6c18948
|
@ -204,10 +204,11 @@ export default (flecks) => {
|
|||
}
|
||||
|
||||
toJSON() {
|
||||
const {Entity} = flecks.get('$avocado/resource.resources');
|
||||
const json = [];
|
||||
for (let i = 0; i < this.#flatEntities.length; i++) {
|
||||
const entity = this.#flatEntities[i];
|
||||
json.push(entity.mergeDiff(entity.toJSON()));
|
||||
json.push(Entity.withoutDefaults(entity.toJSON()));
|
||||
}
|
||||
return json;
|
||||
}
|
||||
|
|
|
@ -378,28 +378,37 @@ export default (flecks) => {
|
|||
json[type] = trait.toJSON();
|
||||
}
|
||||
return {
|
||||
...(this.uri ? {extends: this.uri} : {}),
|
||||
traits: json,
|
||||
};
|
||||
}
|
||||
|
||||
toNetwork(informed) {
|
||||
const pristine = {traits: {}};
|
||||
const json = {
|
||||
traits: {},
|
||||
};
|
||||
const traits = Object.entries(this.#traits);
|
||||
for (let i = 0; i < traits.length; i++) {
|
||||
const [type, trait] = traits[i];
|
||||
pristine.traits[type] = trait.constructor.withDefaults(
|
||||
this.#originalJson ? this.#originalJson.traits[type] : {},
|
||||
);
|
||||
json.traits[type] = trait.toNetwork(informed);
|
||||
let output;
|
||||
if (this.uri) {
|
||||
const pristine = {traits: {}};
|
||||
const json = {
|
||||
traits: {},
|
||||
};
|
||||
const traits = Object.entries(this.#traits);
|
||||
for (let i = 0; i < traits.length; i++) {
|
||||
const [type, trait] = traits[i];
|
||||
pristine.traits[type] = trait.constructor.withDefaults(
|
||||
this.#originalJson ? this.#originalJson.traits[type] : {},
|
||||
);
|
||||
json.traits[type] = trait.toNetwork(informed);
|
||||
}
|
||||
output = {
|
||||
extends: this.uri,
|
||||
...(mergeDiff(pristine, json) || {}),
|
||||
};
|
||||
}
|
||||
else {
|
||||
output = this.toJSON();
|
||||
}
|
||||
const merged = mergeDiff(pristine, json) || {};
|
||||
return {
|
||||
instanceUuid: this.instanceUuid,
|
||||
...(this.uri ? {extends: this.uri} : {}),
|
||||
...merged,
|
||||
...output,
|
||||
};
|
||||
}
|
||||
|
||||
|
|
78
packages/entity/test/json.js
Normal file
78
packages/entity/test/json.js
Normal file
|
@ -0,0 +1,78 @@
|
|||
import {Flecks} from '@flecks/core/server';
|
||||
import {expect} from 'chai';
|
||||
|
||||
let flecks;
|
||||
let Entity;
|
||||
beforeEach(async () => {
|
||||
flecks = Flecks.bootstrap({
|
||||
config: {
|
||||
'@avocado/behavior': {},
|
||||
'@avocado/entity:./src': {},
|
||||
'@avocado/graphics': {},
|
||||
'@avocado/resource': {},
|
||||
'@avocado/traits': {},
|
||||
'@flecks/core': {},
|
||||
'@flecks/react': {},
|
||||
},
|
||||
});
|
||||
await Promise.all(flecks.invokeFlat('@flecks/core.starting'));
|
||||
({Entity} = flecks.get('$avocado/resource.resources'));
|
||||
});
|
||||
|
||||
it('outputs JSON', () => {
|
||||
const entity = new Entity();
|
||||
expect(entity.toJSON()).to.deep.equal({traits: {}});
|
||||
entity.uri = '/foo/bar';
|
||||
expect(entity.toJSON()).to.deep.equal({extends: entity.uri, traits: {}});
|
||||
});
|
||||
|
||||
it('can trim defaults from JSON', async () => {
|
||||
const entity = new Entity();
|
||||
await entity.addTrait('Alive');
|
||||
expect(Entity.withoutDefaults(entity.toJSON()))
|
||||
.to.deep.equal({traits: {Alive: {}}});
|
||||
entity.life = 40;
|
||||
expect(Entity.withoutDefaults(entity.toJSON()))
|
||||
.to.deep.equal({traits: {Alive: {state: {life: 40}}}});
|
||||
entity.maxLife = 420;
|
||||
expect(Entity.withoutDefaults(entity.toJSON()))
|
||||
.to.deep.equal({traits: {Alive: {state: {life: 40, maxLife: 420}}}});
|
||||
entity.maxLife = 100;
|
||||
expect(Entity.withoutDefaults(entity.toJSON()))
|
||||
.to.deep.equal({traits: {Alive: {state: {life: 40}}}});
|
||||
});
|
||||
|
||||
it('can add defaults to JSON', async () => {
|
||||
expect(Entity.withDefaults({traits: {Directional: {}}}))
|
||||
.to.deep.equal({
|
||||
traits: {
|
||||
Directional: {params: {directionCount: 1, trackMovement: true}, state: {direction: 0}},
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('can output JSON optimized for network', async () => {
|
||||
const entity = new Entity();
|
||||
entity.uri = '/foo/bar';
|
||||
await entity.addTrait('Directional', {directionCount: 4});
|
||||
entity.direction = 1;
|
||||
expect(entity.toNetwork())
|
||||
.to.deep.equal({
|
||||
extends: '/foo/bar',
|
||||
instanceUuid: entity.instanceUuid,
|
||||
traits: {Directional: {state: {direction: 1}}},
|
||||
});
|
||||
});
|
||||
|
||||
it('can fallback to sending whole info when there is no base', async () => {
|
||||
const entity = new Entity();
|
||||
await entity.addTrait('Directional', {directionCount: 4});
|
||||
entity.direction = 1;
|
||||
expect(entity.toNetwork())
|
||||
.to.deep.equal({
|
||||
instanceUuid: entity.instanceUuid,
|
||||
traits: {
|
||||
Directional: {params: {directionCount: 1, trackMovement: true}, state: {direction: 1}},
|
||||
},
|
||||
});
|
||||
});
|
Loading…
Reference in New Issue
Block a user