@jsprismarine/client 0.1.0-rc.49 → 0.1.0-rc.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Client.d.ts +7 -5
- package/dist/Client.d.ts.map +1 -1
- package/dist/Client.js +53 -51
- package/dist/Client.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -6217
- package/package.json +8 -6
- package/LICENSE +0 -373
package/dist/Client.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
3
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
4
|
+
import { InetAddress, RakNetSession } from '@jsprismarine/raknet';
|
|
5
|
+
import { type Socket } from 'dgram';
|
|
4
6
|
import { EventEmitter } from 'events';
|
|
5
|
-
export default class Client extends EventEmitter
|
|
7
|
+
export default class Client extends EventEmitter {
|
|
6
8
|
private clientGUID;
|
|
7
9
|
private readonly logger;
|
|
8
10
|
private readonly address;
|
|
@@ -33,6 +35,6 @@ export default class Client extends EventEmitter implements RakNetListener {
|
|
|
33
35
|
sendBuffer(buffer: Buffer): Promise<void>;
|
|
34
36
|
getSocket(): Socket;
|
|
35
37
|
getAddress(): InetAddress;
|
|
36
|
-
removeConnection(connection:
|
|
38
|
+
removeConnection(connection: RakNetSession, reason?: string): Promise<void>;
|
|
37
39
|
}
|
|
38
40
|
//# sourceMappingURL=Client.d.ts.map
|
package/dist/Client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Client.d.ts","sourceRoot":"","sources":["../src/Client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Client.d.ts","sourceRoot":"","sources":["../src/Client.ts"],"names":[],"mappings":";;;AAAA,OAAO,EAAsB,WAAW,EAAY,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChG,OAAc,EAAE,KAAK,MAAM,EAAE,MAAM,OAAO,CAAC;AAK3C,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAoBtC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,YAAY;IAC5C,OAAO,CAAC,UAAU,CAA0C;IAC5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAC/D,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,YAAY,CAAS;;IAQ7B;;OAEG;IACU,OAAO,CAAC,OAAO,SAAY,EAAE,IAAI,SAAQ;YA6CxC,MAAM;IAyBb,qBAAqB,CAAC,MAAM,EAAE,MAAM;IAuBpC,0BAA0B,CAAC,MAAM,EAAE,MAAM;IAoCzC,0BAA0B,CAAC,MAAM,EAAE,MAAM;IA2BhD;;;;;;OAMG;IACU,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,SAAS,IAAI,MAAM;IAInB,UAAU,IAAI,WAAW;IAInB,gBAAgB,CAAC,UAAU,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG3F"}
|
package/dist/Client.js
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const prismarine_1 = require("@jsprismarine/prismarine");
|
|
9
|
-
const dynamic_1 = require("set-interval-async/dynamic");
|
|
10
|
-
const crypto_1 = __importDefault(require("crypto"));
|
|
11
|
-
const events_1 = require("events");
|
|
1
|
+
import { ConnectionPriority, InetAddress, Protocol, RakNetSession } from '@jsprismarine/raknet';
|
|
2
|
+
import Dgram from 'dgram';
|
|
3
|
+
import { Protocol as JSPProtocol, Logger } from '@jsprismarine/prismarine';
|
|
4
|
+
import { clearIntervalAsync, setIntervalAsync } from 'set-interval-async/dynamic';
|
|
5
|
+
import Crypto, { randomBytes } from 'crypto';
|
|
6
|
+
import { EventEmitter } from 'events';
|
|
7
|
+
import { RakNetPriority } from '@jsprismarine/raknet/src/Session.js';
|
|
12
8
|
// https://stackoverflow.com/a/1527820/3142553
|
|
13
9
|
const getRandomInt = (min, max) => {
|
|
14
10
|
min = Math.ceil(min);
|
|
@@ -22,78 +18,80 @@ const DEF_MTU_SIZE = 1455;
|
|
|
22
18
|
// Raknet ticks
|
|
23
19
|
const RAKNET_TPS = 100;
|
|
24
20
|
const RAKNET_TICK_LENGTH = 1 / RAKNET_TPS;
|
|
25
|
-
class Client extends
|
|
21
|
+
export default class Client extends EventEmitter {
|
|
22
|
+
clientGUID = Crypto.randomBytes(8).readBigInt64BE();
|
|
23
|
+
logger = new Logger();
|
|
24
|
+
address;
|
|
25
|
+
targetAddress;
|
|
26
|
+
connection = null;
|
|
27
|
+
socket = Dgram.createSocket({ type: 'udp4' });
|
|
28
|
+
get closed() {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
connecting = false;
|
|
32
|
+
connected = false;
|
|
33
|
+
offlineHandled = false;
|
|
34
|
+
loginHandled = false;
|
|
26
35
|
constructor() {
|
|
27
36
|
super();
|
|
28
|
-
this.
|
|
29
|
-
this.logger = new prismarine_1.Logger();
|
|
30
|
-
this.connection = null;
|
|
31
|
-
this.socket = dgram_1.default.createSocket({ type: 'udp4' });
|
|
32
|
-
this.connecting = false;
|
|
33
|
-
this.connected = false;
|
|
34
|
-
this.offlineHandled = false;
|
|
35
|
-
this.loginHandled = false;
|
|
36
|
-
this.address = new raknet_1.InetAddress('0.0.0.0', getRandomInt(46000, 49999));
|
|
37
|
+
this.address = new InetAddress('0.0.0.0', getRandomInt(46000, 49999));
|
|
37
38
|
this.socket.bind(this.address.getPort(), this.address.getAddress());
|
|
38
39
|
}
|
|
39
|
-
get closed() {
|
|
40
|
-
return false;
|
|
41
|
-
}
|
|
42
40
|
/**
|
|
43
41
|
* Creates a packet listener on given address and port.
|
|
44
42
|
*/
|
|
45
43
|
async connect(address = '0.0.0.0', port = 19132) {
|
|
46
|
-
this.targetAddress = new
|
|
44
|
+
this.targetAddress = new InetAddress(address, port);
|
|
47
45
|
this.socket.on('message', (buffer) => {
|
|
48
46
|
void this.handle(buffer);
|
|
49
47
|
});
|
|
50
48
|
if (this.connection)
|
|
51
49
|
throw new Error('Already connected/connecting to server.');
|
|
52
50
|
this.logger.info('JSPrismarine client is now attempting to connect...');
|
|
53
|
-
const timer =
|
|
51
|
+
const timer = setIntervalAsync(async () => {
|
|
54
52
|
if (this.closed) {
|
|
55
|
-
await
|
|
53
|
+
await clearIntervalAsync(timer);
|
|
56
54
|
return;
|
|
57
55
|
}
|
|
58
56
|
// Send a client packet to the server
|
|
59
57
|
// so the server goes in target mode
|
|
60
58
|
// and the login process starts
|
|
61
59
|
if (!this.connecting) {
|
|
62
|
-
const pk = new
|
|
63
|
-
pk.
|
|
64
|
-
pk.
|
|
60
|
+
const pk = new Protocol.UnconnectedPing();
|
|
61
|
+
pk.timestamp = BigInt(Date.now());
|
|
62
|
+
// TODO: can be omitted... pk. = this.clientGUID;
|
|
65
63
|
pk.encode();
|
|
66
64
|
await this.sendBuffer(pk.getBuffer());
|
|
67
65
|
}
|
|
68
66
|
if (this.connected && !this.loginHandled) {
|
|
69
|
-
const pk = new
|
|
67
|
+
const pk = new JSPProtocol.Packets.LoginPacket();
|
|
70
68
|
pk.encode();
|
|
71
|
-
const sendPk = new
|
|
69
|
+
const sendPk = new Protocol.Frame();
|
|
72
70
|
sendPk.reliability = 0;
|
|
73
|
-
sendPk.
|
|
74
|
-
|
|
71
|
+
sendPk.content = pk.getBuffer();
|
|
72
|
+
this.connection.sendFrame(sendPk, ConnectionPriority.NORMAL); // Packet needs to be splitted
|
|
75
73
|
this.loginHandled = true;
|
|
76
74
|
}
|
|
77
|
-
|
|
75
|
+
this.connection?.update(Date.now());
|
|
78
76
|
}, RAKNET_TICK_LENGTH * 1000);
|
|
79
77
|
return this;
|
|
80
78
|
}
|
|
81
79
|
async handle(buffer) {
|
|
82
80
|
const header = buffer.readUInt8(); // Read packet header
|
|
83
81
|
if (this.connection && this.offlineHandled) {
|
|
84
|
-
return this.connection.
|
|
82
|
+
return this.connection.handle(buffer);
|
|
85
83
|
}
|
|
86
84
|
let buf;
|
|
87
85
|
switch (header) {
|
|
88
|
-
case
|
|
86
|
+
case Protocol.MessageIdentifiers.UNCONNECTED_PONG:
|
|
89
87
|
buf = this.handleUnconnectedPong(buffer);
|
|
90
88
|
await this.sendBuffer(buf);
|
|
91
89
|
break;
|
|
92
|
-
case
|
|
90
|
+
case Protocol.MessageIdentifiers.OPEN_CONNECTION_REPLY_1:
|
|
93
91
|
buf = this.handleOpenConnectionReply1(buffer);
|
|
94
92
|
await this.sendBuffer(buf);
|
|
95
93
|
break;
|
|
96
|
-
case
|
|
94
|
+
case Protocol.MessageIdentifiers.OPEN_CONNECTION_REPLY_2:
|
|
97
95
|
this.handleOpenConnectionReply2(buffer);
|
|
98
96
|
break;
|
|
99
97
|
default:
|
|
@@ -102,7 +100,7 @@ class Client extends events_1.EventEmitter {
|
|
|
102
100
|
}
|
|
103
101
|
handleUnconnectedPong(buffer) {
|
|
104
102
|
// Decode server packet
|
|
105
|
-
const decodedPacket = new
|
|
103
|
+
const decodedPacket = new Protocol.UnconnectedPong(buffer);
|
|
106
104
|
decodedPacket.decode();
|
|
107
105
|
// Check packet validity
|
|
108
106
|
// To refactor
|
|
@@ -110,7 +108,7 @@ class Client extends events_1.EventEmitter {
|
|
|
110
108
|
throw new Error('Received an invalid offline message');
|
|
111
109
|
}
|
|
112
110
|
// Encode response
|
|
113
|
-
const packet = new
|
|
111
|
+
const packet = new Protocol.OpenConnectionRequest1();
|
|
114
112
|
packet.protocol = PROTOCOL;
|
|
115
113
|
packet.mtuSize = DEF_MTU_SIZE;
|
|
116
114
|
packet.encode();
|
|
@@ -120,7 +118,7 @@ class Client extends events_1.EventEmitter {
|
|
|
120
118
|
}
|
|
121
119
|
handleOpenConnectionReply1(buffer) {
|
|
122
120
|
// Decode server packet
|
|
123
|
-
const decodedPacket = new
|
|
121
|
+
const decodedPacket = new Protocol.OpenConnectionReply1(buffer);
|
|
124
122
|
decodedPacket.decode();
|
|
125
123
|
// Check packet validity
|
|
126
124
|
// To refactor
|
|
@@ -128,7 +126,7 @@ class Client extends events_1.EventEmitter {
|
|
|
128
126
|
throw new Error('Received an invalid offline message');
|
|
129
127
|
}
|
|
130
128
|
// Encode response
|
|
131
|
-
const packet = new
|
|
129
|
+
const packet = new Protocol.OpenConnectionRequest2();
|
|
132
130
|
packet.serverAddress = this.targetAddress;
|
|
133
131
|
packet.mtuSize = DEF_MTU_SIZE;
|
|
134
132
|
packet.clientGUID = this.clientGUID;
|
|
@@ -136,12 +134,17 @@ class Client extends events_1.EventEmitter {
|
|
|
136
134
|
// Update session status
|
|
137
135
|
this.connecting = true;
|
|
138
136
|
// This.status = ConnectionStatus.Connected;
|
|
139
|
-
this.connection = new
|
|
137
|
+
this.connection = new RakNetSession(this, DEF_MTU_SIZE, {
|
|
138
|
+
address: this.address.getAddress(),
|
|
139
|
+
port: this.address.getPort(),
|
|
140
|
+
family: 'IPv4',
|
|
141
|
+
size: 0
|
|
142
|
+
}, randomBytes(8).readBigInt64BE());
|
|
140
143
|
return packet.getBuffer();
|
|
141
144
|
}
|
|
142
145
|
handleOpenConnectionReply2(buffer) {
|
|
143
146
|
// Decode server packet
|
|
144
|
-
const decodedPacket = new
|
|
147
|
+
const decodedPacket = new Protocol.OpenConnectionReply2(buffer);
|
|
145
148
|
decodedPacket.decode();
|
|
146
149
|
// Check packet validity
|
|
147
150
|
// To refactor
|
|
@@ -149,14 +152,14 @@ class Client extends events_1.EventEmitter {
|
|
|
149
152
|
throw new Error('Received an invalid offline message');
|
|
150
153
|
}
|
|
151
154
|
// Encode response (encapsulated)
|
|
152
|
-
const packet = new
|
|
155
|
+
const packet = new Protocol.ConnectionRequest();
|
|
153
156
|
packet.clientGUID = this.clientGUID;
|
|
154
157
|
packet.requestTimestamp = BigInt(Date.now());
|
|
155
158
|
packet.encode();
|
|
156
|
-
const sendPacket = new
|
|
159
|
+
const sendPacket = new Protocol.Frame();
|
|
157
160
|
sendPacket.reliability = 0;
|
|
158
|
-
sendPacket.
|
|
159
|
-
|
|
161
|
+
sendPacket.content = packet.getBuffer();
|
|
162
|
+
this.connection?.sendFrame(sendPacket, RakNetPriority.NORMAL);
|
|
160
163
|
this.offlineHandled = true;
|
|
161
164
|
this.connected = true; // Should be... we can't rely on it
|
|
162
165
|
}
|
|
@@ -176,9 +179,8 @@ class Client extends events_1.EventEmitter {
|
|
|
176
179
|
getAddress() {
|
|
177
180
|
return this.address;
|
|
178
181
|
}
|
|
179
|
-
removeConnection(connection, reason) {
|
|
182
|
+
async removeConnection(connection, reason) {
|
|
180
183
|
throw new Error('Method not implemented.');
|
|
181
184
|
}
|
|
182
185
|
}
|
|
183
|
-
exports.default = Client;
|
|
184
186
|
//# sourceMappingURL=Client.js.map
|
package/dist/Client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Client.js","sourceRoot":"","sources":["../src/Client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Client.js","sourceRoot":"","sources":["../src/Client.ts"],"names":[],"mappings":"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"}
|