@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,386 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
|
|
4
|
+
|
|
5
|
+
const protocol_ACK = require('./protocol/ACK.cjs.js');
|
|
6
|
+
const BinaryStream = require('@jsprismarine/jsbinaryutils');
|
|
7
|
+
const protocol_BitFlags = require('./protocol/BitFlags.cjs.js');
|
|
8
|
+
const protocol_connection_ConnectedPing = require('./protocol/connection/ConnectedPing.cjs.js');
|
|
9
|
+
const protocol_connection_ConnectedPong = require('./protocol/connection/ConnectedPong.cjs.js');
|
|
10
|
+
const protocol_login_ConnectionRequest = require('./protocol/login/ConnectionRequest.cjs.js');
|
|
11
|
+
const protocol_login_ConnectionRequestAccepted = require('./protocol/login/ConnectionRequestAccepted.cjs.js');
|
|
12
|
+
const protocol_Frame = require('./protocol/Frame.cjs.js');
|
|
13
|
+
const protocol_FrameReliability = require('./protocol/FrameReliability.cjs.js');
|
|
14
|
+
const protocol_FrameSet = require('./protocol/FrameSet.cjs.js');
|
|
15
|
+
const utils_InetAddress = require('./utils/InetAddress.cjs.js');
|
|
16
|
+
const Constants = require('./Constants.cjs.js');
|
|
17
|
+
const protocol_MessageIdentifiers = require('./protocol/MessageIdentifiers.cjs.js');
|
|
18
|
+
const protocol_NACK = require('./protocol/NACK.cjs.js');
|
|
19
|
+
const assert = require('node:assert');
|
|
20
|
+
const protocol_PacketPool = require('./protocol/PacketPool.cjs.js');
|
|
21
|
+
require('./protocol/AcknowledgePacket.cjs.js');
|
|
22
|
+
require('./protocol/Packet.cjs.js');
|
|
23
|
+
require('assert');
|
|
24
|
+
|
|
25
|
+
const _interopDefault = e => e && e.__esModule ? e : { default: e };
|
|
26
|
+
|
|
27
|
+
const BinaryStream__default = /*#__PURE__*/_interopDefault(BinaryStream);
|
|
28
|
+
const assert__default = /*#__PURE__*/_interopDefault(assert);
|
|
29
|
+
|
|
30
|
+
var RakNetPriority = /* @__PURE__ */ ((RakNetPriority2) => {
|
|
31
|
+
RakNetPriority2[RakNetPriority2["NORMAL"] = 0] = "NORMAL";
|
|
32
|
+
RakNetPriority2[RakNetPriority2["IMMEDIATE"] = 1] = "IMMEDIATE";
|
|
33
|
+
return RakNetPriority2;
|
|
34
|
+
})(RakNetPriority || {});
|
|
35
|
+
var SessionStatus = /* @__PURE__ */ ((SessionStatus2) => {
|
|
36
|
+
SessionStatus2[SessionStatus2["CONNECTING"] = 0] = "CONNECTING";
|
|
37
|
+
SessionStatus2[SessionStatus2["CONNECTED"] = 1] = "CONNECTED";
|
|
38
|
+
SessionStatus2[SessionStatus2["DISCONNECTING"] = 2] = "DISCONNECTING";
|
|
39
|
+
SessionStatus2[SessionStatus2["DISCONNECTED"] = 3] = "DISCONNECTED";
|
|
40
|
+
return SessionStatus2;
|
|
41
|
+
})(SessionStatus || {});
|
|
42
|
+
class Session {
|
|
43
|
+
constructor(listener, mtuSize, rinfo, guid) {
|
|
44
|
+
this.listener = listener;
|
|
45
|
+
this.mtuSize = mtuSize;
|
|
46
|
+
this.rinfo = rinfo;
|
|
47
|
+
this.guid = guid;
|
|
48
|
+
this.lastUpdate = Date.now();
|
|
49
|
+
this.outputOrderIndex = new Array(Constants.MAX_CHANNELS).fill(0);
|
|
50
|
+
this.outputSequenceIndex = new Array(Constants.MAX_CHANNELS).fill(0);
|
|
51
|
+
this.inputOrderIndex = new Array(Constants.MAX_CHANNELS).fill(0);
|
|
52
|
+
for (let i = 0; i < Constants.MAX_CHANNELS; i++) {
|
|
53
|
+
this.inputOrderingQueue.set(i, /* @__PURE__ */ new Map());
|
|
54
|
+
}
|
|
55
|
+
this.inputHighestSequenceIndex = new Array(Constants.MAX_CHANNELS).fill(0);
|
|
56
|
+
}
|
|
57
|
+
state = 0 /* CONNECTING */;
|
|
58
|
+
outputFrameQueue = new protocol_FrameSet.default();
|
|
59
|
+
outputSequenceNumber = 0;
|
|
60
|
+
// TODO: find a better name
|
|
61
|
+
outputReliableIndex = 0;
|
|
62
|
+
outputBackupQueue = /* @__PURE__ */ new Map();
|
|
63
|
+
outputOrderIndex;
|
|
64
|
+
outputSequenceIndex;
|
|
65
|
+
receivedFrameSequences = /* @__PURE__ */ new Set();
|
|
66
|
+
lostFrameSequences = /* @__PURE__ */ new Set();
|
|
67
|
+
// Map holding fragments of fragmented packets
|
|
68
|
+
fragmentsQueue = /* @__PURE__ */ new Map();
|
|
69
|
+
outputFragmentIndex = 0;
|
|
70
|
+
lastInputSequenceNumber = -1;
|
|
71
|
+
inputHighestSequenceIndex;
|
|
72
|
+
inputOrderIndex;
|
|
73
|
+
inputOrderingQueue = /* @__PURE__ */ new Map();
|
|
74
|
+
// Last timestamp of packet received, helpful for timeout
|
|
75
|
+
lastUpdate = Date.now();
|
|
76
|
+
active = true;
|
|
77
|
+
// Packet pool is the best option to reduce allocations
|
|
78
|
+
packetPool = new protocol_PacketPool.default();
|
|
79
|
+
// Lookup table for packet handlers, always O(1) in average and worst case
|
|
80
|
+
packetHandlers = {
|
|
81
|
+
// 0x40 | 0xc0 = MessageHeaders.ACKNOWLEDGE_PACKET
|
|
82
|
+
[protocol_MessageIdentifiers.MessageIdentifiers.ACKNOWLEDGE_PACKET]: (buffer) => {
|
|
83
|
+
const ack = this.packetPool.getAckInstance();
|
|
84
|
+
ack.buffer = buffer;
|
|
85
|
+
ack.decode();
|
|
86
|
+
this.handleACK(ack);
|
|
87
|
+
},
|
|
88
|
+
[protocol_MessageIdentifiers.MessageIdentifiers.NACKNOWLEDGE_PACKET]: (buffer) => {
|
|
89
|
+
const nack = this.packetPool.getNackInstance();
|
|
90
|
+
nack.buffer = buffer;
|
|
91
|
+
nack.decode();
|
|
92
|
+
this.handleNACK(nack);
|
|
93
|
+
},
|
|
94
|
+
[protocol_BitFlags.BitFlags.VALID]: (buffer) => {
|
|
95
|
+
const frameSet = this.packetPool.getFrameSetInstance();
|
|
96
|
+
frameSet.buffer = buffer;
|
|
97
|
+
frameSet.decode();
|
|
98
|
+
this.handleFrameSet(frameSet);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
update(timestamp) {
|
|
102
|
+
if (!this.isActive() && !this.isDisconnected() && this.lastUpdate + 1e4 < timestamp) {
|
|
103
|
+
this.disconnect("timeout");
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
this.active = false;
|
|
107
|
+
if (this.receivedFrameSequences.size > 0) {
|
|
108
|
+
const ack = new protocol_ACK.default();
|
|
109
|
+
ack.sequenceNumbers = Array.from(this.receivedFrameSequences).map((seq) => {
|
|
110
|
+
this.receivedFrameSequences.delete(seq);
|
|
111
|
+
return seq;
|
|
112
|
+
});
|
|
113
|
+
this.sendPacket(ack);
|
|
114
|
+
}
|
|
115
|
+
if (this.lostFrameSequences.size > 0) {
|
|
116
|
+
const pk = new protocol_NACK.default();
|
|
117
|
+
pk.sequenceNumbers = Array.from(this.lostFrameSequences).map((seq) => {
|
|
118
|
+
this.lostFrameSequences.delete(seq);
|
|
119
|
+
return seq;
|
|
120
|
+
});
|
|
121
|
+
this.sendPacket(pk);
|
|
122
|
+
}
|
|
123
|
+
this.sendFrameQueue();
|
|
124
|
+
}
|
|
125
|
+
// https://github.com/facebookarchive/RakNet/blob/1a169895a900c9fc4841c556e16514182b75faf8/Source/ReliabilityLayer.cpp#L635
|
|
126
|
+
handle(buffer) {
|
|
127
|
+
this.active = true;
|
|
128
|
+
this.lastUpdate = Date.now();
|
|
129
|
+
const handler = this.packetHandlers[buffer[0] & 240];
|
|
130
|
+
if (handler) {
|
|
131
|
+
handler(buffer);
|
|
132
|
+
} else {
|
|
133
|
+
this.listener.getLogger().debug("Received an unknown packet type=%d", buffer[0]);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
handleFrameSet(frameSet) {
|
|
137
|
+
if (this.receivedFrameSequences.has(frameSet.sequenceNumber)) {
|
|
138
|
+
this.listener.getLogger().debug("Discarded duplicated packet from client=%o", this.getAddress());
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
this.lostFrameSequences.delete(frameSet.sequenceNumber);
|
|
142
|
+
if (frameSet.sequenceNumber < this.lastInputSequenceNumber || frameSet.sequenceNumber === this.lastInputSequenceNumber) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
this.receivedFrameSequences.add(frameSet.sequenceNumber);
|
|
146
|
+
const diff = frameSet.sequenceNumber - this.lastInputSequenceNumber;
|
|
147
|
+
if (diff !== 1) {
|
|
148
|
+
for (let i = this.lastInputSequenceNumber + 1; i < frameSet.sequenceNumber; i++) {
|
|
149
|
+
if (!this.receivedFrameSequences.has(i)) {
|
|
150
|
+
this.lostFrameSequences.add(i);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
this.lastInputSequenceNumber = frameSet.sequenceNumber;
|
|
155
|
+
for (const frame of frameSet.frames) {
|
|
156
|
+
this.handleFrame(frame);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
handleACK(ack) {
|
|
160
|
+
for (const seq of ack.sequenceNumbers) {
|
|
161
|
+
this.outputBackupQueue.delete(seq);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
handleNACK(nack) {
|
|
165
|
+
for (const seq of nack.sequenceNumbers) {
|
|
166
|
+
if (this.outputBackupQueue.has(seq)) {
|
|
167
|
+
const lostFrames = this.outputBackupQueue.get(seq);
|
|
168
|
+
for (const lostFrame of lostFrames) {
|
|
169
|
+
this.sendFrame(lostFrame, 1 /* IMMEDIATE */);
|
|
170
|
+
}
|
|
171
|
+
this.outputBackupQueue.delete(seq);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
handleFrame(frame) {
|
|
176
|
+
if (frame.isFragmented()) {
|
|
177
|
+
this.handleFragment(frame);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const orderChannel = frame.orderChannel;
|
|
181
|
+
const orderIndex = frame.orderIndex;
|
|
182
|
+
const sequenceIndex = frame.sequenceIndex;
|
|
183
|
+
if (frame.isSequenced()) {
|
|
184
|
+
if (sequenceIndex < this.inputHighestSequenceIndex[orderChannel] || orderIndex < this.inputOrderIndex[orderChannel]) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
this.inputHighestSequenceIndex[orderChannel] = sequenceIndex + 1;
|
|
188
|
+
this.handlePacket(frame);
|
|
189
|
+
} else if (frame.isOrdered()) {
|
|
190
|
+
if (orderIndex === this.inputOrderIndex[orderChannel]) {
|
|
191
|
+
this.inputHighestSequenceIndex[orderChannel] = 0;
|
|
192
|
+
this.inputOrderIndex[orderChannel] = orderIndex + 1;
|
|
193
|
+
this.handlePacket(frame);
|
|
194
|
+
let i = this.inputOrderIndex[orderChannel];
|
|
195
|
+
const outOfOrderQueue = this.inputOrderingQueue.get(orderChannel);
|
|
196
|
+
for (; outOfOrderQueue.has(i); i++) {
|
|
197
|
+
this.handlePacket(outOfOrderQueue.get(i));
|
|
198
|
+
outOfOrderQueue.delete(i);
|
|
199
|
+
}
|
|
200
|
+
this.inputOrderingQueue.set(orderChannel, outOfOrderQueue);
|
|
201
|
+
this.inputOrderIndex[orderChannel] = i;
|
|
202
|
+
} else if (orderIndex > this.inputOrderIndex[orderChannel]) {
|
|
203
|
+
const unordered = this.inputOrderingQueue.get(orderChannel);
|
|
204
|
+
unordered.set(orderIndex, frame);
|
|
205
|
+
}
|
|
206
|
+
} else {
|
|
207
|
+
this.handlePacket(frame);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
sendFrame(frame, flags = 0 /* NORMAL */) {
|
|
211
|
+
assert__default.default(typeof frame.orderChannel === "number", "Frame OrderChannel cannot be null");
|
|
212
|
+
if (frame.isSequenced()) {
|
|
213
|
+
frame.orderIndex = this.outputOrderIndex[frame.orderChannel];
|
|
214
|
+
frame.sequenceIndex = this.outputSequenceIndex[frame.orderChannel]++;
|
|
215
|
+
} else if (frame.isOrderedExclusive()) {
|
|
216
|
+
frame.orderIndex = this.outputOrderIndex[frame.orderChannel]++;
|
|
217
|
+
this.outputSequenceIndex[frame.orderChannel] = 0;
|
|
218
|
+
}
|
|
219
|
+
frame.reliableIndex = this.outputReliableIndex++;
|
|
220
|
+
const maxSize = this.getMTU() - protocol_FrameSet.DATAGRAM_HEADER_BYTE_LENGTH - protocol_Frame.MAX_FRAME_BYTE_LENGTH;
|
|
221
|
+
if (frame.content.byteLength > maxSize) {
|
|
222
|
+
const buffer = Buffer.from(frame.content);
|
|
223
|
+
const fragmentId = this.outputFragmentIndex++ % 65536;
|
|
224
|
+
for (let i = 0; i < buffer.byteLength; i += maxSize) {
|
|
225
|
+
if (i !== 0) {
|
|
226
|
+
frame.reliableIndex = this.outputReliableIndex++;
|
|
227
|
+
}
|
|
228
|
+
frame.content = buffer.slice(i, i + maxSize);
|
|
229
|
+
frame.fragmentIndex = i / maxSize;
|
|
230
|
+
frame.fragmentId = fragmentId;
|
|
231
|
+
frame.fragmentSize = Math.ceil(buffer.byteLength / maxSize);
|
|
232
|
+
this.addFrameToQueue(frame, flags | 1 /* IMMEDIATE */);
|
|
233
|
+
}
|
|
234
|
+
} else {
|
|
235
|
+
this.addFrameToQueue(frame, flags);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
addFrameToQueue(frame, priority = 0 /* NORMAL */) {
|
|
239
|
+
let length = 4;
|
|
240
|
+
for (const queuedFrame of this.outputFrameQueue.frames) {
|
|
241
|
+
length += queuedFrame.getByteLength();
|
|
242
|
+
}
|
|
243
|
+
if (length + frame.getByteLength() > this.mtuSize - 36) {
|
|
244
|
+
this.sendFrameQueue();
|
|
245
|
+
}
|
|
246
|
+
this.outputFrameQueue.frames.push(frame);
|
|
247
|
+
if (priority === 1 /* IMMEDIATE */) {
|
|
248
|
+
this.sendFrameQueue();
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
handlePacket(packet) {
|
|
252
|
+
const id = packet.content[0];
|
|
253
|
+
if (this.state === 0 /* CONNECTING */) {
|
|
254
|
+
if (id === protocol_MessageIdentifiers.MessageIdentifiers.CONNECTION_REQUEST) {
|
|
255
|
+
this.handleConnectionRequest(packet.content).then(
|
|
256
|
+
(encapsulated) => this.sendFrame(encapsulated, 1 /* IMMEDIATE */),
|
|
257
|
+
() => {
|
|
258
|
+
}
|
|
259
|
+
);
|
|
260
|
+
} else if (id === protocol_MessageIdentifiers.MessageIdentifiers.NEW_INCOMING_CONNECTION) {
|
|
261
|
+
this.state = 1 /* CONNECTED */;
|
|
262
|
+
this.listener.emit("openConnection", this);
|
|
263
|
+
}
|
|
264
|
+
} else if (id === protocol_MessageIdentifiers.MessageIdentifiers.DISCONNECTION_NOTIFICATION) {
|
|
265
|
+
this.disconnect();
|
|
266
|
+
} else if (id === protocol_MessageIdentifiers.MessageIdentifiers.CONNECTED_PING) {
|
|
267
|
+
this.handleConnectedPing(packet.content).then(
|
|
268
|
+
(encapsulated) => this.sendFrame(encapsulated),
|
|
269
|
+
() => {
|
|
270
|
+
}
|
|
271
|
+
);
|
|
272
|
+
} else if (this.state === 1 /* CONNECTED */) {
|
|
273
|
+
this.listener.emit("encapsulated", packet, this.getAddress());
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
async handleConnectionRequest(buffer) {
|
|
277
|
+
const dataPacket = new protocol_login_ConnectionRequest.default(buffer);
|
|
278
|
+
dataPacket.decode();
|
|
279
|
+
const pk = new protocol_login_ConnectionRequestAccepted.default();
|
|
280
|
+
pk.clientAddress = this.getAddress();
|
|
281
|
+
pk.requestTimestamp = dataPacket.requestTimestamp;
|
|
282
|
+
pk.acceptedTimestamp = BigInt(Date.now());
|
|
283
|
+
pk.encode();
|
|
284
|
+
const sendPacket = new protocol_Frame.default();
|
|
285
|
+
sendPacket.reliability = protocol_FrameReliability.FrameReliability.UNRELIABLE;
|
|
286
|
+
sendPacket.orderChannel = 0;
|
|
287
|
+
sendPacket.content = pk.getBuffer();
|
|
288
|
+
return sendPacket;
|
|
289
|
+
}
|
|
290
|
+
async handleConnectedPing(buffer) {
|
|
291
|
+
const dataPacket = new protocol_connection_ConnectedPing.default(buffer);
|
|
292
|
+
dataPacket.decode();
|
|
293
|
+
const pk = new protocol_connection_ConnectedPong.default();
|
|
294
|
+
pk.clientTimestamp = dataPacket.clientTimestamp;
|
|
295
|
+
pk.serverTimestamp = BigInt(Date.now());
|
|
296
|
+
pk.encode();
|
|
297
|
+
const sendPacket = new protocol_Frame.default();
|
|
298
|
+
sendPacket.reliability = protocol_FrameReliability.FrameReliability.UNRELIABLE;
|
|
299
|
+
sendPacket.orderChannel = 0;
|
|
300
|
+
sendPacket.content = pk.getBuffer();
|
|
301
|
+
return sendPacket;
|
|
302
|
+
}
|
|
303
|
+
handleFragment(frame) {
|
|
304
|
+
if (!this.fragmentsQueue.has(frame.fragmentId)) {
|
|
305
|
+
this.fragmentsQueue.set(frame.fragmentId, /* @__PURE__ */ new Map([[frame.fragmentIndex, frame]]));
|
|
306
|
+
} else {
|
|
307
|
+
const value = this.fragmentsQueue.get(frame.fragmentId);
|
|
308
|
+
value.set(frame.fragmentIndex, frame);
|
|
309
|
+
if (value.size === frame.fragmentSize) {
|
|
310
|
+
const stream = new BinaryStream__default.default();
|
|
311
|
+
for (let i = 0; i < value.size; i++) {
|
|
312
|
+
const splitPacket = value.get(i);
|
|
313
|
+
stream.write(splitPacket.content);
|
|
314
|
+
}
|
|
315
|
+
const assembledFrame = new protocol_Frame.default();
|
|
316
|
+
assembledFrame.content = stream.getBuffer();
|
|
317
|
+
assembledFrame.reliability = frame.reliability;
|
|
318
|
+
assembledFrame.reliableIndex = frame.reliableIndex;
|
|
319
|
+
assembledFrame.sequenceIndex = frame.sequenceIndex;
|
|
320
|
+
assembledFrame.orderIndex = frame.orderIndex;
|
|
321
|
+
assembledFrame.orderChannel = frame.orderChannel;
|
|
322
|
+
this.fragmentsQueue.delete(frame.fragmentId);
|
|
323
|
+
this.handleFrame(assembledFrame);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
sendFrameQueue() {
|
|
328
|
+
if (this.outputFrameQueue.frames.length > 0) {
|
|
329
|
+
this.outputFrameQueue.sequenceNumber = this.outputSequenceNumber++;
|
|
330
|
+
this.sendFrameSet(this.outputFrameQueue);
|
|
331
|
+
this.outputFrameQueue = new protocol_FrameSet.default();
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
sendFrameSet(frameSet) {
|
|
335
|
+
this.sendPacket(frameSet);
|
|
336
|
+
this.outputBackupQueue.set(
|
|
337
|
+
frameSet.sequenceNumber,
|
|
338
|
+
frameSet.frames.filter((frame) => frame.isReliable())
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
sendPacket(packet) {
|
|
342
|
+
this.listener.sendPacket(packet, this.rinfo);
|
|
343
|
+
}
|
|
344
|
+
close() {
|
|
345
|
+
const stream = new BinaryStream__default.default(Buffer.from("\0\0\b", "binary"));
|
|
346
|
+
this.addFrameToQueue(new protocol_Frame.default().fromBinary(stream), 1 /* IMMEDIATE */);
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Kick a client
|
|
350
|
+
* @param reason the reason message, optional
|
|
351
|
+
*/
|
|
352
|
+
disconnect(reason = "client disconnect") {
|
|
353
|
+
this.close();
|
|
354
|
+
this.state = 3 /* DISCONNECTED */;
|
|
355
|
+
this.update(Date.now());
|
|
356
|
+
this.listener.removeSession(this, reason);
|
|
357
|
+
}
|
|
358
|
+
getState() {
|
|
359
|
+
return this.state;
|
|
360
|
+
}
|
|
361
|
+
isActive() {
|
|
362
|
+
return this.active;
|
|
363
|
+
}
|
|
364
|
+
isDisconnected() {
|
|
365
|
+
return this.state === 3 /* DISCONNECTED */;
|
|
366
|
+
}
|
|
367
|
+
getListener() {
|
|
368
|
+
return this.listener;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Returns the maxmium transfer unit
|
|
372
|
+
* for this connection.
|
|
373
|
+
* @returns {number} the UDP adjusted.
|
|
374
|
+
*/
|
|
375
|
+
getMTU() {
|
|
376
|
+
return this.mtuSize - Constants.UDP_HEADER_SIZE;
|
|
377
|
+
}
|
|
378
|
+
getAddress() {
|
|
379
|
+
return new utils_InetAddress.default(this.rinfo.address, this.rinfo.port, 4);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
exports.RakNetPriority = RakNetPriority;
|
|
384
|
+
exports.SessionStatus = SessionStatus;
|
|
385
|
+
exports.default = Session;
|
|
386
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2Vzc2lvbi5janMuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9TZXNzaW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBBQ0sgZnJvbSAnLi9wcm90b2NvbC9BQ0snO1xuaW1wb3J0IEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IEJpdEZsYWdzIGZyb20gJy4vcHJvdG9jb2wvQml0RmxhZ3MnO1xuaW1wb3J0IENvbm5lY3RlZFBpbmcgZnJvbSAnLi9wcm90b2NvbC9jb25uZWN0aW9uL0Nvbm5lY3RlZFBpbmcnO1xuaW1wb3J0IENvbm5lY3RlZFBvbmcgZnJvbSAnLi9wcm90b2NvbC9jb25uZWN0aW9uL0Nvbm5lY3RlZFBvbmcnO1xuaW1wb3J0IENvbm5lY3Rpb25SZXF1ZXN0IGZyb20gJy4vcHJvdG9jb2wvbG9naW4vQ29ubmVjdGlvblJlcXVlc3QnO1xuaW1wb3J0IENvbm5lY3Rpb25SZXF1ZXN0QWNjZXB0ZWQgZnJvbSAnLi9wcm90b2NvbC9sb2dpbi9Db25uZWN0aW9uUmVxdWVzdEFjY2VwdGVkJztcbmltcG9ydCBGcmFtZSwgeyBNQVhfRlJBTUVfQllURV9MRU5HVEggfSBmcm9tICcuL3Byb3RvY29sL0ZyYW1lJztcbmltcG9ydCBGcmFtZVJlbGlhYmlsaXR5IGZyb20gJy4vcHJvdG9jb2wvRnJhbWVSZWxpYWJpbGl0eSc7XG5pbXBvcnQgRnJhbWVTZXQsIHsgREFUQUdSQU1fSEVBREVSX0JZVEVfTEVOR1RIIH0gZnJvbSAnLi9wcm90b2NvbC9GcmFtZVNldCc7XG5pbXBvcnQgSW5ldEFkZHJlc3MgZnJvbSAnLi91dGlscy9JbmV0QWRkcmVzcyc7XG5pbXBvcnQgeyBNQVhfQ0hBTk5FTFMsIFVEUF9IRUFERVJfU0laRSB9IGZyb20gJy4vQ29uc3RhbnRzJztcbmltcG9ydCB7IE1lc3NhZ2VJZGVudGlmaWVycyB9IGZyb20gJy4vcHJvdG9jb2wvTWVzc2FnZUlkZW50aWZpZXJzJztcbmltcG9ydCBOQUNLIGZyb20gJy4vcHJvdG9jb2wvTkFDSyc7XG5pbXBvcnQgUGFja2V0IGZyb20gJy4vcHJvdG9jb2wvUGFja2V0JztcbmltcG9ydCBSYWtOZXRMaXN0ZW5lciBmcm9tICcuL1NlcnZlclNvY2tldCc7XG5pbXBvcnQgeyB0eXBlIFJlbW90ZUluZm8gfSBmcm9tICdub2RlOmRncmFtJztcbmltcG9ydCBhc3NlcnQgZnJvbSAnbm9kZTphc3NlcnQnO1xuaW1wb3J0IFBhY2tldFBvb2wgZnJvbSAnLi9wcm90b2NvbC9QYWNrZXRQb29sJztcblxuZXhwb3J0IGVudW0gUmFrTmV0UHJpb3JpdHkge1xuICAgIE5PUk1BTCxcbiAgICBJTU1FRElBVEVcbn1cblxuZXhwb3J0IGVudW0gU2Vzc2lvblN0YXR1cyB7XG4gICAgQ09OTkVDVElORyxcbiAgICBDT05ORUNURUQsXG4gICAgRElTQ09OTkVDVElORyxcbiAgICBESVNDT05ORUNURURcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2Vzc2lvbiB7XG4gICAgcHJpdmF0ZSBzdGF0ZSA9IFNlc3Npb25TdGF0dXMuQ09OTkVDVElORztcblxuICAgIHByaXZhdGUgb3V0cHV0RnJhbWVRdWV1ZSA9IG5ldyBGcmFtZVNldCgpO1xuICAgIHByaXZhdGUgb3V0cHV0U2VxdWVuY2VOdW1iZXIgPSAwOyAvLyBUT0RPOiBmaW5kIGEgYmV0dGVyIG5hbWVcbiAgICBwcml2YXRlIG91dHB1dFJlbGlhYmxlSW5kZXggPSAwO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3V0cHV0QmFja3VwUXVldWU6IE1hcDxudW1iZXIsIEZyYW1lW10+ID0gbmV3IE1hcCgpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBvdXRwdXRPcmRlckluZGV4OiBudW1iZXJbXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IG91dHB1dFNlcXVlbmNlSW5kZXg6IG51bWJlcltdO1xuXG4gICAgcHJpdmF0ZSByZWNlaXZlZEZyYW1lU2VxdWVuY2VzOiBTZXQ8bnVtYmVyPiA9IG5ldyBTZXQoKTtcbiAgICBwcml2YXRlIGxvc3RGcmFtZVNlcXVlbmNlczogU2V0PG51bWJlcj4gPSBuZXcgU2V0KCk7XG5cbiAgICAvLyBNYXAgaG9sZGluZyBmcmFnbWVudHMgb2YgZnJhZ21lbnRlZCBwYWNrZXRzXG4gICAgcHJpdmF0ZSByZWFkb25seSBmcmFnbWVudHNRdWV1ZTogTWFwPG51bWJlciwgTWFwPG51bWJlciwgRnJhbWU+PiA9IG5ldyBNYXAoKTtcbiAgICBwcml2YXRlIG91dHB1dEZyYWdtZW50SW5kZXggPSAwO1xuXG4gICAgcHJpdmF0ZSBsYXN0SW5wdXRTZXF1ZW5jZU51bWJlciA9IC0xO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaW5wdXRIaWdoZXN0U2VxdWVuY2VJbmRleDogbnVtYmVyW107XG4gICAgcHJpdmF0ZSByZWFkb25seSBpbnB1dE9yZGVySW5kZXg6IG51bWJlcltdO1xuICAgIHByaXZhdGUgaW5wdXRPcmRlcmluZ1F1ZXVlOiBNYXA8bnVtYmVyLCBNYXA8bnVtYmVyLCBGcmFtZT4+ID0gbmV3IE1hcCgpO1xuXG4gICAgLy8gTGFzdCB0aW1lc3RhbXAgb2YgcGFja2V0IHJlY2VpdmVkLCBoZWxwZnVsIGZvciB0aW1lb3V0XG4gICAgcHJpdmF0ZSBsYXN0VXBkYXRlOiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICAgIHByaXZhdGUgYWN0aXZlID0gdHJ1ZTtcblxuICAgIC8vIFBhY2tldCBwb29sIGlzIHRoZSBiZXN0IG9wdGlvbiB0byByZWR1Y2UgYWxsb2NhdGlvbnNcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhY2tldFBvb2wgPSBuZXcgUGFja2V0UG9vbCgpO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyOiBSYWtOZXRMaXN0ZW5lcixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBtdHVTaXplOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyByZWFkb25seSByaW5mbzogUmVtb3RlSW5mbyxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGd1aWQ6IGJpZ2ludFxuICAgICkge1xuICAgICAgICB0aGlzLmxhc3RVcGRhdGUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIHRoaXMub3V0cHV0T3JkZXJJbmRleCA9IG5ldyBBcnJheShNQVhfQ0hBTk5FTFMpLmZpbGwoMCk7XG4gICAgICAgIHRoaXMub3V0cHV0U2VxdWVuY2VJbmRleCA9IG5ldyBBcnJheShNQVhfQ0hBTk5FTFMpLmZpbGwoMCk7XG5cbiAgICAgICAgdGhpcy5pbnB1dE9yZGVySW5kZXggPSBuZXcgQXJyYXkoTUFYX0NIQU5ORUxTKS5maWxsKDApO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IE1BWF9DSEFOTkVMUzsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmlucHV0T3JkZXJpbmdRdWV1ZS5zZXQoaSwgbmV3IE1hcCgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaW5wdXRIaWdoZXN0U2VxdWVuY2VJbmRleCA9IG5ldyBBcnJheShNQVhfQ0hBTk5FTFMpLmZpbGwoMCk7XG4gICAgfVxuXG4gICAgLy8gTG9va3VwIHRhYmxlIGZvciBwYWNrZXQgaGFuZGxlcnMsIGFsd2F5cyBPKDEpIGluIGF2ZXJhZ2UgYW5kIHdvcnN0IGNhc2VcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhY2tldEhhbmRsZXJzOiBSZWNvcmQ8bnVtYmVyLCAoYnVmZmVyOiBCdWZmZXIpID0+IHZvaWQ+ID0ge1xuICAgICAgICAvLyAweDQwIHwgMHhjMCA9IE1lc3NhZ2VIZWFkZXJzLkFDS05PV0xFREdFX1BBQ0tFVFxuICAgICAgICBbTWVzc2FnZUlkZW50aWZpZXJzLkFDS05PV0xFREdFX1BBQ0tFVF06IChidWZmZXI6IEJ1ZmZlcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWNrID0gdGhpcy5wYWNrZXRQb29sLmdldEFja0luc3RhbmNlKCk7XG4gICAgICAgICAgICAoYWNrIGFzIGFueSkuYnVmZmVyID0gYnVmZmVyO1xuICAgICAgICAgICAgYWNrLmRlY29kZSgpO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVBQ0soYWNrKTtcbiAgICAgICAgfSxcbiAgICAgICAgW01lc3NhZ2VJZGVudGlmaWVycy5OQUNLTk9XTEVER0VfUEFDS0VUXTogKGJ1ZmZlcjogQnVmZmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuYWNrID0gdGhpcy5wYWNrZXRQb29sLmdldE5hY2tJbnN0YW5jZSgpO1xuICAgICAgICAgICAgKG5hY2sgYXMgYW55KS5idWZmZXIgPSBidWZmZXI7XG4gICAgICAgICAgICBuYWNrLmRlY29kZSgpO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVOQUNLKG5hY2spO1xuICAgICAgICB9LFxuICAgICAgICBbQml0RmxhZ3MuVkFMSURdOiAoYnVmZmVyOiBCdWZmZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZyYW1lU2V0ID0gdGhpcy5wYWNrZXRQb29sLmdldEZyYW1lU2V0SW5zdGFuY2UoKTtcbiAgICAgICAgICAgIChmcmFtZVNldCBhcyBhbnkpLmJ1ZmZlciA9IGJ1ZmZlcjtcbiAgICAgICAgICAgIGZyYW1lU2V0LmRlY29kZSgpO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVGcmFtZVNldChmcmFtZVNldCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHVibGljIHVwZGF0ZSh0aW1lc3RhbXA6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNBY3RpdmUoKSAmJiAhdGhpcy5pc0Rpc2Nvbm5lY3RlZCgpICYmIHRoaXMubGFzdFVwZGF0ZSArIDEwXzAwMCA8IHRpbWVzdGFtcCkge1xuICAgICAgICAgICAgdGhpcy5kaXNjb25uZWN0KCd0aW1lb3V0Jyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgIC8vIFRPRE86IGEgcXVldWUganVzdCBmb3IgQUNLcyBzZXF1ZW5jZXMgdG8gYXZvaWQgZHVwbGljYXRlZHNcbiAgICAgICAgaWYgKHRoaXMucmVjZWl2ZWRGcmFtZVNlcXVlbmNlcy5zaXplID4gMCkge1xuICAgICAgICAgICAgY29uc3QgYWNrID0gbmV3IEFDSygpO1xuICAgICAgICAgICAgYWNrLnNlcXVlbmNlTnVtYmVycyA9IEFycmF5LmZyb20odGhpcy5yZWNlaXZlZEZyYW1lU2VxdWVuY2VzKS5tYXAoKHNlcSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVjZWl2ZWRGcmFtZVNlcXVlbmNlcy5kZWxldGUoc2VxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VxO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnNlbmRQYWNrZXQoYWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxvc3RGcmFtZVNlcXVlbmNlcy5zaXplID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcGsgPSBuZXcgTkFDSygpO1xuICAgICAgICAgICAgcGsuc2VxdWVuY2VOdW1iZXJzID0gQXJyYXkuZnJvbSh0aGlzLmxvc3RGcmFtZVNlcXVlbmNlcykubWFwKChzZXEpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvc3RGcmFtZVNlcXVlbmNlcy5kZWxldGUoc2VxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VxO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnNlbmRQYWNrZXQocGspO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZW5kRnJhbWVRdWV1ZSgpO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9va2FyY2hpdmUvUmFrTmV0L2Jsb2IvMWExNjk4OTVhOTAwYzlmYzQ4NDFjNTU2ZTE2NTE0MTgyYjc1ZmFmOC9Tb3VyY2UvUmVsaWFiaWxpdHlMYXllci5jcHAjTDYzNVxuICAgIHB1YmxpYyBoYW5kbGUoYnVmZmVyOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuICAgICAgICB0aGlzLmxhc3RVcGRhdGUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIC8vIE1hc2sgdGhlIGxvd2VyIDQgYml0cyBvZiB0aGUgaGVhZGVyXG4gICAgICAgIC8vIHRvIGdldCB0aGUgcmFuZ2Ugb2YgaGVhZGVyIHZhbHVlc1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5wYWNrZXRIYW5kbGVyc1tidWZmZXJbMF0hICYgMHhmMF07XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKGJ1ZmZlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmdldExvZ2dlcigpLmRlYnVnKCdSZWNlaXZlZCBhbiB1bmtub3duIHBhY2tldCB0eXBlPSVkJywgYnVmZmVyWzBdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlRnJhbWVTZXQoZnJhbWVTZXQ6IEZyYW1lU2V0KTogdm9pZCB7XG4gICAgICAgIC8vIFRPRE86IGFkZGl0aW9uYWwgc2FuaXR5IGNoZWNrc1xuICAgICAgICBpZiAodGhpcy5yZWNlaXZlZEZyYW1lU2VxdWVuY2VzLmhhcyhmcmFtZVNldC5zZXF1ZW5jZU51bWJlcikpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZ2V0TG9nZ2VyKCkuZGVidWcoJ0Rpc2NhcmRlZCBkdXBsaWNhdGVkIHBhY2tldCBmcm9tIGNsaWVudD0lbycsIHRoaXMuZ2V0QWRkcmVzcygpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIGl0IHdhcyBtaXNzaW5nLCByZW1vdmUgZnJvbSB0aGUgcXVldWUgYmVjYXVzZSB3ZSByZWNlaXZlZCBpdCBub3dcbiAgICAgICAgdGhpcy5sb3N0RnJhbWVTZXF1ZW5jZXMuZGVsZXRlKGZyYW1lU2V0LnNlcXVlbmNlTnVtYmVyKTtcblxuICAgICAgICAvLyBGb3Igbm93IGlzIGdvb2QgbGlrZSB0aGF0XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGZyYW1lU2V0LnNlcXVlbmNlTnVtYmVyIDwgdGhpcy5sYXN0SW5wdXRTZXF1ZW5jZU51bWJlciB8fFxuICAgICAgICAgICAgZnJhbWVTZXQuc2VxdWVuY2VOdW1iZXIgPT09IHRoaXMubGFzdElucHV0U2VxdWVuY2VOdW1iZXJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdGhlIGZyYW1lIHRvIHRoZSBBQ0sgcXVldWVcbiAgICAgICAgdGhpcy5yZWNlaXZlZEZyYW1lU2VxdWVuY2VzLmFkZChmcmFtZVNldC5zZXF1ZW5jZU51bWJlcik7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIG1pc3NpbmcgcGFja2V0cyBiZXR3ZWVuIHRoZSByZWNlaXZlZCBwYWNrZXQgYW5kIHRoZSBsYXN0IHJlY2VpdmVkIG9uZVxuICAgICAgICBjb25zdCBkaWZmID0gZnJhbWVTZXQuc2VxdWVuY2VOdW1iZXIgLSB0aGlzLmxhc3RJbnB1dFNlcXVlbmNlTnVtYmVyO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBzZXF1ZW5jZSBoYXMgYSBob2xlIGR1ZSB0byBhIGxvc3QgcGFja2V0XG4gICAgICAgIGlmIChkaWZmICE9PSAxKSB7XG4gICAgICAgICAgICAvLyBBcyBpIHNhaWQgYmVmb3JlLCB0aGVyZSB3ZSBzZWFyY2ggZm9yIG1pc3NpbmcgcGFja2V0cyBpbiB0aGUgbGlzdCBvZiB0aGUgcmVjaWV2ZWQgb25lc1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMubGFzdElucHV0U2VxdWVuY2VOdW1iZXIgKyAxOyBpIDwgZnJhbWVTZXQuc2VxdWVuY2VOdW1iZXI7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIEFkZGluZyB0aGUgcGFja2V0IHNlcXVlbmNlIG51bWJlciB0byB0aGUgTkFDSyBxdWV1ZSBhbmQgdGhlbiBzZW5kaW5nIGEgTkFDS1xuICAgICAgICAgICAgICAgIC8vIHdpbGwgbWFrZSB0aGUgQ2xpZW50IHNlbmRpbmcgYWdhaW4gdGhlIGxvc3QgcGFja2V0XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlY2VpdmVkRnJhbWVTZXF1ZW5jZXMuaGFzKGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9zdEZyYW1lU2VxdWVuY2VzLmFkZChpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB3ZSByZWNlaXZlZCBhIGxvc3QgcGFja2V0IHdlIHNlbnQgaW4gTkFDSyBvciBhIG5vcm1hbCBzZXF1ZW5jZWQgb25lXG4gICAgICAgIHRoaXMubGFzdElucHV0U2VxdWVuY2VOdW1iZXIgPSBmcmFtZVNldC5zZXF1ZW5jZU51bWJlcjtcblxuICAgICAgICAvLyBIYW5kbGUgZW5jYXBzdWxhdGVkXG4gICAgICAgIGZvciAoY29uc3QgZnJhbWUgb2YgZnJhbWVTZXQuZnJhbWVzKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUZyYW1lKGZyYW1lKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlQUNLKGFjazogQUNLKTogdm9pZCB7XG4gICAgICAgIC8vIFRPRE86IHBpbmcgY2FsY3VsYXRpb25cblxuICAgICAgICBmb3IgKGNvbnN0IHNlcSBvZiBhY2suc2VxdWVuY2VOdW1iZXJzKSB7XG4gICAgICAgICAgICB0aGlzLm91dHB1dEJhY2t1cFF1ZXVlLmRlbGV0ZShzZXEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVOQUNLKG5hY2s6IE5BQ0spOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBzZXEgb2YgbmFjay5zZXF1ZW5jZU51bWJlcnMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm91dHB1dEJhY2t1cFF1ZXVlLmhhcyhzZXEpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9zdEZyYW1lcyA9IHRoaXMub3V0cHV0QmFja3VwUXVldWUuZ2V0KHNlcSkhO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbG9zdEZyYW1lIG9mIGxvc3RGcmFtZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kRnJhbWUobG9zdEZyYW1lLCBSYWtOZXRQcmlvcml0eS5JTU1FRElBVEUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLm91dHB1dEJhY2t1cFF1ZXVlLmRlbGV0ZShzZXEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVGcmFtZShmcmFtZTogRnJhbWUpOiB2b2lkIHtcbiAgICAgICAgaWYgKGZyYW1lLmlzRnJhZ21lbnRlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUZyYWdtZW50KGZyYW1lKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9yZGVyQ2hhbm5lbCA9IGZyYW1lLm9yZGVyQ2hhbm5lbCE7XG4gICAgICAgIGNvbnN0IG9yZGVySW5kZXggPSBmcmFtZS5vcmRlckluZGV4ITtcbiAgICAgICAgY29uc3Qgc2VxdWVuY2VJbmRleCA9IGZyYW1lLnNlcXVlbmNlSW5kZXghO1xuXG4gICAgICAgIGlmIChmcmFtZS5pc1NlcXVlbmNlZCgpKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgc2VxdWVuY2VJbmRleCA8IHRoaXMuaW5wdXRIaWdoZXN0U2VxdWVuY2VJbmRleFtvcmRlckNoYW5uZWxdISB8fFxuICAgICAgICAgICAgICAgIG9yZGVySW5kZXggPCB0aGlzLmlucHV0T3JkZXJJbmRleFtvcmRlckNoYW5uZWxdIVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gU2VxdWVuY2VkIHBhY2tldCBpcyB0b28gb2xkLCBkaXNjYXJkIGl0XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmlucHV0SGlnaGVzdFNlcXVlbmNlSW5kZXhbb3JkZXJDaGFubmVsXSA9IHNlcXVlbmNlSW5kZXggKyAxO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVQYWNrZXQoZnJhbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKGZyYW1lLmlzT3JkZXJlZCgpKSB7XG4gICAgICAgICAgICBpZiAob3JkZXJJbmRleCA9PT0gdGhpcy5pbnB1dE9yZGVySW5kZXhbb3JkZXJDaGFubmVsXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5wdXRIaWdoZXN0U2VxdWVuY2VJbmRleFtvcmRlckNoYW5uZWxdID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0T3JkZXJJbmRleFtvcmRlckNoYW5uZWxdID0gb3JkZXJJbmRleCArIDE7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVBhY2tldChmcmFtZSk7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSB0aGlzLmlucHV0T3JkZXJJbmRleFtvcmRlckNoYW5uZWxdITtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXRPZk9yZGVyUXVldWUgPSB0aGlzLmlucHV0T3JkZXJpbmdRdWV1ZS5nZXQob3JkZXJDaGFubmVsKSE7XG4gICAgICAgICAgICAgICAgZm9yICg7IG91dE9mT3JkZXJRdWV1ZS5oYXMoaSk7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVBhY2tldChvdXRPZk9yZGVyUXVldWUuZ2V0KGkpISk7XG4gICAgICAgICAgICAgICAgICAgIG91dE9mT3JkZXJRdWV1ZS5kZWxldGUoaSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSB1cGRhdGVkIHF1ZXVlXG4gICAgICAgICAgICAgICAgdGhpcy5pbnB1dE9yZGVyaW5nUXVldWUuc2V0KG9yZGVyQ2hhbm5lbCwgb3V0T2ZPcmRlclF1ZXVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlucHV0T3JkZXJJbmRleFtvcmRlckNoYW5uZWxdID0gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3JkZXJJbmRleCA+IHRoaXMuaW5wdXRPcmRlckluZGV4W29yZGVyQ2hhbm5lbF0hKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5vcmRlcmVkID0gdGhpcy5pbnB1dE9yZGVyaW5nUXVldWUuZ2V0KG9yZGVyQ2hhbm5lbCkhO1xuICAgICAgICAgICAgICAgIHVub3JkZXJlZC5zZXQob3JkZXJJbmRleCwgZnJhbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVQYWNrZXQoZnJhbWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNlbmRGcmFtZShmcmFtZTogRnJhbWUsIGZsYWdzID0gUmFrTmV0UHJpb3JpdHkuTk9STUFMKTogdm9pZCB7XG4gICAgICAgIGFzc2VydCh0eXBlb2YgZnJhbWUub3JkZXJDaGFubmVsID09PSAnbnVtYmVyJywgJ0ZyYW1lIE9yZGVyQ2hhbm5lbCBjYW5ub3QgYmUgbnVsbCcpO1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2thcmNoaXZlL1Jha05ldC9ibG9iLzFhMTY5ODk1YTkwMGM5ZmM0ODQxYzU1NmUxNjUxNDE4MmI3NWZhZjgvU291cmNlL1JlbGlhYmlsaXR5TGF5ZXIuY3BwI0wxNjI1XG4gICAgICAgIGlmIChmcmFtZS5pc1NlcXVlbmNlZCgpKSB7XG4gICAgICAgICAgICAvLyBTZXF1ZW5jZWQgcGFja2V0cyBkb24ndCBpbmNyZWFzZSB0aGUgb3JkZXJlZCBjaGFubmVsIGluZGV4XG4gICAgICAgICAgICBmcmFtZS5vcmRlckluZGV4ID0gdGhpcy5vdXRwdXRPcmRlckluZGV4W2ZyYW1lLm9yZGVyQ2hhbm5lbF0hO1xuICAgICAgICAgICAgZnJhbWUuc2VxdWVuY2VJbmRleCA9IHRoaXMub3V0cHV0U2VxdWVuY2VJbmRleFtmcmFtZS5vcmRlckNoYW5uZWxdKys7XG4gICAgICAgIH0gZWxzZSBpZiAoZnJhbWUuaXNPcmRlcmVkRXhjbHVzaXZlKCkpIHtcbiAgICAgICAgICAgIC8vIGltcGxpZXMgc2VxdWVuY2VkLCBidXQgd2UgaGF2ZSB0byBkaXN0aW5jdCB0aGVtXG4gICAgICAgICAgICBmcmFtZS5vcmRlckluZGV4ID0gdGhpcy5vdXRwdXRPcmRlckluZGV4W2ZyYW1lLm9yZGVyQ2hhbm5lbF0rKztcbiAgICAgICAgICAgIHRoaXMub3V0cHV0U2VxdWVuY2VJbmRleFtmcmFtZS5vcmRlckNoYW5uZWxdID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZyYW1lLnJlbGlhYmxlSW5kZXggPSB0aGlzLm91dHB1dFJlbGlhYmxlSW5kZXgrKztcblxuICAgICAgICAvLyBTcGxpdCBwYWNrZXQgaWYgYmlnZ2VyIHRoYW4gTVRVIHNpemVcbiAgICAgICAgY29uc3QgbWF4U2l6ZSA9IHRoaXMuZ2V0TVRVKCkgLSBEQVRBR1JBTV9IRUFERVJfQllURV9MRU5HVEggLSBNQVhfRlJBTUVfQllURV9MRU5HVEg7XG4gICAgICAgIGlmIChmcmFtZS5jb250ZW50LmJ5dGVMZW5ndGggPiBtYXhTaXplKSB7XG4gICAgICAgICAgICAvLyBJZiB3ZSB1c2UgdGhlIGZyYW1lIGFzIHJlZmVyZW5jZSwgd2UgaGF2ZSB0byBjb3B5IHNvbWV3aGVyZVxuICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIGJ1ZmZlci4gVGhlbiB3ZSB3aWxsIHBvaW50IHRvIHRoaXMgYnVmZmVyIGNvbnRlbnRcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGZyYW1lLmNvbnRlbnQpO1xuICAgICAgICAgICAgY29uc3QgZnJhZ21lbnRJZCA9IHRoaXMub3V0cHV0RnJhZ21lbnRJbmRleCsrICUgNjU1MzY7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5ieXRlTGVuZ3RoOyBpICs9IG1heFNpemUpIHtcbiAgICAgICAgICAgICAgICAvLyBMaWtlIHRoZSBvcmlnaW5hbCByYWtuZXQsIHdlIGxpa2UgdG8gdXNlIGEgcG9pbnRlciB0byB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgICAgICAvLyBmcmFtZSwgd2UgZG9uJ3QgcmVhbGx5IGNhcmUgYWJvdXQgc2lkZSBlZmZlY3RzIGluIHRoaXMgY2FzZS5cbiAgICAgICAgICAgICAgICAvLyBSYWtOZXQgd2lsbCBhbGxvY2F0ZSB0aGUgd2hvbGUgc3RyY3R1cmUgY29udGFpbmluZyBzcGxpdHMsXG4gICAgICAgICAgICAgICAgLy8gYnV0IGkgdGhpbmsgY2FjaGluZyBqdXN0IHRoZSBidWZmZXIgaXMgZW5vdWdoLlxuICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9va2FyY2hpdmUvUmFrTmV0L2Jsb2IvMWExNjk4OTVhOTAwYzlmYzQ4NDFjNTU2ZTE2NTE0MTgyYjc1ZmFmOC9Tb3VyY2UvUmVsaWFiaWxpdHlMYXllci5jcHAjTDI5NjNcblxuICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIGZpcnN0IGluZGV4IGFzIGl0J3MgYWxyZWFkeSBpbmNyZWFzZWQgYnkgaXRzZWxmLlxuICAgICAgICAgICAgICAgIGlmIChpICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZyYW1lLnJlbGlhYmxlSW5kZXggPSB0aGlzLm91dHB1dFJlbGlhYmxlSW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmcmFtZS5jb250ZW50ID0gYnVmZmVyLnNsaWNlKGksIGkgKyBtYXhTaXplKTtcbiAgICAgICAgICAgICAgICBmcmFtZS5mcmFnbWVudEluZGV4ID0gaSAvIG1heFNpemU7XG4gICAgICAgICAgICAgICAgZnJhbWUuZnJhZ21lbnRJZCA9IGZyYWdtZW50SWQ7XG4gICAgICAgICAgICAgICAgZnJhbWUuZnJhZ21lbnRTaXplID0gTWF0aC5jZWlsKGJ1ZmZlci5ieXRlTGVuZ3RoIC8gbWF4U2l6ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRGcmFtZVRvUXVldWUoZnJhbWUsIGZsYWdzIHwgUmFrTmV0UHJpb3JpdHkuSU1NRURJQVRFKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRnJhbWVUb1F1ZXVlKGZyYW1lLCBmbGFncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEZyYW1lVG9RdWV1ZShmcmFtZTogRnJhbWUsIHByaW9yaXR5ID0gUmFrTmV0UHJpb3JpdHkuTk9STUFMKTogdm9pZCB7XG4gICAgICAgIGxldCBsZW5ndGggPSA0OyAvLyBkYXRhZ3JhbSBoZWFkZXIgc2l6ZVxuICAgICAgICBmb3IgKGNvbnN0IHF1ZXVlZEZyYW1lIG9mIHRoaXMub3V0cHV0RnJhbWVRdWV1ZS5mcmFtZXMpIHtcbiAgICAgICAgICAgIGxlbmd0aCArPSBxdWV1ZWRGcmFtZS5nZXRCeXRlTGVuZ3RoKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGVuZ3RoICsgZnJhbWUuZ2V0Qnl0ZUxlbmd0aCgpID4gdGhpcy5tdHVTaXplIC0gMzYpIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZEZyYW1lUXVldWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3V0cHV0RnJhbWVRdWV1ZS5mcmFtZXMucHVzaChmcmFtZSk7XG5cbiAgICAgICAgaWYgKHByaW9yaXR5ID09PSBSYWtOZXRQcmlvcml0eS5JTU1FRElBVEUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZEZyYW1lUXVldWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlUGFja2V0KHBhY2tldDogRnJhbWUpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaWQgPSBwYWNrZXQuY29udGVudFswXTtcblxuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gU2Vzc2lvblN0YXR1cy5DT05ORUNUSU5HKSB7XG4gICAgICAgICAgICBpZiAoaWQgPT09IE1lc3NhZ2VJZGVudGlmaWVycy5DT05ORUNUSU9OX1JFUVVFU1QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNvbm5lY3Rpb25SZXF1ZXN0KHBhY2tldC5jb250ZW50KS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAoZW5jYXBzdWxhdGVkKSA9PiB0aGlzLnNlbmRGcmFtZShlbmNhcHN1bGF0ZWQsIFJha05ldFByaW9yaXR5LklNTUVESUFURSksXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHt9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT09IE1lc3NhZ2VJZGVudGlmaWVycy5ORVdfSU5DT01JTkdfQ09OTkVDVElPTikge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IG9ubGluZSBtb2RlXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IFNlc3Npb25TdGF0dXMuQ09OTkVDVEVEO1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZW1pdCgnb3BlbkNvbm5lY3Rpb24nLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpZCA9PT0gTWVzc2FnZUlkZW50aWZpZXJzLkRJU0NPTk5FQ1RJT05fTk9USUZJQ0FUSU9OKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgfSBlbHNlIGlmIChpZCA9PT0gTWVzc2FnZUlkZW50aWZpZXJzLkNPTk5FQ1RFRF9QSU5HKSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUNvbm5lY3RlZFBpbmcocGFja2V0LmNvbnRlbnQpLnRoZW4oXG4gICAgICAgICAgICAgICAgKGVuY2Fwc3VsYXRlZCkgPT4gdGhpcy5zZW5kRnJhbWUoZW5jYXBzdWxhdGVkKSxcbiAgICAgICAgICAgICAgICAoKSA9PiB7fVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSBTZXNzaW9uU3RhdHVzLkNPTk5FQ1RFRCkge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lbWl0KCdlbmNhcHN1bGF0ZWQnLCBwYWNrZXQsIHRoaXMuZ2V0QWRkcmVzcygpKTsgLy8gVG8gZml0IGluIHNvZnR3YXJlIG5lZWRzIGxhdGVyXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlQ29ubmVjdGlvblJlcXVlc3QoYnVmZmVyOiBCdWZmZXIpOiBQcm9taXNlPEZyYW1lPiB7XG4gICAgICAgIGNvbnN0IGRhdGFQYWNrZXQgPSBuZXcgQ29ubmVjdGlvblJlcXVlc3QoYnVmZmVyKTtcbiAgICAgICAgZGF0YVBhY2tldC5kZWNvZGUoKTtcblxuICAgICAgICBjb25zdCBwayA9IG5ldyBDb25uZWN0aW9uUmVxdWVzdEFjY2VwdGVkKCk7XG4gICAgICAgIHBrLmNsaWVudEFkZHJlc3MgPSB0aGlzLmdldEFkZHJlc3MoKTtcbiAgICAgICAgcGsucmVxdWVzdFRpbWVzdGFtcCA9IGRhdGFQYWNrZXQucmVxdWVzdFRpbWVzdGFtcDtcbiAgICAgICAgcGsuYWNjZXB0ZWRUaW1lc3RhbXAgPSBCaWdJbnQoRGF0ZS5ub3coKSk7XG4gICAgICAgIHBrLmVuY29kZSgpO1xuXG4gICAgICAgIGNvbnN0IHNlbmRQYWNrZXQgPSBuZXcgRnJhbWUoKTtcbiAgICAgICAgc2VuZFBhY2tldC5yZWxpYWJpbGl0eSA9IEZyYW1lUmVsaWFiaWxpdHkuVU5SRUxJQUJMRTtcbiAgICAgICAgc2VuZFBhY2tldC5vcmRlckNoYW5uZWwgPSAwO1xuICAgICAgICBzZW5kUGFja2V0LmNvbnRlbnQgPSBway5nZXRCdWZmZXIoKTtcblxuICAgICAgICByZXR1cm4gc2VuZFBhY2tldDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgaGFuZGxlQ29ubmVjdGVkUGluZyhidWZmZXI6IEJ1ZmZlcik6IFByb21pc2U8RnJhbWU+IHtcbiAgICAgICAgY29uc3QgZGF0YVBhY2tldCA9IG5ldyBDb25uZWN0ZWRQaW5nKGJ1ZmZlcik7XG4gICAgICAgIGRhdGFQYWNrZXQuZGVjb2RlKCk7XG5cbiAgICAgICAgY29uc3QgcGsgPSBuZXcgQ29ubmVjdGVkUG9uZygpO1xuICAgICAgICBway5jbGllbnRUaW1lc3RhbXAgPSBkYXRhUGFja2V0LmNsaWVudFRpbWVzdGFtcDtcbiAgICAgICAgcGsuc2VydmVyVGltZXN0YW1wID0gQmlnSW50KERhdGUubm93KCkpO1xuICAgICAgICBway5lbmNvZGUoKTtcblxuICAgICAgICBjb25zdCBzZW5kUGFja2V0ID0gbmV3IEZyYW1lKCk7XG4gICAgICAgIHNlbmRQYWNrZXQucmVsaWFiaWxpdHkgPSBGcmFtZVJlbGlhYmlsaXR5LlVOUkVMSUFCTEU7XG4gICAgICAgIHNlbmRQYWNrZXQub3JkZXJDaGFubmVsID0gMDtcbiAgICAgICAgc2VuZFBhY2tldC5jb250ZW50ID0gcGsuZ2V0QnVmZmVyKCk7XG5cbiAgICAgICAgcmV0dXJuIHNlbmRQYWNrZXQ7XG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZUZyYWdtZW50KGZyYW1lOiBGcmFtZSk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZnJhZ21lbnRzUXVldWUuaGFzKGZyYW1lLmZyYWdtZW50SWQpKSB7XG4gICAgICAgICAgICB0aGlzLmZyYWdtZW50c1F1ZXVlLnNldChmcmFtZS5mcmFnbWVudElkLCBuZXcgTWFwKFtbZnJhbWUuZnJhZ21lbnRJbmRleCwgZnJhbWVdXSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmZyYWdtZW50c1F1ZXVlLmdldChmcmFtZS5mcmFnbWVudElkKSE7XG4gICAgICAgICAgICB2YWx1ZS5zZXQoZnJhbWUuZnJhZ21lbnRJbmRleCwgZnJhbWUpO1xuXG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFsbCBwaWVjZXMsIHB1dCB0aGVtIHRvZ2V0aGVyXG4gICAgICAgICAgICBpZiAodmFsdWUuc2l6ZSA9PT0gZnJhbWUuZnJhZ21lbnRTaXplKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGJ1ZmZlciBvcmRlcnNcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLnNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzcGxpdFBhY2tldCA9IHZhbHVlLmdldChpKSE7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZShzcGxpdFBhY2tldC5jb250ZW50KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBhc3NlbWJsZWRGcmFtZSA9IG5ldyBGcmFtZSgpO1xuICAgICAgICAgICAgICAgIGFzc2VtYmxlZEZyYW1lLmNvbnRlbnQgPSBzdHJlYW0uZ2V0QnVmZmVyKCk7XG5cbiAgICAgICAgICAgICAgICBhc3NlbWJsZWRGcmFtZS5yZWxpYWJpbGl0eSA9IGZyYW1lLnJlbGlhYmlsaXR5O1xuICAgICAgICAgICAgICAgIGFzc2VtYmxlZEZyYW1lLnJlbGlhYmxlSW5kZXggPSBmcmFtZS5yZWxpYWJsZUluZGV4O1xuICAgICAgICAgICAgICAgIGFzc2VtYmxlZEZyYW1lLnNlcXVlbmNlSW5kZXggPSBmcmFtZS5zZXF1ZW5jZUluZGV4O1xuICAgICAgICAgICAgICAgIGFzc2VtYmxlZEZyYW1lLm9yZGVySW5kZXggPSBmcmFtZS5vcmRlckluZGV4O1xuICAgICAgICAgICAgICAgIGFzc2VtYmxlZEZyYW1lLm9yZGVyQ2hhbm5lbCA9IGZyYW1lLm9yZGVyQ2hhbm5lbDtcblxuICAgICAgICAgICAgICAgIHRoaXMuZnJhZ21lbnRzUXVldWUuZGVsZXRlKGZyYW1lLmZyYWdtZW50SWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlRnJhbWUoYXNzZW1ibGVkRnJhbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNlbmRGcmFtZVF1ZXVlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5vdXRwdXRGcmFtZVF1ZXVlLmZyYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLm91dHB1dEZyYW1lUXVldWUuc2VxdWVuY2VOdW1iZXIgPSB0aGlzLm91dHB1dFNlcXVlbmNlTnVtYmVyKys7XG4gICAgICAgICAgICB0aGlzLnNlbmRGcmFtZVNldCh0aGlzLm91dHB1dEZyYW1lUXVldWUpO1xuICAgICAgICAgICAgdGhpcy5vdXRwdXRGcmFtZVF1ZXVlID0gbmV3IEZyYW1lU2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbmRGcmFtZVNldChmcmFtZVNldDogRnJhbWVTZXQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZW5kUGFja2V0KGZyYW1lU2V0KTtcbiAgICAgICAgdGhpcy5vdXRwdXRCYWNrdXBRdWV1ZS5zZXQoXG4gICAgICAgICAgICBmcmFtZVNldC5zZXF1ZW5jZU51bWJlcixcbiAgICAgICAgICAgIGZyYW1lU2V0LmZyYW1lcy5maWx0ZXIoKGZyYW1lKSA9PiBmcmFtZS5pc1JlbGlhYmxlKCkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZW5kUGFja2V0KHBhY2tldDogUGFja2V0KTogdm9pZCB7XG4gICAgICAgIHRoaXMubGlzdGVuZXIuc2VuZFBhY2tldChwYWNrZXQsIHRoaXMucmluZm8pO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbShCdWZmZXIuZnJvbSgnXFx1MDAwMFxcdTAwMDBcXHUwMDA4XFx1MDAxNScsICdiaW5hcnknKSk7XG4gICAgICAgIHRoaXMuYWRkRnJhbWVUb1F1ZXVlKG5ldyBGcmFtZSgpLmZyb21CaW5hcnkoc3RyZWFtKSwgUmFrTmV0UHJpb3JpdHkuSU1NRURJQVRFKTsgLy8gQ2xpZW50IGRpc2Njb25lY3QgcGFja2V0IDB4MTVcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBLaWNrIGEgY2xpZW50XG4gICAgICogQHBhcmFtIHJlYXNvbiB0aGUgcmVhc29uIG1lc3NhZ2UsIG9wdGlvbmFsXG4gICAgICovXG4gICAgcHVibGljIGRpc2Nvbm5lY3QocmVhc29uID0gJ2NsaWVudCBkaXNjb25uZWN0Jyk6IHZvaWQge1xuICAgICAgICAvLyBUT0RPOiByZXdyaXRlLCB3b3JrcyBidXQgY2FuIGJlIGltcHJvdmVkXG4gICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgLy8gU2VuZCBkaXNjb25uZWN0IEFDS1xuICAgICAgICB0aGlzLnN0YXRlID0gU2Vzc2lvblN0YXR1cy5ESVNDT05ORUNURUQ7XG4gICAgICAgIHRoaXMudXBkYXRlKERhdGUubm93KCkpO1xuICAgICAgICB0aGlzLmxpc3RlbmVyLnJlbW92ZVNlc3Npb24odGhpcywgcmVhc29uKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U3RhdGUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmU7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRGlzY29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gU2Vzc2lvblN0YXR1cy5ESVNDT05ORUNURUQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldExpc3RlbmVyKCk6IFJha05ldExpc3RlbmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdGVuZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgbWF4bWl1bSB0cmFuc2ZlciB1bml0XG4gICAgICogZm9yIHRoaXMgY29ubmVjdGlvbi5cbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSB0aGUgVURQIGFkanVzdGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRNVFUoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXR1U2l6ZSAtIFVEUF9IRUFERVJfU0laRTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QWRkcmVzcygpOiBJbmV0QWRkcmVzcyB7XG4gICAgICAgIHJldHVybiBuZXcgSW5ldEFkZHJlc3ModGhpcy5yaW5mby5hZGRyZXNzLCB0aGlzLnJpbmZvLnBvcnQsIDQpO1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJSYWtOZXRQcmlvcml0eSIsIlNlc3Npb25TdGF0dXMiLCJNQVhfQ0hBTk5FTFMiLCJGcmFtZVNldCIsIlBhY2tldFBvb2wiLCJNZXNzYWdlSWRlbnRpZmllcnMiLCJCaXRGbGFncyIsIkFDSyIsIk5BQ0siLCJhc3NlcnQiLCJEQVRBR1JBTV9IRUFERVJfQllURV9MRU5HVEgiLCJNQVhfRlJBTUVfQllURV9MRU5HVEgiLCJDb25uZWN0aW9uUmVxdWVzdCIsIkNvbm5lY3Rpb25SZXF1ZXN0QWNjZXB0ZWQiLCJGcmFtZSIsIkZyYW1lUmVsaWFiaWxpdHkiLCJDb25uZWN0ZWRQaW5nIiwiQ29ubmVjdGVkUG9uZyIsIkJpbmFyeVN0cmVhbSIsIlVEUF9IRUFERVJfU0laRSIsIkluZXRBZGRyZXNzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CWSxJQUFBLGNBQUEscUJBQUFBLGVBQUwsS0FBQTtBQUNILEVBQUFBLGVBQUEsQ0FBQSxlQUFBLENBQUEsUUFBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLEdBQUEsUUFBQSxDQUFBO0FBQ0EsRUFBQUEsZUFBQSxDQUFBLGVBQUEsQ0FBQSxXQUFBLENBQUEsR0FBQSxDQUFBLENBQUEsR0FBQSxXQUFBLENBQUE7QUFGUSxFQUFBQSxPQUFBQSxlQUFBQSxDQUFBQTtBQUFBLENBQUEsRUFBQSxjQUFBLElBQUEsRUFBQSxFQUFBO0FBS0EsSUFBQSxhQUFBLHFCQUFBQyxjQUFMLEtBQUE7QUFDSCxFQUFBQSxjQUFBLENBQUEsY0FBQSxDQUFBLFlBQUEsQ0FBQSxHQUFBLENBQUEsQ0FBQSxHQUFBLFlBQUEsQ0FBQTtBQUNBLEVBQUFBLGNBQUEsQ0FBQSxjQUFBLENBQUEsV0FBQSxDQUFBLEdBQUEsQ0FBQSxDQUFBLEdBQUEsV0FBQSxD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
|
package/dist/Session.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
/// <reference types="node"
|
|
2
|
-
/// <reference types="node"
|
|
3
|
-
import Frame from './protocol/Frame
|
|
4
|
-
import InetAddress from './utils/InetAddress
|
|
5
|
-
import RakNetListener from './ServerSocket
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import Frame from './protocol/Frame';
|
|
4
|
+
import InetAddress from './utils/InetAddress';
|
|
5
|
+
import RakNetListener from './ServerSocket';
|
|
6
6
|
import { type RemoteInfo } from 'node:dgram';
|
|
7
7
|
export declare enum RakNetPriority {
|
|
8
8
|
NORMAL = 0,
|
package/dist/Session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Session.d.ts","sourceRoot":"","sources":["../src/Session.ts"],"names":[],"mappings":";;AAOA,OAAO,KAAgC,MAAM,
|
|
1
|
+
{"version":3,"file":"Session.d.ts","sourceRoot":"","sources":["../src/Session.ts"],"names":[],"mappings":";;AAOA,OAAO,KAAgC,MAAM,kBAAkB,CAAC;AAGhE,OAAO,WAAW,MAAM,qBAAqB,CAAC;AAK9C,OAAO,cAAc,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,oBAAY,cAAc;IACtB,MAAM,IAAA;IACN,SAAS,IAAA;CACZ;AAED,oBAAY,aAAa;IACrB,UAAU,IAAA;IACV,SAAS,IAAA;IACT,aAAa,IAAA;IACb,YAAY,IAAA;CACf;AAED,MAAM,CAAC,OAAO,OAAO,OAAO;IA+BpB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO;aACR,KAAK,EAAE,UAAU;aACjB,IAAI,EAAE,MAAM;IAjChC,OAAO,CAAC,KAAK,CAA4B;IAEzC,OAAO,CAAC,gBAAgB,CAAkB;IAC1C,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAmC;IAErE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAW;IAE/C,OAAO,CAAC,sBAAsB,CAA0B;IACxD,OAAO,CAAC,kBAAkB,CAA0B;IAGpD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA8C;IAC7E,OAAO,CAAC,mBAAmB,CAAK;IAEhC,OAAO,CAAC,uBAAuB,CAAM;IACrC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAW;IACrD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAW;IAC3C,OAAO,CAAC,kBAAkB,CAA8C;IAGxE,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,MAAM,CAAQ;IAGtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;gBAG1B,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,MAAM,EAChB,KAAK,EAAE,UAAU,EACjB,IAAI,EAAE,MAAM;IAgBhC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAoB7B;IAEK,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IA+B/B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAcnC,OAAO,CAAC,cAAc;IA6CtB,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,WAAW;IA8CZ,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,iBAAwB,GAAG,IAAI;IA6CnE,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,YAAY;IA0BP,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAkBvD,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAiBzD,cAAc,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IA+BlC,cAAc,IAAI,IAAI;IAQ7B,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,UAAU;IAIX,KAAK,IAAI,IAAI;IAKpB;;;OAGG;IACI,UAAU,CAAC,MAAM,SAAsB,GAAG,IAAI;IAS9C,QAAQ,IAAI,MAAM;IAIlB,QAAQ,IAAI,OAAO;IAInB,cAAc,IAAI,OAAO;IAIzB,WAAW,IAAI,cAAc;IAIpC;;;;OAIG;IACI,MAAM,IAAI,MAAM;IAIhB,UAAU,IAAI,WAAW;CAGnC"}
|