@jsprismarine/raknet 0.1.0-rc.53 → 0.1.0
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/LICENSE +373 -0
- package/dist/ClientSocket.cjs.js +3 -0
- package/dist/ClientSocket.es.js +2 -0
- package/dist/Constants.cjs.js +23 -0
- package/dist/Constants.d.ts +9 -0
- package/dist/Constants.d.ts.map +1 -0
- package/dist/Constants.es.js +13 -0
- package/dist/Protocol-B7Z_wJaK.js +51 -0
- package/dist/Protocol-Bik5hgGW.cjs +53 -0
- package/dist/RakNet.cjs.js +83 -0
- package/dist/RakNet.d.ts +12 -14
- package/dist/RakNet.d.ts.map +1 -1
- package/dist/RakNet.es.js +38 -0
- package/dist/ServerSocket.cjs.js +160 -0
- package/dist/ServerSocket.d.ts +5 -5
- package/dist/ServerSocket.d.ts.map +1 -1
- package/dist/ServerSocket.es.js +152 -0
- package/dist/Session.cjs.js +386 -0
- package/dist/Session.d.ts +5 -5
- package/dist/Session.d.ts.map +1 -1
- package/dist/Session.es.js +375 -0
- package/dist/protocol/ACK.cjs.js +18 -0
- package/dist/protocol/ACK.d.ts +2 -2
- package/dist/protocol/ACK.d.ts.map +1 -1
- package/dist/protocol/ACK.es.js +14 -0
- package/dist/protocol/AcknowledgePacket.cjs.js +75 -0
- package/dist/protocol/AcknowledgePacket.d.ts +1 -1
- package/dist/protocol/AcknowledgePacket.d.ts.map +1 -1
- package/dist/protocol/AcknowledgePacket.es.js +67 -0
- package/dist/protocol/BitFlags.cjs.js +15 -0
- package/dist/protocol/BitFlags.es.js +10 -0
- package/dist/protocol/DisconnectNotification.cjs.js +19 -0
- package/dist/protocol/DisconnectNotification.d.ts +1 -1
- package/dist/protocol/DisconnectNotification.d.ts.map +1 -1
- package/dist/protocol/DisconnectNotification.es.js +15 -0
- package/dist/protocol/Frame.cjs.js +110 -0
- package/dist/protocol/Frame.d.ts +2 -2
- package/dist/protocol/Frame.d.ts.map +1 -1
- package/dist/protocol/Frame.es.js +100 -0
- package/dist/protocol/FrameReliability.cjs.js +19 -0
- package/dist/protocol/FrameReliability.es.js +14 -0
- package/dist/protocol/FrameSet.cjs.js +45 -0
- package/dist/protocol/FrameSet.d.ts +3 -3
- package/dist/protocol/FrameSet.d.ts.map +1 -1
- package/dist/protocol/FrameSet.es.js +40 -0
- package/dist/protocol/MessageIdentifiers.cjs.js +47 -0
- package/dist/protocol/MessageIdentifiers.es.js +43 -0
- package/dist/protocol/NACK.cjs.js +18 -0
- package/dist/protocol/NACK.d.ts +2 -2
- package/dist/protocol/NACK.d.ts.map +1 -1
- package/dist/protocol/NACK.es.js +14 -0
- package/dist/protocol/OfflineHandler.cjs.js +110 -0
- package/dist/protocol/OfflineHandler.d.ts +4 -4
- package/dist/protocol/OfflineHandler.d.ts.map +1 -1
- package/dist/protocol/OfflineHandler.es.js +102 -0
- package/dist/protocol/OfflinePacket.cjs.js +25 -0
- package/dist/protocol/OfflinePacket.d.ts +1 -1
- package/dist/protocol/OfflinePacket.d.ts.map +1 -1
- package/dist/protocol/OfflinePacket.es.js +21 -0
- package/dist/protocol/Packet.cjs.js +67 -0
- package/dist/protocol/Packet.d.ts +2 -2
- package/dist/protocol/Packet.d.ts.map +1 -1
- package/dist/protocol/Packet.es.js +59 -0
- package/dist/protocol/PacketPool.cjs.js +45 -0
- package/dist/protocol/PacketPool.d.ts +3 -3
- package/dist/protocol/PacketPool.d.ts.map +1 -1
- package/dist/protocol/PacketPool.es.js +41 -0
- package/dist/protocol/Protocol.cjs.js +57 -0
- package/dist/protocol/Protocol.d.ts +23 -25
- package/dist/protocol/Protocol.d.ts.map +1 -1
- package/dist/protocol/Protocol.es.js +28 -0
- package/dist/protocol/connection/ConnectedPing.cjs.js +24 -0
- package/dist/protocol/connection/ConnectedPing.d.ts +2 -2
- package/dist/protocol/connection/ConnectedPing.d.ts.map +1 -1
- package/dist/protocol/connection/ConnectedPing.es.js +20 -0
- package/dist/protocol/connection/ConnectedPong.cjs.js +23 -0
- package/dist/protocol/connection/ConnectedPong.d.ts +1 -1
- package/dist/protocol/connection/ConnectedPong.d.ts.map +1 -1
- package/dist/protocol/connection/ConnectedPong.es.js +19 -0
- package/dist/protocol/connection/IncompatibleProtocolVersion.cjs.js +26 -0
- package/dist/protocol/connection/IncompatibleProtocolVersion.d.ts +1 -1
- package/dist/protocol/connection/IncompatibleProtocolVersion.d.ts.map +1 -1
- package/dist/protocol/connection/IncompatibleProtocolVersion.es.js +22 -0
- package/dist/protocol/connection/NewIncomingConnection.cjs.js +37 -0
- package/dist/protocol/connection/NewIncomingConnection.d.ts +3 -3
- package/dist/protocol/connection/NewIncomingConnection.d.ts.map +1 -1
- package/dist/protocol/connection/NewIncomingConnection.es.js +33 -0
- package/dist/protocol/connection/OpenConnectionReply1.cjs.js +33 -0
- package/dist/protocol/connection/OpenConnectionReply1.d.ts +2 -2
- package/dist/protocol/connection/OpenConnectionReply1.d.ts.map +1 -1
- package/dist/protocol/connection/OpenConnectionReply1.es.js +29 -0
- package/dist/protocol/connection/OpenConnectionReply2.cjs.js +36 -0
- package/dist/protocol/connection/OpenConnectionReply2.d.ts +3 -3
- package/dist/protocol/connection/OpenConnectionReply2.d.ts.map +1 -1
- package/dist/protocol/connection/OpenConnectionReply2.es.js +32 -0
- package/dist/protocol/connection/OpenConnectionRequest1.cjs.js +31 -0
- package/dist/protocol/connection/OpenConnectionRequest1.d.ts +2 -2
- package/dist/protocol/connection/OpenConnectionRequest1.d.ts.map +1 -1
- package/dist/protocol/connection/OpenConnectionRequest1.es.js +27 -0
- package/dist/protocol/connection/OpenConnectionRequest2.cjs.js +34 -0
- package/dist/protocol/connection/OpenConnectionRequest2.d.ts +3 -3
- package/dist/protocol/connection/OpenConnectionRequest2.d.ts.map +1 -1
- package/dist/protocol/connection/OpenConnectionRequest2.es.js +30 -0
- package/dist/protocol/login/ConnectionRequest.cjs.js +29 -0
- package/dist/protocol/login/ConnectionRequest.d.ts +2 -2
- package/dist/protocol/login/ConnectionRequest.d.ts.map +1 -1
- package/dist/protocol/login/ConnectionRequest.es.js +25 -0
- package/dist/protocol/login/ConnectionRequestAccepted.cjs.js +39 -0
- package/dist/protocol/login/ConnectionRequestAccepted.d.ts +3 -3
- package/dist/protocol/login/ConnectionRequestAccepted.d.ts.map +1 -1
- package/dist/protocol/login/ConnectionRequestAccepted.es.js +35 -0
- package/dist/protocol/offline/UnconnectedPing.cjs.js +29 -0
- package/dist/protocol/offline/UnconnectedPing.d.ts +2 -2
- package/dist/protocol/offline/UnconnectedPing.d.ts.map +1 -1
- package/dist/protocol/offline/UnconnectedPing.es.js +25 -0
- package/dist/protocol/offline/UnconnectedPong.cjs.js +34 -0
- package/dist/protocol/offline/UnconnectedPong.d.ts +2 -2
- package/dist/protocol/offline/UnconnectedPong.d.ts.map +1 -1
- package/dist/protocol/offline/UnconnectedPong.es.js +30 -0
- package/dist/utils/InetAddress.cjs.js +29 -0
- package/dist/utils/InetAddress.es.js +25 -0
- package/dist/utils/ServerName.cjs.js +83 -0
- package/dist/utils/ServerName.es.js +79 -0
- package/package.json +51 -29
- package/dist/ClientSocket.js +0 -3
- package/dist/ClientSocket.js.map +0 -1
- package/dist/RakNet.js +0 -15
- package/dist/RakNet.js.map +0 -1
- package/dist/ServerSocket.js +0 -129
- package/dist/ServerSocket.js.map +0 -1
- package/dist/Session.js +0 -408
- package/dist/Session.js.map +0 -1
- package/dist/protocol/ACK.js +0 -8
- package/dist/protocol/ACK.js.map +0 -1
- package/dist/protocol/AcknowledgePacket.js +0 -69
- package/dist/protocol/AcknowledgePacket.js.map +0 -1
- package/dist/protocol/BitFlags.js +0 -9
- package/dist/protocol/BitFlags.js.map +0 -1
- package/dist/protocol/DisconnectNotification.js +0 -8
- package/dist/protocol/DisconnectNotification.js.map +0 -1
- package/dist/protocol/Frame.js +0 -103
- package/dist/protocol/Frame.js.map +0 -1
- package/dist/protocol/FrameReliability.js +0 -14
- package/dist/protocol/FrameReliability.js.map +0 -1
- package/dist/protocol/FrameSet.js +0 -34
- package/dist/protocol/FrameSet.js.map +0 -1
- package/dist/protocol/MessageIdentifiers.js +0 -42
- package/dist/protocol/MessageIdentifiers.js.map +0 -1
- package/dist/protocol/NACK.js +0 -8
- package/dist/protocol/NACK.js.map +0 -1
- package/dist/protocol/OfflineHandler.js +0 -103
- package/dist/protocol/OfflineHandler.js.map +0 -1
- package/dist/protocol/OfflinePacket.js +0 -16
- package/dist/protocol/OfflinePacket.js.map +0 -1
- package/dist/protocol/Packet.js +0 -59
- package/dist/protocol/Packet.js.map +0 -1
- package/dist/protocol/PacketPool.js +0 -29
- package/dist/protocol/PacketPool.js.map +0 -1
- package/dist/protocol/Protocol.js +0 -26
- package/dist/protocol/Protocol.js.map +0 -1
- package/dist/protocol/connection/ConnectedPing.js +0 -15
- package/dist/protocol/connection/ConnectedPing.js.map +0 -1
- package/dist/protocol/connection/ConnectedPong.js +0 -14
- package/dist/protocol/connection/ConnectedPong.js.map +0 -1
- package/dist/protocol/connection/IncompatibleProtocolVersion.js +0 -15
- package/dist/protocol/connection/IncompatibleProtocolVersion.js.map +0 -1
- package/dist/protocol/connection/NewIncomingConnection.js +0 -30
- package/dist/protocol/connection/NewIncomingConnection.js.map +0 -1
- package/dist/protocol/connection/OpenConnectionReply1.js +0 -22
- package/dist/protocol/connection/OpenConnectionReply1.js.map +0 -1
- package/dist/protocol/connection/OpenConnectionReply2.js +0 -25
- package/dist/protocol/connection/OpenConnectionReply2.js.map +0 -1
- package/dist/protocol/connection/OpenConnectionRequest1.js +0 -20
- package/dist/protocol/connection/OpenConnectionRequest1.js.map +0 -1
- package/dist/protocol/connection/OpenConnectionRequest2.js +0 -23
- package/dist/protocol/connection/OpenConnectionRequest2.js.map +0 -1
- package/dist/protocol/login/ConnectionRequest.js +0 -20
- package/dist/protocol/login/ConnectionRequest.js.map +0 -1
- package/dist/protocol/login/ConnectionRequestAccepted.js +0 -31
- package/dist/protocol/login/ConnectionRequestAccepted.js.map +0 -1
- package/dist/protocol/offline/UnconnectedPing.js +0 -20
- package/dist/protocol/offline/UnconnectedPing.js.map +0 -1
- package/dist/protocol/offline/UnconnectedPong.js +0 -23
- package/dist/protocol/offline/UnconnectedPong.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/utils/InetAddress.js +0 -23
- package/dist/utils/InetAddress.js.map +0 -1
- package/dist/utils/ServerName.js +0 -77
- package/dist/utils/ServerName.js.map +0 -1
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
import ACK from './protocol/ACK.es.js';
|
|
2
|
+
import BinaryStream from '@jsprismarine/jsbinaryutils';
|
|
3
|
+
import { BitFlags } from './protocol/BitFlags.es.js';
|
|
4
|
+
import ConnectedPing from './protocol/connection/ConnectedPing.es.js';
|
|
5
|
+
import ConnectedPong from './protocol/connection/ConnectedPong.es.js';
|
|
6
|
+
import ConnectionRequest from './protocol/login/ConnectionRequest.es.js';
|
|
7
|
+
import ConnectionRequestAccepted from './protocol/login/ConnectionRequestAccepted.es.js';
|
|
8
|
+
import Frame, { MAX_FRAME_BYTE_LENGTH } from './protocol/Frame.es.js';
|
|
9
|
+
import { FrameReliability } from './protocol/FrameReliability.es.js';
|
|
10
|
+
import FrameSet, { DATAGRAM_HEADER_BYTE_LENGTH } from './protocol/FrameSet.es.js';
|
|
11
|
+
import InetAddress from './utils/InetAddress.es.js';
|
|
12
|
+
import { MAX_CHANNELS, UDP_HEADER_SIZE } from './Constants.es.js';
|
|
13
|
+
import { MessageIdentifiers } from './protocol/MessageIdentifiers.es.js';
|
|
14
|
+
import NACK from './protocol/NACK.es.js';
|
|
15
|
+
import assert from 'node:assert';
|
|
16
|
+
import PacketPool from './protocol/PacketPool.es.js';
|
|
17
|
+
import './protocol/AcknowledgePacket.es.js';
|
|
18
|
+
import './protocol/Packet.es.js';
|
|
19
|
+
import 'assert';
|
|
20
|
+
|
|
21
|
+
var RakNetPriority = /* @__PURE__ */ ((RakNetPriority2) => {
|
|
22
|
+
RakNetPriority2[RakNetPriority2["NORMAL"] = 0] = "NORMAL";
|
|
23
|
+
RakNetPriority2[RakNetPriority2["IMMEDIATE"] = 1] = "IMMEDIATE";
|
|
24
|
+
return RakNetPriority2;
|
|
25
|
+
})(RakNetPriority || {});
|
|
26
|
+
var SessionStatus = /* @__PURE__ */ ((SessionStatus2) => {
|
|
27
|
+
SessionStatus2[SessionStatus2["CONNECTING"] = 0] = "CONNECTING";
|
|
28
|
+
SessionStatus2[SessionStatus2["CONNECTED"] = 1] = "CONNECTED";
|
|
29
|
+
SessionStatus2[SessionStatus2["DISCONNECTING"] = 2] = "DISCONNECTING";
|
|
30
|
+
SessionStatus2[SessionStatus2["DISCONNECTED"] = 3] = "DISCONNECTED";
|
|
31
|
+
return SessionStatus2;
|
|
32
|
+
})(SessionStatus || {});
|
|
33
|
+
class Session {
|
|
34
|
+
constructor(listener, mtuSize, rinfo, guid) {
|
|
35
|
+
this.listener = listener;
|
|
36
|
+
this.mtuSize = mtuSize;
|
|
37
|
+
this.rinfo = rinfo;
|
|
38
|
+
this.guid = guid;
|
|
39
|
+
this.lastUpdate = Date.now();
|
|
40
|
+
this.outputOrderIndex = new Array(MAX_CHANNELS).fill(0);
|
|
41
|
+
this.outputSequenceIndex = new Array(MAX_CHANNELS).fill(0);
|
|
42
|
+
this.inputOrderIndex = new Array(MAX_CHANNELS).fill(0);
|
|
43
|
+
for (let i = 0; i < MAX_CHANNELS; i++) {
|
|
44
|
+
this.inputOrderingQueue.set(i, /* @__PURE__ */ new Map());
|
|
45
|
+
}
|
|
46
|
+
this.inputHighestSequenceIndex = new Array(MAX_CHANNELS).fill(0);
|
|
47
|
+
}
|
|
48
|
+
state = 0 /* CONNECTING */;
|
|
49
|
+
outputFrameQueue = new FrameSet();
|
|
50
|
+
outputSequenceNumber = 0;
|
|
51
|
+
// TODO: find a better name
|
|
52
|
+
outputReliableIndex = 0;
|
|
53
|
+
outputBackupQueue = /* @__PURE__ */ new Map();
|
|
54
|
+
outputOrderIndex;
|
|
55
|
+
outputSequenceIndex;
|
|
56
|
+
receivedFrameSequences = /* @__PURE__ */ new Set();
|
|
57
|
+
lostFrameSequences = /* @__PURE__ */ new Set();
|
|
58
|
+
// Map holding fragments of fragmented packets
|
|
59
|
+
fragmentsQueue = /* @__PURE__ */ new Map();
|
|
60
|
+
outputFragmentIndex = 0;
|
|
61
|
+
lastInputSequenceNumber = -1;
|
|
62
|
+
inputHighestSequenceIndex;
|
|
63
|
+
inputOrderIndex;
|
|
64
|
+
inputOrderingQueue = /* @__PURE__ */ new Map();
|
|
65
|
+
// Last timestamp of packet received, helpful for timeout
|
|
66
|
+
lastUpdate = Date.now();
|
|
67
|
+
active = true;
|
|
68
|
+
// Packet pool is the best option to reduce allocations
|
|
69
|
+
packetPool = new PacketPool();
|
|
70
|
+
// Lookup table for packet handlers, always O(1) in average and worst case
|
|
71
|
+
packetHandlers = {
|
|
72
|
+
// 0x40 | 0xc0 = MessageHeaders.ACKNOWLEDGE_PACKET
|
|
73
|
+
[MessageIdentifiers.ACKNOWLEDGE_PACKET]: (buffer) => {
|
|
74
|
+
const ack = this.packetPool.getAckInstance();
|
|
75
|
+
ack.buffer = buffer;
|
|
76
|
+
ack.decode();
|
|
77
|
+
this.handleACK(ack);
|
|
78
|
+
},
|
|
79
|
+
[MessageIdentifiers.NACKNOWLEDGE_PACKET]: (buffer) => {
|
|
80
|
+
const nack = this.packetPool.getNackInstance();
|
|
81
|
+
nack.buffer = buffer;
|
|
82
|
+
nack.decode();
|
|
83
|
+
this.handleNACK(nack);
|
|
84
|
+
},
|
|
85
|
+
[BitFlags.VALID]: (buffer) => {
|
|
86
|
+
const frameSet = this.packetPool.getFrameSetInstance();
|
|
87
|
+
frameSet.buffer = buffer;
|
|
88
|
+
frameSet.decode();
|
|
89
|
+
this.handleFrameSet(frameSet);
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
update(timestamp) {
|
|
93
|
+
if (!this.isActive() && !this.isDisconnected() && this.lastUpdate + 1e4 < timestamp) {
|
|
94
|
+
this.disconnect("timeout");
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
this.active = false;
|
|
98
|
+
if (this.receivedFrameSequences.size > 0) {
|
|
99
|
+
const ack = new ACK();
|
|
100
|
+
ack.sequenceNumbers = Array.from(this.receivedFrameSequences).map((seq) => {
|
|
101
|
+
this.receivedFrameSequences.delete(seq);
|
|
102
|
+
return seq;
|
|
103
|
+
});
|
|
104
|
+
this.sendPacket(ack);
|
|
105
|
+
}
|
|
106
|
+
if (this.lostFrameSequences.size > 0) {
|
|
107
|
+
const pk = new NACK();
|
|
108
|
+
pk.sequenceNumbers = Array.from(this.lostFrameSequences).map((seq) => {
|
|
109
|
+
this.lostFrameSequences.delete(seq);
|
|
110
|
+
return seq;
|
|
111
|
+
});
|
|
112
|
+
this.sendPacket(pk);
|
|
113
|
+
}
|
|
114
|
+
this.sendFrameQueue();
|
|
115
|
+
}
|
|
116
|
+
// https://github.com/facebookarchive/RakNet/blob/1a169895a900c9fc4841c556e16514182b75faf8/Source/ReliabilityLayer.cpp#L635
|
|
117
|
+
handle(buffer) {
|
|
118
|
+
this.active = true;
|
|
119
|
+
this.lastUpdate = Date.now();
|
|
120
|
+
const handler = this.packetHandlers[buffer[0] & 240];
|
|
121
|
+
if (handler) {
|
|
122
|
+
handler(buffer);
|
|
123
|
+
} else {
|
|
124
|
+
this.listener.getLogger().debug("Received an unknown packet type=%d", buffer[0]);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
handleFrameSet(frameSet) {
|
|
128
|
+
if (this.receivedFrameSequences.has(frameSet.sequenceNumber)) {
|
|
129
|
+
this.listener.getLogger().debug("Discarded duplicated packet from client=%o", this.getAddress());
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
this.lostFrameSequences.delete(frameSet.sequenceNumber);
|
|
133
|
+
if (frameSet.sequenceNumber < this.lastInputSequenceNumber || frameSet.sequenceNumber === this.lastInputSequenceNumber) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
this.receivedFrameSequences.add(frameSet.sequenceNumber);
|
|
137
|
+
const diff = frameSet.sequenceNumber - this.lastInputSequenceNumber;
|
|
138
|
+
if (diff !== 1) {
|
|
139
|
+
for (let i = this.lastInputSequenceNumber + 1; i < frameSet.sequenceNumber; i++) {
|
|
140
|
+
if (!this.receivedFrameSequences.has(i)) {
|
|
141
|
+
this.lostFrameSequences.add(i);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
this.lastInputSequenceNumber = frameSet.sequenceNumber;
|
|
146
|
+
for (const frame of frameSet.frames) {
|
|
147
|
+
this.handleFrame(frame);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
handleACK(ack) {
|
|
151
|
+
for (const seq of ack.sequenceNumbers) {
|
|
152
|
+
this.outputBackupQueue.delete(seq);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
handleNACK(nack) {
|
|
156
|
+
for (const seq of nack.sequenceNumbers) {
|
|
157
|
+
if (this.outputBackupQueue.has(seq)) {
|
|
158
|
+
const lostFrames = this.outputBackupQueue.get(seq);
|
|
159
|
+
for (const lostFrame of lostFrames) {
|
|
160
|
+
this.sendFrame(lostFrame, 1 /* IMMEDIATE */);
|
|
161
|
+
}
|
|
162
|
+
this.outputBackupQueue.delete(seq);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
handleFrame(frame) {
|
|
167
|
+
if (frame.isFragmented()) {
|
|
168
|
+
this.handleFragment(frame);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const orderChannel = frame.orderChannel;
|
|
172
|
+
const orderIndex = frame.orderIndex;
|
|
173
|
+
const sequenceIndex = frame.sequenceIndex;
|
|
174
|
+
if (frame.isSequenced()) {
|
|
175
|
+
if (sequenceIndex < this.inputHighestSequenceIndex[orderChannel] || orderIndex < this.inputOrderIndex[orderChannel]) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
this.inputHighestSequenceIndex[orderChannel] = sequenceIndex + 1;
|
|
179
|
+
this.handlePacket(frame);
|
|
180
|
+
} else if (frame.isOrdered()) {
|
|
181
|
+
if (orderIndex === this.inputOrderIndex[orderChannel]) {
|
|
182
|
+
this.inputHighestSequenceIndex[orderChannel] = 0;
|
|
183
|
+
this.inputOrderIndex[orderChannel] = orderIndex + 1;
|
|
184
|
+
this.handlePacket(frame);
|
|
185
|
+
let i = this.inputOrderIndex[orderChannel];
|
|
186
|
+
const outOfOrderQueue = this.inputOrderingQueue.get(orderChannel);
|
|
187
|
+
for (; outOfOrderQueue.has(i); i++) {
|
|
188
|
+
this.handlePacket(outOfOrderQueue.get(i));
|
|
189
|
+
outOfOrderQueue.delete(i);
|
|
190
|
+
}
|
|
191
|
+
this.inputOrderingQueue.set(orderChannel, outOfOrderQueue);
|
|
192
|
+
this.inputOrderIndex[orderChannel] = i;
|
|
193
|
+
} else if (orderIndex > this.inputOrderIndex[orderChannel]) {
|
|
194
|
+
const unordered = this.inputOrderingQueue.get(orderChannel);
|
|
195
|
+
unordered.set(orderIndex, frame);
|
|
196
|
+
}
|
|
197
|
+
} else {
|
|
198
|
+
this.handlePacket(frame);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
sendFrame(frame, flags = 0 /* NORMAL */) {
|
|
202
|
+
assert(typeof frame.orderChannel === "number", "Frame OrderChannel cannot be null");
|
|
203
|
+
if (frame.isSequenced()) {
|
|
204
|
+
frame.orderIndex = this.outputOrderIndex[frame.orderChannel];
|
|
205
|
+
frame.sequenceIndex = this.outputSequenceIndex[frame.orderChannel]++;
|
|
206
|
+
} else if (frame.isOrderedExclusive()) {
|
|
207
|
+
frame.orderIndex = this.outputOrderIndex[frame.orderChannel]++;
|
|
208
|
+
this.outputSequenceIndex[frame.orderChannel] = 0;
|
|
209
|
+
}
|
|
210
|
+
frame.reliableIndex = this.outputReliableIndex++;
|
|
211
|
+
const maxSize = this.getMTU() - DATAGRAM_HEADER_BYTE_LENGTH - MAX_FRAME_BYTE_LENGTH;
|
|
212
|
+
if (frame.content.byteLength > maxSize) {
|
|
213
|
+
const buffer = Buffer.from(frame.content);
|
|
214
|
+
const fragmentId = this.outputFragmentIndex++ % 65536;
|
|
215
|
+
for (let i = 0; i < buffer.byteLength; i += maxSize) {
|
|
216
|
+
if (i !== 0) {
|
|
217
|
+
frame.reliableIndex = this.outputReliableIndex++;
|
|
218
|
+
}
|
|
219
|
+
frame.content = buffer.slice(i, i + maxSize);
|
|
220
|
+
frame.fragmentIndex = i / maxSize;
|
|
221
|
+
frame.fragmentId = fragmentId;
|
|
222
|
+
frame.fragmentSize = Math.ceil(buffer.byteLength / maxSize);
|
|
223
|
+
this.addFrameToQueue(frame, flags | 1 /* IMMEDIATE */);
|
|
224
|
+
}
|
|
225
|
+
} else {
|
|
226
|
+
this.addFrameToQueue(frame, flags);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
addFrameToQueue(frame, priority = 0 /* NORMAL */) {
|
|
230
|
+
let length = 4;
|
|
231
|
+
for (const queuedFrame of this.outputFrameQueue.frames) {
|
|
232
|
+
length += queuedFrame.getByteLength();
|
|
233
|
+
}
|
|
234
|
+
if (length + frame.getByteLength() > this.mtuSize - 36) {
|
|
235
|
+
this.sendFrameQueue();
|
|
236
|
+
}
|
|
237
|
+
this.outputFrameQueue.frames.push(frame);
|
|
238
|
+
if (priority === 1 /* IMMEDIATE */) {
|
|
239
|
+
this.sendFrameQueue();
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
handlePacket(packet) {
|
|
243
|
+
const id = packet.content[0];
|
|
244
|
+
if (this.state === 0 /* CONNECTING */) {
|
|
245
|
+
if (id === MessageIdentifiers.CONNECTION_REQUEST) {
|
|
246
|
+
this.handleConnectionRequest(packet.content).then(
|
|
247
|
+
(encapsulated) => this.sendFrame(encapsulated, 1 /* IMMEDIATE */),
|
|
248
|
+
() => {
|
|
249
|
+
}
|
|
250
|
+
);
|
|
251
|
+
} else if (id === MessageIdentifiers.NEW_INCOMING_CONNECTION) {
|
|
252
|
+
this.state = 1 /* CONNECTED */;
|
|
253
|
+
this.listener.emit("openConnection", this);
|
|
254
|
+
}
|
|
255
|
+
} else if (id === MessageIdentifiers.DISCONNECTION_NOTIFICATION) {
|
|
256
|
+
this.disconnect();
|
|
257
|
+
} else if (id === MessageIdentifiers.CONNECTED_PING) {
|
|
258
|
+
this.handleConnectedPing(packet.content).then(
|
|
259
|
+
(encapsulated) => this.sendFrame(encapsulated),
|
|
260
|
+
() => {
|
|
261
|
+
}
|
|
262
|
+
);
|
|
263
|
+
} else if (this.state === 1 /* CONNECTED */) {
|
|
264
|
+
this.listener.emit("encapsulated", packet, this.getAddress());
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
async handleConnectionRequest(buffer) {
|
|
268
|
+
const dataPacket = new ConnectionRequest(buffer);
|
|
269
|
+
dataPacket.decode();
|
|
270
|
+
const pk = new ConnectionRequestAccepted();
|
|
271
|
+
pk.clientAddress = this.getAddress();
|
|
272
|
+
pk.requestTimestamp = dataPacket.requestTimestamp;
|
|
273
|
+
pk.acceptedTimestamp = BigInt(Date.now());
|
|
274
|
+
pk.encode();
|
|
275
|
+
const sendPacket = new Frame();
|
|
276
|
+
sendPacket.reliability = FrameReliability.UNRELIABLE;
|
|
277
|
+
sendPacket.orderChannel = 0;
|
|
278
|
+
sendPacket.content = pk.getBuffer();
|
|
279
|
+
return sendPacket;
|
|
280
|
+
}
|
|
281
|
+
async handleConnectedPing(buffer) {
|
|
282
|
+
const dataPacket = new ConnectedPing(buffer);
|
|
283
|
+
dataPacket.decode();
|
|
284
|
+
const pk = new ConnectedPong();
|
|
285
|
+
pk.clientTimestamp = dataPacket.clientTimestamp;
|
|
286
|
+
pk.serverTimestamp = BigInt(Date.now());
|
|
287
|
+
pk.encode();
|
|
288
|
+
const sendPacket = new Frame();
|
|
289
|
+
sendPacket.reliability = FrameReliability.UNRELIABLE;
|
|
290
|
+
sendPacket.orderChannel = 0;
|
|
291
|
+
sendPacket.content = pk.getBuffer();
|
|
292
|
+
return sendPacket;
|
|
293
|
+
}
|
|
294
|
+
handleFragment(frame) {
|
|
295
|
+
if (!this.fragmentsQueue.has(frame.fragmentId)) {
|
|
296
|
+
this.fragmentsQueue.set(frame.fragmentId, /* @__PURE__ */ new Map([[frame.fragmentIndex, frame]]));
|
|
297
|
+
} else {
|
|
298
|
+
const value = this.fragmentsQueue.get(frame.fragmentId);
|
|
299
|
+
value.set(frame.fragmentIndex, frame);
|
|
300
|
+
if (value.size === frame.fragmentSize) {
|
|
301
|
+
const stream = new BinaryStream();
|
|
302
|
+
for (let i = 0; i < value.size; i++) {
|
|
303
|
+
const splitPacket = value.get(i);
|
|
304
|
+
stream.write(splitPacket.content);
|
|
305
|
+
}
|
|
306
|
+
const assembledFrame = new Frame();
|
|
307
|
+
assembledFrame.content = stream.getBuffer();
|
|
308
|
+
assembledFrame.reliability = frame.reliability;
|
|
309
|
+
assembledFrame.reliableIndex = frame.reliableIndex;
|
|
310
|
+
assembledFrame.sequenceIndex = frame.sequenceIndex;
|
|
311
|
+
assembledFrame.orderIndex = frame.orderIndex;
|
|
312
|
+
assembledFrame.orderChannel = frame.orderChannel;
|
|
313
|
+
this.fragmentsQueue.delete(frame.fragmentId);
|
|
314
|
+
this.handleFrame(assembledFrame);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
sendFrameQueue() {
|
|
319
|
+
if (this.outputFrameQueue.frames.length > 0) {
|
|
320
|
+
this.outputFrameQueue.sequenceNumber = this.outputSequenceNumber++;
|
|
321
|
+
this.sendFrameSet(this.outputFrameQueue);
|
|
322
|
+
this.outputFrameQueue = new FrameSet();
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
sendFrameSet(frameSet) {
|
|
326
|
+
this.sendPacket(frameSet);
|
|
327
|
+
this.outputBackupQueue.set(
|
|
328
|
+
frameSet.sequenceNumber,
|
|
329
|
+
frameSet.frames.filter((frame) => frame.isReliable())
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
sendPacket(packet) {
|
|
333
|
+
this.listener.sendPacket(packet, this.rinfo);
|
|
334
|
+
}
|
|
335
|
+
close() {
|
|
336
|
+
const stream = new BinaryStream(Buffer.from("\0\0\b", "binary"));
|
|
337
|
+
this.addFrameToQueue(new Frame().fromBinary(stream), 1 /* IMMEDIATE */);
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Kick a client
|
|
341
|
+
* @param reason the reason message, optional
|
|
342
|
+
*/
|
|
343
|
+
disconnect(reason = "client disconnect") {
|
|
344
|
+
this.close();
|
|
345
|
+
this.state = 3 /* DISCONNECTED */;
|
|
346
|
+
this.update(Date.now());
|
|
347
|
+
this.listener.removeSession(this, reason);
|
|
348
|
+
}
|
|
349
|
+
getState() {
|
|
350
|
+
return this.state;
|
|
351
|
+
}
|
|
352
|
+
isActive() {
|
|
353
|
+
return this.active;
|
|
354
|
+
}
|
|
355
|
+
isDisconnected() {
|
|
356
|
+
return this.state === 3 /* DISCONNECTED */;
|
|
357
|
+
}
|
|
358
|
+
getListener() {
|
|
359
|
+
return this.listener;
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Returns the maxmium transfer unit
|
|
363
|
+
* for this connection.
|
|
364
|
+
* @returns {number} the UDP adjusted.
|
|
365
|
+
*/
|
|
366
|
+
getMTU() {
|
|
367
|
+
return this.mtuSize - UDP_HEADER_SIZE;
|
|
368
|
+
}
|
|
369
|
+
getAddress() {
|
|
370
|
+
return new InetAddress(this.rinfo.address, this.rinfo.port, 4);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
export { RakNetPriority, SessionStatus, Session as default };
|
|
375
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2Vzc2lvbi5lcy5qcyIsInNvdXJjZXMiOlsiLi4vc3JjL1Nlc3Npb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEFDSyBmcm9tICcuL3Byb3RvY29sL0FDSyc7XG5pbXBvcnQgQmluYXJ5U3RyZWFtIGZyb20gJ0Bqc3ByaXNtYXJpbmUvanNiaW5hcnl1dGlscyc7XG5pbXBvcnQgQml0RmxhZ3MgZnJvbSAnLi9wcm90b2NvbC9CaXRGbGFncyc7XG5pbXBvcnQgQ29ubmVjdGVkUGluZyBmcm9tICcuL3Byb3RvY29sL2Nvbm5lY3Rpb24vQ29ubmVjdGVkUGluZyc7XG5pbXBvcnQgQ29ubmVjdGVkUG9uZyBmcm9tICcuL3Byb3RvY29sL2Nvbm5lY3Rpb24vQ29ubmVjdGVkUG9uZyc7XG5pbXBvcnQgQ29ubmVjdGlvblJlcXVlc3QgZnJvbSAnLi9wcm90b2NvbC9sb2dpbi9Db25uZWN0aW9uUmVxdWVzdCc7XG5pbXBvcnQgQ29ubmVjdGlvblJlcXVlc3RBY2NlcHRlZCBmcm9tICcuL3Byb3RvY29sL2xvZ2luL0Nvbm5lY3Rpb25SZXF1ZXN0QWNjZXB0ZWQnO1xuaW1wb3J0IEZyYW1lLCB7IE1BWF9GUkFNRV9CWVRFX0xFTkdUSCB9IGZyb20gJy4vcHJvdG9jb2wvRnJhbWUnO1xuaW1wb3J0IEZyYW1lUmVsaWFiaWxpdHkgZnJvbSAnLi9wcm90b2NvbC9GcmFtZVJlbGlhYmlsaXR5JztcbmltcG9ydCBGcmFtZVNldCwgeyBEQVRBR1JBTV9IRUFERVJfQllURV9MRU5HVEggfSBmcm9tICcuL3Byb3RvY29sL0ZyYW1lU2V0JztcbmltcG9ydCBJbmV0QWRkcmVzcyBmcm9tICcuL3V0aWxzL0luZXRBZGRyZXNzJztcbmltcG9ydCB7IE1BWF9DSEFOTkVMUywgVURQX0hFQURFUl9TSVpFIH0gZnJvbSAnLi9Db25zdGFudHMnO1xuaW1wb3J0IHsgTWVzc2FnZUlkZW50aWZpZXJzIH0gZnJvbSAnLi9wcm90b2NvbC9NZXNzYWdlSWRlbnRpZmllcnMnO1xuaW1wb3J0IE5BQ0sgZnJvbSAnLi9wcm90b2NvbC9OQUNLJztcbmltcG9ydCBQYWNrZXQgZnJvbSAnLi9wcm90b2NvbC9QYWNrZXQnO1xuaW1wb3J0IFJha05ldExpc3RlbmVyIGZyb20gJy4vU2VydmVyU29ja2V0JztcbmltcG9ydCB7IHR5cGUgUmVtb3RlSW5mbyB9IGZyb20gJ25vZGU6ZGdyYW0nO1xuaW1wb3J0IGFzc2VydCBmcm9tICdub2RlOmFzc2VydCc7XG5pbXBvcnQgUGFja2V0UG9vbCBmcm9tICcuL3Byb3RvY29sL1BhY2tldFBvb2wnO1xuXG5leHBvcnQgZW51bSBSYWtOZXRQcmlvcml0eSB7XG4gICAgTk9STUFMLFxuICAgIElNTUVESUFURVxufVxuXG5leHBvcnQgZW51bSBTZXNzaW9uU3RhdHVzIHtcbiAgICBDT05ORUNUSU5HLFxuICAgIENPTk5FQ1RFRCxcbiAgICBESVNDT05ORUNUSU5HLFxuICAgIERJU0NPTk5FQ1RFRFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZXNzaW9uIHtcbiAgICBwcml2YXRlIHN0YXRlID0gU2Vzc2lvblN0YXR1cy5DT05ORUNUSU5HO1xuXG4gICAgcHJpdmF0ZSBvdXRwdXRGcmFtZVF1ZXVlID0gbmV3IEZyYW1lU2V0KCk7XG4gICAgcHJpdmF0ZSBvdXRwdXRTZXF1ZW5jZU51bWJlciA9IDA7IC8vIFRPRE86IGZpbmQgYSBiZXR0ZXIgbmFtZVxuICAgIHByaXZhdGUgb3V0cHV0UmVsaWFibGVJbmRleCA9IDA7XG4gICAgcHJpdmF0ZSByZWFkb25seSBvdXRwdXRCYWNrdXBRdWV1ZTogTWFwPG51bWJlciwgRnJhbWVbXT4gPSBuZXcgTWFwKCk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IG91dHB1dE9yZGVySW5kZXg6IG51bWJlcltdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3V0cHV0U2VxdWVuY2VJbmRleDogbnVtYmVyW107XG5cbiAgICBwcml2YXRlIHJlY2VpdmVkRnJhbWVTZXF1ZW5jZXM6IFNldDxudW1iZXI+ID0gbmV3IFNldCgpO1xuICAgIHByaXZhdGUgbG9zdEZyYW1lU2VxdWVuY2VzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQoKTtcblxuICAgIC8vIE1hcCBob2xkaW5nIGZyYWdtZW50cyBvZiBmcmFnbWVudGVkIHBhY2tldHNcbiAgICBwcml2YXRlIHJlYWRvbmx5IGZyYWdtZW50c1F1ZXVlOiBNYXA8bnVtYmVyLCBNYXA8bnVtYmVyLCBGcmFtZT4+ID0gbmV3IE1hcCgpO1xuICAgIHByaXZhdGUgb3V0cHV0RnJhZ21lbnRJbmRleCA9IDA7XG5cbiAgICBwcml2YXRlIGxhc3RJbnB1dFNlcXVlbmNlTnVtYmVyID0gLTE7XG4gICAgcHJpdmF0ZSByZWFkb25seSBpbnB1dEhpZ2hlc3RTZXF1ZW5jZUluZGV4OiBudW1iZXJbXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGlucHV0T3JkZXJJbmRleDogbnVtYmVyW107XG4gICAgcHJpdmF0ZSBpbnB1dE9yZGVyaW5nUXVldWU6IE1hcDxudW1iZXIsIE1hcDxudW1iZXIsIEZyYW1lPj4gPSBuZXcgTWFwKCk7XG5cbiAgICAvLyBMYXN0IHRpbWVzdGFtcCBvZiBwYWNrZXQgcmVjZWl2ZWQsIGhlbHBmdWwgZm9yIHRpbWVvdXRcbiAgICBwcml2YXRlIGxhc3RVcGRhdGU6IG51bWJlciA9IERhdGUubm93KCk7XG4gICAgcHJpdmF0ZSBhY3RpdmUgPSB0cnVlO1xuXG4gICAgLy8gUGFja2V0IHBvb2wgaXMgdGhlIGJlc3Qgb3B0aW9uIHRvIHJlZHVjZSBhbGxvY2F0aW9uc1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFja2V0UG9vbCA9IG5ldyBQYWNrZXRQb29sKCk7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXI6IFJha05ldExpc3RlbmVyLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG10dVNpemU6IG51bWJlcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHJpbmZvOiBSZW1vdGVJbmZvLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZ3VpZDogYmlnaW50XG4gICAgKSB7XG4gICAgICAgIHRoaXMubGFzdFVwZGF0ZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgdGhpcy5vdXRwdXRPcmRlckluZGV4ID0gbmV3IEFycmF5KE1BWF9DSEFOTkVMUykuZmlsbCgwKTtcbiAgICAgICAgdGhpcy5vdXRwdXRTZXF1ZW5jZUluZGV4ID0gbmV3IEFycmF5KE1BWF9DSEFOTkVMUykuZmlsbCgwKTtcblxuICAgICAgICB0aGlzLmlucHV0T3JkZXJJbmRleCA9IG5ldyBBcnJheShNQVhfQ0hBTk5FTFMpLmZpbGwoMCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTUFYX0NIQU5ORUxTOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRPcmRlcmluZ1F1ZXVlLnNldChpLCBuZXcgTWFwKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbnB1dEhpZ2hlc3RTZXF1ZW5jZUluZGV4ID0gbmV3IEFycmF5KE1BWF9DSEFOTkVMUykuZmlsbCgwKTtcbiAgICB9XG5cbiAgICAvLyBMb29rdXAgdGFibGUgZm9yIHBhY2tldCBoYW5kbGVycywgYWx3YXlzIE8oMSkgaW4gYXZlcmFnZSBhbmQgd29yc3QgY2FzZVxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFja2V0SGFuZGxlcnM6IFJlY29yZDxudW1iZXIsIChidWZmZXI6IEJ1ZmZlcikgPT4gdm9pZD4gPSB7XG4gICAgICAgIC8vIDB4NDAgfCAweGMwID0gTWVzc2FnZUhlYWRlcnMuQUNLTk9XTEVER0VfUEFDS0VUXG4gICAgICAgIFtNZXNzYWdlSWRlbnRpZmllcnMuQUNLTk9XTEVER0VfUEFDS0VUXTogKGJ1ZmZlcjogQnVmZmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhY2sgPSB0aGlzLnBhY2tldFBvb2wuZ2V0QWNrSW5zdGFuY2UoKTtcbiAgICAgICAgICAgIChhY2sgYXMgYW55KS5idWZmZXIgPSBidWZmZXI7XG4gICAgICAgICAgICBhY2suZGVjb2RlKCk7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUFDSyhhY2spO1xuICAgICAgICB9LFxuICAgICAgICBbTWVzc2FnZUlkZW50aWZpZXJzLk5BQ0tOT1dMRURHRV9QQUNLRVRdOiAoYnVmZmVyOiBCdWZmZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5hY2sgPSB0aGlzLnBhY2tldFBvb2wuZ2V0TmFja0luc3RhbmNlKCk7XG4gICAgICAgICAgICAobmFjayBhcyBhbnkpLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgICAgICAgIG5hY2suZGVjb2RlKCk7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU5BQ0sobmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIFtCaXRGbGFncy5WQUxJRF06IChidWZmZXI6IEJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnJhbWVTZXQgPSB0aGlzLnBhY2tldFBvb2wuZ2V0RnJhbWVTZXRJbnN0YW5jZSgpO1xuICAgICAgICAgICAgKGZyYW1lU2V0IGFzIGFueSkuYnVmZmVyID0gYnVmZmVyO1xuICAgICAgICAgICAgZnJhbWVTZXQuZGVjb2RlKCk7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUZyYW1lU2V0KGZyYW1lU2V0KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwdWJsaWMgdXBkYXRlKHRpbWVzdGFtcDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc0FjdGl2ZSgpICYmICF0aGlzLmlzRGlzY29ubmVjdGVkKCkgJiYgdGhpcy5sYXN0VXBkYXRlICsgMTBfMDAwIDwgdGltZXN0YW1wKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoJ3RpbWVvdXQnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gVE9ETzogYSBxdWV1ZSBqdXN0IGZvciBBQ0tzIHNlcXVlbmNlcyB0byBhdm9pZCBkdXBsaWNhdGVkc1xuICAgICAgICBpZiAodGhpcy5yZWNlaXZlZEZyYW1lU2VxdWVuY2VzLnNpemUgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBhY2sgPSBuZXcgQUNLKCk7XG4gICAgICAgICAgICBhY2suc2VxdWVuY2VOdW1iZXJzID0gQXJyYXkuZnJvbSh0aGlzLnJlY2VpdmVkRnJhbWVTZXF1ZW5jZXMpLm1hcCgoc2VxKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWNlaXZlZEZyYW1lU2VxdWVuY2VzLmRlbGV0ZShzZXEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc2VuZFBhY2tldChhY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubG9zdEZyYW1lU2VxdWVuY2VzLnNpemUgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBwayA9IG5ldyBOQUNLKCk7XG4gICAgICAgICAgICBway5zZXF1ZW5jZU51bWJlcnMgPSBBcnJheS5mcm9tKHRoaXMubG9zdEZyYW1lU2VxdWVuY2VzKS5tYXAoKHNlcSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9zdEZyYW1lU2VxdWVuY2VzLmRlbGV0ZShzZXEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXE7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc2VuZFBhY2tldChwayk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNlbmRGcmFtZVF1ZXVlKCk7XG4gICAgfVxuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rYXJjaGl2ZS9SYWtOZXQvYmxvYi8xYTE2OTg5NWE5MDBjOWZjNDg0MWM1NTZlMTY1MTQxODJiNzVmYWY4L1NvdXJjZS9SZWxpYWJpbGl0eUxheWVyLmNwcCNMNjM1XG4gICAgcHVibGljIGhhbmRsZShidWZmZXI6IEJ1ZmZlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgIHRoaXMubGFzdFVwZGF0ZSA9IERhdGUubm93KCk7XG5cbiAgICAgICAgLy8gTWFzayB0aGUgbG93ZXIgNCBiaXRzIG9mIHRoZSBoZWFkZXJcbiAgICAgICAgLy8gdG8gZ2V0IHRoZSByYW5nZSBvZiBoZWFkZXIgdmFsdWVzXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLnBhY2tldEhhbmRsZXJzW2J1ZmZlclswXSEgJiAweGYwXTtcbiAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICAgIGhhbmRsZXIoYnVmZmVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZ2V0TG9nZ2VyKCkuZGVidWcoJ1JlY2VpdmVkIGFuIHVua25vd24gcGFja2V0IHR5cGU9JWQnLCBidWZmZXJbMF0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVGcmFtZVNldChmcmFtZVNldDogRnJhbWVTZXQpOiB2b2lkIHtcbiAgICAgICAgLy8gVE9ETzogYWRkaXRpb25hbCBzYW5pdHkgY2hlY2tzXG4gICAgICAgIGlmICh0aGlzLnJlY2VpdmVkRnJhbWVTZXF1ZW5jZXMuaGFzKGZyYW1lU2V0LnNlcXVlbmNlTnVtYmVyKSkge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5nZXRMb2dnZXIoKS5kZWJ1ZygnRGlzY2FyZGVkIGR1cGxpY2F0ZWQgcGFja2V0IGZyb20gY2xpZW50PSVvJywgdGhpcy5nZXRBZGRyZXNzKCkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgaXQgd2FzIG1pc3NpbmcsIHJlbW92ZSBmcm9tIHRoZSBxdWV1ZSBiZWNhdXNlIHdlIHJlY2VpdmVkIGl0IG5vd1xuICAgICAgICB0aGlzLmxvc3RGcmFtZVNlcXVlbmNlcy5kZWxldGUoZnJhbWVTZXQuc2VxdWVuY2VOdW1iZXIpO1xuXG4gICAgICAgIC8vIEZvciBub3cgaXMgZ29vZCBsaWtlIHRoYXRcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZnJhbWVTZXQuc2VxdWVuY2VOdW1iZXIgPCB0aGlzLmxhc3RJbnB1dFNlcXVlbmNlTnVtYmVyIHx8XG4gICAgICAgICAgICBmcmFtZVNldC5zZXF1ZW5jZU51bWJlciA9PT0gdGhpcy5sYXN0SW5wdXRTZXF1ZW5jZU51bWJlclxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCB0aGUgZnJhbWUgdG8gdGhlIEFDSyBxdWV1ZVxuICAgICAgICB0aGlzLnJlY2VpdmVkRnJhbWVTZXF1ZW5jZXMuYWRkKGZyYW1lU2V0LnNlcXVlbmNlTnVtYmVyKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgbWlzc2luZyBwYWNrZXRzIGJldHdlZW4gdGhlIHJlY2VpdmVkIHBhY2tldCBhbmQgdGhlIGxhc3QgcmVjZWl2ZWQgb25lXG4gICAgICAgIGNvbnN0IGRpZmYgPSBmcmFtZVNldC5zZXF1ZW5jZU51bWJlciAtIHRoaXMubGFzdElucHV0U2VxdWVuY2VOdW1iZXI7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNlcXVlbmNlIGhhcyBhIGhvbGUgZHVlIHRvIGEgbG9zdCBwYWNrZXRcbiAgICAgICAgaWYgKGRpZmYgIT09IDEpIHtcbiAgICAgICAgICAgIC8vIEFzIGkgc2FpZCBiZWZvcmUsIHRoZXJlIHdlIHNlYXJjaCBmb3IgbWlzc2luZyBwYWNrZXRzIGluIHRoZSBsaXN0IG9mIHRoZSByZWNpZXZlZCBvbmVzXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5sYXN0SW5wdXRTZXF1ZW5jZU51bWJlciArIDE7IGkgPCBmcmFtZVNldC5zZXF1ZW5jZU51bWJlcjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gQWRkaW5nIHRoZSBwYWNrZXQgc2VxdWVuY2UgbnVtYmVyIHRvIHRoZSBOQUNLIHF1ZXVlIGFuZCB0aGVuIHNlbmRpbmcgYSBOQUNLXG4gICAgICAgICAgICAgICAgLy8gd2lsbCBtYWtlIHRoZSBDbGllbnQgc2VuZGluZyBhZ2FpbiB0aGUgbG9zdCBwYWNrZXRcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmVjZWl2ZWRGcmFtZVNlcXVlbmNlcy5oYXMoaSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb3N0RnJhbWVTZXF1ZW5jZXMuYWRkKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHdlIHJlY2VpdmVkIGEgbG9zdCBwYWNrZXQgd2Ugc2VudCBpbiBOQUNLIG9yIGEgbm9ybWFsIHNlcXVlbmNlZCBvbmVcbiAgICAgICAgdGhpcy5sYXN0SW5wdXRTZXF1ZW5jZU51bWJlciA9IGZyYW1lU2V0LnNlcXVlbmNlTnVtYmVyO1xuXG4gICAgICAgIC8vIEhhbmRsZSBlbmNhcHN1bGF0ZWRcbiAgICAgICAgZm9yIChjb25zdCBmcmFtZSBvZiBmcmFtZVNldC5mcmFtZXMpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRnJhbWUoZnJhbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVBQ0soYWNrOiBBQ0spOiB2b2lkIHtcbiAgICAgICAgLy8gVE9ETzogcGluZyBjYWxjdWxhdGlvblxuXG4gICAgICAgIGZvciAoY29uc3Qgc2VxIG9mIGFjay5zZXF1ZW5jZU51bWJlcnMpIHtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0QmFja3VwUXVldWUuZGVsZXRlKHNlcSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZU5BQ0sobmFjazogTkFDSyk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IHNlcSBvZiBuYWNrLnNlcXVlbmNlTnVtYmVycykge1xuICAgICAgICAgICAgaWYgKHRoaXMub3V0cHV0QmFja3VwUXVldWUuaGFzKHNlcSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsb3N0RnJhbWVzID0gdGhpcy5vdXRwdXRCYWNrdXBRdWV1ZS5nZXQoc2VxKSE7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBsb3N0RnJhbWUgb2YgbG9zdEZyYW1lcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbmRGcmFtZShsb3N0RnJhbWUsIFJha05ldFByaW9yaXR5LklNTUVESUFURSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMub3V0cHV0QmFja3VwUXVldWUuZGVsZXRlKHNlcSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUZyYW1lKGZyYW1lOiBGcmFtZSk6IHZvaWQge1xuICAgICAgICBpZiAoZnJhbWUuaXNGcmFnbWVudGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRnJhZ21lbnQoZnJhbWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3JkZXJDaGFubmVsID0gZnJhbWUub3JkZXJDaGFubmVsITtcbiAgICAgICAgY29uc3Qgb3JkZXJJbmRleCA9IGZyYW1lLm9yZGVySW5kZXghO1xuICAgICAgICBjb25zdCBzZXF1ZW5jZUluZGV4ID0gZnJhbWUuc2VxdWVuY2VJbmRleCE7XG5cbiAgICAgICAgaWYgKGZyYW1lLmlzU2VxdWVuY2VkKCkpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBzZXF1ZW5jZUluZGV4IDwgdGhpcy5pbnB1dEhpZ2hlc3RTZXF1ZW5jZUluZGV4W29yZGVyQ2hhbm5lbF0hIHx8XG4gICAgICAgICAgICAgICAgb3JkZXJJbmRleCA8IHRoaXMuaW5wdXRPcmRlckluZGV4W29yZGVyQ2hhbm5lbF0hXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBTZXF1ZW5jZWQgcGFja2V0IGlzIHRvbyBvbGQsIGRpc2NhcmQgaXRcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaW5wdXRIaWdoZXN0U2VxdWVuY2VJbmRleFtvcmRlckNoYW5uZWxdID0gc2VxdWVuY2VJbmRleCArIDE7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVBhY2tldChmcmFtZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZnJhbWUuaXNPcmRlcmVkKCkpIHtcbiAgICAgICAgICAgIGlmIChvcmRlckluZGV4ID09PSB0aGlzLmlucHV0T3JkZXJJbmRleFtvcmRlckNoYW5uZWxdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dEhpZ2hlc3RTZXF1ZW5jZUluZGV4W29yZGVyQ2hhbm5lbF0gPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRPcmRlckluZGV4W29yZGVyQ2hhbm5lbF0gPSBvcmRlckluZGV4ICsgMTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUGFja2V0KGZyYW1lKTtcbiAgICAgICAgICAgICAgICBsZXQgaSA9IHRoaXMuaW5wdXRPcmRlckluZGV4W29yZGVyQ2hhbm5lbF0hO1xuICAgICAgICAgICAgICAgIGNvbnN0IG91dE9mT3JkZXJRdWV1ZSA9IHRoaXMuaW5wdXRPcmRlcmluZ1F1ZXVlLmdldChvcmRlckNoYW5uZWwpITtcbiAgICAgICAgICAgICAgICBmb3IgKDsgb3V0T2ZPcmRlclF1ZXVlLmhhcyhpKTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUGFja2V0KG91dE9mT3JkZXJRdWV1ZS5nZXQoaSkhKTtcbiAgICAgICAgICAgICAgICAgICAgb3V0T2ZPcmRlclF1ZXVlLmRlbGV0ZShpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHVwZGF0ZWQgcXVldWVcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0T3JkZXJpbmdRdWV1ZS5zZXQob3JkZXJDaGFubmVsLCBvdXRPZk9yZGVyUXVldWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRPcmRlckluZGV4W29yZGVyQ2hhbm5lbF0gPSBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcmRlckluZGV4ID4gdGhpcy5pbnB1dE9yZGVySW5kZXhbb3JkZXJDaGFubmVsXSEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1bm9yZGVyZWQgPSB0aGlzLmlucHV0T3JkZXJpbmdRdWV1ZS5nZXQob3JkZXJDaGFubmVsKSE7XG4gICAgICAgICAgICAgICAgdW5vcmRlcmVkLnNldChvcmRlckluZGV4LCBmcmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVBhY2tldChmcmFtZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2VuZEZyYW1lKGZyYW1lOiBGcmFtZSwgZmxhZ3MgPSBSYWtOZXRQcmlvcml0eS5OT1JNQUwpOiB2b2lkIHtcbiAgICAgICAgYXNzZXJ0KHR5cGVvZiBmcmFtZS5vcmRlckNoYW5uZWwgPT09ICdudW1iZXInLCAnRnJhbWUgT3JkZXJDaGFubmVsIGNhbm5vdCBiZSBudWxsJyk7XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9va2FyY2hpdmUvUmFrTmV0L2Jsb2IvMWExNjk4OTVhOTAwYzlmYzQ4NDFjNTU2ZTE2NTE0MTgyYjc1ZmFmOC9Tb3VyY2UvUmVsaWFiaWxpdHlMYXllci5jcHAjTDE2MjVcbiAgICAgICAgaWYgKGZyYW1lLmlzU2VxdWVuY2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlcXVlbmNlZCBwYWNrZXRzIGRvbid0IGluY3JlYXNlIHRoZSBvcmRlcmVkIGNoYW5uZWwgaW5kZXhcbiAgICAgICAgICAgIGZyYW1lLm9yZGVySW5kZXggPSB0aGlzLm91dHB1dE9yZGVySW5kZXhbZnJhbWUub3JkZXJDaGFubmVsXSE7XG4gICAgICAgICAgICBmcmFtZS5zZXF1ZW5jZUluZGV4ID0gdGhpcy5vdXRwdXRTZXF1ZW5jZUluZGV4W2ZyYW1lLm9yZGVyQ2hhbm5lbF0rKztcbiAgICAgICAgfSBlbHNlIGlmIChmcmFtZS5pc09yZGVyZWRFeGNsdXNpdmUoKSkge1xuICAgICAgICAgICAgLy8gaW1wbGllcyBzZXF1ZW5jZWQsIGJ1dCB3ZSBoYXZlIHRvIGRpc3RpbmN0IHRoZW1cbiAgICAgICAgICAgIGZyYW1lLm9yZGVySW5kZXggPSB0aGlzLm91dHB1dE9yZGVySW5kZXhbZnJhbWUub3JkZXJDaGFubmVsXSsrO1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRTZXF1ZW5jZUluZGV4W2ZyYW1lLm9yZGVyQ2hhbm5lbF0gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgZnJhbWUucmVsaWFibGVJbmRleCA9IHRoaXMub3V0cHV0UmVsaWFibGVJbmRleCsrO1xuXG4gICAgICAgIC8vIFNwbGl0IHBhY2tldCBpZiBiaWdnZXIgdGhhbiBNVFUgc2l6ZVxuICAgICAgICBjb25zdCBtYXhTaXplID0gdGhpcy5nZXRNVFUoKSAtIERBVEFHUkFNX0hFQURFUl9CWVRFX0xFTkdUSCAtIE1BWF9GUkFNRV9CWVRFX0xFTkdUSDtcbiAgICAgICAgaWYgKGZyYW1lLmNvbnRlbnQuYnl0ZUxlbmd0aCA+IG1heFNpemUpIHtcbiAgICAgICAgICAgIC8vIElmIHdlIHVzZSB0aGUgZnJhbWUgYXMgcmVmZXJlbmNlLCB3ZSBoYXZlIHRvIGNvcHkgc29tZXdoZXJlXG4gICAgICAgICAgICAvLyB0aGUgb3JpZ2luYWwgYnVmZmVyLiBUaGVuIHdlIHdpbGwgcG9pbnQgdG8gdGhpcyBidWZmZXIgY29udGVudFxuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oZnJhbWUuY29udGVudCk7XG4gICAgICAgICAgICBjb25zdCBmcmFnbWVudElkID0gdGhpcy5vdXRwdXRGcmFnbWVudEluZGV4KysgJSA2NTUzNjtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmJ5dGVMZW5ndGg7IGkgKz0gbWF4U2l6ZSkge1xuICAgICAgICAgICAgICAgIC8vIExpa2UgdGhlIG9yaWdpbmFsIHJha25ldCwgd2UgbGlrZSB0byB1c2UgYSBwb2ludGVyIHRvIHRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgICAgIC8vIGZyYW1lLCB3ZSBkb24ndCByZWFsbHkgY2FyZSBhYm91dCBzaWRlIGVmZmVjdHMgaW4gdGhpcyBjYXNlLlxuICAgICAgICAgICAgICAgIC8vIFJha05ldCB3aWxsIGFsbG9jYXRlIHRoZSB3aG9sZSBzdHJjdHVyZSBjb250YWluaW5nIHNwbGl0cyxcbiAgICAgICAgICAgICAgICAvLyBidXQgaSB0aGluayBjYWNoaW5nIGp1c3QgdGhlIGJ1ZmZlciBpcyBlbm91Z2guXG4gICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rYXJjaGl2ZS9SYWtOZXQvYmxvYi8xYTE2OTg5NWE5MDBjOWZjNDg0MWM1NTZlMTY1MTQxODJiNzVmYWY4L1NvdXJjZS9SZWxpYWJpbGl0eUxheWVyLmNwcCNMMjk2M1xuXG4gICAgICAgICAgICAgICAgLy8gU2tpcCB0aGUgZmlyc3QgaW5kZXggYXMgaXQncyBhbHJlYWR5IGluY3JlYXNlZCBieSBpdHNlbGYuXG4gICAgICAgICAgICAgICAgaWYgKGkgIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZnJhbWUucmVsaWFibGVJbmRleCA9IHRoaXMub3V0cHV0UmVsaWFibGVJbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZyYW1lLmNvbnRlbnQgPSBidWZmZXIuc2xpY2UoaSwgaSArIG1heFNpemUpO1xuICAgICAgICAgICAgICAgIGZyYW1lLmZyYWdtZW50SW5kZXggPSBpIC8gbWF4U2l6ZTtcbiAgICAgICAgICAgICAgICBmcmFtZS5mcmFnbWVudElkID0gZnJhZ21lbnRJZDtcbiAgICAgICAgICAgICAgICBmcmFtZS5mcmFnbWVudFNpemUgPSBNYXRoLmNlaWwoYnVmZmVyLmJ5dGVMZW5ndGggLyBtYXhTaXplKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEZyYW1lVG9RdWV1ZShmcmFtZSwgZmxhZ3MgfCBSYWtOZXRQcmlvcml0eS5JTU1FRElBVEUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hZGRGcmFtZVRvUXVldWUoZnJhbWUsIGZsYWdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYWRkRnJhbWVUb1F1ZXVlKGZyYW1lOiBGcmFtZSwgcHJpb3JpdHkgPSBSYWtOZXRQcmlvcml0eS5OT1JNQUwpOiB2b2lkIHtcbiAgICAgICAgbGV0IGxlbmd0aCA9IDQ7IC8vIGRhdGFncmFtIGhlYWRlciBzaXplXG4gICAgICAgIGZvciAoY29uc3QgcXVldWVkRnJhbWUgb2YgdGhpcy5vdXRwdXRGcmFtZVF1ZXVlLmZyYW1lcykge1xuICAgICAgICAgICAgbGVuZ3RoICs9IHF1ZXVlZEZyYW1lLmdldEJ5dGVMZW5ndGgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsZW5ndGggKyBmcmFtZS5nZXRCeXRlTGVuZ3RoKCkgPiB0aGlzLm10dVNpemUgLSAzNikge1xuICAgICAgICAgICAgdGhpcy5zZW5kRnJhbWVRdWV1ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vdXRwdXRGcmFtZVF1ZXVlLmZyYW1lcy5wdXNoKGZyYW1lKTtcblxuICAgICAgICBpZiAocHJpb3JpdHkgPT09IFJha05ldFByaW9yaXR5LklNTUVESUFURSkge1xuICAgICAgICAgICAgdGhpcy5zZW5kRnJhbWVRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVQYWNrZXQocGFja2V0OiBGcmFtZSk6IHZvaWQge1xuICAgICAgICBjb25zdCBpZCA9IHBhY2tldC5jb250ZW50WzBdO1xuXG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSBTZXNzaW9uU3RhdHVzLkNPTk5FQ1RJTkcpIHtcbiAgICAgICAgICAgIGlmIChpZCA9PT0gTWVzc2FnZUlkZW50aWZpZXJzLkNPTk5FQ1RJT05fUkVRVUVTVCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ29ubmVjdGlvblJlcXVlc3QocGFja2V0LmNvbnRlbnQpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgIChlbmNhcHN1bGF0ZWQpID0+IHRoaXMuc2VuZEZyYW1lKGVuY2Fwc3VsYXRlZCwgUmFrTmV0UHJpb3JpdHkuSU1NRURJQVRFKSxcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4ge31cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpZCA9PT0gTWVzc2FnZUlkZW50aWZpZXJzLk5FV19JTkNPTUlOR19DT05ORUNUSU9OKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogb25saW5lIG1vZGVcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gU2Vzc2lvblN0YXR1cy5DT05ORUNURUQ7XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KCdvcGVuQ29ubmVjdGlvbicsIHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlkID09PSBNZXNzYWdlSWRlbnRpZmllcnMuRElTQ09OTkVDVElPTl9OT1RJRklDQVRJT04pIHtcbiAgICAgICAgICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGlkID09PSBNZXNzYWdlSWRlbnRpZmllcnMuQ09OTkVDVEVEX1BJTkcpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ29ubmVjdGVkUGluZyhwYWNrZXQuY29udGVudCkudGhlbihcbiAgICAgICAgICAgICAgICAoZW5jYXBzdWxhdGVkKSA9PiB0aGlzLnNlbmRGcmFtZShlbmNhcHN1bGF0ZWQpLFxuICAgICAgICAgICAgICAgICgpID0+IHt9XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09IFNlc3Npb25TdGF0dXMuQ09OTkVDVEVEKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVtaXQoJ2VuY2Fwc3VsYXRlZCcsIHBhY2tldCwgdGhpcy5nZXRBZGRyZXNzKCkpOyAvLyBUbyBmaXQgaW4gc29mdHdhcmUgbmVlZHMgbGF0ZXJcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVDb25uZWN0aW9uUmVxdWVzdChidWZmZXI6IEJ1ZmZlcik6IFByb21pc2U8RnJhbWU+IHtcbiAgICAgICAgY29uc3QgZGF0YVBhY2tldCA9IG5ldyBDb25uZWN0aW9uUmVxdWVzdChidWZmZXIpO1xuICAgICAgICBkYXRhUGFja2V0LmRlY29kZSgpO1xuXG4gICAgICAgIGNvbnN0IHBrID0gbmV3IENvbm5lY3Rpb25SZXF1ZXN0QWNjZXB0ZWQoKTtcbiAgICAgICAgcGsuY2xpZW50QWRkcmVzcyA9IHRoaXMuZ2V0QWRkcmVzcygpO1xuICAgICAgICBway5yZXF1ZXN0VGltZXN0YW1wID0gZGF0YVBhY2tldC5yZXF1ZXN0VGltZXN0YW1wO1xuICAgICAgICBway5hY2NlcHRlZFRpbWVzdGFtcCA9IEJpZ0ludChEYXRlLm5vdygpKTtcbiAgICAgICAgcGsuZW5jb2RlKCk7XG5cbiAgICAgICAgY29uc3Qgc2VuZFBhY2tldCA9IG5ldyBGcmFtZSgpO1xuICAgICAgICBzZW5kUGFja2V0LnJlbGlhYmlsaXR5ID0gRnJhbWVSZWxpYWJpbGl0eS5VTlJFTElBQkxFO1xuICAgICAgICBzZW5kUGFja2V0Lm9yZGVyQ2hhbm5lbCA9IDA7XG4gICAgICAgIHNlbmRQYWNrZXQuY29udGVudCA9IHBrLmdldEJ1ZmZlcigpO1xuXG4gICAgICAgIHJldHVybiBzZW5kUGFja2V0O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBoYW5kbGVDb25uZWN0ZWRQaW5nKGJ1ZmZlcjogQnVmZmVyKTogUHJvbWlzZTxGcmFtZT4ge1xuICAgICAgICBjb25zdCBkYXRhUGFja2V0ID0gbmV3IENvbm5lY3RlZFBpbmcoYnVmZmVyKTtcbiAgICAgICAgZGF0YVBhY2tldC5kZWNvZGUoKTtcblxuICAgICAgICBjb25zdCBwayA9IG5ldyBDb25uZWN0ZWRQb25nKCk7XG4gICAgICAgIHBrLmNsaWVudFRpbWVzdGFtcCA9IGRhdGFQYWNrZXQuY2xpZW50VGltZXN0YW1wO1xuICAgICAgICBway5zZXJ2ZXJUaW1lc3RhbXAgPSBCaWdJbnQoRGF0ZS5ub3coKSk7XG4gICAgICAgIHBrLmVuY29kZSgpO1xuXG4gICAgICAgIGNvbnN0IHNlbmRQYWNrZXQgPSBuZXcgRnJhbWUoKTtcbiAgICAgICAgc2VuZFBhY2tldC5yZWxpYWJpbGl0eSA9IEZyYW1lUmVsaWFiaWxpdHkuVU5SRUxJQUJMRTtcbiAgICAgICAgc2VuZFBhY2tldC5vcmRlckNoYW5uZWwgPSAwO1xuICAgICAgICBzZW5kUGFja2V0LmNvbnRlbnQgPSBway5nZXRCdWZmZXIoKTtcblxuICAgICAgICByZXR1cm4gc2VuZFBhY2tldDtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFuZGxlRnJhZ21lbnQoZnJhbWU6IEZyYW1lKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5mcmFnbWVudHNRdWV1ZS5oYXMoZnJhbWUuZnJhZ21lbnRJZCkpIHtcbiAgICAgICAgICAgIHRoaXMuZnJhZ21lbnRzUXVldWUuc2V0KGZyYW1lLmZyYWdtZW50SWQsIG5ldyBNYXAoW1tmcmFtZS5mcmFnbWVudEluZGV4LCBmcmFtZV1dKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZnJhZ21lbnRzUXVldWUuZ2V0KGZyYW1lLmZyYWdtZW50SWQpITtcbiAgICAgICAgICAgIHZhbHVlLnNldChmcmFtZS5mcmFnbWVudEluZGV4LCBmcmFtZSk7XG5cbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYWxsIHBpZWNlcywgcHV0IHRoZW0gdG9nZXRoZXJcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zaXplID09PSBmcmFtZS5mcmFnbWVudFNpemUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG4gICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgYnVmZmVyIG9yZGVyc1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUuc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwbGl0UGFja2V0ID0gdmFsdWUuZ2V0KGkpITtcbiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlKHNwbGl0UGFja2V0LmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGFzc2VtYmxlZEZyYW1lID0gbmV3IEZyYW1lKCk7XG4gICAgICAgICAgICAgICAgYXNzZW1ibGVkRnJhbWUuY29udGVudCA9IHN0cmVhbS5nZXRCdWZmZXIoKTtcblxuICAgICAgICAgICAgICAgIGFzc2VtYmxlZEZyYW1lLnJlbGlhYmlsaXR5ID0gZnJhbWUucmVsaWFiaWxpdHk7XG4gICAgICAgICAgICAgICAgYXNzZW1ibGVkRnJhbWUucmVsaWFibGVJbmRleCA9IGZyYW1lLnJlbGlhYmxlSW5kZXg7XG4gICAgICAgICAgICAgICAgYXNzZW1ibGVkRnJhbWUuc2VxdWVuY2VJbmRleCA9IGZyYW1lLnNlcXVlbmNlSW5kZXg7XG4gICAgICAgICAgICAgICAgYXNzZW1ibGVkRnJhbWUub3JkZXJJbmRleCA9IGZyYW1lLm9yZGVySW5kZXg7XG4gICAgICAgICAgICAgICAgYXNzZW1ibGVkRnJhbWUub3JkZXJDaGFubmVsID0gZnJhbWUub3JkZXJDaGFubmVsO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5mcmFnbWVudHNRdWV1ZS5kZWxldGUoZnJhbWUuZnJhZ21lbnRJZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVGcmFtZShhc3NlbWJsZWRGcmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2VuZEZyYW1lUXVldWUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm91dHB1dEZyYW1lUXVldWUuZnJhbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMub3V0cHV0RnJhbWVRdWV1ZS5zZXF1ZW5jZU51bWJlciA9IHRoaXMub3V0cHV0U2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIHRoaXMuc2VuZEZyYW1lU2V0KHRoaXMub3V0cHV0RnJhbWVRdWV1ZSk7XG4gICAgICAgICAgICB0aGlzLm91dHB1dEZyYW1lUXVldWUgPSBuZXcgRnJhbWVTZXQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2VuZEZyYW1lU2V0KGZyYW1lU2V0OiBGcmFtZVNldCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlbmRQYWNrZXQoZnJhbWVTZXQpO1xuICAgICAgICB0aGlzLm91dHB1dEJhY2t1cFF1ZXVlLnNldChcbiAgICAgICAgICAgIGZyYW1lU2V0LnNlcXVlbmNlTnVtYmVyLFxuICAgICAgICAgICAgZnJhbWVTZXQuZnJhbWVzLmZpbHRlcigoZnJhbWUpID0+IGZyYW1lLmlzUmVsaWFibGUoKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbmRQYWNrZXQocGFja2V0OiBQYWNrZXQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5saXN0ZW5lci5zZW5kUGFja2V0KHBhY2tldCwgdGhpcy5yaW5mbyk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKEJ1ZmZlci5mcm9tKCdcXHUwMDAwXFx1MDAwMFxcdTAwMDhcXHUwMDE1JywgJ2JpbmFyeScpKTtcbiAgICAgICAgdGhpcy5hZGRGcmFtZVRvUXVldWUobmV3IEZyYW1lKCkuZnJvbUJpbmFyeShzdHJlYW0pLCBSYWtOZXRQcmlvcml0eS5JTU1FRElBVEUpOyAvLyBDbGllbnQgZGlzY2NvbmVjdCBwYWNrZXQgMHgxNVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEtpY2sgYSBjbGllbnRcbiAgICAgKiBAcGFyYW0gcmVhc29uIHRoZSByZWFzb24gbWVzc2FnZSwgb3B0aW9uYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzY29ubmVjdChyZWFzb24gPSAnY2xpZW50IGRpc2Nvbm5lY3QnKTogdm9pZCB7XG4gICAgICAgIC8vIFRPRE86IHJld3JpdGUsIHdvcmtzIGJ1dCBjYW4gYmUgaW1wcm92ZWRcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAvLyBTZW5kIGRpc2Nvbm5lY3QgQUNLXG4gICAgICAgIHRoaXMuc3RhdGUgPSBTZXNzaW9uU3RhdHVzLkRJU0NPTk5FQ1RFRDtcbiAgICAgICAgdGhpcy51cGRhdGUoRGF0ZS5ub3coKSk7XG4gICAgICAgIHRoaXMubGlzdGVuZXIucmVtb3ZlU2Vzc2lvbih0aGlzLCByZWFzb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTdGF0ZSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNEaXNjb25uZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlID09PSBTZXNzaW9uU3RhdHVzLkRJU0NPTk5FQ1RFRDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TGlzdGVuZXIoKTogUmFrTmV0TGlzdGVuZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0ZW5lcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtYXhtaXVtIHRyYW5zZmVyIHVuaXRcbiAgICAgKiBmb3IgdGhpcyBjb25uZWN0aW9uLlxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IHRoZSBVRFAgYWRqdXN0ZWQuXG4gICAgICovXG4gICAgcHVibGljIGdldE1UVSgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5tdHVTaXplIC0gVURQX0hFQURFUl9TSVpFO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBZGRyZXNzKCk6IEluZXRBZGRyZXNzIHtcbiAgICAgICAgcmV0dXJuIG5ldyBJbmV0QWRkcmVzcyh0aGlzLnJpbmZvLmFkZHJlc3MsIHRoaXMucmluZm8ucG9ydCwgNCk7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIlJha05ldFByaW9yaXR5IiwiU2Vzc2lvblN0YXR1cyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQlksSUFBQSxjQUFBLHFCQUFBQSxlQUFMLEtBQUE7QUFDSCxFQUFBQSxlQUFBLENBQUEsZUFBQSxDQUFBLFFBQUEsQ0FBQSxHQUFBLENBQUEsQ0FBQSxHQUFBLFFBQUEsQ0FBQTtBQUNBLEVBQUFBLGVBQUEsQ0FBQSxlQUFBLENBQUEsV0FBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLEdBQUEsV0FBQSxDQUFBO0FBRlEsRUFBQUEsT0FBQUEsZUFBQUEsQ0FBQUE7QUFBQSxDQUFBLEVBQUEsY0FBQSxJQUFBLEVBQUEsRUFBQTtBQUtBLElBQUEsYUFBQSxxQkFBQUMsY0FBTCxLQUFBO0FBQ0gsRUFBQUEsY0FBQSxDQUFBLGNBQUEsQ0FBQSxZQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxZQUFBLENBQUE7QUFDQSxFQUFBQSxjQUFBLENBQUEsY0FBQSxDQUFBLFdBQUEsQ0FBQSxHQUFBLENBQUEsQ0FBQSxHQUFBLFdBQUEsQ0FBQTtBQUNBLEVBQUFBLGNBQUEsQ0FBQSxjQUFBLENBQUEsZUFBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLEdBQUEsZUFBQSxDQUFBO0FBQ0EsRUFBQUEsY0FBQSxDQUFBLGNBQUEsQ0FBQSxjQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxjQUFBLENBQUE7QUFKUSxFQUFBQSxPQUFBQSxjQUFBQSxDQUFBQTtBQUFBLENBQUEsRUFBQSxhQUFBLElBQUEsRUFBQSxFQUFBO0FBT1osTUFBcUIsT0FBUSxDQUFBO0FBQUEsRUE4QmxCLFdBQ2MsQ0FBQSxRQUFBLEVBQ0EsT0FDRCxFQUFBLEtBQUEsRUFDQSxJQUNsQixFQUFBO0FBSm1CLElBQUEsSUFBQSxD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
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
|
|
4
|
+
|
|
5
|
+
const protocol_AcknowledgePacket = require('./AcknowledgePacket.cjs.js');
|
|
6
|
+
const protocol_MessageIdentifiers = require('./MessageIdentifiers.cjs.js');
|
|
7
|
+
require('@jsprismarine/jsbinaryutils');
|
|
8
|
+
require('./Packet.cjs.js');
|
|
9
|
+
require('../utils/InetAddress.cjs.js');
|
|
10
|
+
|
|
11
|
+
class ACK extends protocol_AcknowledgePacket.default {
|
|
12
|
+
constructor(buffer) {
|
|
13
|
+
super(protocol_MessageIdentifiers.MessageIdentifiers.ACKNOWLEDGE_PACKET, buffer);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
exports.default = ACK;
|
|
18
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQUNLLmNqcy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3RvY29sL0FDSy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQWNrbm93bGVkZ2VQYWNrZXQgZnJvbSAnLi9BY2tub3dsZWRnZVBhY2tldCc7XG5pbXBvcnQgeyBNZXNzYWdlSWRlbnRpZmllcnMgfSBmcm9tICcuL01lc3NhZ2VJZGVudGlmaWVycyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFDSyBleHRlbmRzIEFja25vd2xlZGdlUGFja2V0IHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IoYnVmZmVyPzogQnVmZmVyKSB7XG4gICAgICAgIHN1cGVyKE1lc3NhZ2VJZGVudGlmaWVycy5BQ0tOT1dMRURHRV9QQUNLRVQsIGJ1ZmZlcik7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIkFja25vd2xlZGdlUGFja2V0IiwiTWVzc2FnZUlkZW50aWZpZXJzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBR0EsTUFBcUIsWUFBWUEsa0NBQWtCLENBQUE7QUFBQSxFQUN4QyxZQUFZLE1BQWlCLEVBQUE7QUFDaEMsSUFBTSxLQUFBLENBQUFDLDhDQUFBLENBQW1CLG9CQUFvQixNQUFNLENBQUEsQ0FBQTtBQUFBLEdBQ3ZEO0FBQ0o7Ozs7In0=
|
package/dist/protocol/ACK.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/// <reference types="node"
|
|
2
|
-
import AcknowledgePacket from './AcknowledgePacket
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import AcknowledgePacket from './AcknowledgePacket';
|
|
3
3
|
export default class ACK extends AcknowledgePacket {
|
|
4
4
|
constructor(buffer?: Buffer);
|
|
5
5
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ACK.d.ts","sourceRoot":"","sources":["../../src/protocol/ACK.ts"],"names":[],"mappings":";AAAA,OAAO,iBAAiB,MAAM,
|
|
1
|
+
{"version":3,"file":"ACK.d.ts","sourceRoot":"","sources":["../../src/protocol/ACK.ts"],"names":[],"mappings":";AAAA,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AAGpD,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,iBAAiB;gBAC3B,MAAM,CAAC,EAAE,MAAM;CAGrC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import AcknowledgePacket from './AcknowledgePacket.es.js';
|
|
2
|
+
import { MessageIdentifiers } from './MessageIdentifiers.es.js';
|
|
3
|
+
import '@jsprismarine/jsbinaryutils';
|
|
4
|
+
import './Packet.es.js';
|
|
5
|
+
import '../utils/InetAddress.es.js';
|
|
6
|
+
|
|
7
|
+
class ACK extends AcknowledgePacket {
|
|
8
|
+
constructor(buffer) {
|
|
9
|
+
super(MessageIdentifiers.ACKNOWLEDGE_PACKET, buffer);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export { ACK as default };
|
|
14
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQUNLLmVzLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvdG9jb2wvQUNLLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBBY2tub3dsZWRnZVBhY2tldCBmcm9tICcuL0Fja25vd2xlZGdlUGFja2V0JztcbmltcG9ydCB7IE1lc3NhZ2VJZGVudGlmaWVycyB9IGZyb20gJy4vTWVzc2FnZUlkZW50aWZpZXJzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQUNLIGV4dGVuZHMgQWNrbm93bGVkZ2VQYWNrZXQge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihidWZmZXI/OiBCdWZmZXIpIHtcbiAgICAgICAgc3VwZXIoTWVzc2FnZUlkZW50aWZpZXJzLkFDS05PV0xFREdFX1BBQ0tFVCwgYnVmZmVyKTtcbiAgICB9XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBR0EsTUFBcUIsWUFBWSxpQkFBa0IsQ0FBQTtBQUFBLEVBQ3hDLFlBQVksTUFBaUIsRUFBQTtBQUNoQyxJQUFNLEtBQUEsQ0FBQSxrQkFBQSxDQUFtQixvQkFBb0IsTUFBTSxDQUFBLENBQUE7QUFBQSxHQUN2RDtBQUNKOzs7OyJ9
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
|
|
4
|
+
|
|
5
|
+
const BinaryStream = require('@jsprismarine/jsbinaryutils');
|
|
6
|
+
const protocol_Packet = require('./Packet.cjs.js');
|
|
7
|
+
require('../utils/InetAddress.cjs.js');
|
|
8
|
+
|
|
9
|
+
const _interopDefault = e => e && e.__esModule ? e : { default: e };
|
|
10
|
+
|
|
11
|
+
const BinaryStream__default = /*#__PURE__*/_interopDefault(BinaryStream);
|
|
12
|
+
|
|
13
|
+
class AcknowledgePacket extends protocol_Packet.default {
|
|
14
|
+
sequenceNumbers = [];
|
|
15
|
+
decodePayload() {
|
|
16
|
+
this.sequenceNumbers = [];
|
|
17
|
+
const recordCount = this.readUnsignedShort();
|
|
18
|
+
for (let i = 0; i < recordCount; i++) {
|
|
19
|
+
const notRange = this.readBoolean();
|
|
20
|
+
if (notRange) {
|
|
21
|
+
this.sequenceNumbers.push(this.readUnsignedTriadLE());
|
|
22
|
+
} else {
|
|
23
|
+
const start = this.readUnsignedTriadLE();
|
|
24
|
+
const end = this.readUnsignedTriadLE();
|
|
25
|
+
for (let i2 = start; i2 <= end; i2++) {
|
|
26
|
+
this.sequenceNumbers.push(i2);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
encodePayload() {
|
|
32
|
+
const stream = new BinaryStream__default.default();
|
|
33
|
+
this.sequenceNumbers.sort((a, b) => a - b);
|
|
34
|
+
const count = this.sequenceNumbers.length;
|
|
35
|
+
let records = 0;
|
|
36
|
+
if (count > 0) {
|
|
37
|
+
let pointer = 1;
|
|
38
|
+
let start = this.sequenceNumbers[0];
|
|
39
|
+
let last = this.sequenceNumbers[0];
|
|
40
|
+
while (pointer < count) {
|
|
41
|
+
const current = this.sequenceNumbers[pointer++];
|
|
42
|
+
const diff = current - last;
|
|
43
|
+
if (diff === 1) {
|
|
44
|
+
last = current;
|
|
45
|
+
} else if (diff > 1) {
|
|
46
|
+
if (start === last) {
|
|
47
|
+
stream.writeBoolean(true);
|
|
48
|
+
stream.writeUnsignedTriadLE(start);
|
|
49
|
+
start = last = current;
|
|
50
|
+
} else {
|
|
51
|
+
stream.writeBoolean(false);
|
|
52
|
+
stream.writeUnsignedTriadLE(start);
|
|
53
|
+
stream.writeUnsignedTriadLE(last);
|
|
54
|
+
start = last = current;
|
|
55
|
+
}
|
|
56
|
+
++records;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (start === last) {
|
|
60
|
+
stream.writeBoolean(true);
|
|
61
|
+
stream.writeUnsignedTriadLE(start);
|
|
62
|
+
} else {
|
|
63
|
+
stream.writeBoolean(false);
|
|
64
|
+
stream.writeUnsignedTriadLE(start);
|
|
65
|
+
stream.writeUnsignedTriadLE(last);
|
|
66
|
+
}
|
|
67
|
+
++records;
|
|
68
|
+
}
|
|
69
|
+
this.writeUnsignedShort(records);
|
|
70
|
+
this.write(stream.getBuffer());
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
exports.default = AcknowledgePacket;
|
|
75
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNrbm93bGVkZ2VQYWNrZXQuY2pzLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvdG9jb2wvQWNrbm93bGVkZ2VQYWNrZXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IFBhY2tldCBmcm9tICcuL1BhY2tldCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFja25vd2xlZGdlUGFja2V0IGV4dGVuZHMgUGFja2V0IHtcbiAgICBwdWJsaWMgc2VxdWVuY2VOdW1iZXJzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgcHVibGljIGRlY29kZVBheWxvYWQoKTogdm9pZCB7XG4gICAgICAgIC8vIENsZWFyIG9sZCBjYWNoZWQgZGVjb2RlZCBwYWNrZXRzXG4gICAgICAgIHRoaXMuc2VxdWVuY2VOdW1iZXJzID0gW107XG5cbiAgICAgICAgY29uc3QgcmVjb3JkQ291bnQgPSB0aGlzLnJlYWRVbnNpZ25lZFNob3J0KCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjb3JkQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgbm90UmFuZ2UgPSB0aGlzLnJlYWRCb29sZWFuKCk7XG5cbiAgICAgICAgICAgIGlmIChub3RSYW5nZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VxdWVuY2VOdW1iZXJzLnB1c2godGhpcy5yZWFkVW5zaWduZWRUcmlhZExFKCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMucmVhZFVuc2lnbmVkVHJpYWRMRSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IHRoaXMucmVhZFVuc2lnbmVkVHJpYWRMRSgpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VxdWVuY2VOdW1iZXJzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGVuY29kZVBheWxvYWQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0oKTtcbiAgICAgICAgdGhpcy5zZXF1ZW5jZU51bWJlcnMuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xuICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMuc2VxdWVuY2VOdW1iZXJzLmxlbmd0aDtcbiAgICAgICAgbGV0IHJlY29yZHMgPSAwO1xuXG4gICAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgICAgIGxldCBwb2ludGVyID0gMTtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMuc2VxdWVuY2VOdW1iZXJzWzBdITtcbiAgICAgICAgICAgIGxldCBsYXN0ID0gdGhpcy5zZXF1ZW5jZU51bWJlcnNbMF0hO1xuXG4gICAgICAgICAgICB3aGlsZSAocG9pbnRlciA8IGNvdW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMuc2VxdWVuY2VOdW1iZXJzW3BvaW50ZXIrK10hO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpZmYgPSBjdXJyZW50IC0gbGFzdDtcbiAgICAgICAgICAgICAgICBpZiAoZGlmZiA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBsYXN0ID0gY3VycmVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpZmYgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA9PT0gbGFzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlQm9vbGVhbih0cnVlKTsgLy8gc2luZ2xlP1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRUcmlhZExFKHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gbGFzdCA9IGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGVCb29sZWFuKGZhbHNlKTsgLy8gc2luZ2xlP1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRUcmlhZExFKHN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkVHJpYWRMRShsYXN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gbGFzdCA9IGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKytyZWNvcmRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbGFzdCBpdGVyYXRpb25cbiAgICAgICAgICAgIGlmIChzdGFydCA9PT0gbGFzdCkge1xuICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZUJvb2xlYW4odHJ1ZSk7IC8vIHNpbmdsZT9cbiAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGVVbnNpZ25lZFRyaWFkTEUoc3RhcnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGVCb29sZWFuKGZhbHNlKTsgLy8gc2luZ2xlP1xuICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZVVuc2lnbmVkVHJpYWRMRShzdGFydCk7XG4gICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlVW5zaWduZWRUcmlhZExFKGxhc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKytyZWNvcmRzO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy53cml0ZVVuc2lnbmVkU2hvcnQocmVjb3Jkcyk7XG4gICAgICAgIHRoaXMud3JpdGUoc3RyZWFtLmdldEJ1ZmZlcigpKTtcbiAgICB9XG59XG4i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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AcknowledgePacket.d.ts","sourceRoot":"","sources":["../../src/protocol/AcknowledgePacket.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"AcknowledgePacket.d.ts","sourceRoot":"","sources":["../../src/protocol/AcknowledgePacket.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,UAAU,CAAC;AAE9B,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,MAAM;IAC1C,eAAe,EAAE,MAAM,EAAE,CAAM;IAE/B,aAAa,IAAI,IAAI;IAqBrB,aAAa,IAAI,IAAI;CA8C/B"}
|