@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.
@@ -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" resolution-mode="require"/>
2
- /// <reference types="node" resolution-mode="require"/>
3
- /// <reference types="node" resolution-mode="require"/>
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=Client.d.ts.map
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"}