@sanctumterra/raknet 1.0.10 → 1.0.11
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/src/client/FrameHandler.d.ts +2 -0
- package/dist/src/client/FrameHandler.js +74 -56
- package/dist/src/client/PacketHandler.d.ts +1 -0
- package/dist/src/client/PacketHandler.js +16 -22
- package/dist/src/client/Queue.d.ts +1 -2
- package/dist/src/client/Queue.js +1 -2
- package/dist/src/client/RaknetClient.js +1 -1
- package/package.json +1 -1
|
@@ -16,8 +16,10 @@ export declare class FrameHandler {
|
|
|
16
16
|
private handleFrame;
|
|
17
17
|
private processFrame;
|
|
18
18
|
private handleFragment;
|
|
19
|
+
private reassembleAndProcessFragment;
|
|
19
20
|
private handleSequenced;
|
|
20
21
|
private handleOrdered;
|
|
22
|
+
private processOrderedFrames;
|
|
21
23
|
private handleConnectedPing;
|
|
22
24
|
private handleConnectionRequestAccepted;
|
|
23
25
|
}
|
|
@@ -59,10 +59,16 @@ class FrameHandler {
|
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
handleFrame(frame) {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
else
|
|
62
|
+
_Logger.Logger.debug(`Handling frame: reliability=${frame.reliability}, orderIndex=${frame.orderIndex}, sequenceIndex=${frame.sequenceIndex}`);
|
|
63
|
+
if (frame.isSplit()) {
|
|
64
|
+
this.handleFragment(frame);
|
|
65
|
+
} else if (frame.isSequenced()) {
|
|
66
|
+
this.handleSequenced(frame);
|
|
67
|
+
} else if (frame.isOrdered()) {
|
|
68
|
+
this.handleOrdered(frame);
|
|
69
|
+
} else {
|
|
70
|
+
this.processFrame(frame);
|
|
71
|
+
}
|
|
66
72
|
}
|
|
67
73
|
processFrame(frame) {
|
|
68
74
|
const header = frame.payload[0];
|
|
@@ -79,63 +85,75 @@ class FrameHandler {
|
|
|
79
85
|
}
|
|
80
86
|
}
|
|
81
87
|
handleFragment(frame) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
88
|
+
_Logger.Logger.debug(`Handling fragment: splitId=${frame.splitId}, splitIndex=${frame.splitIndex}, splitSize=${frame.splitSize}`);
|
|
89
|
+
if (!this.fragmentsQueue.has(frame.splitId)) {
|
|
90
|
+
this.fragmentsQueue.set(frame.splitId, new Map());
|
|
91
|
+
}
|
|
92
|
+
const fragment = this.fragmentsQueue.get(frame.splitId);
|
|
93
|
+
if (!fragment) return;
|
|
94
|
+
fragment.set(frame.splitIndex, frame);
|
|
95
|
+
if (fragment.size === frame.splitSize) {
|
|
96
|
+
_Logger.Logger.debug(`Reassembling complete frame from fragments: splitId=${frame.splitId}`);
|
|
97
|
+
this.reassembleAndProcessFragment(frame, fragment);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
reassembleAndProcessFragment(frame, fragment) {
|
|
101
|
+
const stream = new _binarystream.BinaryStream();
|
|
102
|
+
for(let index = 0; index < fragment.size; index++){
|
|
103
|
+
const sframe = fragment.get(index);
|
|
104
|
+
if (sframe) {
|
|
105
|
+
stream.writeBuffer(sframe.payload);
|
|
106
|
+
} else {
|
|
107
|
+
_Logger.Logger.error(`Missing fragment at index ${index} for splitId=${frame.splitId}`);
|
|
108
|
+
return;
|
|
101
109
|
}
|
|
102
|
-
} else {
|
|
103
|
-
this.fragmentsQueue.set(frame.splitId, new Map([
|
|
104
|
-
[
|
|
105
|
-
frame.splitIndex,
|
|
106
|
-
frame
|
|
107
|
-
]
|
|
108
|
-
]));
|
|
109
110
|
}
|
|
111
|
+
const reassembledFrame = new _raknet.Frame();
|
|
112
|
+
reassembledFrame.reliability = frame.reliability;
|
|
113
|
+
reassembledFrame.reliableIndex = frame.reliableIndex;
|
|
114
|
+
reassembledFrame.sequenceIndex = frame.sequenceIndex;
|
|
115
|
+
reassembledFrame.orderIndex = frame.orderIndex;
|
|
116
|
+
reassembledFrame.orderChannel = frame.orderChannel;
|
|
117
|
+
reassembledFrame.payload = stream.getBuffer();
|
|
118
|
+
this.fragmentsQueue.delete(frame.splitId);
|
|
119
|
+
this.handleFrame(reassembledFrame);
|
|
110
120
|
}
|
|
111
121
|
handleSequenced(frame) {
|
|
112
|
-
|
|
113
|
-
|
|
122
|
+
const currentHighestSequence = this.inputHighestSequenceIndex[frame.orderChannel];
|
|
123
|
+
_Logger.Logger.debug(`Handling sequenced frame: sequenceIndex=${frame.sequenceIndex}, currentHighest=${currentHighestSequence}`);
|
|
124
|
+
if (frame.sequenceIndex > currentHighestSequence) {
|
|
125
|
+
this.inputHighestSequenceIndex[frame.orderChannel] = frame.sequenceIndex;
|
|
126
|
+
this.processFrame(frame);
|
|
127
|
+
} else {
|
|
128
|
+
_Logger.Logger.debug(`Discarding old sequenced frame: ${frame.sequenceIndex}`);
|
|
114
129
|
}
|
|
115
|
-
this.inputHighestSequenceIndex[frame.orderChannel] = frame.sequenceIndex + 1;
|
|
116
|
-
return this.processFrame(frame);
|
|
117
130
|
}
|
|
118
131
|
handleOrdered(frame) {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
if (!frame) break;
|
|
128
|
-
this.processFrame(frame);
|
|
129
|
-
outOfOrderQueue.delete(index);
|
|
130
|
-
}
|
|
131
|
-
this.inputOrderingQueue.set(frame.orderChannel, outOfOrderQueue);
|
|
132
|
-
this.inputOrderIndex[frame.orderChannel] = index;
|
|
133
|
-
} else if (frame.orderIndex > this.inputOrderIndex[frame.orderChannel]) {
|
|
134
|
-
const unordered = this.inputOrderingQueue.get(frame.orderChannel);
|
|
135
|
-
if (!unordered) return;
|
|
136
|
-
unordered.set(frame.orderIndex, frame);
|
|
132
|
+
_Logger.Logger.debug(`Handling ordered frame: orderIndex=${frame.orderIndex}, channel=${frame.orderChannel}`);
|
|
133
|
+
const expectedOrderIndex = this.inputOrderIndex[frame.orderChannel];
|
|
134
|
+
const outOfOrderQueue = this.inputOrderingQueue.get(frame.orderChannel);
|
|
135
|
+
if (frame.orderIndex === expectedOrderIndex) {
|
|
136
|
+
this.processOrderedFrames(frame, outOfOrderQueue);
|
|
137
|
+
} else if (frame.orderIndex > expectedOrderIndex) {
|
|
138
|
+
_Logger.Logger.debug(`Queuing out-of-order frame: ${frame.orderIndex}`);
|
|
139
|
+
outOfOrderQueue.set(frame.orderIndex, frame);
|
|
137
140
|
} else {
|
|
138
|
-
|
|
141
|
+
_Logger.Logger.debug(`Discarding old frame: ${frame.orderIndex}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
processOrderedFrames(frame, outOfOrderQueue) {
|
|
145
|
+
this.processFrame(frame);
|
|
146
|
+
this.inputOrderIndex[frame.orderChannel]++;
|
|
147
|
+
let nextOrderIndex = this.inputOrderIndex[frame.orderChannel];
|
|
148
|
+
while(outOfOrderQueue.has(nextOrderIndex)){
|
|
149
|
+
const nextFrame = outOfOrderQueue.get(nextOrderIndex);
|
|
150
|
+
if (nextFrame) {
|
|
151
|
+
_Logger.Logger.debug(`Processing queued frame: ${nextOrderIndex}`);
|
|
152
|
+
this.processFrame(nextFrame);
|
|
153
|
+
outOfOrderQueue.delete(nextOrderIndex);
|
|
154
|
+
this.inputOrderIndex[frame.orderChannel]++;
|
|
155
|
+
nextOrderIndex++;
|
|
156
|
+
}
|
|
139
157
|
}
|
|
140
158
|
}
|
|
141
159
|
handleConnectedPing(buffer) {
|
|
@@ -181,12 +199,12 @@ class FrameHandler {
|
|
|
181
199
|
this.lastInputSequence = -1;
|
|
182
200
|
this.receivedFrameSequences = new Set();
|
|
183
201
|
this.lostFrameSequences = new Set();
|
|
184
|
-
this.inputHighestSequenceIndex = new Array(
|
|
185
|
-
this.inputOrderIndex = new Array(
|
|
202
|
+
this.inputHighestSequenceIndex = new Array(64).fill(0);
|
|
203
|
+
this.inputOrderIndex = new Array(64).fill(0);
|
|
186
204
|
this.inputOrderingQueue = new Map();
|
|
187
205
|
this.fragmentsQueue = new Map();
|
|
188
206
|
this.raknet = raknet;
|
|
189
|
-
for(let index = 0; index <
|
|
207
|
+
for(let index = 0; index < 64; index++){
|
|
190
208
|
this.inputOrderingQueue.set(index, new Map());
|
|
191
209
|
}
|
|
192
210
|
this.raknet.on("tick", ()=>{
|
|
@@ -5,6 +5,7 @@ export declare class PacketHandler {
|
|
|
5
5
|
framehandler: FrameHandler;
|
|
6
6
|
constructor(client: RakNetClient);
|
|
7
7
|
handleIncoming(buffer: Buffer): void;
|
|
8
|
+
otherPackets(buffer: Buffer): void;
|
|
8
9
|
handleOpenConnectionRequest2(buffer: Buffer): void;
|
|
9
10
|
handleOpenConnectionRequest(): void;
|
|
10
11
|
sendConnectionPacket(): void;
|
|
@@ -23,8 +23,8 @@ class PacketHandler {
|
|
|
23
23
|
];
|
|
24
24
|
if (!ignore.includes(packetId)) _Logger.Logger.debug("Received Packet ID " + packetId);
|
|
25
25
|
switch(packetId){
|
|
26
|
-
case
|
|
27
|
-
|
|
26
|
+
case _raknet.Bitflags.Valid + 44:
|
|
27
|
+
this.framehandler.handleFrameSet(buffer);
|
|
28
28
|
break;
|
|
29
29
|
case _raknet.Packet.OpenConnectionReply1:
|
|
30
30
|
this.handleOpenConnectionRequest2(buffer);
|
|
@@ -32,35 +32,29 @@ class PacketHandler {
|
|
|
32
32
|
case _raknet.Packet.OpenConnectionReply2:
|
|
33
33
|
this.handleOpenConnectionRequest();
|
|
34
34
|
break;
|
|
35
|
+
default:
|
|
36
|
+
this.otherPackets(buffer);
|
|
37
|
+
_Logger.Logger.debug('Received unknown packet ' + packetId);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
otherPackets(buffer) {
|
|
41
|
+
const packetId = buffer.readUint8() & 0xf0;
|
|
42
|
+
switch(packetId){
|
|
43
|
+
case _raknet.Bitflags.Valid:
|
|
44
|
+
this.framehandler.handleFrameSet(buffer);
|
|
45
|
+
break;
|
|
35
46
|
case _raknet.Packet.Ack:
|
|
36
|
-
_Logger.Logger.debug(new _raknet.Ack(buffer).deserialize());
|
|
37
47
|
break;
|
|
38
48
|
case _raknet.Packet.Nack:
|
|
39
|
-
_Logger.Logger.debug(new _raknet.Nack(buffer).deserialize());
|
|
40
|
-
break;
|
|
41
|
-
case 128:
|
|
42
|
-
case 129:
|
|
43
|
-
case 130:
|
|
44
|
-
case 131:
|
|
45
|
-
case 132:
|
|
46
|
-
case 134:
|
|
47
|
-
case 135:
|
|
48
|
-
case 136:
|
|
49
|
-
case 137:
|
|
50
|
-
case 138:
|
|
51
|
-
case 139:
|
|
52
|
-
case 140:
|
|
53
|
-
case 141:
|
|
54
|
-
this.framehandler.handleFrameSet(buffer);
|
|
55
49
|
break;
|
|
56
50
|
default:
|
|
57
|
-
|
|
51
|
+
break;
|
|
58
52
|
}
|
|
59
53
|
}
|
|
60
54
|
handleOpenConnectionRequest2(buffer) {
|
|
61
55
|
const reply2 = new _raknet.OpenConnectionReply1(buffer).deserialize();
|
|
62
56
|
const pak = new _raknet.OpenConnectionRequest2();
|
|
63
|
-
pak.mtu =
|
|
57
|
+
pak.mtu = 1024;
|
|
64
58
|
pak.client = this.client.id;
|
|
65
59
|
pak.magic = reply2.magic;
|
|
66
60
|
pak.address = new _raknet.Address(this.client.socket.address().address, this.client.socket.address().port, 4);
|
|
@@ -81,7 +75,7 @@ class PacketHandler {
|
|
|
81
75
|
const packet = new _raknet.OpenConnectionRequest1();
|
|
82
76
|
packet.magic = Buffer.from("\0\xFF\xFF\0\xFE\xFE\xFE\xFE\xFD\xFD\xFD\xFD4Vx", "binary");
|
|
83
77
|
packet.protocol = this.client.protocol;
|
|
84
|
-
packet.mtu =
|
|
78
|
+
packet.mtu = 1024 - _raknet.DGRAM_MTU_OVERHEAD;
|
|
85
79
|
const serializedPacket = packet.serialize();
|
|
86
80
|
this.client.send(serializedPacket);
|
|
87
81
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Frame, FrameSet, Priority } from '@serenityjs/raknet';
|
|
2
2
|
import { RakNetClient } from './RaknetClient';
|
|
3
3
|
export declare class Queue {
|
|
4
|
-
outputBackupQueue: Map<number, Frame[]>;
|
|
5
4
|
outputOrderIndex: Array<number>;
|
|
6
5
|
outputSequenceIndex: Array<number>;
|
|
7
6
|
outputFrameQueue: FrameSet;
|
|
@@ -10,7 +9,7 @@ export declare class Queue {
|
|
|
10
9
|
protected outputsplitIndex: number;
|
|
11
10
|
protected outputReliableIndex: number;
|
|
12
11
|
protected outputFrames: Set<Frame>;
|
|
13
|
-
|
|
12
|
+
outputBackup: Map<number, Frame[]>;
|
|
14
13
|
protected client: RakNetClient;
|
|
15
14
|
constructor(client: RakNetClient);
|
|
16
15
|
onTick(): void;
|
package/dist/src/client/Queue.js
CHANGED
|
@@ -68,8 +68,7 @@ class Queue {
|
|
|
68
68
|
return this.client.send(frameset.serialize());
|
|
69
69
|
}
|
|
70
70
|
constructor(client){
|
|
71
|
-
this.
|
|
72
|
-
this.mtu = 1492;
|
|
71
|
+
this.mtu = 1024;
|
|
73
72
|
this.outputSequence = 0;
|
|
74
73
|
this.outputsplitIndex = 0;
|
|
75
74
|
this.outputReliableIndex = 0;
|
|
@@ -87,7 +87,7 @@ class RakNetClient extends _events.EventEmitter {
|
|
|
87
87
|
this.id = BigInt(Array.from({
|
|
88
88
|
length: 20
|
|
89
89
|
}, ()=>Math.floor(Math.random() * 10)).join(''));
|
|
90
|
-
this.status = _raknet.Status.
|
|
90
|
+
this.status = _raknet.Status.Connecting;
|
|
91
91
|
this.packetHandler = new _PacketHandler.PacketHandler(this);
|
|
92
92
|
this.queue = new _Queue.Queue(this);
|
|
93
93
|
setInterval(()=>{
|