@sanctumterra/raknet 1.0.10 → 1.0.12

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.
@@ -1,5 +1,6 @@
1
1
  import { Frame } from "@serenityjs/raknet";
2
2
  import { RakNetClient } from "./RaknetClient";
3
+ import { OhMyNewIncommingConnection } from "../packets/raknet/OhMyNewIncommingConnection";
3
4
  export declare class FrameHandler {
4
5
  private lastInputSequence;
5
6
  private receivedFrameSequences;
@@ -16,8 +17,11 @@ export declare class FrameHandler {
16
17
  private handleFrame;
17
18
  private processFrame;
18
19
  private handleFragment;
20
+ private reassembleAndProcessFragment;
19
21
  private handleSequenced;
20
22
  private handleOrdered;
23
+ private processOrderedFrames;
21
24
  private handleConnectedPing;
25
+ handleConnectionRequestAcceptedTwo(frame: Frame): OhMyNewIncommingConnection;
22
26
  private handleConnectionRequestAccepted;
23
27
  }
@@ -12,6 +12,7 @@ const _raknet = require("@serenityjs/raknet");
12
12
  const _OhMyNewIncommingConnection = require("../packets/raknet/OhMyNewIncommingConnection");
13
13
  const _binarystream = require("@serenityjs/binarystream");
14
14
  const _Logger = require("../utils/Logger");
15
+ const _OhMyConnectionRequestAccepted = require("../packets/raknet/OhMyConnectionRequestAccepted");
15
16
  class FrameHandler {
16
17
  tick() {
17
18
  if (this.receivedFrameSequences.size > 0) {
@@ -59,10 +60,16 @@ class FrameHandler {
59
60
  }
60
61
  }
61
62
  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);
63
+ _Logger.Logger.debug(`Handling frame: reliability=${frame.reliability}, orderIndex=${frame.orderIndex}, sequenceIndex=${frame.sequenceIndex}`);
64
+ if (frame.isSplit()) {
65
+ this.handleFragment(frame);
66
+ } else if (frame.isSequenced()) {
67
+ this.handleSequenced(frame);
68
+ } else if (frame.isOrdered()) {
69
+ this.handleOrdered(frame);
70
+ } else {
71
+ this.processFrame(frame);
72
+ }
66
73
  }
67
74
  processFrame(frame) {
68
75
  const header = frame.payload[0];
@@ -79,63 +86,75 @@ class FrameHandler {
79
86
  }
80
87
  }
81
88
  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);
89
+ _Logger.Logger.debug(`Handling fragment: splitId=${frame.splitId}, splitIndex=${frame.splitIndex}, splitSize=${frame.splitSize}`);
90
+ if (!this.fragmentsQueue.has(frame.splitId)) {
91
+ this.fragmentsQueue.set(frame.splitId, new Map());
92
+ }
93
+ const fragment = this.fragmentsQueue.get(frame.splitId);
94
+ if (!fragment) return;
95
+ fragment.set(frame.splitIndex, frame);
96
+ if (fragment.size === frame.splitSize) {
97
+ _Logger.Logger.debug(`Reassembling complete frame from fragments: splitId=${frame.splitId}`);
98
+ this.reassembleAndProcessFragment(frame, fragment);
99
+ }
100
+ }
101
+ reassembleAndProcessFragment(frame, fragment) {
102
+ const stream = new _binarystream.BinaryStream();
103
+ for(let index = 0; index < fragment.size; index++){
104
+ const sframe = fragment.get(index);
105
+ if (sframe) {
106
+ stream.writeBuffer(sframe.payload);
107
+ } else {
108
+ _Logger.Logger.error(`Missing fragment at index ${index} for splitId=${frame.splitId}`);
109
+ return;
101
110
  }
102
- } else {
103
- this.fragmentsQueue.set(frame.splitId, new Map([
104
- [
105
- frame.splitIndex,
106
- frame
107
- ]
108
- ]));
109
111
  }
112
+ const reassembledFrame = new _raknet.Frame();
113
+ reassembledFrame.reliability = frame.reliability;
114
+ reassembledFrame.reliableIndex = frame.reliableIndex;
115
+ reassembledFrame.sequenceIndex = frame.sequenceIndex;
116
+ reassembledFrame.orderIndex = frame.orderIndex;
117
+ reassembledFrame.orderChannel = frame.orderChannel;
118
+ reassembledFrame.payload = stream.getBuffer();
119
+ this.fragmentsQueue.delete(frame.splitId);
120
+ this.handleFrame(reassembledFrame);
110
121
  }
111
122
  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}!`);
123
+ const currentHighestSequence = this.inputHighestSequenceIndex[frame.orderChannel];
124
+ _Logger.Logger.debug(`Handling sequenced frame: sequenceIndex=${frame.sequenceIndex}, currentHighest=${currentHighestSequence}`);
125
+ if (frame.sequenceIndex > currentHighestSequence) {
126
+ this.inputHighestSequenceIndex[frame.orderChannel] = frame.sequenceIndex;
127
+ this.processFrame(frame);
128
+ } else {
129
+ _Logger.Logger.debug(`Discarding old sequenced frame: ${frame.sequenceIndex}`);
114
130
  }
115
- this.inputHighestSequenceIndex[frame.orderChannel] = frame.sequenceIndex + 1;
116
- return this.processFrame(frame);
117
131
  }
118
132
  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);
133
+ _Logger.Logger.debug(`Handling ordered frame: orderIndex=${frame.orderIndex}, channel=${frame.orderChannel}`);
134
+ const expectedOrderIndex = this.inputOrderIndex[frame.orderChannel];
135
+ const outOfOrderQueue = this.inputOrderingQueue.get(frame.orderChannel);
136
+ if (frame.orderIndex === expectedOrderIndex) {
137
+ this.processOrderedFrames(frame, outOfOrderQueue);
138
+ } else if (frame.orderIndex > expectedOrderIndex) {
139
+ _Logger.Logger.debug(`Queuing out-of-order frame: ${frame.orderIndex}`);
140
+ outOfOrderQueue.set(frame.orderIndex, frame);
137
141
  } else {
138
- return this.processFrame(frame);
142
+ _Logger.Logger.debug(`Discarding old frame: ${frame.orderIndex}`);
143
+ }
144
+ }
145
+ processOrderedFrames(frame, outOfOrderQueue) {
146
+ this.processFrame(frame);
147
+ this.inputOrderIndex[frame.orderChannel]++;
148
+ let nextOrderIndex = this.inputOrderIndex[frame.orderChannel];
149
+ while(outOfOrderQueue.has(nextOrderIndex)){
150
+ const nextFrame = outOfOrderQueue.get(nextOrderIndex);
151
+ if (nextFrame) {
152
+ _Logger.Logger.debug(`Processing queued frame: ${nextOrderIndex}`);
153
+ this.processFrame(nextFrame);
154
+ outOfOrderQueue.delete(nextOrderIndex);
155
+ this.inputOrderIndex[frame.orderChannel]++;
156
+ nextOrderIndex++;
157
+ }
139
158
  }
140
159
  }
141
160
  handleConnectedPing(buffer) {
@@ -150,21 +169,40 @@ class FrameHandler {
150
169
  frame.payload = pong.serialize();
151
170
  this.raknet.queue.sendFrame(frame, _raknet.Priority.Immediate);
152
171
  }
153
- handleConnectionRequestAccepted(frame) {
154
- const IncomingPacket = new _raknet.ConnectionRequestAccepted(frame.payload);
155
- const des = IncomingPacket.deserialize();
156
- if (!des) {
157
- console.error('Failed to deserialize IncomingPacket!');
158
- return;
159
- }
160
- const packet = new _OhMyNewIncommingConnection.OhMyNewIncommingConnection();
172
+ handleConnectionRequestAcceptedTwo(frame) {
173
+ let des = new _OhMyConnectionRequestAccepted.OhMyConnectionRequestAccepted(frame.payload).deserialize();
174
+ let packet = new _OhMyNewIncommingConnection.OhMyNewIncommingConnection();
161
175
  packet.internalAddress = new Array();
162
176
  for(let i = 0; i < 10; i++){
163
177
  packet.internalAddress[i] = new _raknet.Address('0.0.0.0', 0, 4);
164
178
  }
165
- packet.serverAddress = new _raknet.Address(des.address.address, des.address.port, 4);
179
+ packet.serverAddress = des.serverAddress;
166
180
  packet.incomingTimestamp = BigInt(Date.now());
167
- packet.serverTimestamp = des.timestamp;
181
+ packet.serverTimestamp = des.serverTimestamp;
182
+ return packet;
183
+ }
184
+ handleConnectionRequestAccepted(frame) {
185
+ let des;
186
+ let packet;
187
+ try {
188
+ const IncomingPacket = new _raknet.ConnectionRequestAccepted(frame.payload);
189
+ des = IncomingPacket.deserialize();
190
+ packet = new _OhMyNewIncommingConnection.OhMyNewIncommingConnection();
191
+ packet.internalAddress = new Array();
192
+ for(let i = 0; i < 10; i++){
193
+ packet.internalAddress[i] = new _raknet.Address('0.0.0.0', 0, 4);
194
+ }
195
+ packet.serverAddress = new _raknet.Address(des.address.address, des.address.port, 4);
196
+ packet.incomingTimestamp = BigInt(Date.now());
197
+ packet.serverTimestamp = des.timestamp;
198
+ } catch (error) {
199
+ packet = this.handleConnectionRequestAcceptedTwo(frame);
200
+ }
201
+ if (!packet) {
202
+ console.error('Failed to deserialize IncomingPacket!');
203
+ return;
204
+ }
205
+ console.log('packet ', packet);
168
206
  const sendFrame = new _raknet.Frame();
169
207
  sendFrame.reliability = _raknet.Reliability.ReliableOrdered;
170
208
  sendFrame.orderChannel = 0;
@@ -181,12 +219,12 @@ class FrameHandler {
181
219
  this.lastInputSequence = -1;
182
220
  this.receivedFrameSequences = new Set();
183
221
  this.lostFrameSequences = new Set();
184
- this.inputHighestSequenceIndex = new Array(32).fill(0);
185
- this.inputOrderIndex = new Array(32).fill(0);
222
+ this.inputHighestSequenceIndex = new Array(64).fill(0);
223
+ this.inputOrderIndex = new Array(64).fill(0);
186
224
  this.inputOrderingQueue = new Map();
187
225
  this.fragmentsQueue = new Map();
188
226
  this.raknet = raknet;
189
- for(let index = 0; index < 32; index++){
227
+ for(let index = 0; index < 64; index++){
190
228
  this.inputOrderingQueue.set(index, new Map());
191
229
  }
192
230
  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(()=>{
@@ -0,0 +1,20 @@
1
+ import { Address, BasePacket } from "@serenityjs/raknet";
2
+ declare class OhMyConnectionRequestAccepted extends BasePacket {
3
+ /**
4
+ * the server adress of the reply.
5
+ */
6
+ serverAddress: Address;
7
+ /**
8
+ * unknown what this is used for.
9
+ */
10
+ internalAddress: Address;
11
+ /**
12
+ * The incoming timestamp of the reply.
13
+ */
14
+ incomingTimestamp: bigint;
15
+ /**
16
+ * The server timestamp of the reply.
17
+ */
18
+ serverTimestamp: bigint;
19
+ }
20
+ export { OhMyConnectionRequestAccepted };
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "OhMyConnectionRequestAccepted", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return OhMyConnectionRequestAccepted;
9
+ }
10
+ });
11
+ const _ts_decorate = require("@swc/helpers/_/_ts_decorate");
12
+ const _proto = require("../proto");
13
+ const _serialize = require("../serialize");
14
+ const _raknet = require("@serenityjs/raknet");
15
+ const _binarystream = require("@serenityjs/binarystream");
16
+ class OhMyConnectionRequestAccepted extends _raknet.BasePacket {
17
+ }
18
+ _ts_decorate._([
19
+ (0, _serialize.Serialize)(_raknet.Address)
20
+ ], OhMyConnectionRequestAccepted.prototype, "serverAddress", void 0);
21
+ _ts_decorate._([
22
+ (0, _serialize.Serialize)(_raknet.Address)
23
+ ], OhMyConnectionRequestAccepted.prototype, "internalAddress", void 0);
24
+ _ts_decorate._([
25
+ (0, _serialize.Serialize)(_binarystream.Long)
26
+ ], OhMyConnectionRequestAccepted.prototype, "incomingTimestamp", void 0);
27
+ _ts_decorate._([
28
+ (0, _serialize.Serialize)(_binarystream.Long)
29
+ ], OhMyConnectionRequestAccepted.prototype, "serverTimestamp", void 0);
30
+ OhMyConnectionRequestAccepted = _ts_decorate._([
31
+ (0, _proto.Proto)(_raknet.Packet.ConnectionRequestAccepted)
32
+ ], OhMyConnectionRequestAccepted);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanctumterra/raknet",
3
- "version": "1.0.10",
3
+ "version": "1.0.12",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "emitDeclarationOnly": true,