pages235/src/customClient.js

78 lines
2.1 KiB
JavaScript

import { options } from './optionsStorage'
//@ts-check
const { EventEmitter } = require('events')
const debug = require('debug')('minecraft-protocol')
const states = require('minecraft-protocol/src/states')
window.serverDataChannel ??= {}
export const customCommunication = {
sendData(data) {
setTimeout(() => {
window.serverDataChannel[this.isServer ? 'emitClient' : 'emitServer'](data)
})
},
receiverSetup(processData) {
window.serverDataChannel[this.isServer ? 'emitServer' : 'emitClient'] = (data) => {
processData(data)
}
}
}
class CustomChannelClient extends EventEmitter {
constructor(isServer, version) {
super()
this.version = version
this.isServer = !!isServer
this.state = states.HANDSHAKING
}
get state() {
return this.protocolState
}
setSerializer(state) {
customCommunication.receiverSetup.call(this, (/** @type {{name, params, state?}} */parsed) => {
if (!options.excludeCommunicationDebugEvents.includes(parsed.name)) {
debug(`receive in ${this.isServer ? 'server' : 'client'}: ${parsed.name}`)
}
this.emit(parsed.name, parsed.params, parsed)
this.emit('packet_name', parsed.name, parsed.params, parsed)
})
}
// eslint-disable-next-line @typescript-eslint/adjacent-overload-signatures, grouped-accessor-pairs
set state(newProperty) {
const oldProperty = this.protocolState
this.protocolState = newProperty
this.setSerializer(this.protocolState)
this.emit('state', newProperty, oldProperty)
}
end(reason) {
this._endReason = reason
this.emit('end', this._endReason) // still emits on server side only, doesn't send anything to our client
}
write(name, params) {
if (!options.excludeCommunicationDebugEvents.includes(name)) {
debug(`[${this.state}] from ${this.isServer ? 'server' : 'client'}: ` + name)
debug(params)
}
this.emit('writePacket', name, params)
customCommunication.sendData.call(this, { name, params, state: this.state })
}
writeBundle(packets) {
// no-op
}
writeRaw(buffer) {
// no-op
}
}
export default CustomChannelClient