forked from PrismarineJS/prismarine-web-client
-
Notifications
You must be signed in to change notification settings - Fork 63
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
21 changed files
with
443 additions
and
75 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -62,6 +62,7 @@ | |
"esbuild": "^0.19.3", | ||
"esbuild-plugin-polyfill-node": "^0.3.0", | ||
"express": "^4.18.2", | ||
"filesize": "^10.0.12", | ||
"flying-squid": "npm:@zardoy/flying-squid@^0.0.20", | ||
"fs-extra": "^11.1.1", | ||
"google-drive-browserfs": "github:zardoy/browserfs#google-drive", | ||
|
@@ -70,32 +71,32 @@ | |
"lodash-es": "^4.17.21", | ||
"minecraft-assets": "^1.12.2", | ||
"minecraft-data": "3.65.0", | ||
"minecraft-protocol": "github:PrismarineJS/node-minecraft-protocol", | ||
"mojangson": "^2.0.4", | ||
"net-browserify": "github:zardoy/prismarinejs-net-browserify", | ||
"node-gzip": "^1.1.2", | ||
"peerjs": "^1.5.0", | ||
"pretty-bytes": "^6.1.1", | ||
"prismarine-provider-anvil": "github:zardoy/prismarine-provider-anvil#everything", | ||
"prosemirror-example-setup": "^1.2.2", | ||
"prosemirror-markdown": "^1.12.0", | ||
"prosemirror-menu": "^1.2.4", | ||
"prosemirror-state": "^1.4.3", | ||
"prosemirror-view": "^1.33.1", | ||
"qrcode.react": "^3.1.0", | ||
"react": "^18.2.0", | ||
"react-dom": "^18.2.0", | ||
"react-transition-group": "^4.4.5", | ||
"remark": "^15.0.1", | ||
"filesize": "^10.0.12", | ||
"sanitize-filename": "^1.6.3", | ||
"skinview3d": "^3.0.1", | ||
"source-map-js": "^1.0.2", | ||
"stats-gl": "^1.0.5", | ||
"stats.js": "^0.17.0", | ||
"use-typed-event-listener": "^4.0.2", | ||
"mojangson": "^2.0.4", | ||
"prosemirror-menu": "^1.2.4", | ||
"tabbable": "^6.2.0", | ||
"title-case": "3.x", | ||
"ua-parser-js": "^1.0.37", | ||
"use-typed-event-listener": "^4.0.2", | ||
"valtio": "^1.11.1", | ||
"vec3": "^0.1.7", | ||
"workbox-build": "^7.0.0" | ||
|
@@ -116,7 +117,7 @@ | |
"browserify-zlib": "^0.2.0", | ||
"buffer": "^6.0.3", | ||
"constants-browserify": "^1.0.0", | ||
"contro-max": "^0.1.2", | ||
"contro-max": "^0.1.6", | ||
"crypto-browserify": "^3.12.0", | ||
"cypress": "^10.11.0", | ||
"cypress-esbuild-preprocessor": "^1.0.2", | ||
|
@@ -156,12 +157,15 @@ | |
"prismarine-world": "github:zardoy/prismarine-world#next-era", | ||
"minecraft-data": "3.65.0", | ||
"prismarine-provider-anvil": "github:zardoy/prismarine-provider-anvil#everything", | ||
"minecraft-protocol": "github:zardoy/minecraft-protocol#everything", | ||
"minecraft-protocol": "github:PrismarineJS/node-minecraft-protocol", | ||
"react": "^18.2.0", | ||
"prismarine-chunk": "github:zardoy/prismarine-chunk" | ||
}, | ||
"updateConfig": { | ||
"ignoreDependencies": [] | ||
}, | ||
"patchedDependencies": { | ||
"[email protected]": "patches/[email protected]" | ||
} | ||
}, | ||
"packageManager": "[email protected]" | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,130 @@ | ||
diff --git a/src/client/autoVersion.js b/src/client/autoVersion.js | ||
index c437ecf3a0e4ab5758a48538c714b7e9651bb5da..d9c9895ae8614550aa09ad60a396ac32ffdf1287 100644 | ||
--- a/src/client/autoVersion.js | ||
+++ b/src/client/autoVersion.js | ||
@@ -9,7 +9,7 @@ module.exports = function (client, options) { | ||
client.wait_connect = true // don't let src/client/setProtocol proceed on socket 'connect' until 'connect_allowed' | ||
debug('pinging', options.host) | ||
// TODO: use 0xfe ping instead for better compatibility/performance? https://github.com/deathcap/node-minecraft-ping | ||
- ping(options, function (err, response) { | ||
+ ping(options, async function (err, response) { | ||
if (err) { return client.emit('error', err) } | ||
debug('ping response', response) | ||
// TODO: could also use ping pre-connect to save description, type, max players, etc. | ||
@@ -40,6 +40,7 @@ module.exports = function (client, options) { | ||
|
||
// Reinitialize client object with new version TODO: move out of its constructor? | ||
client.version = minecraftVersion | ||
+ await options.versionSelectedHook?.(client) | ||
client.state = states.HANDSHAKING | ||
|
||
// Let other plugins such as Forge/FML (modinfo) respond to the ping response | ||
diff --git a/src/client/encrypt.js b/src/client/encrypt.js | ||
index b9d21bab9faccd5dbf1975fc423fc55c73e906c5..99ffd76527b410e3a393181beb260108f4c63536 100644 | ||
--- a/src/client/encrypt.js | ||
+++ b/src/client/encrypt.js | ||
@@ -25,7 +25,11 @@ module.exports = function (client, options) { | ||
if (packet.serverId !== '-') { | ||
debug('This server appears to be an online server and you are providing no password, the authentication will probably fail') | ||
} | ||
- sendEncryptionKeyResponse() | ||
+ client.end('This server appears to be an online server and you are providing no authentication. Try authenticating first.') | ||
+ // sendEncryptionKeyResponse() | ||
+ // client.once('set_compression', () => { | ||
+ // clearTimeout(loginTimeout) | ||
+ // }) | ||
} | ||
|
||
function onJoinServerResponse (err) { | ||
diff --git a/src/client.js b/src/client.js | ||
index c89375e32babbf3559655b1e95f6441b9a30796f..f24cd5dc8fa9a0a4000b184fb3c79590a3ad8b8a 100644 | ||
--- a/src/client.js | ||
+++ b/src/client.js | ||
@@ -88,10 +88,12 @@ class Client extends EventEmitter { | ||
parsed.metadata.name = parsed.data.name | ||
parsed.data = parsed.data.params | ||
parsed.metadata.state = state | ||
- debug('read packet ' + state + '.' + parsed.metadata.name) | ||
- if (debug.enabled) { | ||
- const s = JSON.stringify(parsed.data, null, 2) | ||
- debug(s && s.length > 10000 ? parsed.data : s) | ||
+ if (!globalThis.excludeCommunicationDebugEvents?.includes(parsed.metadata.name)) { | ||
+ debug('read packet ' + state + '.' + parsed.metadata.name) | ||
+ if (debug.enabled) { | ||
+ const s = JSON.stringify(parsed.data, null, 2) | ||
+ debug(s && s.length > 10000 ? parsed.data : s) | ||
+ } | ||
} | ||
if (this._hasBundlePacket && parsed.metadata.name === 'bundle_delimiter') { | ||
if (this._mcBundle.length) { // End bundle | ||
@@ -109,7 +111,13 @@ class Client extends EventEmitter { | ||
this._hasBundlePacket = false | ||
} | ||
} else { | ||
- emitPacket(parsed) | ||
+ try { | ||
+ emitPacket(parsed) | ||
+ } catch (err) { | ||
+ console.log('Client incorrectly handled packet ' + parsed.metadata.name) | ||
+ console.error(err) | ||
+ // todo investigate why it doesn't close the stream even if unhandled there | ||
+ } | ||
} | ||
}) | ||
} | ||
@@ -166,7 +174,10 @@ class Client extends EventEmitter { | ||
} | ||
|
||
const onFatalError = (err) => { | ||
- this.emit('error', err) | ||
+ // todo find out what is trying to write after client disconnect | ||
+ if(err.code !== 'ECONNABORTED') { | ||
+ this.emit('error', err) | ||
+ } | ||
endSocket() | ||
} | ||
|
||
@@ -195,6 +206,8 @@ class Client extends EventEmitter { | ||
serializer -> framer -> socket -> splitter -> deserializer */ | ||
if (this.serializer) { | ||
this.serializer.end() | ||
+ this.socket?.end() | ||
+ this.socket?.emit('end') | ||
} else { | ||
if (this.socket) this.socket.end() | ||
} | ||
@@ -236,8 +249,11 @@ class Client extends EventEmitter { | ||
|
||
write (name, params) { | ||
if (!this.serializer.writable) { return } | ||
- debug('writing packet ' + this.state + '.' + name) | ||
- debug(params) | ||
+ if (!globalThis.excludeCommunicationDebugEvents?.includes(name)) { | ||
+ debug(`[${this.state}] from ${this.isServer ? 'server' : 'client'}: ` + name) | ||
+ debug(params) | ||
+ } | ||
+ this.emit('writePacket', name, params) | ||
this.serializer.write({ name, params }) | ||
} | ||
|
||
diff --git a/src/index.d.ts b/src/index.d.ts | ||
index 0a5821c32d735e11205a280aa5a503c13533dc14..94a49f661d922478b940d853169b6087e6ec3df5 100644 | ||
--- a/src/index.d.ts | ||
+++ b/src/index.d.ts | ||
@@ -121,6 +121,7 @@ declare module 'minecraft-protocol' { | ||
sessionServer?: string | ||
keepAlive?: boolean | ||
closeTimeout?: number | ||
+ closeTimeout?: number | ||
noPongTimeout?: number | ||
checkTimeoutInterval?: number | ||
version?: string | ||
@@ -141,6 +142,8 @@ declare module 'minecraft-protocol' { | ||
disableChatSigning?: boolean | ||
/** Pass custom client implementation if needed. */ | ||
Client?: Client | ||
+ /** Can be used to prepare mc data on autoVersion (client.version has selected version) */ | ||
+ versionSelectedHook?: (client: Client) => Promise<void> | void | ||
} | ||
|
||
export class Server extends EventEmitter { |
Oops, something went wrong.