@@ -12,12 +12,12 @@ index c437ecf3a0e4ab5758a48538c714b7e9651bb5da..d9c9895ae8614550aa09ad60a396ac32
12
12
debug('ping response', response)
13
13
// TODO: could also use ping pre-connect to save description, type, max players, etc.
14
14
@@ -40,6 +40,7 @@ module.exports = function (client, options) {
15
-
15
+
16
16
// Reinitialize client object with new version TODO: move out of its constructor?
17
17
client.version = minecraftVersion
18
18
+ await options.versionSelectedHook?.(client)
19
19
client.state = states.HANDSHAKING
20
-
20
+
21
21
// Let other plugins such as Forge/FML (modinfo) respond to the ping response
22
22
diff --git a/src/client/encrypt.js b/src/client/encrypt.js
23
23
index b9d21bab9faccd5dbf1975fc423fc55c73e906c5..99ffd76527b410e3a393181beb260108f4c63536 100644
@@ -34,7 +34,7 @@ index b9d21bab9faccd5dbf1975fc423fc55c73e906c5..99ffd76527b410e3a393181beb260108
34
34
+ // clearTimeout(loginTimeout)
35
35
+ // })
36
36
}
37
-
37
+
38
38
function onJoinServerResponse (err) {
39
39
diff --git a/src/client.js b/src/client.js
40
40
index c89375e32babbf3559655b1e95f6441b9a30796f..f24cd5dc8fa9a0a4000b184fb3c79590a3ad8b8a 100644
@@ -74,7 +74,7 @@ index c89375e32babbf3559655b1e95f6441b9a30796f..f24cd5dc8fa9a0a4000b184fb3c79590
74
74
}
75
75
@@ -166,7 +174,10 @@ class Client extends EventEmitter {
76
76
}
77
-
77
+
78
78
const onFatalError = (err) => {
79
79
- this.emit('error', err)
80
80
+ // todo find out what is trying to write after client disconnect
@@ -83,7 +83,7 @@ index c89375e32babbf3559655b1e95f6441b9a30796f..f24cd5dc8fa9a0a4000b184fb3c79590
83
83
+ }
84
84
endSocket()
85
85
}
86
-
86
+
87
87
@@ -195,6 +206,8 @@ class Client extends EventEmitter {
88
88
serializer -> framer -> socket -> splitter -> deserializer */
89
89
if (this.serializer) {
@@ -94,7 +94,7 @@ index c89375e32babbf3559655b1e95f6441b9a30796f..f24cd5dc8fa9a0a4000b184fb3c79590
94
94
if (this.socket) this.socket.end()
95
95
}
96
96
@@ -236,8 +249,11 @@ class Client extends EventEmitter {
97
-
97
+
98
98
write (name, params) {
99
99
if (!this.serializer.writable) { return }
100
100
- debug('writing packet ' + this.state + '.' + name)
@@ -106,7 +106,7 @@ index c89375e32babbf3559655b1e95f6441b9a30796f..f24cd5dc8fa9a0a4000b184fb3c79590
106
106
+ this.emit('writePacket', name, params)
107
107
this.serializer.write({ name, params })
108
108
}
109
-
109
+
110
110
diff --git a/src/index.d.ts b/src/index.d.ts
111
111
index 0a5821c32d735e11205a280aa5a503c13533dc14..94a49f661d922478b940d853169b6087e6ec3df5 100644
112
112
--- a/src/index.d.ts
@@ -126,5 +126,63 @@ index 0a5821c32d735e11205a280aa5a503c13533dc14..94a49f661d922478b940d853169b6087
126
126
+ /** Can be used to prepare mc data on autoVersion (client.version has selected version) */
127
127
+ versionSelectedHook?: (client: Client) => Promise<void> | void
128
128
}
129
-
129
+
130
130
export class Server extends EventEmitter {
131
+ diff --git a/src/client/chat.js b/src/client/chat.js
132
+ index 5cad9954db13d7121ed0a03792c2304156cdf436..ffd7c7d6299ef54854e0923f8d5296bf2a58956b 100644
133
+ --- a/src/client/chat.js
134
+ +++ b/src/client/chat.js
135
+ @@ -111,7 +111,7 @@ module.exports = function (client, options) {
136
+ for (const player of packet.data) {
137
+ if (!player.chatSession) continue
138
+ client._players[player.UUID] = {
139
+ - publicKey: crypto.createPublicKey({ key: player.chatSession.publicKey.keyBytes, format: 'der', type: 'spki' }),
140
+ + // publicKey: crypto.createPublicKey({ key: player.chatSession.publicKey.keyBytes, format: 'der', type: 'spki' }),
141
+ publicKeyDER: player.chatSession.publicKey.keyBytes,
142
+ sessionUuid: player.chatSession.uuid
143
+ }
144
+ @@ -127,7 +127,7 @@ module.exports = function (client, options) {
145
+ for (const player of packet.data) {
146
+ if (player.crypto) {
147
+ client._players[player.UUID] = {
148
+ - publicKey: crypto.createPublicKey({ key: player.crypto.publicKey, format: 'der', type: 'spki' }),
149
+ + // publicKey: crypto.createPublicKey({ key: player.crypto.publicKey, format: 'der', type: 'spki' }),
150
+ publicKeyDER: player.crypto.publicKey,
151
+ signature: player.crypto.signature,
152
+ displayName: player.displayName || player.name
153
+ @@ -198,7 +198,7 @@ module.exports = function (client, options) {
154
+ if (mcData.supportFeature('useChatSessions')) {
155
+ const tsDelta = BigInt(Date.now()) - packet.timestamp
156
+ const expired = !packet.timestamp || tsDelta > messageExpireTime || tsDelta < 0
157
+ - const verified = !packet.unsignedChatContent && updateAndValidateSession(packet.senderUuid, packet.plainMessage, packet.signature, packet.index, packet.previousMessages, packet.salt, packet.timestamp) && !expired
158
+ + const verified = false && !packet.unsignedChatContent && updateAndValidateSession(packet.senderUuid, packet.plainMessage, packet.signature, packet.index, packet.previousMessages, packet.salt, packet.timestamp) && !expired
159
+ if (verified) client._signatureCache.push(packet.signature)
160
+ client.emit('playerChat', {
161
+ plainMessage: packet.plainMessage,
162
+ @@ -363,7 +363,7 @@ module.exports = function (client, options) {
163
+ }
164
+ }
165
+
166
+ - client._signedChat = (message, options = {}) => {
167
+ + client._signedChat = async (message, options = {}) => {
168
+ options.timestamp = options.timestamp || BigInt(Date.now())
169
+ options.salt = options.salt || 1n
170
+
171
+ @@ -404,7 +404,7 @@ module.exports = function (client, options) {
172
+ message,
173
+ timestamp: options.timestamp,
174
+ salt: options.salt,
175
+ - signature: (client.profileKeys && client._session) ? client.signMessage(message, options.timestamp, options.salt, undefined, acknowledgements) : undefined,
176
+ + signature: (client.profileKeys && client._session) ? await client.signMessage(message, options.timestamp, options.salt, undefined, acknowledgements) : undefined,
177
+ offset: client._lastSeenMessages.pending,
178
+ acknowledged
179
+ })
180
+ @@ -418,7 +418,7 @@ module.exports = function (client, options) {
181
+ message,
182
+ timestamp: options.timestamp,
183
+ salt: options.salt,
184
+ - signature: client.profileKeys ? client.signMessage(message, options.timestamp, options.salt, options.preview) : Buffer.alloc(0),
185
+ + signature: client.profileKeys ? await client.signMessage(message, options.timestamp, options.salt, options.preview) : Buffer.alloc(0),
186
+ signedPreview: options.didPreview,
187
+ previousMessages: client._lastSeenMessages.map((e) => ({
188
+ messageSender: e.sender,
0 commit comments