From da6f6fbd51ab14e59c81f9e999c50479a7601efa Mon Sep 17 00:00:00 2001 From: cha0s Date: Fri, 5 Jan 2024 22:50:17 -0600 Subject: [PATCH] refactor: mixin --- packages/app/src/client/index.js | 20 ++++++++++++++- packages/app/src/hooks/use-room.js | 8 +++--- packages/app/src/hooks/use-self-entity.js | 6 ++--- packages/combat/src/index.js | 24 +++++++++++++++--- packages/combat/src/packets/harm.js | 4 +-- packages/combat/src/traits/vulnerable.js | 2 +- packages/universe/src/server/index.js | 25 ++++++++++++++++--- .../src/server/packets/decorators/join.js | 2 +- 8 files changed, 71 insertions(+), 20 deletions(-) diff --git a/packages/app/src/client/index.js b/packages/app/src/client/index.js index 8299953..e915ca9 100644 --- a/packages/app/src/client/index.js +++ b/packages/app/src/client/index.js @@ -1,11 +1,29 @@ import Receiver from './receiver'; export const hooks = { + '@flecks/core.mixin': (Flecks) => ( + class FlecksWithHumusAppClient extends Flecks { + + constructor(...args) { + super(...args); + if (!this.humus) { + this.humus = {}; + } + if (!this.humus.app) { + this.humus.app = {}; + } + this.humus.app.room = undefined; + this.humus.app.selfEntity = undefined; + this.humus.app.synchronizer = undefined; + } + + } + ), '@flecks/web/client.up': (flecks) => { window.flecks = flecks; const Synchronizer = Receiver(flecks); const synchronizer = new Synchronizer(); - flecks.set('$humus/app.synchronizer', synchronizer); + flecks.humus.app.synchronizer = synchronizer; synchronizer.listenTo(flecks.socket.client); }, }; diff --git a/packages/app/src/hooks/use-room.js b/packages/app/src/hooks/use-room.js index 8fd3bc4..9c911b7 100644 --- a/packages/app/src/hooks/use-room.js +++ b/packages/app/src/hooks/use-room.js @@ -7,16 +7,16 @@ import {useSocket} from '@flecks/socket'; export default () => { const flecks = useFlecks(); - const [room, setRoom] = useState(flecks.get('$humus/app.room')); + const [room, setRoom] = useState(flecks.humus.app.room); const socket = useSocket(); - const synchronizer = flecks.get('$humus/app.synchronizer'); + const {synchronizer} = flecks.humus.app; useEffect(() => { if (!room) { return undefined; } const onDisconnect = () => { synchronizer.destroySynchronized(room.constructor.resourceId, room.s13nId); - flecks.set('$humus/app.room', undefined); + flecks.humus.app.room = undefined; setRoom(undefined); }; socket.on('disconnect', onDisconnect); @@ -33,7 +33,7 @@ export default () => { switch (created.constructor.resourceId) { // Track room. case Room.resourceId: { - flecks.set('$humus/app.room', created); + flecks.humus.app.room = created; created.universe = synchronizer.synchronized(7, 0); setRoom(created); break; diff --git a/packages/app/src/hooks/use-self-entity.js b/packages/app/src/hooks/use-self-entity.js index 2fa5665..5c0f26a 100644 --- a/packages/app/src/hooks/use-self-entity.js +++ b/packages/app/src/hooks/use-self-entity.js @@ -12,13 +12,13 @@ export default () => { const flecks = useFlecks(); const room = useRoom(); const selfEntity = useSelector(selfEntitySelector); - const [entity, setEntity] = useState(flecks.get('$humus/app.selfEntity')); + const [entity, setEntity] = useState(flecks.humus.app.selfEntity); useEffect(() => { if (!room) { return; } const onDestroying = () => { - flecks.set('$humus/app.selfEntity', undefined); + flecks.humus.app.selfEntity = undefined; setEntity(undefined); }; const augmentSelfEntity = async (entity) => { @@ -26,7 +26,7 @@ export default () => { entity.initialFollow(); entity.on('destroying', onDestroying); } - flecks.set('$humus/app.selfEntity', entity); + flecks.humus.app.selfEntity = entity; setEntity(entity); }; augmentSelfEntity(room.findEntity(selfEntity)); diff --git a/packages/combat/src/index.js b/packages/combat/src/index.js index 5b6a1ee..24ebe3f 100644 --- a/packages/combat/src/index.js +++ b/packages/combat/src/index.js @@ -3,6 +3,23 @@ import flatten from 'lodash.flatten'; export const hooks = { '@avocado/traits.traits': Flecks.provide(require.context('./traits', false, /\.js$/)), + '@flecks/core.mixin': (Flecks) => ( + class FlecksWithHumusCombat extends Flecks { + + constructor(...args) { + super(...args); + if (!this.humus) { + this.humus = {}; + } + if (!this.humus.combat) { + this.humus.combat = {}; + } + this.humus.combat.Affinities = {}; + this.humus.combat.interactions = () => {}; + } + + } + ), '@humus/combat.affinities': () => ({ Void: Class, Bio: Class, @@ -19,7 +36,7 @@ export const hooks = { return context.keys().map((path) => context(path).default); }, '@flecks/core.starting': (flecks) => { - flecks.set('$humus/combat.affinities', flecks.gather('@humus/combat.affinities')); + flecks.humus.combat.Affinities = flecks.gather('@humus/combat.affinities'); const interactions = flatten(flecks.invokeFlat('@humus/combat.interactions')) .reduce( (r, interaction) => { @@ -37,9 +54,8 @@ export const hooks = { }, {}, ); - flecks.set( - '$humus/combat.interactions', - (harmingAffinity, harmedAffinity) => interactions[harmingAffinity]?.[harmedAffinity] || [], + flecks.humus.combat.interactions = (harmingAffinity, harmedAffinity) => ( + interactions[harmingAffinity]?.[harmedAffinity] || [] ); }, '@flecks/socket.packets': Flecks.provide(require.context('./packets', false, /\.js$/)), diff --git a/packages/combat/src/packets/harm.js b/packages/combat/src/packets/harm.js index 2efd1b1..d15fbd4 100644 --- a/packages/combat/src/packets/harm.js +++ b/packages/combat/src/packets/harm.js @@ -5,7 +5,7 @@ import {Packet} from '@flecks/socket'; export default (flecks) => class HarmPacket extends Packet { static pack(harms) { - const Affinities = flecks.get('$humus/combat.affinities'); + const {Affinities} = flecks.humus.combat; return harms.map((harm) => { const {[harm.affinity]: Affinity} = Affinities; harm.affinity = Affinity.id; @@ -27,7 +27,7 @@ export default (flecks) => class HarmPacket extends Packet { } static unpack(harms) { - const Affinities = flecks.get('$humus/combat.affinities'); + const {Affinities} = flecks.humus.combat; return harms.map((harm) => { const {[harm.affinity]: Affinity} = Affinities; harm.affinity = Affinity.type; diff --git a/packages/combat/src/traits/vulnerable.js b/packages/combat/src/traits/vulnerable.js index ee6746b..da8cbe3 100644 --- a/packages/combat/src/traits/vulnerable.js +++ b/packages/combat/src/traits/vulnerable.js @@ -194,7 +194,7 @@ export default (flecks) => class Vulnerable extends Trait { interactions(harmed, harm) { const {Script} = flecks.avocado.resource.Resources; const {affinity, from} = harm; - const interactions = flecks.get('$humus/combat.interactions'); + const {interactions} = flecks.humus.combat; flatten( harmed.affinities() .map((harmedAffinity) => interactions(affinity, harmedAffinity)), diff --git a/packages/universe/src/server/index.js b/packages/universe/src/server/index.js index 289221b..5f2dae3 100644 --- a/packages/universe/src/server/index.js +++ b/packages/universe/src/server/index.js @@ -14,6 +14,23 @@ const { const debug = D('@humus/universe/server'); export const hooks = { + '@flecks/core.mixin': (Flecks) => ( + class FlecksWithHumusAppClient extends Flecks { + + constructor(...args) { + super(...args); + if (!this.humus) { + this.humus = {}; + } + if (!this.humus.universe) { + this.humus.universe = {}; + } + this.humus.universe.universe = undefined; + this.humus.universe.resourceServer = undefined; + } + + } + ), '@flecks/core.starting': async (flecks) => { const {resource} = flecks.get('@humus/universe'); const stats = await stat(resource); @@ -21,14 +38,14 @@ export const hooks = { throw new Error(`resource root ${resource} is not a directory`); } Resource.root = resource; - flecks.set('$humus/universe.resource-server', express.static(resource)); + flecks.humus.universe.resourceServer = express.static(resource); debug('resource root: %s', resource); }, '@flecks/server.up': async (flecks) => { const {universe: path} = flecks.get('@humus/universe'); try { const universe = await Universe.loadFrom(flecks, resolve(FLECKS_CORE_ROOT, path)); - flecks.set('$humus/universe.universe', universe); + flecks.humus.universe.universe = universe; universe.start(); debug('universe up and running!'); } @@ -39,7 +56,7 @@ export const hooks = { '@flecks/web/server.request.socket': (flecks) => (req, res, next) => { if (req.url.startsWith('/resource')) { req.url = req.url.slice('/resource'.length); - flecks.get('$humus/universe.resource-server')(req, res, next); + flecks.humus.universe.resourceServer(req, res, next); return; } next(); @@ -48,7 +65,7 @@ export const hooks = { Flecks.decorate(require.context('./packets/decorators', false, /\.js$/)) ), '@flecks/socket/server.request.socket': (flecks) => async ({handshake}, next) => { - const {universe} = flecks.get('$humus/universe'); + const {universe} = flecks.humus.universe; const {user} = handshake; if (0 !== user.id) { handshake.entity = await universe.loadOrCreateEntity(user); diff --git a/packages/universe/src/server/packets/decorators/join.js b/packages/universe/src/server/packets/decorators/join.js index 7a86117..c70804d 100644 --- a/packages/universe/src/server/packets/decorators/join.js +++ b/packages/universe/src/server/packets/decorators/join.js @@ -4,7 +4,7 @@ export default (Join, flecks) => class UniverseJoinPacket extends Join { static async respond(packet, socket) { const {req: {entity}} = socket; - const universe = flecks.get('$humus/universe.universe'); + const {universe} = flecks.humus.universe; if (universe.hasEntity(entity)) { throw new ValidationError({code: 409, reason: 'already logged in'}); }