@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.
Files changed (189) hide show
  1. package/LICENSE +373 -0
  2. package/dist/ClientSocket.cjs.js +3 -0
  3. package/dist/ClientSocket.es.js +2 -0
  4. package/dist/Constants.cjs.js +23 -0
  5. package/dist/Constants.d.ts +9 -0
  6. package/dist/Constants.d.ts.map +1 -0
  7. package/dist/Constants.es.js +13 -0
  8. package/dist/Protocol-B7Z_wJaK.js +51 -0
  9. package/dist/Protocol-Bik5hgGW.cjs +53 -0
  10. package/dist/RakNet.cjs.js +83 -0
  11. package/dist/RakNet.d.ts +12 -14
  12. package/dist/RakNet.d.ts.map +1 -1
  13. package/dist/RakNet.es.js +38 -0
  14. package/dist/ServerSocket.cjs.js +160 -0
  15. package/dist/ServerSocket.d.ts +5 -5
  16. package/dist/ServerSocket.d.ts.map +1 -1
  17. package/dist/ServerSocket.es.js +152 -0
  18. package/dist/Session.cjs.js +386 -0
  19. package/dist/Session.d.ts +5 -5
  20. package/dist/Session.d.ts.map +1 -1
  21. package/dist/Session.es.js +375 -0
  22. package/dist/protocol/ACK.cjs.js +18 -0
  23. package/dist/protocol/ACK.d.ts +2 -2
  24. package/dist/protocol/ACK.d.ts.map +1 -1
  25. package/dist/protocol/ACK.es.js +14 -0
  26. package/dist/protocol/AcknowledgePacket.cjs.js +75 -0
  27. package/dist/protocol/AcknowledgePacket.d.ts +1 -1
  28. package/dist/protocol/AcknowledgePacket.d.ts.map +1 -1
  29. package/dist/protocol/AcknowledgePacket.es.js +67 -0
  30. package/dist/protocol/BitFlags.cjs.js +15 -0
  31. package/dist/protocol/BitFlags.es.js +10 -0
  32. package/dist/protocol/DisconnectNotification.cjs.js +19 -0
  33. package/dist/protocol/DisconnectNotification.d.ts +1 -1
  34. package/dist/protocol/DisconnectNotification.d.ts.map +1 -1
  35. package/dist/protocol/DisconnectNotification.es.js +15 -0
  36. package/dist/protocol/Frame.cjs.js +110 -0
  37. package/dist/protocol/Frame.d.ts +2 -2
  38. package/dist/protocol/Frame.d.ts.map +1 -1
  39. package/dist/protocol/Frame.es.js +100 -0
  40. package/dist/protocol/FrameReliability.cjs.js +19 -0
  41. package/dist/protocol/FrameReliability.es.js +14 -0
  42. package/dist/protocol/FrameSet.cjs.js +45 -0
  43. package/dist/protocol/FrameSet.d.ts +3 -3
  44. package/dist/protocol/FrameSet.d.ts.map +1 -1
  45. package/dist/protocol/FrameSet.es.js +40 -0
  46. package/dist/protocol/MessageIdentifiers.cjs.js +47 -0
  47. package/dist/protocol/MessageIdentifiers.es.js +43 -0
  48. package/dist/protocol/NACK.cjs.js +18 -0
  49. package/dist/protocol/NACK.d.ts +2 -2
  50. package/dist/protocol/NACK.d.ts.map +1 -1
  51. package/dist/protocol/NACK.es.js +14 -0
  52. package/dist/protocol/OfflineHandler.cjs.js +110 -0
  53. package/dist/protocol/OfflineHandler.d.ts +4 -4
  54. package/dist/protocol/OfflineHandler.d.ts.map +1 -1
  55. package/dist/protocol/OfflineHandler.es.js +102 -0
  56. package/dist/protocol/OfflinePacket.cjs.js +25 -0
  57. package/dist/protocol/OfflinePacket.d.ts +1 -1
  58. package/dist/protocol/OfflinePacket.d.ts.map +1 -1
  59. package/dist/protocol/OfflinePacket.es.js +21 -0
  60. package/dist/protocol/Packet.cjs.js +67 -0
  61. package/dist/protocol/Packet.d.ts +2 -2
  62. package/dist/protocol/Packet.d.ts.map +1 -1
  63. package/dist/protocol/Packet.es.js +59 -0
  64. package/dist/protocol/PacketPool.cjs.js +45 -0
  65. package/dist/protocol/PacketPool.d.ts +3 -3
  66. package/dist/protocol/PacketPool.d.ts.map +1 -1
  67. package/dist/protocol/PacketPool.es.js +41 -0
  68. package/dist/protocol/Protocol.cjs.js +57 -0
  69. package/dist/protocol/Protocol.d.ts +23 -25
  70. package/dist/protocol/Protocol.d.ts.map +1 -1
  71. package/dist/protocol/Protocol.es.js +28 -0
  72. package/dist/protocol/connection/ConnectedPing.cjs.js +24 -0
  73. package/dist/protocol/connection/ConnectedPing.d.ts +2 -2
  74. package/dist/protocol/connection/ConnectedPing.d.ts.map +1 -1
  75. package/dist/protocol/connection/ConnectedPing.es.js +20 -0
  76. package/dist/protocol/connection/ConnectedPong.cjs.js +23 -0
  77. package/dist/protocol/connection/ConnectedPong.d.ts +1 -1
  78. package/dist/protocol/connection/ConnectedPong.d.ts.map +1 -1
  79. package/dist/protocol/connection/ConnectedPong.es.js +19 -0
  80. package/dist/protocol/connection/IncompatibleProtocolVersion.cjs.js +26 -0
  81. package/dist/protocol/connection/IncompatibleProtocolVersion.d.ts +1 -1
  82. package/dist/protocol/connection/IncompatibleProtocolVersion.d.ts.map +1 -1
  83. package/dist/protocol/connection/IncompatibleProtocolVersion.es.js +22 -0
  84. package/dist/protocol/connection/NewIncomingConnection.cjs.js +37 -0
  85. package/dist/protocol/connection/NewIncomingConnection.d.ts +3 -3
  86. package/dist/protocol/connection/NewIncomingConnection.d.ts.map +1 -1
  87. package/dist/protocol/connection/NewIncomingConnection.es.js +33 -0
  88. package/dist/protocol/connection/OpenConnectionReply1.cjs.js +33 -0
  89. package/dist/protocol/connection/OpenConnectionReply1.d.ts +2 -2
  90. package/dist/protocol/connection/OpenConnectionReply1.d.ts.map +1 -1
  91. package/dist/protocol/connection/OpenConnectionReply1.es.js +29 -0
  92. package/dist/protocol/connection/OpenConnectionReply2.cjs.js +36 -0
  93. package/dist/protocol/connection/OpenConnectionReply2.d.ts +3 -3
  94. package/dist/protocol/connection/OpenConnectionReply2.d.ts.map +1 -1
  95. package/dist/protocol/connection/OpenConnectionReply2.es.js +32 -0
  96. package/dist/protocol/connection/OpenConnectionRequest1.cjs.js +31 -0
  97. package/dist/protocol/connection/OpenConnectionRequest1.d.ts +2 -2
  98. package/dist/protocol/connection/OpenConnectionRequest1.d.ts.map +1 -1
  99. package/dist/protocol/connection/OpenConnectionRequest1.es.js +27 -0
  100. package/dist/protocol/connection/OpenConnectionRequest2.cjs.js +34 -0
  101. package/dist/protocol/connection/OpenConnectionRequest2.d.ts +3 -3
  102. package/dist/protocol/connection/OpenConnectionRequest2.d.ts.map +1 -1
  103. package/dist/protocol/connection/OpenConnectionRequest2.es.js +30 -0
  104. package/dist/protocol/login/ConnectionRequest.cjs.js +29 -0
  105. package/dist/protocol/login/ConnectionRequest.d.ts +2 -2
  106. package/dist/protocol/login/ConnectionRequest.d.ts.map +1 -1
  107. package/dist/protocol/login/ConnectionRequest.es.js +25 -0
  108. package/dist/protocol/login/ConnectionRequestAccepted.cjs.js +39 -0
  109. package/dist/protocol/login/ConnectionRequestAccepted.d.ts +3 -3
  110. package/dist/protocol/login/ConnectionRequestAccepted.d.ts.map +1 -1
  111. package/dist/protocol/login/ConnectionRequestAccepted.es.js +35 -0
  112. package/dist/protocol/offline/UnconnectedPing.cjs.js +29 -0
  113. package/dist/protocol/offline/UnconnectedPing.d.ts +2 -2
  114. package/dist/protocol/offline/UnconnectedPing.d.ts.map +1 -1
  115. package/dist/protocol/offline/UnconnectedPing.es.js +25 -0
  116. package/dist/protocol/offline/UnconnectedPong.cjs.js +34 -0
  117. package/dist/protocol/offline/UnconnectedPong.d.ts +2 -2
  118. package/dist/protocol/offline/UnconnectedPong.d.ts.map +1 -1
  119. package/dist/protocol/offline/UnconnectedPong.es.js +30 -0
  120. package/dist/utils/InetAddress.cjs.js +29 -0
  121. package/dist/utils/InetAddress.es.js +25 -0
  122. package/dist/utils/ServerName.cjs.js +83 -0
  123. package/dist/utils/ServerName.es.js +79 -0
  124. package/package.json +51 -29
  125. package/dist/ClientSocket.js +0 -3
  126. package/dist/ClientSocket.js.map +0 -1
  127. package/dist/RakNet.js +0 -15
  128. package/dist/RakNet.js.map +0 -1
  129. package/dist/ServerSocket.js +0 -129
  130. package/dist/ServerSocket.js.map +0 -1
  131. package/dist/Session.js +0 -408
  132. package/dist/Session.js.map +0 -1
  133. package/dist/protocol/ACK.js +0 -8
  134. package/dist/protocol/ACK.js.map +0 -1
  135. package/dist/protocol/AcknowledgePacket.js +0 -69
  136. package/dist/protocol/AcknowledgePacket.js.map +0 -1
  137. package/dist/protocol/BitFlags.js +0 -9
  138. package/dist/protocol/BitFlags.js.map +0 -1
  139. package/dist/protocol/DisconnectNotification.js +0 -8
  140. package/dist/protocol/DisconnectNotification.js.map +0 -1
  141. package/dist/protocol/Frame.js +0 -103
  142. package/dist/protocol/Frame.js.map +0 -1
  143. package/dist/protocol/FrameReliability.js +0 -14
  144. package/dist/protocol/FrameReliability.js.map +0 -1
  145. package/dist/protocol/FrameSet.js +0 -34
  146. package/dist/protocol/FrameSet.js.map +0 -1
  147. package/dist/protocol/MessageIdentifiers.js +0 -42
  148. package/dist/protocol/MessageIdentifiers.js.map +0 -1
  149. package/dist/protocol/NACK.js +0 -8
  150. package/dist/protocol/NACK.js.map +0 -1
  151. package/dist/protocol/OfflineHandler.js +0 -103
  152. package/dist/protocol/OfflineHandler.js.map +0 -1
  153. package/dist/protocol/OfflinePacket.js +0 -16
  154. package/dist/protocol/OfflinePacket.js.map +0 -1
  155. package/dist/protocol/Packet.js +0 -59
  156. package/dist/protocol/Packet.js.map +0 -1
  157. package/dist/protocol/PacketPool.js +0 -29
  158. package/dist/protocol/PacketPool.js.map +0 -1
  159. package/dist/protocol/Protocol.js +0 -26
  160. package/dist/protocol/Protocol.js.map +0 -1
  161. package/dist/protocol/connection/ConnectedPing.js +0 -15
  162. package/dist/protocol/connection/ConnectedPing.js.map +0 -1
  163. package/dist/protocol/connection/ConnectedPong.js +0 -14
  164. package/dist/protocol/connection/ConnectedPong.js.map +0 -1
  165. package/dist/protocol/connection/IncompatibleProtocolVersion.js +0 -15
  166. package/dist/protocol/connection/IncompatibleProtocolVersion.js.map +0 -1
  167. package/dist/protocol/connection/NewIncomingConnection.js +0 -30
  168. package/dist/protocol/connection/NewIncomingConnection.js.map +0 -1
  169. package/dist/protocol/connection/OpenConnectionReply1.js +0 -22
  170. package/dist/protocol/connection/OpenConnectionReply1.js.map +0 -1
  171. package/dist/protocol/connection/OpenConnectionReply2.js +0 -25
  172. package/dist/protocol/connection/OpenConnectionReply2.js.map +0 -1
  173. package/dist/protocol/connection/OpenConnectionRequest1.js +0 -20
  174. package/dist/protocol/connection/OpenConnectionRequest1.js.map +0 -1
  175. package/dist/protocol/connection/OpenConnectionRequest2.js +0 -23
  176. package/dist/protocol/connection/OpenConnectionRequest2.js.map +0 -1
  177. package/dist/protocol/login/ConnectionRequest.js +0 -20
  178. package/dist/protocol/login/ConnectionRequest.js.map +0 -1
  179. package/dist/protocol/login/ConnectionRequestAccepted.js +0 -31
  180. package/dist/protocol/login/ConnectionRequestAccepted.js.map +0 -1
  181. package/dist/protocol/offline/UnconnectedPing.js +0 -20
  182. package/dist/protocol/offline/UnconnectedPing.js.map +0 -1
  183. package/dist/protocol/offline/UnconnectedPong.js +0 -23
  184. package/dist/protocol/offline/UnconnectedPong.js.map +0 -1
  185. package/dist/tsconfig.tsbuildinfo +0 -1
  186. package/dist/utils/InetAddress.js +0 -23
  187. package/dist/utils/InetAddress.js.map +0 -1
  188. package/dist/utils/ServerName.js +0 -77
  189. 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=
@@ -1,5 +1,5 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- import AcknowledgePacket from './AcknowledgePacket.js';
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,wBAAwB,CAAC;AAGvD,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,iBAAiB;gBAC3B,MAAM,CAAC,EAAE,MAAM;CAGrC"}
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,4 +1,4 @@
1
- import Packet from './Packet.js';
1
+ import Packet from './Packet';
2
2
  export default class AcknowledgePacket extends Packet {
3
3
  sequenceNumbers: number[];
4
4
  decodePayload(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"AcknowledgePacket.d.ts","sourceRoot":"","sources":["../../src/protocol/AcknowledgePacket.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,MAAM;IAC1C,eAAe,EAAE,MAAM,EAAE,CAAM;IAE/B,aAAa,IAAI,IAAI;IAqBrB,aAAa,IAAI,IAAI;CA8C/B"}
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"}