@jsprismarine/client 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/index.cjs.js +275 -0
- package/dist/{Client.d.ts → index.d.ts} +6 -6
- package/dist/index.d.ts.map +1 -0
- package/dist/index.es.js +266 -0
- package/package.json +52 -30
- package/dist/Client.d.ts.map +0 -1
- package/dist/Client.js +0 -186
- package/dist/Client.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
|
|
4
|
+
|
|
5
|
+
const raknet = require('@jsprismarine/raknet');
|
|
6
|
+
const Dgram = require('node:dgram');
|
|
7
|
+
const prismarine = require('@jsprismarine/prismarine');
|
|
8
|
+
const Crypto = require('node:crypto');
|
|
9
|
+
const node_events = require('node:events');
|
|
10
|
+
|
|
11
|
+
const _interopDefault = e => e && e.__esModule ? e : { default: e };
|
|
12
|
+
|
|
13
|
+
const Dgram__default = /*#__PURE__*/_interopDefault(Dgram);
|
|
14
|
+
const Crypto__default = /*#__PURE__*/_interopDefault(Crypto);
|
|
15
|
+
|
|
16
|
+
var clearIntervalAsync$1 = {};
|
|
17
|
+
|
|
18
|
+
var setIntervalAsyncTimer = {};
|
|
19
|
+
|
|
20
|
+
Object.defineProperty(setIntervalAsyncTimer, "__esModule", { value: true });
|
|
21
|
+
setIntervalAsyncTimer.SetIntervalAsyncTimer = void 0;
|
|
22
|
+
const MIN_INTERVAL_MS = 10;
|
|
23
|
+
const MAX_INTERVAL_MS = 2147483647;
|
|
24
|
+
class SetIntervalAsyncTimer {
|
|
25
|
+
#timeout = undefined;
|
|
26
|
+
#promise = undefined;
|
|
27
|
+
#stopped = false;
|
|
28
|
+
static startTimer(strategy, handler, intervalMs, ...handlerArgs) {
|
|
29
|
+
intervalMs = Math.min(Math.max(Math.trunc(intervalMs), MIN_INTERVAL_MS), MAX_INTERVAL_MS);
|
|
30
|
+
const timer = new SetIntervalAsyncTimer();
|
|
31
|
+
timer.#scheduleTimeout(strategy, handler, intervalMs, intervalMs, ...handlerArgs);
|
|
32
|
+
return timer;
|
|
33
|
+
}
|
|
34
|
+
static async stopTimer(timer) {
|
|
35
|
+
timer.#stopped = true;
|
|
36
|
+
if (timer.#timeout) {
|
|
37
|
+
clearTimeout(timer.#timeout);
|
|
38
|
+
}
|
|
39
|
+
if (timer.#promise) {
|
|
40
|
+
await timer.#promise;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
#scheduleTimeout(strategy, handler, intervalMs, delayMs, ...handlerArgs) {
|
|
44
|
+
this.#timeout = setTimeout(async () => {
|
|
45
|
+
this.#timeout = undefined;
|
|
46
|
+
this.#promise = this.#runHandlerAndScheduleTimeout(strategy, handler, intervalMs, ...handlerArgs);
|
|
47
|
+
await this.#promise;
|
|
48
|
+
this.#promise = undefined;
|
|
49
|
+
}, delayMs);
|
|
50
|
+
}
|
|
51
|
+
async #runHandlerAndScheduleTimeout(strategy, handler, intervalMs, ...handlerArgs) {
|
|
52
|
+
const startTimeMs = new Date().getTime();
|
|
53
|
+
try {
|
|
54
|
+
await handler(...handlerArgs);
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
if (!this.#stopped) {
|
|
58
|
+
const executionTimeMs = new Date().getTime() - startTimeMs;
|
|
59
|
+
const delayMs = strategy === "dynamic"
|
|
60
|
+
? intervalMs > executionTimeMs
|
|
61
|
+
? intervalMs - executionTimeMs
|
|
62
|
+
: 0
|
|
63
|
+
: intervalMs;
|
|
64
|
+
this.#scheduleTimeout(strategy, handler, intervalMs, delayMs, ...handlerArgs);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
setIntervalAsyncTimer.SetIntervalAsyncTimer = SetIntervalAsyncTimer;
|
|
70
|
+
|
|
71
|
+
Object.defineProperty(clearIntervalAsync$1, "__esModule", { value: true });
|
|
72
|
+
var clearIntervalAsync_2 = clearIntervalAsync$1.clearIntervalAsync = void 0;
|
|
73
|
+
const set_interval_async_timer_cjs_1 = setIntervalAsyncTimer;
|
|
74
|
+
/**
|
|
75
|
+
* Stops an execution cycle started by setIntervalAsync.
|
|
76
|
+
* Any ongoing function executions will run until completion,
|
|
77
|
+
* but all future ones will be cancelled.
|
|
78
|
+
*/
|
|
79
|
+
async function clearIntervalAsync(timer) {
|
|
80
|
+
if (!(timer instanceof set_interval_async_timer_cjs_1.SetIntervalAsyncTimer)) {
|
|
81
|
+
throw new TypeError("First argument is not an instance of SetIntervalAsyncTimer");
|
|
82
|
+
}
|
|
83
|
+
await set_interval_async_timer_cjs_1.SetIntervalAsyncTimer.stopTimer(timer);
|
|
84
|
+
}
|
|
85
|
+
clearIntervalAsync_2 = clearIntervalAsync$1.clearIntervalAsync = clearIntervalAsync;
|
|
86
|
+
|
|
87
|
+
var setIntervalAsync = {};
|
|
88
|
+
|
|
89
|
+
(function (exports) {
|
|
90
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
91
|
+
exports.setIntervalAsync = exports.clearIntervalAsync = void 0;
|
|
92
|
+
const clear_interval_async_cjs_1 = clearIntervalAsync$1;
|
|
93
|
+
Object.defineProperty(exports, "clearIntervalAsync", { enumerable: true, get: function () { return clear_interval_async_cjs_1.clearIntervalAsync; } });
|
|
94
|
+
const set_interval_async_timer_cjs_1 = setIntervalAsyncTimer;
|
|
95
|
+
/**
|
|
96
|
+
* Executes the given handler at fixed intervals, while preventing
|
|
97
|
+
* multiple concurrent executions. The handler will never be executed
|
|
98
|
+
* concurrently more than once in any given moment, providing a fixed
|
|
99
|
+
* time interval between the end of a given execution and the start of
|
|
100
|
+
* the following one.
|
|
101
|
+
*/
|
|
102
|
+
function setIntervalAsync(handler, intervalMs, ...handlerArgs) {
|
|
103
|
+
if (!(typeof handler === "function")) {
|
|
104
|
+
throw new TypeError("First argument is not a function");
|
|
105
|
+
}
|
|
106
|
+
if (!(typeof intervalMs === "number")) {
|
|
107
|
+
throw new TypeError("Second argument is not a number");
|
|
108
|
+
}
|
|
109
|
+
return set_interval_async_timer_cjs_1.SetIntervalAsyncTimer.startTimer("dynamic", handler, intervalMs, ...handlerArgs);
|
|
110
|
+
}
|
|
111
|
+
exports.setIntervalAsync = setIntervalAsync;
|
|
112
|
+
} (setIntervalAsync));
|
|
113
|
+
|
|
114
|
+
const getRandomInt = (min, max) => {
|
|
115
|
+
min = Math.ceil(min);
|
|
116
|
+
max = Math.floor(max);
|
|
117
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
118
|
+
};
|
|
119
|
+
const PROTOCOL = 10;
|
|
120
|
+
const DEF_MTU_SIZE = 1455;
|
|
121
|
+
const RAKNET_TPS = 100;
|
|
122
|
+
const RAKNET_TICK_LENGTH = 1 / RAKNET_TPS;
|
|
123
|
+
class Client extends node_events.EventEmitter {
|
|
124
|
+
clientGUID = Crypto__default.default.randomBytes(8).readBigInt64BE();
|
|
125
|
+
logger = new prismarine.Logger();
|
|
126
|
+
address;
|
|
127
|
+
targetAddress;
|
|
128
|
+
connection = null;
|
|
129
|
+
socket = Dgram__default.default.createSocket({ type: "udp4" });
|
|
130
|
+
get closed() {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
connecting = false;
|
|
134
|
+
connected = false;
|
|
135
|
+
offlineHandled = false;
|
|
136
|
+
loginHandled = false;
|
|
137
|
+
constructor() {
|
|
138
|
+
super();
|
|
139
|
+
this.address = new raknet.InetAddress("0.0.0.0", getRandomInt(46e3, 49999));
|
|
140
|
+
this.socket.bind(this.address.getPort(), this.address.getAddress());
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Creates a packet listener on given address and port.
|
|
144
|
+
*/
|
|
145
|
+
async connect(address = "0.0.0.0", port = 19132) {
|
|
146
|
+
this.targetAddress = new raknet.InetAddress(address, port);
|
|
147
|
+
this.socket.on("message", (buffer) => {
|
|
148
|
+
void this.handle(buffer);
|
|
149
|
+
});
|
|
150
|
+
if (this.connection)
|
|
151
|
+
throw new Error("Already connected/connecting to server.");
|
|
152
|
+
this.logger.info("JSPrismarine client is now attempting to connect...");
|
|
153
|
+
const timer = setIntervalAsync.setIntervalAsync(async () => {
|
|
154
|
+
if (this.closed) {
|
|
155
|
+
await clearIntervalAsync_2(timer);
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
if (!this.connecting) {
|
|
159
|
+
const pk = new raknet.Protocol.UnconnectedPing();
|
|
160
|
+
pk.timestamp = BigInt(Date.now());
|
|
161
|
+
pk.encode();
|
|
162
|
+
await this.sendBuffer(pk.getBuffer());
|
|
163
|
+
}
|
|
164
|
+
if (this.connected && !this.loginHandled) {
|
|
165
|
+
const pk = new prismarine.Protocol.Packets.LoginPacket();
|
|
166
|
+
pk.encode();
|
|
167
|
+
const sendPk = new raknet.Protocol.Frame();
|
|
168
|
+
sendPk.reliability = 0;
|
|
169
|
+
sendPk.content = pk.getBuffer();
|
|
170
|
+
this.connection.sendFrame(sendPk, raknet.ConnectionPriority.NORMAL);
|
|
171
|
+
this.loginHandled = true;
|
|
172
|
+
}
|
|
173
|
+
this.connection?.update(Date.now());
|
|
174
|
+
}, RAKNET_TICK_LENGTH * 1e3);
|
|
175
|
+
return this;
|
|
176
|
+
}
|
|
177
|
+
async handle(buffer) {
|
|
178
|
+
const header = buffer.readUInt8();
|
|
179
|
+
if (this.connection && this.offlineHandled) {
|
|
180
|
+
return this.connection.handle(buffer);
|
|
181
|
+
}
|
|
182
|
+
let buf;
|
|
183
|
+
switch (header) {
|
|
184
|
+
case raknet.MessageIdentifiers.UNCONNECTED_PONG:
|
|
185
|
+
buf = this.handleUnconnectedPong(buffer);
|
|
186
|
+
await this.sendBuffer(buf);
|
|
187
|
+
break;
|
|
188
|
+
case raknet.MessageIdentifiers.OPEN_CONNECTION_REPLY_1:
|
|
189
|
+
buf = this.handleOpenConnectionReply1(buffer);
|
|
190
|
+
await this.sendBuffer(buf);
|
|
191
|
+
break;
|
|
192
|
+
case raknet.MessageIdentifiers.OPEN_CONNECTION_REPLY_2:
|
|
193
|
+
this.handleOpenConnectionReply2(buffer);
|
|
194
|
+
break;
|
|
195
|
+
default:
|
|
196
|
+
this.logger.warn(`Unhandled offline packet ID: ${header}`, "Client/handle");
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
handleUnconnectedPong(buffer) {
|
|
200
|
+
const decodedPacket = new raknet.Protocol.UnconnectedPong(buffer);
|
|
201
|
+
decodedPacket.decode();
|
|
202
|
+
if (!decodedPacket.isValid()) {
|
|
203
|
+
throw new Error("Received an invalid offline message");
|
|
204
|
+
}
|
|
205
|
+
const packet = new raknet.Protocol.OpenConnectionRequest1();
|
|
206
|
+
packet.protocol = PROTOCOL;
|
|
207
|
+
packet.mtuSize = DEF_MTU_SIZE;
|
|
208
|
+
packet.encode();
|
|
209
|
+
return packet.getBuffer();
|
|
210
|
+
}
|
|
211
|
+
handleOpenConnectionReply1(buffer) {
|
|
212
|
+
const decodedPacket = new raknet.Protocol.OpenConnectionReply1(buffer);
|
|
213
|
+
decodedPacket.decode();
|
|
214
|
+
if (!decodedPacket.isValid()) {
|
|
215
|
+
throw new Error("Received an invalid offline message");
|
|
216
|
+
}
|
|
217
|
+
const packet = new raknet.Protocol.OpenConnectionRequest2();
|
|
218
|
+
packet.serverAddress = this.targetAddress;
|
|
219
|
+
packet.mtuSize = DEF_MTU_SIZE;
|
|
220
|
+
packet.clientGUID = this.clientGUID;
|
|
221
|
+
packet.encode();
|
|
222
|
+
this.connecting = true;
|
|
223
|
+
this.connection = new raknet.RakNetSession(
|
|
224
|
+
this,
|
|
225
|
+
DEF_MTU_SIZE,
|
|
226
|
+
{
|
|
227
|
+
address: this.address.getAddress(),
|
|
228
|
+
port: this.address.getPort(),
|
|
229
|
+
family: "IPv4",
|
|
230
|
+
size: 0
|
|
231
|
+
},
|
|
232
|
+
Crypto.randomBytes(8).readBigInt64BE()
|
|
233
|
+
);
|
|
234
|
+
return packet.getBuffer();
|
|
235
|
+
}
|
|
236
|
+
handleOpenConnectionReply2(buffer) {
|
|
237
|
+
const decodedPacket = new raknet.Protocol.OpenConnectionReply2(buffer);
|
|
238
|
+
decodedPacket.decode();
|
|
239
|
+
if (!decodedPacket.isValid()) {
|
|
240
|
+
throw new Error("Received an invalid offline message");
|
|
241
|
+
}
|
|
242
|
+
const packet = new raknet.Protocol.ConnectionRequest();
|
|
243
|
+
packet.clientGUID = this.clientGUID;
|
|
244
|
+
packet.requestTimestamp = BigInt(Date.now());
|
|
245
|
+
packet.encode();
|
|
246
|
+
const sendPacket = new raknet.Protocol.Frame();
|
|
247
|
+
sendPacket.reliability = 0;
|
|
248
|
+
sendPacket.content = packet.getBuffer();
|
|
249
|
+
this.connection?.sendFrame(sendPacket, raknet.ConnectionPriority.NORMAL);
|
|
250
|
+
this.offlineHandled = true;
|
|
251
|
+
this.connected = true;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Sends the buffer to the server
|
|
255
|
+
*
|
|
256
|
+
* @param buffer
|
|
257
|
+
* @param address
|
|
258
|
+
* @param port
|
|
259
|
+
*/
|
|
260
|
+
async sendBuffer(buffer) {
|
|
261
|
+
this.socket.send(buffer, 0, buffer.byteLength, this.targetAddress.getPort(), this.targetAddress.getAddress());
|
|
262
|
+
}
|
|
263
|
+
getSocket() {
|
|
264
|
+
return this.socket;
|
|
265
|
+
}
|
|
266
|
+
getAddress() {
|
|
267
|
+
return this.address;
|
|
268
|
+
}
|
|
269
|
+
async removeConnection(_connection, _reason) {
|
|
270
|
+
throw new Error("Method not implemented.");
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
exports.default = Client;
|
|
275
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY2pzLmpzIiwic291cmNlcyI6WyIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vc2V0LWludGVydmFsLWFzeW5jQDMuMC4zL25vZGVfbW9kdWxlcy9zZXQtaW50ZXJ2YWwtYXN5bmMvZGlzdC9zZXQtaW50ZXJ2YWwtYXN5bmMtdGltZXIuY2pzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3NldC1pbnRlcnZhbC1hc3luY0AzLjAuMy9ub2RlX21vZHVsZXMvc2V0LWludGVydmFsLWFzeW5jL2Rpc3QvY2xlYXItaW50ZXJ2YWwtYXN5bmMuY2pzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3NldC1pbnRlcnZhbC1hc3luY0AzLjAuMy9ub2RlX21vZHVsZXMvc2V0LWludGVydmFsLWFzeW5jL2Rpc3QvZHluYW1pYy9zZXQtaW50ZXJ2YWwtYXN5bmMuY2pzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TZXRJbnRlcnZhbEFzeW5jVGltZXIgPSB2b2lkIDA7XG5jb25zdCBNSU5fSU5URVJWQUxfTVMgPSAxMDtcbmNvbnN0IE1BWF9JTlRFUlZBTF9NUyA9IDIxNDc0ODM2NDc7XG5jbGFzcyBTZXRJbnRlcnZhbEFzeW5jVGltZXIge1xuICAgICN0aW1lb3V0ID0gdW5kZWZpbmVkO1xuICAgICNwcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICNzdG9wcGVkID0gZmFsc2U7XG4gICAgc3RhdGljIHN0YXJ0VGltZXIoc3RyYXRlZ3ksIGhhbmRsZXIsIGludGVydmFsTXMsIC4uLmhhbmRsZXJBcmdzKSB7XG4gICAgICAgIGludGVydmFsTXMgPSBNYXRoLm1pbihNYXRoLm1heChNYXRoLnRydW5jKGludGVydmFsTXMpLCBNSU5fSU5URVJWQUxfTVMpLCBNQVhfSU5URVJWQUxfTVMpO1xuICAgICAgICBjb25zdCB0aW1lciA9IG5ldyBTZXRJbnRlcnZhbEFzeW5jVGltZXIoKTtcbiAgICAgICAgdGltZXIuI3NjaGVkdWxlVGltZW91dChzdHJhdGVneSwgaGFuZGxlciwgaW50ZXJ2YWxNcywgaW50ZXJ2YWxNcywgLi4uaGFuZGxlckFyZ3MpO1xuICAgICAgICByZXR1cm4gdGltZXI7XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBzdG9wVGltZXIodGltZXIpIHtcbiAgICAgICAgdGltZXIuI3N0b3BwZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGltZXIuI3RpbWVvdXQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lci4jdGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbWVyLiNwcm9taXNlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aW1lci4jcHJvbWlzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAjc2NoZWR1bGVUaW1lb3V0KHN0cmF0ZWd5LCBoYW5kbGVyLCBpbnRlcnZhbE1zLCBkZWxheU1zLCAuLi5oYW5kbGVyQXJncykge1xuICAgICAgICB0aGlzLiN0aW1lb3V0ID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiN0aW1lb3V0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy4jcHJvbWlzZSA9IHRoaXMuI3J1bkhhbmRsZXJBbmRTY2hlZHVsZVRpbWVvdXQoc3RyYXRlZ3ksIGhhbmRsZXIsIGludGVydmFsTXMsIC4uLmhhbmRsZXJBcmdzKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuI3Byb21pc2U7XG4gICAgICAgICAgICB0aGlzLiNwcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICB9LCBkZWxheU1zKTtcbiAgICB9XG4gICAgYXN5bmMgI3J1bkhhbmRsZXJBbmRTY2hlZHVsZVRpbWVvdXQoc3RyYXRlZ3ksIGhhbmRsZXIsIGludGVydmFsTXMsIC4uLmhhbmRsZXJBcmdzKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZU1zID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGVyKC4uLmhhbmRsZXJBcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmICghdGhpcy4jc3RvcHBlZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGlvblRpbWVNcyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnRUaW1lTXM7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVsYXlNcyA9IHN0cmF0ZWd5ID09PSBcImR5bmFtaWNcIlxuICAgICAgICAgICAgICAgICAgICA/IGludGVydmFsTXMgPiBleGVjdXRpb25UaW1lTXNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gaW50ZXJ2YWxNcyAtIGV4ZWN1dGlvblRpbWVNc1xuICAgICAgICAgICAgICAgICAgICAgICAgOiAwXG4gICAgICAgICAgICAgICAgICAgIDogaW50ZXJ2YWxNcztcbiAgICAgICAgICAgICAgICB0aGlzLiNzY2hlZHVsZVRpbWVvdXQoc3RyYXRlZ3ksIGhhbmRsZXIsIGludGVydmFsTXMsIGRlbGF5TXMsIC4uLmhhbmRsZXJBcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2V0SW50ZXJ2YWxBc3luY1RpbWVyID0gU2V0SW50ZXJ2YWxBc3luY1RpbWVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNsZWFySW50ZXJ2YWxBc3luYyA9IHZvaWQgMDtcbmNvbnN0IHNldF9pbnRlcnZhbF9hc3luY190aW1lcl9janNfMSA9IHJlcXVpcmUoXCIuL3NldC1pbnRlcnZhbC1hc3luYy10aW1lci5janNcIik7XG4vKipcbiAqIFN0b3BzIGFuIGV4ZWN1dGlvbiBjeWNsZSBzdGFydGVkIGJ5IHNldEludGVydmFsQXN5bmMuXG4gKiBBbnkgb25nb2luZyBmdW5jdGlvbiBleGVjdXRpb25zIHdpbGwgcnVuIHVudGlsIGNvbXBsZXRpb24sXG4gKiBidXQgYWxsIGZ1dHVyZSBvbmVzIHdpbGwgYmUgY2FuY2VsbGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiBjbGVhckludGVydmFsQXN5bmModGltZXIpIHtcbiAgICBpZiAoISh0aW1lciBpbnN0YW5jZW9mIHNldF9pbnRlcnZhbF9hc3luY190aW1lcl9janNfMS5TZXRJbnRlcnZhbEFzeW5jVGltZXIpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGaXJzdCBhcmd1bWVudCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgU2V0SW50ZXJ2YWxBc3luY1RpbWVyXCIpO1xuICAgIH1cbiAgICBhd2FpdCBzZXRfaW50ZXJ2YWxfYXN5bmNfdGltZXJfY2pzXzEuU2V0SW50ZXJ2YWxBc3luY1RpbWVyLnN0b3BUaW1lcih0aW1lcik7XG59XG5leHBvcnRzLmNsZWFySW50ZXJ2YWxBc3luYyA9IGNsZWFySW50ZXJ2YWxBc3luYztcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zZXRJbnRlcnZhbEFzeW5jID0gZXhwb3J0cy5jbGVhckludGVydmFsQXN5bmMgPSB2b2lkIDA7XG5jb25zdCBjbGVhcl9pbnRlcnZhbF9hc3luY19janNfMSA9IHJlcXVpcmUoXCIuLi9jbGVhci1pbnRlcnZhbC1hc3luYy5janNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJjbGVhckludGVydmFsQXN5bmNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNsZWFyX2ludGVydmFsX2FzeW5jX2Nqc18xLmNsZWFySW50ZXJ2YWxBc3luYzsgfSB9KTtcbmNvbnN0IHNldF9pbnRlcnZhbF9hc3luY190aW1lcl9janNfMSA9IHJlcXVpcmUoXCIuLi9zZXQtaW50ZXJ2YWwtYXN5bmMtdGltZXIuY2pzXCIpO1xuLyoqXG4gKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gaGFuZGxlciBhdCBmaXhlZCBpbnRlcnZhbHMsIHdoaWxlIHByZXZlbnRpbmdcbiAqIG11bHRpcGxlIGNvbmN1cnJlbnQgZXhlY3V0aW9ucy4gVGhlIGhhbmRsZXIgd2lsbCBuZXZlciBiZSBleGVjdXRlZFxuICogY29uY3VycmVudGx5IG1vcmUgdGhhbiBvbmNlIGluIGFueSBnaXZlbiBtb21lbnQsIHByb3ZpZGluZyBhIGZpeGVkXG4gKiB0aW1lIGludGVydmFsIGJldHdlZW4gdGhlIGVuZCBvZiBhIGdpdmVuIGV4ZWN1dGlvbiBhbmQgdGhlIHN0YXJ0IG9mXG4gKiB0aGUgZm9sbG93aW5nIG9uZS5cbiAqL1xuZnVuY3Rpb24gc2V0SW50ZXJ2YWxBc3luYyhoYW5kbGVyLCBpbnRlcnZhbE1zLCAuLi5oYW5kbGVyQXJncykge1xuICAgIGlmICghKHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJGaXJzdCBhcmd1bWVudCBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgICB9XG4gICAgaWYgKCEodHlwZW9mIGludGVydmFsTXMgPT09IFwibnVtYmVyXCIpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTZWNvbmQgYXJndW1lbnQgaXMgbm90IGEgbnVtYmVyXCIpO1xuICAgIH1cbiAgICByZXR1cm4gc2V0X2ludGVydmFsX2FzeW5jX3RpbWVyX2Nqc18xLlNldEludGVydmFsQXN5bmNUaW1lci5zdGFydFRpbWVyKFwiZHluYW1pY1wiLCBoYW5kbGVyLCBpbnRlcnZhbE1zLCAuLi5oYW5kbGVyQXJncyk7XG59XG5leHBvcnRzLnNldEludGVydmFsQXN5bmMgPSBzZXRJbnRlcnZhbEFzeW5jO1xuIiwiaW1wb3J0IHsgQ29ubmVjdGlvblByaW9yaXR5LCBJbmV0QWRkcmVzcywgUHJvdG9jb2wsIFJha05ldFNlc3Npb24sIE1lc3NhZ2VJZGVudGlmaWVycyB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvcmFrbmV0JztcbmltcG9ydCBEZ3JhbSwgeyB0eXBlIFNvY2tldCB9IGZyb20gJ25vZGU6ZGdyYW0nO1xuaW1wb3J0IHsgUHJvdG9jb2wgYXMgSlNQUHJvdG9jb2wsIExvZ2dlciB9IGZyb20gJ0Bqc3ByaXNtYXJpbmUvcHJpc21hcmluZSc7XG5pbXBvcnQgeyBjbGVhckludGVydmFsQXN5bmMsIHNldEludGVydmFsQXN5bmMgfSBmcm9tICdzZXQtaW50ZXJ2YWwtYXN5bmMvZHluYW1pYyc7XG5pbXBvcnQgQ3J5cHRvLCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnbm9kZTpldmVudHMnO1xuXG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTUyNzgyMC8zMTQyNTUzXG5jb25zdCBnZXRSYW5kb21JbnQgPSAobWluOiBudW1iZXIsIG1heDogbnVtYmVyKSA9PiB7XG4gICAgbWluID0gTWF0aC5jZWlsKG1pbik7XG4gICAgbWF4ID0gTWF0aC5mbG9vcihtYXgpO1xuICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpICsgbWluO1xufTtcblxuLy8gTWluZWNyYWZ0IHJlbGF0ZWQgcHJvdG9jb2xcbmNvbnN0IFBST1RPQ09MID0gMTA7XG5cbi8vIE1heCBuZXQgdHJhbnNmZXIgdW5pdFxuY29uc3QgREVGX01UVV9TSVpFID0gMTQ1NTtcblxuLy8gUmFrbmV0IHRpY2tzXG5jb25zdCBSQUtORVRfVFBTID0gMTAwO1xuY29uc3QgUkFLTkVUX1RJQ0tfTEVOR1RIID0gMSAvIFJBS05FVF9UUFM7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsaWVudCBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgcHJpdmF0ZSBjbGllbnRHVUlEID0gQ3J5cHRvLnJhbmRvbUJ5dGVzKDgpLnJlYWRCaWdJbnQ2NEJFKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBuZXcgTG9nZ2VyKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBhZGRyZXNzOiBJbmV0QWRkcmVzcztcbiAgICBwcml2YXRlIHRhcmdldEFkZHJlc3MhOiBJbmV0QWRkcmVzcztcbiAgICBwcml2YXRlIGNvbm5lY3Rpb246IFJha05ldFNlc3Npb24gfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNvY2tldCA9IERncmFtLmNyZWF0ZVNvY2tldCh7IHR5cGU6ICd1ZHA0JyB9KTtcbiAgICBwcml2YXRlIGdldCBjbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICBwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgb2ZmbGluZUhhbmRsZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGxvZ2luSGFuZGxlZCA9IGZhbHNlO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmFkZHJlc3MgPSBuZXcgSW5ldEFkZHJlc3MoJzAuMC4wLjAnLCBnZXRSYW5kb21JbnQoNDYwMDAsIDQ5OTk5KSk7XG4gICAgICAgIHRoaXMuc29ja2V0LmJpbmQodGhpcy5hZGRyZXNzLmdldFBvcnQoKSwgdGhpcy5hZGRyZXNzLmdldEFkZHJlc3MoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHBhY2tldCBsaXN0ZW5lciBvbiBnaXZlbiBhZGRyZXNzIGFuZCBwb3J0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBjb25uZWN0KGFkZHJlc3MgPSAnMC4wLjAuMCcsIHBvcnQgPSAxOTEzMikge1xuICAgICAgICB0aGlzLnRhcmdldEFkZHJlc3MgPSBuZXcgSW5ldEFkZHJlc3MoYWRkcmVzcywgcG9ydCk7XG5cbiAgICAgICAgdGhpcy5zb2NrZXQub24oJ21lc3NhZ2UnLCAoYnVmZmVyOiBCdWZmZXIpID0+IHtcbiAgICAgICAgICAgIHZvaWQgdGhpcy5oYW5kbGUoYnVmZmVyKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29ubmVjdGlvbikgdGhyb3cgbmV3IEVycm9yKCdBbHJlYWR5IGNvbm5lY3RlZC9jb25uZWN0aW5nIHRvIHNlcnZlci4nKTtcblxuICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKCdKU1ByaXNtYXJpbmUgY2xpZW50IGlzIG5vdyBhdHRlbXB0aW5nIHRvIGNvbm5lY3QuLi4nKTtcblxuICAgICAgICBjb25zdCB0aW1lciA9IHNldEludGVydmFsQXN5bmMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgY2xlYXJJbnRlcnZhbEFzeW5jKHRpbWVyKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNlbmQgYSBjbGllbnQgcGFja2V0IHRvIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAgIC8vIHNvIHRoZSBzZXJ2ZXIgZ29lcyBpbiB0YXJnZXQgbW9kZVxuICAgICAgICAgICAgLy8gYW5kIHRoZSBsb2dpbiBwcm9jZXNzIHN0YXJ0c1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbm5lY3RpbmcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwayA9IG5ldyBQcm90b2NvbC5VbmNvbm5lY3RlZFBpbmcoKTtcbiAgICAgICAgICAgICAgICBway50aW1lc3RhbXAgPSBCaWdJbnQoRGF0ZS5ub3coKSk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogY2FuIGJlIG9taXR0ZWQuLi4gcGsuID0gdGhpcy5jbGllbnRHVUlEO1xuICAgICAgICAgICAgICAgIHBrLmVuY29kZSgpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZEJ1ZmZlcihway5nZXRCdWZmZXIoKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmNvbm5lY3RlZCAmJiAhdGhpcy5sb2dpbkhhbmRsZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwayA9IG5ldyBKU1BQcm90b2NvbC5QYWNrZXRzLkxvZ2luUGFja2V0KCk7XG4gICAgICAgICAgICAgICAgcGsuZW5jb2RlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzZW5kUGsgPSBuZXcgUHJvdG9jb2wuRnJhbWUoKTtcbiAgICAgICAgICAgICAgICBzZW5kUGsucmVsaWFiaWxpdHkgPSAwO1xuICAgICAgICAgICAgICAgIHNlbmRQay5jb250ZW50ID0gcGsuZ2V0QnVmZmVyKCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24hLnNlbmRGcmFtZShzZW5kUGssIENvbm5lY3Rpb25Qcmlvcml0eS5OT1JNQUwpOyAvLyBQYWNrZXQgbmVlZHMgdG8gYmUgc3BsaXR0ZWRcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2luSGFuZGxlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbj8udXBkYXRlKERhdGUubm93KCkpO1xuICAgICAgICB9LCBSQUtORVRfVElDS19MRU5HVEggKiAxMDAwKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGUoYnVmZmVyOiBCdWZmZXIpIHtcbiAgICAgICAgY29uc3QgaGVhZGVyID0gYnVmZmVyLnJlYWRVSW50OCgpOyAvLyBSZWFkIHBhY2tldCBoZWFkZXJcblxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uICYmIHRoaXMub2ZmbGluZUhhbmRsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3Rpb24uaGFuZGxlKGJ1ZmZlcik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYnVmO1xuICAgICAgICBzd2l0Y2ggKGhlYWRlcikge1xuICAgICAgICAgICAgY2FzZSBNZXNzYWdlSWRlbnRpZmllcnMuVU5DT05ORUNURURfUE9ORzpcbiAgICAgICAgICAgICAgICBidWYgPSB0aGlzLmhhbmRsZVVuY29ubmVjdGVkUG9uZyhidWZmZXIpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZEJ1ZmZlcihidWYpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBNZXNzYWdlSWRlbnRpZmllcnMuT1BFTl9DT05ORUNUSU9OX1JFUExZXzE6XG4gICAgICAgICAgICAgICAgYnVmID0gdGhpcy5oYW5kbGVPcGVuQ29ubmVjdGlvblJlcGx5MShidWZmZXIpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZEJ1ZmZlcihidWYpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBNZXNzYWdlSWRlbnRpZmllcnMuT1BFTl9DT05ORUNUSU9OX1JFUExZXzI6XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVPcGVuQ29ubmVjdGlvblJlcGx5MihidWZmZXIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBVbmhhbmRsZWQgb2ZmbGluZSBwYWNrZXQgSUQ6ICR7aGVhZGVyfWAsICdDbGllbnQvaGFuZGxlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaGFuZGxlVW5jb25uZWN0ZWRQb25nKGJ1ZmZlcjogQnVmZmVyKSB7XG4gICAgICAgIC8vIERlY29kZSBzZXJ2ZXIgcGFja2V0XG4gICAgICAgIGNvbnN0IGRlY29kZWRQYWNrZXQgPSBuZXcgUHJvdG9jb2wuVW5jb25uZWN0ZWRQb25nKGJ1ZmZlcik7XG4gICAgICAgIGRlY29kZWRQYWNrZXQuZGVjb2RlKCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgcGFja2V0IHZhbGlkaXR5XG4gICAgICAgIC8vIFRvIHJlZmFjdG9yXG4gICAgICAgIGlmICghZGVjb2RlZFBhY2tldC5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVjZWl2ZWQgYW4gaW52YWxpZCBvZmZsaW5lIG1lc3NhZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuY29kZSByZXNwb25zZVxuICAgICAgICBjb25zdCBwYWNrZXQgPSBuZXcgUHJvdG9jb2wuT3BlbkNvbm5lY3Rpb25SZXF1ZXN0MSgpO1xuICAgICAgICBwYWNrZXQucHJvdG9jb2wgPSBQUk9UT0NPTDtcbiAgICAgICAgcGFja2V0Lm10dVNpemUgPSBERUZfTVRVX1NJWkU7XG4gICAgICAgIHBhY2tldC5lbmNvZGUoKTtcblxuICAgICAgICAvLyBVcGRhdGUgc2Vzc2lvbiBzdGF0dXNcbiAgICAgICAgLy8gdGhpcy5zdGF0dXMgPSBDb25uZWN0aW9uU3RhdHVzLlRhcmdldHRlZDtcblxuICAgICAgICByZXR1cm4gcGFja2V0LmdldEJ1ZmZlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYW5kbGVPcGVuQ29ubmVjdGlvblJlcGx5MShidWZmZXI6IEJ1ZmZlcikge1xuICAgICAgICAvLyBEZWNvZGUgc2VydmVyIHBhY2tldFxuICAgICAgICBjb25zdCBkZWNvZGVkUGFja2V0ID0gbmV3IFByb3RvY29sLk9wZW5Db25uZWN0aW9uUmVwbHkxKGJ1ZmZlcik7XG4gICAgICAgIGRlY29kZWRQYWNrZXQuZGVjb2RlKCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgcGFja2V0IHZhbGlkaXR5XG4gICAgICAgIC8vIFRvIHJlZmFjdG9yXG4gICAgICAgIGlmICghZGVjb2RlZFBhY2tldC5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVjZWl2ZWQgYW4gaW52YWxpZCBvZmZsaW5lIG1lc3NhZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuY29kZSByZXNwb25zZVxuICAgICAgICBjb25zdCBwYWNrZXQgPSBuZXcgUHJvdG9jb2wuT3BlbkNvbm5lY3Rpb25SZXF1ZXN0MigpO1xuICAgICAgICBwYWNrZXQuc2VydmVyQWRkcmVzcyA9IHRoaXMudGFyZ2V0QWRkcmVzcztcbiAgICAgICAgcGFja2V0Lm10dVNpemUgPSBERUZfTVRVX1NJWkU7XG4gICAgICAgIHBhY2tldC5jbGllbnRHVUlEID0gdGhpcy5jbGllbnRHVUlEO1xuICAgICAgICBwYWNrZXQuZW5jb2RlKCk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHNlc3Npb24gc3RhdHVzXG4gICAgICAgIHRoaXMuY29ubmVjdGluZyA9IHRydWU7XG4gICAgICAgIC8vIFRoaXMuc3RhdHVzID0gQ29ubmVjdGlvblN0YXR1cy5Db25uZWN0ZWQ7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IG5ldyBSYWtOZXRTZXNzaW9uKFxuICAgICAgICAgICAgdGhpcyBhcyBhbnksXG4gICAgICAgICAgICBERUZfTVRVX1NJWkUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgYWRkcmVzczogdGhpcy5hZGRyZXNzLmdldEFkZHJlc3MoKSxcbiAgICAgICAgICAgICAgICBwb3J0OiB0aGlzLmFkZHJlc3MuZ2V0UG9ydCgpLFxuICAgICAgICAgICAgICAgIGZhbWlseTogJ0lQdjQnLFxuICAgICAgICAgICAgICAgIHNpemU6IDBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByYW5kb21CeXRlcyg4KS5yZWFkQmlnSW50NjRCRSgpXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHBhY2tldC5nZXRCdWZmZXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFuZGxlT3BlbkNvbm5lY3Rpb25SZXBseTIoYnVmZmVyOiBCdWZmZXIpIHtcbiAgICAgICAgLy8gRGVjb2RlIHNlcnZlciBwYWNrZXRcbiAgICAgICAgY29uc3QgZGVjb2RlZFBhY2tldCA9IG5ldyBQcm90b2NvbC5PcGVuQ29ubmVjdGlvblJlcGx5MihidWZmZXIpO1xuICAgICAgICBkZWNvZGVkUGFja2V0LmRlY29kZSgpO1xuXG4gICAgICAgIC8vIENoZWNrIHBhY2tldCB2YWxpZGl0eVxuICAgICAgICAvLyBUbyByZWZhY3RvclxuICAgICAgICBpZiAoIWRlY29kZWRQYWNrZXQuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlY2VpdmVkIGFuIGludmFsaWQgb2ZmbGluZSBtZXNzYWdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbmNvZGUgcmVzcG9uc2UgKGVuY2Fwc3VsYXRlZClcbiAgICAgICAgY29uc3QgcGFja2V0ID0gbmV3IFByb3RvY29sLkNvbm5lY3Rpb25SZXF1ZXN0KCk7XG4gICAgICAgIHBhY2tldC5jbGllbnRHVUlEID0gdGhpcy5jbGllbnRHVUlEO1xuICAgICAgICBwYWNrZXQucmVxdWVzdFRpbWVzdGFtcCA9IEJpZ0ludChEYXRlLm5vdygpKTtcbiAgICAgICAgcGFja2V0LmVuY29kZSgpO1xuXG4gICAgICAgIGNvbnN0IHNlbmRQYWNrZXQgPSBuZXcgUHJvdG9jb2wuRnJhbWUoKTtcbiAgICAgICAgc2VuZFBhY2tldC5yZWxpYWJpbGl0eSA9IDA7XG4gICAgICAgIHNlbmRQYWNrZXQuY29udGVudCA9IHBhY2tldC5nZXRCdWZmZXIoKTtcblxuICAgICAgICB0aGlzLmNvbm5lY3Rpb24/LnNlbmRGcmFtZShzZW5kUGFja2V0LCBDb25uZWN0aW9uUHJpb3JpdHkuTk9STUFMKTtcblxuICAgICAgICB0aGlzLm9mZmxpbmVIYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSB0cnVlOyAvLyBTaG91bGQgYmUuLi4gd2UgY2FuJ3QgcmVseSBvbiBpdFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmRzIHRoZSBidWZmZXIgdG8gdGhlIHNlcnZlclxuICAgICAqXG4gICAgICogQHBhcmFtIGJ1ZmZlclxuICAgICAqIEBwYXJhbSBhZGRyZXNzXG4gICAgICogQHBhcmFtIHBvcnRcbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgc2VuZEJ1ZmZlcihidWZmZXI6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGJ1ZmZlciwgMCwgYnVmZmVyLmJ5dGVMZW5ndGgsIHRoaXMudGFyZ2V0QWRkcmVzcy5nZXRQb3J0KCksIHRoaXMudGFyZ2V0QWRkcmVzcy5nZXRBZGRyZXNzKCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTb2NrZXQoKTogU29ja2V0IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29ja2V0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBZGRyZXNzKCk6IEluZXRBZGRyZXNzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkcmVzcztcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcmVtb3ZlQ29ubmVjdGlvbihfY29ubmVjdGlvbjogUmFrTmV0U2Vzc2lvbiwgX3JlYXNvbj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbImNsZWFySW50ZXJ2YWxBc3luY18xIiwicmVxdWlyZSQkMCIsInJlcXVpcmUkJDEiLCJFdmVudEVtaXR0ZXIiLCJDcnlwdG8iLCJMb2dnZXIiLCJEZ3JhbSIsIkluZXRBZGRyZXNzIiwic2V0SW50ZXJ2YWxBc3luYyIsImNsZWFySW50ZXJ2YWxBc3luYyIsIlByb3RvY29sIiwiSlNQUHJvdG9jb2wiLCJDb25uZWN0aW9uUHJpb3JpdHkiLCJNZXNzYWdlSWRlbnRpZmllcnMiLCJSYWtOZXRTZXNzaW9uIiwicmFuZG9tQnl0ZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxNQUFNLENBQUMsY0FBYyxDQUFDLHFCQUFPLEVBQUUsWUFBWSxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDakMscUJBQUEs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
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
/// <reference types="node"
|
|
2
|
-
/// <reference types="node"
|
|
3
|
-
/// <reference types="node"
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node" />
|
|
4
4
|
import { InetAddress, RakNetSession } from '@jsprismarine/raknet';
|
|
5
|
-
import { type Socket } from 'dgram';
|
|
6
|
-
import { EventEmitter } from 'events';
|
|
5
|
+
import { type Socket } from 'node:dgram';
|
|
6
|
+
import { EventEmitter } from 'node:events';
|
|
7
7
|
export default class Client extends EventEmitter {
|
|
8
8
|
private clientGUID;
|
|
9
9
|
private readonly logger;
|
|
@@ -37,4 +37,4 @@ export default class Client extends EventEmitter {
|
|
|
37
37
|
getAddress(): InetAddress;
|
|
38
38
|
removeConnection(_connection: RakNetSession, _reason?: string): Promise<void>;
|
|
39
39
|
}
|
|
40
|
-
//# sourceMappingURL=
|
|
40
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,OAAO,EAAsB,WAAW,EAAY,aAAa,EAAsB,MAAM,sBAAsB,CAAC;AACpH,OAAc,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAIhD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmB3C,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,YAAY;IAC5C,OAAO,CAAC,UAAU,CAA0C;IAC5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAC/D,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,YAAY,CAAS;;IAQ7B;;OAEG;IACU,OAAO,CAAC,OAAO,SAAY,EAAE,IAAI,SAAQ;YA6CxC,MAAM;IAyBb,qBAAqB,CAAC,MAAM,EAAE,MAAM;IAuBpC,0BAA0B,CAAC,MAAM,EAAE,MAAM;IAoCzC,0BAA0B,CAAC,MAAM,EAAE,MAAM;IA2BhD;;;;;;OAMG;IACU,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/C,SAAS,IAAI,MAAM;IAInB,UAAU,IAAI,WAAW;IAInB,gBAAgB,CAAC,WAAW,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG7F"}
|