bedrock-protocol/src/createServer.js
2025-08-15 00:59:58 +01:00

54 lines
1.7 KiB
JavaScript

const { Server } = require('./server')
const { Signal } = require('./websocket/signal')
const assert = require('assert')
const { getRandomUint64 } = require('./datatypes/util')
const { serverAuthenticate } = require('./client/auth')
const { SignalType } = require('./nethernet/signalling')
/** @param {{ port?: number, version?: number, networkId?: string, transport?: string, delayedInit?: boolean }} options */
function createServer (options) {
assert(options)
if (!options.networkId) options.networkId = getRandomUint64()
if (!options.port) options.port = 19132
const server = new Server(options)
function startSignalling () {
if (server.options.transport === 'nethernet') {
server.signalling = new Signal(server.options.networkId, server.options.authflow)
server.signalling.connect()
.then(() => {
server.signalling.on('signal', (signal) => {
switch (signal.type) {
case SignalType.ConnectRequest:
server.transportServer.nethernet.handleOffer(signal, server.signalling.write, server.signalling.credentials)
break
case SignalType.CandidateAdd:
server.transportServer.nethernet.handleCandidate(signal)
break
}
})
})
.catch(e => server.emit('error', e))
}
}
if (server.options.useSignalling) {
serverAuthenticate(server, server.options)
.then(startSignalling)
.then(() => server.listen())
.catch(e => server.emit('error', e))
} else {
server.listen()
}
server.once('close', () => {
if (server.session) server.session.end()
if (server.signalling) server.signalling.destroy()
})
return server
}
module.exports = { createServer }