diff --git a/package.json b/package.json index 3e4980d..0332040 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ }, "devDependencies": { "@neutrinojs/airbnb-base": "^9.4.0", - "@neutrinojs/banner": "^9.4.0", + "@neutrinojs/banner": "^9.5.0", "@neutrinojs/mocha": "^9.4.0", "@neutrinojs/react": "^9.4.0", "chai": "4.2.0", diff --git a/packages/entity/src/packets/entity-list-update-entity.js b/packages/entity/src/packets/entity-list-update-entity.js index 181173e..142a2dd 100644 --- a/packages/entity/src/packets/entity-list-update-entity.js +++ b/packages/entity/src/packets/entity-list-update-entity.js @@ -2,15 +2,13 @@ import {packetFromName, Packet} from '@latus/socket'; export default (latus) => class EntityListUpdateEntityPacket extends Packet { - static pack(packet) { + static packData(data) { const {BundlePacket} = packetFromName(latus); - const data = packet.data[1]; for (let i = 0; i < data.length; i++) { - data[i].packets = BundlePacket.packPacket( - new BundlePacket(data[i].packets), - ); + // eslint-disable-next-line no-param-reassign + data[i].packets = BundlePacket.bundle(data[i].packets); } - return super.pack(packet); + return data; } static get data() { @@ -22,14 +20,13 @@ export default (latus) => class EntityListUpdateEntityPacket extends Packet { ]; } - static unpack(packet) { + static unpackData(data) { const {BundlePacket} = packetFromName(latus); - const unpacked = super.unpack(packet); - const {data} = unpacked; for (let i = 0; i < data.length; i++) { - data[i].packets = BundlePacket.unpack(data[i].packets).data; + // eslint-disable-next-line no-param-reassign + data[i].packets = BundlePacket.unbundle(data[i].packets); } - return unpacked; + return data; } }; diff --git a/packages/entity/src/packets/entity-update-trait.js b/packages/entity/src/packets/entity-update-trait.js index af3c265..628fde5 100644 --- a/packages/entity/src/packets/entity-update-trait.js +++ b/packages/entity/src/packets/entity-update-trait.js @@ -2,20 +2,19 @@ import {SynchronizedUpdatePacket} from '@avocado/s13n'; import {traits} from '@avocado/traits'; import {packetFromName} from '@latus/socket'; -// import {traitFromId, traitFromType} from '../trait'; - export default (latus) => class EntityUpdateTraitPacket extends SynchronizedUpdatePacket { - static pack(packet) { + static packData(data) { const {BundlePacket} = packetFromName(latus); - const data = packet.data[1]; const {fromType} = traits(latus); for (let i = 0; i < data.traits.length; i++) { const Trait = fromType[data.traits[i].type]; - data.traits[i].type = Trait.id; - data.traits[i].packets = BundlePacket.packPacket(new BundlePacket(data.traits[i].packets)); + // eslint-disable-next-line no-param-reassign + data.traits[i] = { + type: Trait.id, + packets: BundlePacket.bundle(data.traits[i].packets), + }; } - return super.pack(packet); } static get synchronizationSchema() { @@ -29,17 +28,18 @@ export default (latus) => class EntityUpdateTraitPacket extends SynchronizedUpda }; } - static unpack(packet) { + static unpack(data) { const {BundlePacket} = packetFromName(latus); - const unpacked = super.unpack(packet); - const {data} = unpacked; const {fromId} = traits(latus); for (let i = 0; i < data.traits.length; i++) { const {default: Trait} = fromId[data.traits[i].type]; - data.traits[i].type = Trait.type(); - data.traits[i].packets = BundlePacket.unpack(data.traits[i].packets).data; + // eslint-disable-next-line no-param-reassign + data.traits[i] = { + type: Trait.type(), + packets: BundlePacket.unbundle(data.traits[i].packets), + }; } - return unpacked; + return data; } }; diff --git a/packages/entity/src/packets/trait-update-positioned-position.js b/packages/entity/src/packets/trait-update-positioned-position.js index 1b659be..62b9dac 100644 --- a/packages/entity/src/packets/trait-update-positioned-position.js +++ b/packages/entity/src/packets/trait-update-positioned-position.js @@ -1,21 +1,11 @@ import {Vector} from '@avocado/math'; +import {compose} from '@latus/core'; import {Packet} from '@latus/socket'; -export default class TraitUpdatePositionedPositionPacket extends Packet { +const decorate = compose( + Vector.packer, +); - static pack(packet) { - // eslint-disable-next-line no-param-reassign - packet.data[1] = Vector.packToUint32(packet.data[1]); - return super.pack(packet); - } +class TraitUpdatePositionedPositionPacket extends Packet {} - static get data() { - return 'uint32'; - } - - static unpack(packet) { - const unpacked = super.unpack(packet); - return Vector.unpackFromUint32(unpacked); - } - -} +export default decorate(TraitUpdatePositionedPositionPacket); diff --git a/packages/graphics/src/packets/trait-update-visible.js b/packages/graphics/src/packets/trait-update-visible.js index 647bd73..ad4c87c 100644 --- a/packages/graphics/src/packets/trait-update-visible.js +++ b/packages/graphics/src/packets/trait-update-visible.js @@ -2,27 +2,25 @@ import {Packet} from '@latus/socket'; export default class TraitUpdateVisiblePacket extends Packet { - static pack(packet) { - const data = packet.data[1]; - data.opacity = Math.floor(data.opacity * 255); - return super.pack(packet); - } - - static get schema() { + static packData(data) { return { - ...super.schema, - data: { - isVisible: 'bool', - opacity: 'uint8', - }, + isVisibile: data.isVisible, + opacity: Math.floor(data.opacity * 255), }; } - static unpack(packet) { - const unpacked = super.unpack(packet); - const {data} = unpacked; - data.opacity /= 255; - return unpacked; + static get data() { + return { + isVisible: 'bool', + opacity: 'uint8', + }; + } + + static unpackData(data) { + return { + isVisibile: data.isVisible, + opacity: data.opacity / 255, + }; } } diff --git a/packages/input/src/packets/input.js b/packages/input/src/packets/input.js index 2dad9ca..cdb1e8d 100644 --- a/packages/input/src/packets/input.js +++ b/packages/input/src/packets/input.js @@ -2,49 +2,46 @@ import {Packet} from '@latus/socket'; export default class InputPacket extends Packet { + static #actionIds = {}; + + static #idActions = {}; + static setActionIds(actionIds) { - this._actionIds = actionIds; - this._idActions = {}; - const actions = Object.entries(this._actionIds); + this.#actionIds = actionIds; + this.#idActions = {}; + const actions = Object.entries(this.#actionIds); for (let i = 0; i < actions.length; i++) { const [action, id] = actions[i]; - this._idActions[id] = action; + this.#idActions[id] = action; } } - static pack(packet) { - const data = packet.data[1]; + static packData(data) { for (let i = 0; i < data.length; i++) { const {action, value} = data[i]; - const actionId = this._actionIds[action]; - // eslint-disable-next-line no-bitwise + const actionId = this.#actionIds[action]; + // eslint-disable-next-line no-bitwise, no-param-reassign data[i] = ((actionId & 0xFF) << 24) | (value & 0xFFFFFF); } - return super.pack(packet); + return data; } - static get schema() { - return { - ...super.schema, - data: ['uint32'], - }; + static get data() { + return 'uint32'; } - static unpack(packet) { - const unpacked = super.unpack(packet); - const {data} = unpacked; + static unpackData(data) { for (let i = 0; i < data.length; i++) { - /* eslint-disable no-bitwise */ - const actionId = data[i] >> 24; - const value = data[i] & 0xFFFFFF; - /* eslint-enable no-bitwise */ + // eslint-disable-next-line no-bitwise + const [actionId, value] = [data[i] >> 24, data[i] & 0xFFFFFF]; + // eslint-disable-next-line no-param-reassign data[i] = { - action: this._idActions[actionId], + action: this.#idActions[actionId], // -1 is nice to handle, anyway. We'll be a pal. value: 16777214 === value ? -1 : value, }; } - return unpacked; + return data; } } diff --git a/packages/math/src/vector/packer.js b/packages/math/src/vector/packer.js new file mode 100644 index 0000000..7921da3 --- /dev/null +++ b/packages/math/src/vector/packer.js @@ -0,0 +1,51 @@ +/* eslint-disable no-bitwise */ +export function unpackFromUint32(uint32) { + return [ + uint32 & 0xFFFF, + uint32 >> 16, + ]; +} + +export function packToUint32(v) { + const x = Math.min(65535, Math.max(0, v[0])); + const y = Math.min(65535, Math.max(0, v[1])); + return (y << 16) | x; +} +/* eslint-enable no-bitwise */ + +export default (key) => (Superclass) => { + class PackedVectorPacket extends Superclass {} + Object.defineProperty( + PackedVectorPacket, + 'data', + key + ? { + get() { + // eslint-disable-next-line no-param-reassign + const data = super.data; + data[key] = 'uint32'; + return data; + }, + } + : { + get() { + return 'uint32'; + }, + }, + ); + PackedVectorPacket.packData = key + ? (data) => { + // eslint-disable-next-line no-param-reassign + data[key] = packToUint32(data[key]); + return data; + } + : (data) => packToUint32(data); + PackedVectorPacket.unpackData = key + ? (data) => { + // eslint-disable-next-line no-param-reassign + data[key] = unpackFromUint32(data[key]); + return data; + } + : (data) => unpackFromUint32(data); + return PackedVectorPacket; +}; diff --git a/packages/math/src/vector/vector.js b/packages/math/src/vector/vector.js index 3b9d436..8c7a124 100644 --- a/packages/math/src/vector/vector.js +++ b/packages/math/src/vector/vector.js @@ -375,17 +375,8 @@ export function toObject(v) { return {x: v[0], y: v[1]}; } -/* eslint-disable no-bitwise */ -export function unpackFromUint32(uint32) { - return [ - uint32 & 0xFFFF, - uint32 >> 16, - ]; -} - -export function packToUint32(v) { - const x = Math.min(65535, Math.max(0, v[0])); - const y = Math.min(65535, Math.max(0, v[1])); - return (y << 16) | x; -} -/* eslint-enable no-bitwise */ +export { + default as Packer, + packToUint32, + unpackFromUint32, +} from './packer'; diff --git a/packages/s13n/src/packets/synchronized-create.js b/packages/s13n/src/packets/synchronized-create.js index 1728a21..12c377c 100644 --- a/packages/s13n/src/packets/synchronized-create.js +++ b/packages/s13n/src/packets/synchronized-create.js @@ -4,10 +4,10 @@ import SynchronizedPacket from './synchronized'; export default class SynchronizedCreatePacket extends SynchronizedPacket { - static pack(packet) { - const data = packet.data[1]; + static packData(data) { + // eslint-disable-next-line no-param-reassign data.spec = msgpack.encode(data.spec); - return super.pack(packet); + return data; } static get synchronizationSchema() { @@ -16,11 +16,10 @@ export default class SynchronizedCreatePacket extends SynchronizedPacket { }; } - static unpack(packet) { - const unpacked = super.unpack(packet); - const {data} = unpacked; + static unpackData(data) { + // eslint-disable-next-line no-param-reassign data.spec = msgpack.decode(data.spec); - return unpacked; + return data; } } diff --git a/packages/topdown/src/packets/layer-update-tileset-uri.packet.js b/packages/topdown/src/packets/layer-update-tileset-uri.packet.js index e7a20d5..7d24dd9 100644 --- a/packages/topdown/src/packets/layer-update-tileset-uri.packet.js +++ b/packages/topdown/src/packets/layer-update-tileset-uri.packet.js @@ -2,10 +2,8 @@ import {Packet} from '@latus/socket'; export default class LayerUpdateTilesetUriPacket extends Packet { - static get schema() { - return { - data: 'string', - }; + static get data() { + return 'string'; } } diff --git a/packages/topdown/src/packets/layers-update-layer.packet.js b/packages/topdown/src/packets/layers-update-layer.packet.js index d85d62f..5f6cb13 100644 --- a/packages/topdown/src/packets/layers-update-layer.packet.js +++ b/packages/topdown/src/packets/layers-update-layer.packet.js @@ -2,35 +2,29 @@ import {BundlePacket, Packet} from '@latus/socket'; export default class LayersUpdateLayerPacket extends Packet { - static pack(packet) { - const data = packet.data[1]; + static packData(data) { for (let i = 0; i < data.length; i++) { - data[i].layerPackets = BundlePacket.packPacket( - new BundlePacket(data[i].layerPackets), - ); + // eslint-disable-next-line no-param-reassign + data[i].layerPackets = BundlePacket.bundle(data[i].layerPackets); } - return super.pack(packet); + return data; } - static get schema() { - return { - ...super.schema, - data: [ - { - layerIndex: 'uint8', - layerPackets: 'buffer', - }, - ], - }; + static get data() { + return [ + { + layerIndex: 'uint8', + layerPackets: 'buffer', + }, + ]; } - static unpack(packet) { - const unpacked = super.unpack(packet); - const {data} = unpacked; + static unpackData(data) { for (let i = 0; i < data.length; i++) { - data[i].layerPackets = BundlePacket.unpack(data[i].layerPackets).data; + // eslint-disable-next-line no-param-reassign + data[i].layerPackets = BundlePacket.unbundle(data[i].layerPackets); } - return unpacked; + return data; } } diff --git a/packages/topdown/src/packets/room-update-layers.packet.js b/packages/topdown/src/packets/room-update-layers.packet.js index 68193a7..3536236 100644 --- a/packages/topdown/src/packets/room-update-layers.packet.js +++ b/packages/topdown/src/packets/room-update-layers.packet.js @@ -1,14 +1,12 @@ import {BundlePacket} from '@latus/socket'; import {SynchronizedUpdatePacket} from '@avocado/s13n'; -export default class RoomUpdateLayersPacket extends SynchronizedUpdatePacket { +export default class RoomUpdateLayers extends SynchronizedUpdatePacket { - static pack(packet) { - const data = packet.data[1]; - data.layersPackets = BundlePacket.packPacket( - new BundlePacket(data.layersPackets), - ); - return super.pack(packet); + static packData(data) { + // eslint-disable-next-line no-param-reassign + data.layersPackets = BundlePacket.bundle(data.layerPackets); + return data; } static get synchronizationSchema() { @@ -17,11 +15,10 @@ export default class RoomUpdateLayersPacket extends SynchronizedUpdatePacket { }; } - static unpack(packet) { - const unpacked = super.unpack(packet); - const {data} = unpacked; - data.layersPackets = BundlePacket.unpack(data.layersPackets).data; - return unpacked; + static unpackData(data) { + // eslint-disable-next-line no-param-reassign + data.layersPackets = BundlePacket.unbundle(data.layersPackets); + return data; } } diff --git a/packages/topdown/src/packets/tiles-update.packet.js b/packages/topdown/src/packets/tiles-update.packet.js index 6286a85..41d7598 100644 --- a/packages/topdown/src/packets/tiles-update.packet.js +++ b/packages/topdown/src/packets/tiles-update.packet.js @@ -1,29 +1,19 @@ import {Vector} from '@avocado/math'; +import {compose} from '@latus/core'; import {Packet} from '@latus/socket'; -export default class TilesUpdatePacket extends Packet { +const decorate = compose( + Vector.packer('position'), +); - static pack(packet) { - const data = packet.data[1]; - data.position = Vector.packToUint32(data.position); - return super.pack(packet); - } +class TilesUpdatePacket extends Packet { - static get schema() { + static get data() { return { - ...super.schema, - data: { - position: 'uint32', - tile: 'uint16', - }, + tile: 'uint16', }; } - static unpack(packet) { - const unpacked = super.unpack(packet); - const {data} = unpacked; - data.position = Vector.unpackFromUint32(data.position); - return unpacked; - } - } + +export default decorate(TilesUpdatePacket); diff --git a/yarn.lock b/yarn.lock index e7dddea..823d008 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1896,6 +1896,11 @@ eslint-config-airbnb-base "^14.2.0" eslint-plugin-import "^2.22.0" +"@neutrinojs/banner@^9.5.0": + version "9.5.0" + resolved "https://npm.i12e.cha0s.io/@neutrinojs%2fbanner/-/banner-9.5.0.tgz#ee8df39db5d76033211a1811428e444a06d7222f" + integrity sha512-SL4nT0V1Wykf+LcRlCp/L8Frt4dk7MZITToC+OeDz2w6V7gg8YfEwDfdEg+aampjyUoxaq+A02ZyZP1TyRDtLA== + "@neutrinojs/clean@9.5.0": version "9.5.0" resolved "https://npm.i12e.cha0s.io/@neutrinojs%2fclean/-/clean-9.5.0.tgz#77cfb0add1584741c7501f5e12ad206b67f216bf" @@ -9500,7 +9505,7 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.16, source-map-support@~0.5.12: +source-map-support@0.5.19, source-map-support@^0.5.16, source-map-support@~0.5.12: version "0.5.19" resolved "https://npm.i12e.cha0s.io/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==