@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.
@@ -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
- if (frame.isSplit()) return this.handleFragment(frame);
63
- else if (frame.isSequenced()) return this.handleSequenced(frame);
64
- else if (frame.isOrdered()) this.handleOrdered(frame);
65
- else this.processFrame(frame);
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
- if (this.fragmentsQueue.has(frame.splitId)) {
83
- const fragment = this.fragmentsQueue.get(frame.splitId);
84
- if (!fragment) return;
85
- fragment.set(frame.splitIndex, frame);
86
- if (fragment.size === frame.splitSize) {
87
- const stream = new _binarystream.BinaryStream();
88
- for(let index = 0; index < fragment.size; index++){
89
- const sframe = fragment.get(index);
90
- stream.writeBuffer(sframe.payload);
91
- }
92
- const nframe = new _raknet.Frame();
93
- nframe.reliability = frame.reliability;
94
- nframe.reliableIndex = frame.reliableIndex;
95
- nframe.sequenceIndex = frame.sequenceIndex;
96
- nframe.orderIndex = frame.orderIndex;
97
- nframe.orderChannel = frame.orderChannel;
98
- nframe.payload = stream.getBuffer();
99
- this.fragmentsQueue.delete(frame.splitId);
100
- return this.handleFrame(nframe);
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
- if (frame.sequenceIndex < this.inputHighestSequenceIndex[frame.orderChannel] || frame.orderIndex < this.inputOrderIndex[frame.orderChannel]) {
113
- return _Logger.Logger.debug(`Recieved out of order frame ${frame.sequenceIndex}!`);
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
- if (frame.orderIndex === this.inputOrderIndex[frame.orderChannel]) {
120
- this.inputHighestSequenceIndex[frame.orderChannel] = 0;
121
- this.inputOrderIndex[frame.orderChannel] = frame.orderIndex + 1;
122
- this.processFrame(frame);
123
- let index = this.inputOrderIndex[frame.orderChannel];
124
- const outOfOrderQueue = this.inputOrderingQueue.get(frame.orderChannel);
125
- for(; outOfOrderQueue.has(index); index++){
126
- const frame = outOfOrderQueue.get(index);
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
- return this.processFrame(frame);
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(32).fill(0);
185
- this.inputOrderIndex = new Array(32).fill(0);
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 < 32; 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 254:
27
- process.exit(0);
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
- _Logger.Logger.debug('Received unknown packet ' + packetId);
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 = 1492;
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 = 1464;
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
- protected outputBackup: Map<number, Frame[]>;
12
+ outputBackup: Map<number, Frame[]>;
14
13
  protected client: RakNetClient;
15
14
  constructor(client: RakNetClient);
16
15
  onTick(): void;
@@ -68,8 +68,7 @@ class Queue {
68
68
  return this.client.send(frameset.serialize());
69
69
  }
70
70
  constructor(client){
71
- this.outputBackupQueue = new Map();
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.Disconnected;
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(()=>{
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanctumterra/raknet",
3
- "version": "1.0.10",
3
+ "version": "1.0.11",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "emitDeclarationOnly": true,