Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ jobs:
runs-on: ubuntu-22.04
strategy:
matrix:
node-version: [18, 20, 22]
node-version: [24]
steps:
- uses: actions/checkout@v4
- name: Install pnpm
Expand All @@ -27,5 +27,7 @@ jobs:
run: pnpm install
- name: Test
run: pnpm test
- name: Type check
run: pnpm run type-check
- name: Coveralls
uses: coverallsapp/github-action@v2
44 changes: 22 additions & 22 deletions Server.js → Server.mjs
Original file line number Diff line number Diff line change
@@ -1,22 +1,16 @@
const EventEmitter = require("events").EventEmitter

const World = require("./class/World.js")
const Player = require("./class/Player.js")
const cmapLib = require("./data/cmapLib.js")
const Recording = require("./class/Recording.js")

const qs = require("qs")
const axios = require("axios")

const SmartBuffer = require("smart-buffer").SmartBuffer
const Packet = require("./class/Packet.js")

const tcpPacketHandler = require("./net/tcpPacketHandler.js")

const net = require("net")
const dgram = require("dgram")

const util = require("./util/index.js")
import { EventEmitter } from "events"
import { World } from "./class/World.mjs"
import { Player } from "./class/Player.mjs"
import * as cmapLib from "./data/cmapLib.mjs"
import { Recording } from "./class/Recording.mjs"
import qs from "qs"
import axios from "axios"
import { SmartBuffer } from "smart-buffer"
import { Packet } from "./class/Packet.mjs"
import { tcpPacketHandler } from "./net/tcpPacketHandler.mjs"
import net from "net"
import dgram from "dgram"
import { util } from "./util/index.mjs"

function randomIntFromInterval(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min)
Expand All @@ -26,7 +20,7 @@ function animationAllowed(animId) {
return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 25].includes(animId)
}

class Server extends EventEmitter {
export class Server extends EventEmitter {
/**/
constructor(props) {
super()
Expand Down Expand Up @@ -134,6 +128,8 @@ class Server extends EventEmitter {
this.tcpServer = net.createServer((socket) => {
// TCP Handler
const player = new Player(socket) // This player isn't added to any World until it has been validated
/** @deprecated Use {@link Player#} */
player.cServer = this
player.cServer = this
socket.setNoDelay(true)
socket.on("error", () => {
Expand Down Expand Up @@ -334,6 +330,10 @@ class Server extends EventEmitter {
}
}

const Vector3 = require("./class/Vector3.js")
export function startServer(props) {
const server = new Server(props)
server.start()
return server
}

module.exports = Server
export default Server
32 changes: 21 additions & 11 deletions class/MapTransmitter.js → class/MapTransmitter.mjs
Original file line number Diff line number Diff line change
@@ -1,27 +1,37 @@
const EventEmitter = require("events").EventEmitter
const { SmartBuffer } = require("smart-buffer")
const Packet = require("./Packet.js")
// @ts-check
import { EventEmitter } from "events"
import { SmartBuffer } from "smart-buffer"
import { Packet } from "./Packet.mjs"
import { Player } from "./Player.mjs"

const PacketFragmentLength = 4096

class MapTransmitter extends EventEmitter {
/**/
export class MapTransmitter extends EventEmitter {
/**@todo Yet to be documented.
*
* @param {Player} player
*/
constructor(player) {
super()
/** @type {Player} */
this.player = player
/** @type {SmartBuffer} */
this.mapDataBuffer = new SmartBuffer()
}

setMapData(buff) {
/**@todo Yet to be documented.
*
* @param {Buffer} buffer
*/
setMapData(buffer) {
// Set the current map buffer
this.mapDataBuffer = SmartBuffer.fromBuffer(buff)
this.mapDataBuffer = SmartBuffer.fromBuffer(buffer)
}

/** @todo Yet to be documented. */
sendAllPackets() {
// Disregard waiting for the client! SEND ALL THA PACKETS!!
while (this.sendPacket() == false) {}
}

/** @todo Yet to be documented. */
sendPacket() {
if (this.mapDataBuffer.remaining() === 0) {
// There are no more map fragments to be sent
Expand All @@ -43,4 +53,4 @@ class MapTransmitter extends EventEmitter {
}
}

module.exports = MapTransmitter
export default MapTransmitter
18 changes: 11 additions & 7 deletions class/Packet.js → class/Packet.mjs
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
const { SmartBuffer } = require("smart-buffer")

// SmartBuffer instance with Celaria packet headers
class Packet extends SmartBuffer {
/**/
// @ts-check
import { SmartBuffer } from "smart-buffer"
/** I am a {@link SmartBuffer} wrapper for Celaria packet headers. */
export class Packet extends SmartBuffer {
/**@todo TypeScript fields for {@link protocol}
*
* @param {number} packetType
* @param {string | null} [protocol]
*/
constructor(packetType, protocol) {
super()
this.packetType = packetType
this.protocol = protocol
}

/** @todo Yet to be documented. */
transformPacket(protocol = this.protocol) {
let length = this.length
const packetBuffer = new SmartBuffer()
Expand All @@ -26,4 +30,4 @@ class Packet extends SmartBuffer {
}
}

module.exports = Packet
export default Packet
49 changes: 29 additions & 20 deletions class/Player.js → class/Player.mjs
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
const EventEmitter = require("events").EventEmitter
const Vector3 = require("./Vector3.js")
const Packet = require("./Packet.js")
const MapTransmitter = require("./MapTransmitter.js")
const util = require("../util/index.js")

function animationAllowed(animId) {
return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 25].includes(animId)
}

function characterAllowed(charId) {
return [0, 1, 2].includes(charId)
}

class Player extends EventEmitter {
/**/
// @ts-check
import { EventEmitter } from "events"
import { Packet } from "./Packet.mjs"
import { MapTransmitter } from "./MapTransmitter.mjs"
import { util } from "../util/index.mjs"
/** @import {World} from "./World.mjs" */
/** @import {Server} from "../Server.mjs" */

export class Player extends EventEmitter {
/**@todo Yet to be documented.
*
* @param {any} socket
*/
constructor(socket) {
super()
this.socket = socket // null means player is fake/bot and shouldn't be sent packets to or count towards the server list.
Expand All @@ -28,6 +25,7 @@ class Player extends EventEmitter {
this.chatColor = "#ffffff"

this.destroyed = false
/** @type {World | null} */
this.world = null
this.ready = false

Expand Down Expand Up @@ -79,6 +77,8 @@ class Player extends EventEmitter {
}

this.lastStatusSend = new Date()
/** @type {Server | null} */
this.cServer
}

refresh() {
Expand All @@ -89,7 +89,10 @@ class Player extends EventEmitter {
const roundEndBuff = new Packet(184) // ROUND_END
this.socket.write(roundEndBuff.transformPacket("TCP"))
}

/**@todo Yet to be documented.
*
* @param {Buffer} mapBuffer
*/
loadMap(mapBuffer, gamemode = 1, timer = this.world.timer) {
// Oh. This apparently doesn't work well right now, Celaria really expects rounds to not end right after maps are about to change.
// pls fix
Expand Down Expand Up @@ -252,7 +255,10 @@ class Player extends EventEmitter {
}
if (this.socket && !this.socket.destroyed) this.socket.destroy()
}

/**@todo Yet to be documented.
*
* @param {string} reason
*/
kick(reason, kickReasonID = 0) {
// Kick the player and destroy their socket
if (this.destroyed) return
Expand All @@ -270,7 +276,10 @@ class Player extends EventEmitter {

this.destroy()
}

/**@todo Yet to be documented.
*
* @param {string} message
*/
message(message, color = "#ffffff") {
if (this.destroyed) return
if (!this.socket) return
Expand All @@ -290,4 +299,4 @@ class Player extends EventEmitter {
}
}

module.exports = Player
export default Player
6 changes: 3 additions & 3 deletions class/Recording.js → class/Recording.mjs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// replaced by ReplayBuffer
const Player = require("./Player.js")
import { Player } from "./Player.mjs"

class Recording {
export class Recording {
/**/
constructor(data) {
this.player = null
Expand Down Expand Up @@ -81,4 +81,4 @@ class Recording {
}
}

module.exports = Recording
export default Recording
23 changes: 17 additions & 6 deletions class/Timer.js → class/Timer.mjs
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
const EventEmitter = require("events").EventEmitter
// @ts-check
import { EventEmitter } from "events"

class Timer extends EventEmitter {
export class Timer extends EventEmitter {
/**/
constructor() {
super()
/** @type {number} */
this.timeStart = Date.now()
/** @type {number} */
this.timeEnd = Date.now()
/** @type {boolean} */
this.active = false
/** @type {NodeJS.Timeout?} */
this.timeout = null
}

Expand All @@ -29,18 +34,24 @@ class Timer extends EventEmitter {
this.active = false
clearTimeout(this.timeout)
}

/**@todo Yet to be documented.
*
* @param {number} ms
*/
extend(ms) {
this.timeEnd += ms
this.update(ms)
this.update()
this.emit("extend", ms)
}

/**@todo Yet to be documented.
*
* @param {number} timeEnd
*/
set(timeEnd) {
this.timeStart = Date.now()
this.timeEnd = this.timeStart + timeEnd
this.update()
}
}

module.exports = Timer
export default Timer
63 changes: 0 additions & 63 deletions class/Vector3.js

This file was deleted.

Loading