Skip to content
This repository was archived by the owner on Nov 15, 2022. It is now read-only.

Commit d1a48c2

Browse files
authored
Merge branch 'PrismarineJS:master' into master
2 parents 33e4b29 + 78f038c commit d1a48c2

File tree

10 files changed

+114
-42
lines changed

10 files changed

+114
-42
lines changed

.github/workflows/ci.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ jobs:
2424
- name: Setup Java JDK
2525
uses: actions/[email protected]
2626
with:
27-
java-version: 1.8
28-
java-package: jre
27+
java-version: '16'
28+
distribution: 'adopt'
2929
- name: Install dependencies
3030
run: npm install
3131
- name: Run tests
@@ -42,6 +42,6 @@ jobs:
4242
- name: Setup Java JDK
4343
uses: actions/[email protected]
4444
with:
45-
java-version: 1.8
46-
java-package: jre
45+
java-version: '16'
46+
distribution: 'adopt'
4747
- run: npm install && npm run test-non-par

docs/API.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ automatically logged in and validated against mojang's auth.
1515
* beforePing : allow customisation of the answer to ping the server does.
1616
It takes a function with argument response and client, response is the default json response, and client is client who sent a ping.
1717
It can take as third argument a callback. If the callback is passed, the function should pass its result to the callback, if not it should return.
18+
* beforeLogin : allow customisation of client before the `success` packet is sent.
19+
It takes a function with argument client and should be synchronous for the server to wait for completion before continuing execution.
1820
* motd : default to "A Minecraft server"
1921
* maxPlayers : default to 20
2022
* keepAlive : send keep alive packets : default to true

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
},
3535
"browser": "src/browser.js",
3636
"devDependencies": {
37-
"@types/node": "^15.0.1",
37+
"@types/node": "^16.0.0",
3838
"espower-loader": "^1.0.0",
3939
"intelli-espower-loader": "^1.1.0",
4040
"minecraft-packets": "^1.1.5",

src/client/authFlow.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class MsAuthFlow {
4141
let cachePath = cacheDir || mcDefaultFolderPath
4242
try {
4343
if (!fs.existsSync(cachePath + '/nmp-cache')) {
44-
fs.mkdirSync(cachePath + '/nmp-cache')
44+
fs.mkdirSync(cachePath + '/nmp-cache', { recursive: true })
4545
}
4646
cachePath += '/nmp-cache'
4747
} catch (e) {

src/index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ declare module 'minecraft-protocol' {
8282
port?: number
8383
version?: string
8484
beforePing?: (response: any, client: Client, callback?: (result: any) => any) => any
85+
beforeLogin?: (client: Client) => void
8586
errorHandler?: (client: Client, error: Error) => void
8687
agent?: Agent
8788
}

src/server/login.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ module.exports = function (client, server, options) {
109109
if (onlineMode === false || isException) {
110110
client.uuid = nameToMcOfflineUUID(client.username)
111111
}
112+
options.beforeLogin?.(client)
112113
if (client.protocolVersion >= 27) { // 14w28a (27) added whole-protocol compression (http://wiki.vg/Protocol_History#14w28a), earlier versions per-packet compressed TODO: refactor into minecraft-data
113114
client.write('compress', { threshold: 256 }) // Default threshold is 256
114115
client.compressionThreshold = 256

test/clientTest.js

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,17 @@ const os = require('os')
55
const path = require('path')
66
const assert = require('power-assert')
77
const SURVIVE_TIME = 10000
8+
const util = require('util')
89
const MC_SERVER_PATH = path.join(__dirname, 'server')
910

1011
const Wrap = require('minecraft-wrap').Wrap
1112

12-
const download = require('minecraft-wrap').download
13+
const download = util.promisify(require('minecraft-wrap').download)
14+
15+
const { getPort } = require('./common/util')
1316

1417
for (const supportedVersion of mc.supportedVersions) {
15-
const PORT = Math.round(30000 + Math.random() * 20000)
18+
let PORT = null
1619
const mcData = require('minecraft-data')(supportedVersion)
1720
const version = mcData.version
1821
const MC_SERVER_JAR_DIR = process.env.MC_SERVER_JAR_DIR || os.tmpdir()
@@ -28,28 +31,39 @@ for (const supportedVersion of mc.supportedVersions) {
2831
describe('client ' + version.minecraftVersion, function () {
2932
this.timeout(10 * 60 * 1000)
3033

31-
before(download.bind(null, version.minecraftVersion, MC_SERVER_JAR))
34+
before(async function () {
35+
this.timeout(30 * 1000)
36+
await download(version.minecraftVersion, MC_SERVER_JAR)
37+
PORT = await getPort()
38+
console.log(`Port chosen: ${PORT}`)
39+
})
3240

33-
after(function (done) {
34-
wrap.deleteServerData(function (err) {
35-
if (err) { console.log(err) }
36-
done(err)
41+
after(async () => {
42+
await new Promise((resolve, reject) => {
43+
wrap.deleteServerData(err => {
44+
if (err) reject(err)
45+
resolve()
46+
})
3747
})
3848
})
3949

4050
describe('offline', function () {
41-
before(function (done) {
51+
this.timeout(90 * 1000)
52+
before(async () => {
4253
console.log(new Date() + 'starting server ' + version.minecraftVersion)
43-
wrap.startServer({
44-
'online-mode': 'false',
45-
'server-port': PORT,
46-
motd: 'test1234',
47-
'max-players': 120
48-
}, function (err) {
49-
if (err) { console.log(err) }
50-
console.log(new Date() + 'started server ' + version.minecraftVersion)
51-
done(err)
54+
await new Promise((resolve, reject) => {
55+
wrap.startServer({
56+
'online-mode': 'false',
57+
'server-port': PORT,
58+
motd: 'test1234',
59+
'max-players': 120,
60+
'use-native-transport': 'false' // java 16 throws errors without this, https://www.spigotmc.org/threads/unable-to-access-address-of-buffer.311602
61+
}, (err) => {
62+
if (err) reject(err)
63+
resolve()
64+
})
5265
})
66+
console.log(new Date() + 'started server ' + version.minecraftVersion)
5367
})
5468

5569
after(function (done) {
@@ -173,12 +187,13 @@ for (const supportedVersion of mc.supportedVersions) {
173187
})
174188
})
175189

176-
describe('online', function () {
190+
describe.skip('online', function () {
177191
before(function (done) {
178192
console.log(new Date() + 'starting server ' + version.minecraftVersion)
179193
wrap.startServer({
180194
'online-mode': 'true',
181-
'server-port': PORT
195+
'server-port': PORT,
196+
'use-native-transport': 'false' // java 16 throws errors without this, https://www.spigotmc.org/threads/unable-to-access-address-of-buffer.311602
182197
}, function (err) {
183198
if (err) { console.log(err) }
184199
console.log(new Date() + 'started server ' + version.minecraftVersion)
@@ -195,7 +210,7 @@ for (const supportedVersion of mc.supportedVersions) {
195210
})
196211
})
197212

198-
it.skip('connects successfully - online mode', function (done) {
213+
it('connects successfully - online mode', function (done) {
199214
const client = mc.createClient({
200215
username: process.env.MC_USERNAME,
201216
password: process.env.MC_PASSWORD,

test/common/util.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
const net = require('net')
2+
3+
const getPort = () => new Promise(resolve => {
4+
const server = net.createServer()
5+
server.listen(0, '127.0.0.1')
6+
server.on('listening', () => {
7+
const { port } = server.address()
8+
server.close(() => resolve(port))
9+
})
10+
})
11+
12+
module.exports = { getPort }

test/packetTest.js

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ const assert = require('power-assert')
88
const getFieldInfo = require('protodef').utils.getFieldInfo
99
const getField = require('protodef').utils.getField
1010

11+
const { getPort } = require('./common/util')
12+
1113
function evalCount (count, fields) {
1214
if (fields[count.field] in count.map) { return count.map[fields[count.field]] }
1315
return count.default
@@ -188,24 +190,29 @@ function getValue (_type, packet) {
188190
}
189191

190192
for (const supportedVersion of mc.supportedVersions) {
191-
const PORT = Math.round(30000 + Math.random() * 20000)
193+
let PORT
194+
192195
const mcData = require('minecraft-data')(supportedVersion)
193196
const version = mcData.version
194197
const packets = mcData.protocol
195198

196199
describe('packets ' + version.minecraftVersion, function () {
197200
let client, server, serverClient
198-
before(function (done) {
201+
before(async function () {
202+
PORT = await getPort()
199203
server = new Server(version.minecraftVersion)
200-
server.once('listening', function () {
201-
server.once('connection', function (c) {
202-
serverClient = c
203-
done()
204+
return new Promise((resolve) => {
205+
console.log(`Using port for tests: ${PORT}`)
206+
server.once('listening', function () {
207+
server.once('connection', function (c) {
208+
serverClient = c
209+
resolve()
210+
})
211+
client = new Client(false, version.minecraftVersion)
212+
client.setSocket(net.connect(PORT, 'localhost'))
204213
})
205-
client = new Client(false, version.minecraftVersion)
206-
client.setSocket(net.connect(PORT, 'localhost'))
214+
server.listen(PORT, 'localhost')
207215
})
208-
server.listen(PORT, 'localhost')
209216
})
210217
after(function (done) {
211218
client.on('end', function () {

test/serverTest.js

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ const mc = require('../')
44
const assert = require('power-assert')
55
const { once } = require('events')
66

7+
const { getPort } = require('./common/util')
8+
79
const w = {
810
piglin_safe: {
911
type: 'byte',
@@ -60,11 +62,17 @@ const w = {
6062
}
6163

6264
for (const supportedVersion of mc.supportedVersions) {
63-
const PORT = Math.round(30000 + Math.random() * 20000)
65+
let PORT
6466
const mcData = require('minecraft-data')(supportedVersion)
6567
const version = mcData.version
6668

6769
describe('mc-server ' + version.minecraftVersion, function () {
70+
71+
this.beforeAll(async function() {
72+
PORT = await getPort()
73+
console.log(`Using port for tests: ${PORT}`)
74+
})
75+
6876
this.timeout(5000)
6977
it('starts listening and shuts down cleanly', function (done) {
7078
const server = mc.createServer({
@@ -183,6 +191,32 @@ for (const supportedVersion of mc.supportedVersions) {
183191
})
184192
server.on('close', done)
185193
})
194+
it('clients can be changed by beforeLogin', function (done) {
195+
const notchUUID = '069a79f4-44e9-4726-a5be-fca90e38aaf5'
196+
const server = mc.createServer({
197+
'online-mode': false,
198+
version: version.minecraftVersion,
199+
port: PORT,
200+
beforeLogin: (client) => {
201+
client.uuid = notchUUID
202+
}
203+
})
204+
server.on('listening', function () {
205+
const client = mc.createClient({
206+
username: 'notNotch',
207+
host: '127.0.0.1',
208+
version: version.minecraftVersion,
209+
port: PORT
210+
})
211+
client.on('packet', (data, {name})=>{
212+
if (name === 'success') {
213+
assert.strictEqual(data.uuid, notchUUID, 'UUID')
214+
server.close()
215+
}
216+
})
217+
})
218+
server.on('close', done)
219+
})
186220
it('clients can log in and chat', function (done) {
187221
const server = mc.createServer({
188222
'online-mode': false,
@@ -203,9 +237,9 @@ for (const supportedVersion of mc.supportedVersions) {
203237
entityId: client.id,
204238
levelType: 'default',
205239
gameMode: 1,
206-
previousGameMode: 255,
240+
previousGameMode: version.version >= 755 ? 0 : 255,
207241
worldNames: ['minecraft:overworld'],
208-
dimensionCodec: (version.version >= 735 ? mcData.loginPacket.dimension : { name: '', type: 'compound', value: { dimension: { type: 'list', value: { type: 'compound', value: [w] } } } }),
242+
dimensionCodec: version.version >= 755 ? mcData.loginPacket.dimensionCodec : (version.version >= 735 ? mcData.loginPacket.dimension : { name: '', type: 'compound', value: { dimension: { type: 'list', value: { type: 'compound', value: [w] } } } }),
209243
dimension: (version.version >= 735 ? mcData.loginPacket.dimension : 0),
210244
worldName: 'minecraft:overworld',
211245
hashedSeed: [0, 0],
@@ -328,9 +362,9 @@ for (const supportedVersion of mc.supportedVersions) {
328362
entityId: client.id,
329363
levelType: 'default',
330364
gameMode: 1,
331-
previousGameMode: 255,
365+
previousGameMode: version.version >= 755 ? 0 : 255,
332366
worldNames: ['minecraft:overworld'],
333-
dimensionCodec: (version.version >= 735 ? mcData.loginPacket.dimension : { name: '', type: 'compound', value: { dimension: { type: 'list', value: { type: 'compound', value: [w] } } } }),
367+
dimensionCodec: version.version >= 755 ? mcData.loginPacket.dimensionCodec : (version.version >= 735 ? mcData.loginPacket.dimension : { name: '', type: 'compound', value: { dimension: { type: 'list', value: { type: 'compound', value: [w] } } } }),
334368
dimension: (version.version >= 735 ? mcData.loginPacket.dimension : 0),
335369
worldName: 'minecraft:overworld',
336370
hashedSeed: [0, 0],
@@ -379,9 +413,9 @@ for (const supportedVersion of mc.supportedVersions) {
379413
entityId: client.id,
380414
levelType: 'default',
381415
gameMode: 1,
382-
previousGameMode: 255,
416+
previousGameMode: version.version >= 755 ? 0 : 255,
383417
worldNames: ['minecraft:overworld'],
384-
dimensionCodec: (version.version >= 735 ? mcData.loginPacket.dimension : { name: '', type: 'compound', value: { dimension: { type: 'list', value: { type: 'compound', value: [w] } } } }),
418+
dimensionCodec: version.version >= 755 ? mcData.loginPacket.dimensionCodec : (version.version >= 735 ? mcData.loginPacket.dimension : { name: '', type: 'compound', value: { dimension: { type: 'list', value: { type: 'compound', value: [w] } } } }),
385419
dimension: (version.version >= 735 ? mcData.loginPacket.dimension : 0),
386420
worldName: 'minecraft:overworld',
387421
hashedSeed: [0, 0],

0 commit comments

Comments
 (0)