Skip to content

Commit a0c4701

Browse files
committed
Prepare for a Connection NativeModule.
1 parent 69c3287 commit a0c4701

File tree

6 files changed

+251
-124
lines changed

6 files changed

+251
-124
lines changed

android/gradlew.bat

+103-103
Original file line numberDiff line numberDiff line change
@@ -1,103 +1,103 @@
1-
@rem
2-
@rem Copyright 2015 the original author or authors.
3-
@rem
4-
@rem Licensed under the Apache License, Version 2.0 (the "License");
5-
@rem you may not use this file except in compliance with the License.
6-
@rem You may obtain a copy of the License at
7-
@rem
8-
@rem https://www.apache.org/licenses/LICENSE-2.0
9-
@rem
10-
@rem Unless required by applicable law or agreed to in writing, software
11-
@rem distributed under the License is distributed on an "AS IS" BASIS,
12-
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13-
@rem See the License for the specific language governing permissions and
14-
@rem limitations under the License.
15-
@rem
16-
17-
@if "%DEBUG%" == "" @echo off
18-
@rem ##########################################################################
19-
@rem
20-
@rem Gradle startup script for Windows
21-
@rem
22-
@rem ##########################################################################
23-
24-
@rem Set local scope for the variables with windows NT shell
25-
if "%OS%"=="Windows_NT" setlocal
26-
27-
set DIRNAME=%~dp0
28-
if "%DIRNAME%" == "" set DIRNAME=.
29-
set APP_BASE_NAME=%~n0
30-
set APP_HOME=%DIRNAME%
31-
32-
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
33-
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
34-
35-
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
36-
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
37-
38-
@rem Find java.exe
39-
if defined JAVA_HOME goto findJavaFromJavaHome
40-
41-
set JAVA_EXE=java.exe
42-
%JAVA_EXE% -version >NUL 2>&1
43-
if "%ERRORLEVEL%" == "0" goto init
44-
45-
echo.
46-
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
47-
echo.
48-
echo Please set the JAVA_HOME variable in your environment to match the
49-
echo location of your Java installation.
50-
51-
goto fail
52-
53-
:findJavaFromJavaHome
54-
set JAVA_HOME=%JAVA_HOME:"=%
55-
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
56-
57-
if exist "%JAVA_EXE%" goto init
58-
59-
echo.
60-
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
61-
echo.
62-
echo Please set the JAVA_HOME variable in your environment to match the
63-
echo location of your Java installation.
64-
65-
goto fail
66-
67-
:init
68-
@rem Get command-line arguments, handling Windows variants
69-
70-
if not "%OS%" == "Windows_NT" goto win9xME_args
71-
72-
:win9xME_args
73-
@rem Slurp the command line arguments.
74-
set CMD_LINE_ARGS=
75-
set _SKIP=2
76-
77-
:win9xME_args_slurp
78-
if "x%~1" == "x" goto execute
79-
80-
set CMD_LINE_ARGS=%*
81-
82-
:execute
83-
@rem Setup the command line
84-
85-
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
86-
87-
@rem Execute Gradle
88-
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
89-
90-
:end
91-
@rem End local scope for the variables with windows NT shell
92-
if "%ERRORLEVEL%"=="0" goto mainEnd
93-
94-
:fail
95-
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
96-
rem the _cmd.exe /c_ return code!
97-
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
98-
exit /b 1
99-
100-
:mainEnd
101-
if "%OS%"=="Windows_NT" endlocal
102-
103-
:omega
1+
@rem
2+
@rem Copyright 2015 the original author or authors.
3+
@rem
4+
@rem Licensed under the Apache License, Version 2.0 (the "License");
5+
@rem you may not use this file except in compliance with the License.
6+
@rem You may obtain a copy of the License at
7+
@rem
8+
@rem https://www.apache.org/licenses/LICENSE-2.0
9+
@rem
10+
@rem Unless required by applicable law or agreed to in writing, software
11+
@rem distributed under the License is distributed on an "AS IS" BASIS,
12+
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
@rem See the License for the specific language governing permissions and
14+
@rem limitations under the License.
15+
@rem
16+
17+
@if "%DEBUG%" == "" @echo off
18+
@rem ##########################################################################
19+
@rem
20+
@rem Gradle startup script for Windows
21+
@rem
22+
@rem ##########################################################################
23+
24+
@rem Set local scope for the variables with windows NT shell
25+
if "%OS%"=="Windows_NT" setlocal
26+
27+
set DIRNAME=%~dp0
28+
if "%DIRNAME%" == "" set DIRNAME=.
29+
set APP_BASE_NAME=%~n0
30+
set APP_HOME=%DIRNAME%
31+
32+
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
33+
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
34+
35+
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
36+
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
37+
38+
@rem Find java.exe
39+
if defined JAVA_HOME goto findJavaFromJavaHome
40+
41+
set JAVA_EXE=java.exe
42+
%JAVA_EXE% -version >NUL 2>&1
43+
if "%ERRORLEVEL%" == "0" goto init
44+
45+
echo.
46+
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
47+
echo.
48+
echo Please set the JAVA_HOME variable in your environment to match the
49+
echo location of your Java installation.
50+
51+
goto fail
52+
53+
:findJavaFromJavaHome
54+
set JAVA_HOME=%JAVA_HOME:"=%
55+
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
56+
57+
if exist "%JAVA_EXE%" goto init
58+
59+
echo.
60+
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
61+
echo.
62+
echo Please set the JAVA_HOME variable in your environment to match the
63+
echo location of your Java installation.
64+
65+
goto fail
66+
67+
:init
68+
@rem Get command-line arguments, handling Windows variants
69+
70+
if not "%OS%" == "Windows_NT" goto win9xME_args
71+
72+
:win9xME_args
73+
@rem Slurp the command line arguments.
74+
set CMD_LINE_ARGS=
75+
set _SKIP=2
76+
77+
:win9xME_args_slurp
78+
if "x%~1" == "x" goto execute
79+
80+
set CMD_LINE_ARGS=%*
81+
82+
:execute
83+
@rem Setup the command line
84+
85+
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
86+
87+
@rem Execute Gradle
88+
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
89+
90+
:end
91+
@rem End local scope for the variables with windows NT shell
92+
if "%ERRORLEVEL%"=="0" goto mainEnd
93+
94+
:fail
95+
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
96+
rem the _cmd.exe /c_ return code!
97+
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
98+
exit /b 1
99+
100+
:mainEnd
101+
if "%OS%"=="Windows_NT" endlocal
102+
103+
:omega

src/minecraft/native/compression.ts renamed to src/minecraft/compression.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import { NativeModules } from 'react-native'
22
import zlib from 'zlib'
33

44
const { CompressionModule } = NativeModules
5+
// This actually introduces a performance penalty compared to JS zlib, hence it's disabled.
56
const isCompressionModuleAvailable = false
6-
// compressionModule?.compressData && CompressionModule.decompressData
7+
// CompressionModule && CompressionModule.compressData && CompressionModule.decompressData
78

89
export const compressData = async (data: Buffer): Promise<Buffer> => {
910
if (isCompressionModuleAvailable) {

src/minecraft/connection/index.ts

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import events from 'events'
2+
import { Packet } from '../packet'
3+
import { Certificate } from '../api/mojang'
4+
import initiateJavaScriptConnection from './javascript'
5+
import initiateNativeConnection, { isNativeConnectionAvailable } from './native'
6+
7+
export interface ConnectionOptions {
8+
host: string
9+
port: number
10+
username: string
11+
protocolVersion: number
12+
selectedProfile?: string
13+
accessToken?: string
14+
certificate?: Certificate
15+
}
16+
17+
export interface ServerConnection extends events.EventEmitter {
18+
options: ConnectionOptions
19+
loggedIn: boolean
20+
closed: boolean
21+
msgSalt?: Buffer
22+
disconnectReason?: string
23+
24+
writePacket: (
25+
packetId: number,
26+
data: Buffer,
27+
cb?: ((err?: Error | undefined) => void) | undefined
28+
) => Promise<boolean>
29+
30+
close: () => void
31+
32+
on: ((event: 'packet', listener: (packet: Packet) => void) => this) &
33+
((event: 'error', listener: (error: Error) => void) => this) &
34+
((event: 'data', listener: (data: Buffer) => void) => this) &
35+
((event: 'close', listener: () => void) => this) &
36+
((event: string, listener: Function) => this)
37+
}
38+
39+
const initiateConnection = async (opts: ConnectionOptions) => {
40+
if (isNativeConnectionAvailable()) {
41+
return await initiateNativeConnection(opts)
42+
}
43+
return await initiateJavaScriptConnection(opts)
44+
}
45+
46+
export default initiateConnection

src/minecraft/connection.ts renamed to src/minecraft/connection/javascript.ts

+15-19
Original file line numberDiff line numberDiff line change
@@ -18,36 +18,32 @@ import {
1818
PacketDataTypes,
1919
parseCompressedPacket,
2020
parsePacket
21-
} from './packet'
21+
} from '../packet'
2222
import {
2323
readVarInt,
2424
writeVarInt,
2525
resolveHostname,
2626
mcHexDigest,
2727
protocolMap,
2828
getRandomBytes
29-
} from './utils'
30-
import { Certificate, joinMinecraftSession } from './api/mojang'
29+
} from '../utils'
30+
import { joinMinecraftSession } from '../api/mojang'
31+
import { ServerConnection, ConnectionOptions } from '.'
3132

32-
export interface ConnectionOptions {
33-
host: string
34-
port: number
35-
username: string
36-
protocolVersion: number
37-
selectedProfile?: string
38-
accessToken?: string
39-
certificate?: Certificate
40-
}
41-
42-
export declare interface ServerConnection {
33+
export declare interface JavaScriptServerConnection {
4334
on: ((event: 'packet', listener: (packet: Packet) => void) => this) &
4435
((event: 'error', listener: (error: Error) => void) => this) &
4536
((event: 'data', listener: (data: Buffer) => void) => this) &
4637
((event: 'close', listener: () => void) => this) &
4738
((event: string, listener: Function) => this)
4839
}
4940

50-
export class ServerConnection extends events.EventEmitter {
41+
/* eslint-disable @typescript-eslint/brace-style */
42+
export class JavaScriptServerConnection
43+
extends events.EventEmitter
44+
implements ServerConnection
45+
{
46+
/* eslint-enable @typescript-eslint/brace-style */
5147
bufferedData: Buffer = Buffer.from([])
5248
compressionThreshold = -1
5349
compressionEnabled = false
@@ -126,11 +122,11 @@ const getLoginPacket = (opts: ConnectionOptions) => {
126122
return concatPacketData(data)
127123
}
128124

129-
const initiateConnection = async (opts: ConnectionOptions) => {
125+
const initiateJavaScriptConnection = async (opts: ConnectionOptions) => {
130126
const [host, port] = await resolveHostname(opts.host, opts.port)
131127
return await new Promise<ServerConnection>((resolve, reject) => {
132128
const socket = net.createConnection({ host, port })
133-
const conn = new ServerConnection(socket, opts)
129+
const conn = new JavaScriptServerConnection(socket, opts)
134130
let resolved = false
135131
const { accessToken, selectedProfile } = opts
136132
socket.on('connect', () => {
@@ -298,8 +294,6 @@ const initiateConnection = async (opts: ConnectionOptions) => {
298294
})
299295
}
300296

301-
export default initiateConnection
302-
303297
const parseEncryptionRequestPacket = (packet: Packet) => {
304298
// ASCII encoding of the server id string
305299
let data = packet.data
@@ -316,3 +310,5 @@ const parseEncryptionRequestPacket = (packet: Packet) => {
316310

317311
return [serverId, publicKey, verifyToken]
318312
}
313+
314+
export default initiateJavaScriptConnection

0 commit comments

Comments
 (0)