amule-ec-client 0.3.2 → 0.3.4
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/dist/index.d.ts +6 -5
- package/dist/index.js +56 -44
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -401,7 +401,7 @@ declare enum ECTagName {
|
|
|
401
401
|
EC_TAG_STATS_KAD_USERS = 522,
|
|
402
402
|
EC_TAG_STATS_ED2K_FILES = 523,
|
|
403
403
|
EC_TAG_STATS_KAD_FILES = 524,
|
|
404
|
-
|
|
404
|
+
EC_TAG_STATS_LOGGER_MESSAGE = 525,
|
|
405
405
|
EC_TAG_STATS_KAD_FIREWALLED_UDP = 526,
|
|
406
406
|
EC_TAG_STATS_KAD_INDEXED_SOURCES = 527,
|
|
407
407
|
EC_TAG_STATS_KAD_INDEXED_KEYWORDS = 528,
|
|
@@ -411,10 +411,11 @@ declare enum ECTagName {
|
|
|
411
411
|
EC_TAG_STATS_BUDDY_STATUS = 532,
|
|
412
412
|
EC_TAG_STATS_BUDDY_IP = 533,
|
|
413
413
|
EC_TAG_STATS_BUDDY_PORT = 534,
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
414
|
+
EC_TAG_STATS_KAD_IN_LAN_MODE = 535,
|
|
415
|
+
EC_TAG_STATS_TOTAL_SENT_BYTES = 536,
|
|
416
|
+
EC_TAG_STATS_TOTAL_RECEIVED_BYTES = 537,
|
|
417
|
+
EC_TAG_STATS_SHARED_FILE_COUNT = 538,
|
|
418
|
+
EC_TAG_STATS_KAD_NODES = 539,
|
|
418
419
|
EC_TAG_PARTFILE = 768,
|
|
419
420
|
EC_TAG_PARTFILE_NAME = 769,
|
|
420
421
|
EC_TAG_PARTFILE_PARTMETID = 770,
|
package/dist/index.js
CHANGED
|
@@ -274,7 +274,7 @@ var init_Codes = __esm({
|
|
|
274
274
|
ECTagName4[ECTagName4["EC_TAG_STATS_KAD_USERS"] = 522] = "EC_TAG_STATS_KAD_USERS";
|
|
275
275
|
ECTagName4[ECTagName4["EC_TAG_STATS_ED2K_FILES"] = 523] = "EC_TAG_STATS_ED2K_FILES";
|
|
276
276
|
ECTagName4[ECTagName4["EC_TAG_STATS_KAD_FILES"] = 524] = "EC_TAG_STATS_KAD_FILES";
|
|
277
|
-
ECTagName4[ECTagName4["
|
|
277
|
+
ECTagName4[ECTagName4["EC_TAG_STATS_LOGGER_MESSAGE"] = 525] = "EC_TAG_STATS_LOGGER_MESSAGE";
|
|
278
278
|
ECTagName4[ECTagName4["EC_TAG_STATS_KAD_FIREWALLED_UDP"] = 526] = "EC_TAG_STATS_KAD_FIREWALLED_UDP";
|
|
279
279
|
ECTagName4[ECTagName4["EC_TAG_STATS_KAD_INDEXED_SOURCES"] = 527] = "EC_TAG_STATS_KAD_INDEXED_SOURCES";
|
|
280
280
|
ECTagName4[ECTagName4["EC_TAG_STATS_KAD_INDEXED_KEYWORDS"] = 528] = "EC_TAG_STATS_KAD_INDEXED_KEYWORDS";
|
|
@@ -284,10 +284,11 @@ var init_Codes = __esm({
|
|
|
284
284
|
ECTagName4[ECTagName4["EC_TAG_STATS_BUDDY_STATUS"] = 532] = "EC_TAG_STATS_BUDDY_STATUS";
|
|
285
285
|
ECTagName4[ECTagName4["EC_TAG_STATS_BUDDY_IP"] = 533] = "EC_TAG_STATS_BUDDY_IP";
|
|
286
286
|
ECTagName4[ECTagName4["EC_TAG_STATS_BUDDY_PORT"] = 534] = "EC_TAG_STATS_BUDDY_PORT";
|
|
287
|
-
ECTagName4[ECTagName4["
|
|
288
|
-
ECTagName4[ECTagName4["
|
|
289
|
-
ECTagName4[ECTagName4["
|
|
290
|
-
ECTagName4[ECTagName4["
|
|
287
|
+
ECTagName4[ECTagName4["EC_TAG_STATS_KAD_IN_LAN_MODE"] = 535] = "EC_TAG_STATS_KAD_IN_LAN_MODE";
|
|
288
|
+
ECTagName4[ECTagName4["EC_TAG_STATS_TOTAL_SENT_BYTES"] = 536] = "EC_TAG_STATS_TOTAL_SENT_BYTES";
|
|
289
|
+
ECTagName4[ECTagName4["EC_TAG_STATS_TOTAL_RECEIVED_BYTES"] = 537] = "EC_TAG_STATS_TOTAL_RECEIVED_BYTES";
|
|
290
|
+
ECTagName4[ECTagName4["EC_TAG_STATS_SHARED_FILE_COUNT"] = 538] = "EC_TAG_STATS_SHARED_FILE_COUNT";
|
|
291
|
+
ECTagName4[ECTagName4["EC_TAG_STATS_KAD_NODES"] = 539] = "EC_TAG_STATS_KAD_NODES";
|
|
291
292
|
ECTagName4[ECTagName4["EC_TAG_PARTFILE"] = 768] = "EC_TAG_PARTFILE";
|
|
292
293
|
ECTagName4[ECTagName4["EC_TAG_PARTFILE_NAME"] = 769] = "EC_TAG_PARTFILE_NAME";
|
|
293
294
|
ECTagName4[ECTagName4["EC_TAG_PARTFILE_PARTMETID"] = 770] = "EC_TAG_PARTFILE_PARTMETID";
|
|
@@ -939,9 +940,9 @@ var init_StatsResponse = __esm({
|
|
|
939
940
|
const uploadOverhead = findNumericTag(packet.tags, 516 /* EC_TAG_STATS_UP_OVERHEAD */)?.getValue() || 0;
|
|
940
941
|
const downloadOverhead = findNumericTag(packet.tags, 517 /* EC_TAG_STATS_DOWN_OVERHEAD */)?.getValue() || 0;
|
|
941
942
|
const bannedCount = findNumericTag(packet.tags, 519 /* EC_TAG_STATS_BANNED_COUNT */)?.getValue() || 0;
|
|
942
|
-
const totalSentBytes = findNumericTag(packet.tags,
|
|
943
|
-
const totalReceivedBytes = findNumericTag(packet.tags,
|
|
944
|
-
const sharedFileCount = findNumericTag(packet.tags,
|
|
943
|
+
const totalSentBytes = findNumericTag(packet.tags, 536 /* EC_TAG_STATS_TOTAL_SENT_BYTES */)?.getValue() || 0;
|
|
944
|
+
const totalReceivedBytes = findNumericTag(packet.tags, 537 /* EC_TAG_STATS_TOTAL_RECEIVED_BYTES */)?.getValue() || 0;
|
|
945
|
+
const sharedFileCount = findNumericTag(packet.tags, 538 /* EC_TAG_STATS_SHARED_FILE_COUNT */)?.getValue() || 0;
|
|
945
946
|
const uploadSpeed = findNumericTag(packet.tags, 512 /* EC_TAG_STATS_UL_SPEED */)?.getValue() || 0;
|
|
946
947
|
const downloadSpeed = findNumericTag(packet.tags, 513 /* EC_TAG_STATS_DL_SPEED */)?.getValue() || 0;
|
|
947
948
|
const uploadSpeedLimit = findNumericTag(packet.tags, 514 /* EC_TAG_STATS_UL_SPEED_LIMIT */)?.getValue() || 0;
|
|
@@ -952,7 +953,7 @@ var init_StatsResponse = __esm({
|
|
|
952
953
|
const kadUsers = findNumericTag(packet.tags, 522 /* EC_TAG_STATS_KAD_USERS */)?.getValue() || 0;
|
|
953
954
|
const ed2kFiles = findNumericTag(packet.tags, 523 /* EC_TAG_STATS_ED2K_FILES */)?.getValue() || 0;
|
|
954
955
|
const kadFiles = findNumericTag(packet.tags, 524 /* EC_TAG_STATS_KAD_FILES */)?.getValue() || 0;
|
|
955
|
-
const kadNodes = findNumericTag(packet.tags,
|
|
956
|
+
const kadNodes = findNumericTag(packet.tags, 539 /* EC_TAG_STATS_KAD_NODES */)?.getValue() || 0;
|
|
956
957
|
const connStateTag = findTag(packet.tags, 5 /* EC_TAG_CONNSTATE */);
|
|
957
958
|
let ed2kId = 0;
|
|
958
959
|
let clientId = 0;
|
|
@@ -2481,7 +2482,8 @@ var AmuleConnection = class {
|
|
|
2481
2482
|
socket;
|
|
2482
2483
|
connected = false;
|
|
2483
2484
|
buffer = Buffer.allocUnsafe(0);
|
|
2484
|
-
|
|
2485
|
+
pendingResponses = [];
|
|
2486
|
+
connectionPromise;
|
|
2485
2487
|
// Debug logging flag (disabled by default)
|
|
2486
2488
|
debug = false;
|
|
2487
2489
|
/**
|
|
@@ -2503,21 +2505,31 @@ var AmuleConnection = class {
|
|
|
2503
2505
|
* Reconnect to the server
|
|
2504
2506
|
*/
|
|
2505
2507
|
async reconnect() {
|
|
2506
|
-
this.
|
|
2507
|
-
|
|
2508
|
-
this.socket.destroy();
|
|
2509
|
-
}
|
|
2510
|
-
this.socket = new net.Socket();
|
|
2511
|
-
if (this.timeout > 0) {
|
|
2512
|
-
this.socket.setTimeout(this.timeout);
|
|
2508
|
+
if (this.connectionPromise) {
|
|
2509
|
+
return this.connectionPromise;
|
|
2513
2510
|
}
|
|
2514
|
-
this.
|
|
2515
|
-
|
|
2516
|
-
|
|
2517
|
-
|
|
2518
|
-
|
|
2519
|
-
|
|
2520
|
-
|
|
2511
|
+
this.connectionPromise = (async () => {
|
|
2512
|
+
this.connected = false;
|
|
2513
|
+
if (this.socket) {
|
|
2514
|
+
this.socket.destroy();
|
|
2515
|
+
}
|
|
2516
|
+
this.socket = new net.Socket();
|
|
2517
|
+
if (this.timeout > 0) {
|
|
2518
|
+
this.socket.setTimeout(this.timeout);
|
|
2519
|
+
}
|
|
2520
|
+
this.socket.on("data", (data) => this.handleData(Buffer.isBuffer(data) ? data : Buffer.from(data)));
|
|
2521
|
+
this.socket.on("error", (error) => this.handleError(error));
|
|
2522
|
+
this.socket.on("timeout", () => this.handleTimeout());
|
|
2523
|
+
this.socket.on("close", () => this.handleClose());
|
|
2524
|
+
try {
|
|
2525
|
+
await this.connectSocket();
|
|
2526
|
+
await this.authenticate();
|
|
2527
|
+
this.connected = true;
|
|
2528
|
+
} finally {
|
|
2529
|
+
this.connectionPromise = void 0;
|
|
2530
|
+
}
|
|
2531
|
+
})();
|
|
2532
|
+
return this.connectionPromise;
|
|
2521
2533
|
}
|
|
2522
2534
|
/**
|
|
2523
2535
|
* Connect socket to server
|
|
@@ -2570,25 +2582,25 @@ var AmuleConnection = class {
|
|
|
2570
2582
|
handleData(data) {
|
|
2571
2583
|
this.log("Received data:", data.length, "bytes, hex:", data.toString("hex").substring(0, 100));
|
|
2572
2584
|
this.buffer = Buffer.concat([this.buffer, data]);
|
|
2573
|
-
|
|
2585
|
+
while (PacketParser.hasCompletePacket(this.buffer)) {
|
|
2574
2586
|
try {
|
|
2575
2587
|
const packet = PacketParser.parse(this.buffer);
|
|
2576
2588
|
this.log("Parsed packet, opCode:", packet.opCode);
|
|
2577
2589
|
const consumedBytes = PacketParser.getExpectedPacketSize(this.buffer);
|
|
2578
2590
|
this.buffer = this.buffer.subarray(consumedBytes);
|
|
2579
|
-
|
|
2580
|
-
|
|
2581
|
-
|
|
2591
|
+
const pending = this.pendingResponses.shift();
|
|
2592
|
+
if (pending) {
|
|
2593
|
+
pending.resolve(packet);
|
|
2582
2594
|
}
|
|
2583
2595
|
} catch (error) {
|
|
2584
2596
|
this.log("Parse error:", error);
|
|
2585
|
-
|
|
2586
|
-
|
|
2587
|
-
|
|
2597
|
+
const pending = this.pendingResponses.shift();
|
|
2598
|
+
if (pending) {
|
|
2599
|
+
pending.reject(error);
|
|
2588
2600
|
}
|
|
2601
|
+
this.buffer = Buffer.allocUnsafe(0);
|
|
2602
|
+
break;
|
|
2589
2603
|
}
|
|
2590
|
-
} else {
|
|
2591
|
-
this.log("Incomplete packet, waiting for more data...");
|
|
2592
2604
|
}
|
|
2593
2605
|
}
|
|
2594
2606
|
/**
|
|
@@ -2596,9 +2608,9 @@ var AmuleConnection = class {
|
|
|
2596
2608
|
*/
|
|
2597
2609
|
handleError(error) {
|
|
2598
2610
|
this.connected = false;
|
|
2599
|
-
|
|
2600
|
-
this.
|
|
2601
|
-
|
|
2611
|
+
while (this.pendingResponses.length > 0) {
|
|
2612
|
+
const pending = this.pendingResponses.shift();
|
|
2613
|
+
pending?.reject(new CommunicationException(`Socket error: ${error.message}`));
|
|
2602
2614
|
}
|
|
2603
2615
|
}
|
|
2604
2616
|
/**
|
|
@@ -2606,20 +2618,20 @@ var AmuleConnection = class {
|
|
|
2606
2618
|
*/
|
|
2607
2619
|
handleTimeout() {
|
|
2608
2620
|
this.connected = false;
|
|
2609
|
-
|
|
2610
|
-
this.
|
|
2611
|
-
|
|
2621
|
+
while (this.pendingResponses.length > 0) {
|
|
2622
|
+
const pending = this.pendingResponses.shift();
|
|
2623
|
+
pending?.reject(new CommunicationException("Socket timeout"));
|
|
2612
2624
|
}
|
|
2613
2625
|
}
|
|
2614
2626
|
/**
|
|
2615
2627
|
* Handle socket close
|
|
2616
2628
|
*/
|
|
2617
2629
|
handleClose() {
|
|
2618
|
-
this.log("Socket closed! connected:", this.connected, "
|
|
2630
|
+
this.log("Socket closed! connected:", this.connected, "pendingResponses:", this.pendingResponses.length);
|
|
2619
2631
|
this.connected = false;
|
|
2620
|
-
|
|
2621
|
-
this.
|
|
2622
|
-
|
|
2632
|
+
while (this.pendingResponses.length > 0) {
|
|
2633
|
+
const pending = this.pendingResponses.shift();
|
|
2634
|
+
pending?.reject(new CommunicationException("Socket closed"));
|
|
2623
2635
|
}
|
|
2624
2636
|
}
|
|
2625
2637
|
/**
|
|
@@ -2647,7 +2659,7 @@ var AmuleConnection = class {
|
|
|
2647
2659
|
const buffer = PacketWriter.write(packet);
|
|
2648
2660
|
this.log("Sending request:", packet.opCode.toString(16), "Size:", buffer.length);
|
|
2649
2661
|
const responsePromise = new Promise((resolve, reject) => {
|
|
2650
|
-
this.
|
|
2662
|
+
this.pendingResponses.push({ resolve, reject });
|
|
2651
2663
|
});
|
|
2652
2664
|
this.socket.write(buffer);
|
|
2653
2665
|
return responsePromise;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ec/packet/Flags.ts","../src/ec/packet/Packet.ts","../src/ec/Codes.ts","../src/ec/tag/Tag.ts","../src/request/Request.ts","../src/request/StatsRequest.ts","../src/response/StatsResponse.ts","../src/model/index.ts","../src/request/SearchRequest.ts","../src/request/SearchStatusRequest.ts","../src/response/SearchProgressResponse.ts","../src/request/SearchResultsRequest.ts","../src/response/SearchResultsResponse.ts","../src/request/SearchStopRequest.ts","../src/request/DownloadFileRequest.ts","../src/request/AddLinkRequest.ts","../src/request/DownloadQueueRequest.ts","../src/response/DownloadQueueResponse.ts","../src/request/SharedFilesRequest.ts","../src/response/SharedFilesResponse.ts","../src/request/ServerListRequest.ts","../src/response/ServerListResponse.ts","../src/request/ServerConnectRequest.ts","../src/request/ServerDisconnectRequest.ts","../src/request/CreateCategoryRequest.ts","../src/request/UpdateCategoryRequest.ts","../src/request/DeleteCategoryRequest.ts","../src/request/GetPreferencesRequest.ts","../src/response/PreferencesResponse.ts","../src/request/SetFileCategoryRequest.ts","../src/request/DownloadCommandRequest.ts","../src/client/AmuleConnection.ts","../src/exceptions/index.ts","../src/ec/packet/PacketParser.ts","../src/ec/tag/TagParser.ts","../src/ec/Encoding.ts","../src/ec/packet/PacketWriter.ts","../src/ec/tag/TagEncoder.ts","../src/request/AuthRequest.ts","../src/response/AuthSaltResponse.ts","../src/auth/PasswordHasher.ts","../src/client/AmuleClient.ts","../src/index.ts"],"sourcesContent":["/**\n * Packet flags for EC protocol\n */\n\nexport class Flags {\n\tprivate static readonly FLAG_ACCEPTS = 0x10;\n\tprivate static readonly FLAG_ZLIB = 0x01;\n\tprivate static readonly FLAG_UTF8_NUMBERS = 0x02;\n\tprivate static readonly FLAG_ALWAYS_SET = 0x20; // Bit 5 always set to distinguish from older clients\n\n\tprivate readonly flags: number;\n\n\tconstructor(flags?: number) {\n\t\tthis.flags = flags ?? 0;\n\t}\n\n\t/**\n\t * Create flags from buffer\n\t */\n\tstatic fromBuffer(buffer: Buffer, offset: number = 0): Flags {\n\t\tconst flags = buffer.readUInt32BE(offset);\n\t\treturn new Flags(flags);\n\t}\n\n\t/**\n\t * Write flags to buffer\n\t */\n\twriteToBuffer(buffer: Buffer, offset: number = 0): void {\n\t\tbuffer.writeUInt32BE(this.flags, offset);\n\t}\n\n\t/**\n\t * Check if UTF-8 number encoding is supported/accepted\n\t */\n\tisUtf8NumbersAccepted(): boolean {\n\t\treturn (this.flags & Flags.FLAG_ACCEPTS) > 0 && (this.flags & Flags.FLAG_UTF8_NUMBERS) > 0;\n\t}\n\n\t/**\n\t * Check if ZLIB compression is supported/accepted\n\t */\n\tisZlibAccepted(): boolean {\n\t\treturn (this.flags & Flags.FLAG_ACCEPTS) > 0 && (this.flags & Flags.FLAG_ZLIB) > 0;\n\t}\n\n\t/**\n\t * Check if UTF-8 number encoding is used\n\t */\n\tisUtf8Numbers(): boolean {\n\t\treturn (this.flags & Flags.FLAG_UTF8_NUMBERS) > 0;\n\t}\n\n\t/**\n\t * Check if ZLIB compression is used\n\t */\n\tisZlib(): boolean {\n\t\treturn (this.flags & Flags.FLAG_ZLIB) > 0;\n\t}\n\n\t/**\n\t * Create flags accepting UTF-8 numbers and ZLIB\n\t */\n\tstatic accept(): Flags {\n\t\treturn new Flags(Flags.FLAG_ACCEPTS | Flags.FLAG_UTF8_NUMBERS | Flags.FLAG_ZLIB | Flags.FLAG_ALWAYS_SET);\n\t}\n\n\t/**\n\t * Create flags using UTF-8 numbers\n\t */\n\tstatic useUtf8Numbers(): Flags {\n\t\treturn new Flags(Flags.FLAG_UTF8_NUMBERS | Flags.FLAG_ALWAYS_SET);\n\t}\n\n\t/**\n\t * Create flags without UTF-8 numbers (required for search)\n\t */\n\tstatic noUtf8(): Flags {\n\t\treturn new Flags(Flags.FLAG_ALWAYS_SET);\n\t}\n\n\t/**\n\t * Create flags using ZLIB compression\n\t */\n\tstatic useZlib(): Flags {\n\t\treturn new Flags(Flags.FLAG_ZLIB | Flags.FLAG_ALWAYS_SET);\n\t}\n\n\t/**\n\t * Get numeric value of flags\n\t */\n\tgetValue(): number {\n\t\treturn this.flags;\n\t}\n}\n","/**\n * EC Packet structure\n */\n\nimport { ECOpCode } from '../Codes';\nimport { Flags } from './Flags';\nimport type { Tag } from '../tag/Tag';\n\nexport class Packet {\n\tprivate static readonly EC_CURRENT_PROTOCOL_VERSION = 0x0204;\n\n\tconstructor(\n\t\tpublic readonly opCode: ECOpCode,\n\t\tpublic readonly flags: Flags = new Flags(),\n\t\tpublic readonly tags: Tag<any>[] = []\n\t) {}\n\n\t/**\n\t * Add a tag to the packet\n\t */\n\taddTag(tag: Tag<any>): this {\n\t\tthis.tags.push(tag);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Add multiple tags to the packet\n\t */\n\taddTags(tags: Tag<any>[]): this {\n\t\tthis.tags.push(...tags);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get protocol version\n\t */\n\tstatic getProtocolVersion(): number {\n\t\treturn Packet.EC_CURRENT_PROTOCOL_VERSION;\n\t}\n\n\t/**\n\t * Find a tag by name\n\t */\n\tfindTag(tagName: number): Tag<any> | undefined {\n\t\treturn this.tags.find((tag) => tag.name === tagName);\n\t}\n\n\t/**\n\t * Get all tags with a specific name\n\t */\n\tfindAllTags(tagName: number): Tag<any>[] {\n\t\treturn this.tags.filter((tag) => tag.name === tagName);\n\t}\n\n\t/**\n\t * Check if packet has a specific tag\n\t */\n\thasTag(tagName: number): boolean {\n\t\treturn this.findTag(tagName) !== undefined;\n\t}\n}\n","// EC Protocol constants and enumerations\n\nexport enum ProtocolVersion {\n\tEC_CURRENT_PROTOCOL_VERSION = 0x0204,\n}\n\nexport enum ECFlag {\n\tEC_FLAG_ZLIB = 0x00000001,\n\tEC_FLAG_UTF8_NUMBERS = 0x00000002,\n\tEC_FLAG_HAS_ID = 0x00000004,\n\tEC_FLAG_ACCEPTS = 0x00000010,\n\tEC_FLAG_UNKNOWN_MASK = 0xff7f7f08,\n}\n\nexport enum ECOpCode {\n\tEC_OP_NOOP = 0x01,\n\tEC_OP_AUTH_REQ = 0x02,\n\tEC_OP_AUTH_FAIL = 0x03,\n\tEC_OP_AUTH_OK = 0x04,\n\tEC_OP_FAILED = 0x05,\n\tEC_OP_STRINGS = 0x06,\n\tEC_OP_MISC_DATA = 0x07,\n\tEC_OP_SHUTDOWN = 0x08,\n\tEC_OP_ADD_LINK = 0x09,\n\tEC_OP_STAT_REQ = 0x0a,\n\tEC_OP_GET_CONNSTATE = 0x0b,\n\tEC_OP_STATS = 0x0c,\n\tEC_OP_GET_DLOAD_QUEUE = 0x0d,\n\tEC_OP_GET_ULOAD_QUEUE = 0x0e,\n\tEC_OP_GET_SHARED_FILES = 0x10,\n\tEC_OP_SHARED_SET_PRIO = 0x11,\n\tEC_OP_PARTFILE_SWAP_A4AF_THIS = 0x16,\n\tEC_OP_PARTFILE_SWAP_A4AF_THIS_AUTO = 0x17,\n\tEC_OP_PARTFILE_SWAP_A4AF_OTHERS = 0x18,\n\tEC_OP_PARTFILE_PAUSE = 0x19,\n\tEC_OP_PARTFILE_RESUME = 0x1a,\n\tEC_OP_PARTFILE_STOP = 0x1b,\n\tEC_OP_PARTFILE_PRIO_SET = 0x1c,\n\tEC_OP_PARTFILE_DELETE = 0x1d,\n\tEC_OP_PARTFILE_SET_CAT = 0x1e,\n\tEC_OP_DLOAD_QUEUE = 0x1f,\n\tEC_OP_ULOAD_QUEUE = 0x20,\n\tEC_OP_SHARED_FILES = 0x22,\n\tEC_OP_SHAREDFILES_RELOAD = 0x23,\n\tEC_OP_RENAME_FILE = 0x25,\n\tEC_OP_SEARCH_START = 0x26,\n\tEC_OP_SEARCH_STOP = 0x27,\n\tEC_OP_SEARCH_RESULTS = 0x28,\n\tEC_OP_SEARCH_PROGRESS = 0x29,\n\tEC_OP_DOWNLOAD_SEARCH_RESULT = 0x2a,\n\tEC_OP_IPFILTER_RELOAD = 0x2b,\n\tEC_OP_GET_SERVER_LIST = 0x2c,\n\tEC_OP_SERVER_LIST = 0x2d,\n\tEC_OP_SERVER_DISCONNECT = 0x2e,\n\tEC_OP_SERVER_CONNECT = 0x2f,\n\tEC_OP_SERVER_REMOVE = 0x30,\n\tEC_OP_SERVER_ADD = 0x31,\n\tEC_OP_SERVER_UPDATE_FROM_URL = 0x32,\n\tEC_OP_ADDLOGLINE = 0x33,\n\tEC_OP_ADDDEBUGLOGLINE = 0x34,\n\tEC_OP_GET_LOG = 0x35,\n\tEC_OP_GET_DEBUGLOG = 0x36,\n\tEC_OP_GET_SERVERINFO = 0x37,\n\tEC_OP_LOG = 0x38,\n\tEC_OP_DEBUGLOG = 0x39,\n\tEC_OP_SERVERINFO = 0x3a,\n\tEC_OP_RESET_LOG = 0x3b,\n\tEC_OP_RESET_DEBUGLOG = 0x3c,\n\tEC_OP_CLEAR_SERVERINFO = 0x3d,\n\tEC_OP_GET_LAST_LOG_ENTRY = 0x3e,\n\tEC_OP_GET_PREFERENCES = 0x3f,\n\tEC_OP_SET_PREFERENCES = 0x40,\n\tEC_OP_CREATE_CATEGORY = 0x41,\n\tEC_OP_UPDATE_CATEGORY = 0x42,\n\tEC_OP_DELETE_CATEGORY = 0x43,\n\tEC_OP_GET_STATSGRAPHS = 0x44,\n\tEC_OP_STATSGRAPHS = 0x45,\n\tEC_OP_GET_STATSTREE = 0x46,\n\tEC_OP_STATSTREE = 0x47,\n\tEC_OP_KAD_START = 0x48,\n\tEC_OP_KAD_STOP = 0x49,\n\tEC_OP_CONNECT = 0x4a,\n\tEC_OP_DISCONNECT = 0x4b,\n\tEC_OP_KAD_UPDATE_FROM_URL = 0x4d,\n\tEC_OP_KAD_BOOTSTRAP_FROM_IP = 0x4e,\n\tEC_OP_AUTH_SALT = 0x4f,\n\tEC_OP_AUTH_PASSWD = 0x50,\n\tEC_OP_IPFILTER_UPDATE = 0x51,\n\tEC_OP_GET_UPDATE = 0x52,\n\tEC_OP_CLEAR_COMPLETED = 0x53,\n\tEC_OP_CLIENT_SWAP_TO_ANOTHER_FILE = 0x54,\n\tEC_OP_SHARED_FILE_SET_COMMENT = 0x55,\n\tEC_OP_SERVER_SET_STATIC_PRIO = 0x56,\n\tEC_OP_FRIEND = 0x57,\n}\n\nexport enum ECTagName {\n\tEC_TAG_STRING = 0x0000,\n\tEC_TAG_PASSWD_HASH = 0x0001,\n\tEC_TAG_PROTOCOL_VERSION = 0x0002,\n\tEC_TAG_VERSION_ID = 0x0003,\n\tEC_TAG_DETAIL_LEVEL = 0x0004,\n\tEC_TAG_CONNSTATE = 0x0005,\n\tEC_TAG_ED2K_ID = 0x0006,\n\tEC_TAG_LOG_TO_STATUS = 0x0007,\n\tEC_TAG_BOOTSTRAP_IP = 0x0008,\n\tEC_TAG_BOOTSTRAP_PORT = 0x0009,\n\tEC_TAG_CLIENT_ID = 0x000a,\n\tEC_TAG_PASSWD_SALT = 0x000b,\n\tEC_TAG_CAN_ZLIB = 0x000c,\n\tEC_TAG_CAN_UTF8_NUMBERS = 0x000d,\n\tEC_TAG_CAN_NOTIFY = 0x000e,\n\tEC_TAG_ECID = 0x000f,\n\tEC_TAG_KAD_ID = 0x0010,\n\tEC_TAG_CLIENT_NAME = 0x0100,\n\tEC_TAG_CLIENT_VERSION = 0x0101,\n\tEC_TAG_CLIENT_MOD = 0x0102,\n\tEC_TAG_STATS_UL_SPEED = 0x0200,\n\tEC_TAG_STATS_DL_SPEED = 0x0201,\n\tEC_TAG_STATS_UL_SPEED_LIMIT = 0x0202,\n\tEC_TAG_STATS_DL_SPEED_LIMIT = 0x0203,\n\tEC_TAG_STATS_UP_OVERHEAD = 0x0204,\n\tEC_TAG_STATS_DOWN_OVERHEAD = 0x0205,\n\tEC_TAG_STATS_TOTAL_SRC_COUNT = 0x0206,\n\tEC_TAG_STATS_BANNED_COUNT = 0x0207,\n\tEC_TAG_STATS_UL_QUEUE_LEN = 0x0208,\n\tEC_TAG_STATS_ED2K_USERS = 0x0209,\n\tEC_TAG_STATS_KAD_USERS = 0x020a,\n\tEC_TAG_STATS_ED2K_FILES = 0x020b,\n\tEC_TAG_STATS_KAD_FILES = 0x020c,\n\tEC_TAG_STATS_KAD_NODES = 0x020d,\n\tEC_TAG_STATS_KAD_FIREWALLED_UDP = 0x020e,\n\tEC_TAG_STATS_KAD_INDEXED_SOURCES = 0x020f,\n\tEC_TAG_STATS_KAD_INDEXED_KEYWORDS = 0x0210,\n\tEC_TAG_STATS_KAD_INDEXED_NOTES = 0x0211,\n\tEC_TAG_STATS_KAD_INDEXED_LOAD = 0x0212,\n\tEC_TAG_STATS_KAD_IP_ADRESS = 0x0213,\n\tEC_TAG_STATS_BUDDY_STATUS = 0x0214,\n\tEC_TAG_STATS_BUDDY_IP = 0x0215,\n\tEC_TAG_STATS_BUDDY_PORT = 0x0216,\n\tEC_TAG_STATS_TOTAL_SENT_BYTES = 0x0217,\n\tEC_TAG_STATS_TOTAL_RECEIVED_BYTES = 0x0218,\n\tEC_TAG_STATS_SHARED_FILE_COUNT = 0x0219,\n\tEC_TAG_STATS_LOGGER_MESSAGE = 0x021a,\n\tEC_TAG_PARTFILE = 0x0300,\n\tEC_TAG_PARTFILE_NAME = 0x0301,\n\tEC_TAG_PARTFILE_PARTMETID = 0x0302,\n\tEC_TAG_PARTFILE_SIZE_FULL = 0x0303,\n\tEC_TAG_PARTFILE_SIZE_XFER = 0x0304,\n\tEC_TAG_PARTFILE_SIZE_XFER_UP = 0x0305,\n\tEC_TAG_PARTFILE_SIZE_DONE = 0x0306,\n\tEC_TAG_PARTFILE_SPEED = 0x0307,\n\tEC_TAG_PARTFILE_STATUS = 0x0308,\n\tEC_TAG_PARTFILE_PRIO = 0x0309,\n\tEC_TAG_PARTFILE_SOURCE_COUNT = 0x030a,\n\tEC_TAG_PARTFILE_SOURCE_COUNT_A4AF = 0x030b,\n\tEC_TAG_PARTFILE_SOURCE_COUNT_NOT_CURRENT = 0x030c,\n\tEC_TAG_PARTFILE_SOURCE_COUNT_XFER = 0x030d,\n\tEC_TAG_PARTFILE_ED2K_LINK = 0x030e,\n\tEC_TAG_PARTFILE_CAT = 0x030f,\n\tEC_TAG_PARTFILE_LAST_RECV = 0x0310,\n\tEC_TAG_PARTFILE_LAST_SEEN_COMP = 0x0311,\n\tEC_TAG_PARTFILE_PART_STATUS = 0x0312,\n\tEC_TAG_PARTFILE_GAP_STATUS = 0x0313,\n\tEC_TAG_PARTFILE_REQ_STATUS = 0x0314,\n\tEC_TAG_PARTFILE_SOURCE_NAMES = 0x0315,\n\tEC_TAG_PARTFILE_COMMENTS = 0x0316,\n\tEC_TAG_PARTFILE_STOPPED = 0x0317,\n\tEC_TAG_PARTFILE_DOWNLOAD_ACTIVE = 0x0318,\n\tEC_TAG_PARTFILE_LOST_CORRUPTION = 0x0319,\n\tEC_TAG_PARTFILE_GAINED_COMPRESSION = 0x031a,\n\tEC_TAG_PARTFILE_SAVED_ICH = 0x031b,\n\tEC_TAG_PARTFILE_SOURCE_NAMES_COUNTS = 0x031c,\n\tEC_TAG_PARTFILE_AVAILABLE_PARTS = 0x031d,\n\tEC_TAG_PARTFILE_HASH = 0x031e,\n\tEC_TAG_PARTFILE_SHARED = 0x031f,\n\tEC_TAG_PARTFILE_HASHED_PART_COUNT = 0x0320,\n\tEC_TAG_PARTFILE_A4AFAUTO = 0x0321,\n\tEC_TAG_PARTFILE_A4AF_SOURCES = 0x0322,\n\tEC_TAG_KNOWNFILE = 0x0400,\n\tEC_TAG_KNOWNFILE_XFERRED = 0x0401,\n\tEC_TAG_KNOWNFILE_XFERRED_ALL = 0x0402,\n\tEC_TAG_KNOWNFILE_REQ_COUNT = 0x0403,\n\tEC_TAG_KNOWNFILE_REQ_COUNT_ALL = 0x0404,\n\tEC_TAG_KNOWNFILE_ACCEPT_COUNT = 0x0405,\n\tEC_TAG_KNOWNFILE_ACCEPT_COUNT_ALL = 0x0406,\n\tEC_TAG_KNOWNFILE_AICH_MASTERHASH = 0x0407,\n\tEC_TAG_KNOWNFILE_FILENAME = 0x0408,\n\tEC_TAG_KNOWNFILE_COMPLETE_SOURCES_LOW = 0x0409,\n\tEC_TAG_KNOWNFILE_COMPLETE_SOURCES_HIGH = 0x040a,\n\tEC_TAG_KNOWNFILE_PRIO = 0x040b,\n\tEC_TAG_KNOWNFILE_ON_QUEUE = 0x040c,\n\tEC_TAG_KNOWNFILE_COMPLETE_SOURCES = 0x040d,\n\tEC_TAG_KNOWNFILE_COMMENT = 0x040e,\n\tEC_TAG_KNOWNFILE_RATING = 0x040f,\n\tEC_TAG_SERVER = 0x0500,\n\tEC_TAG_SERVER_NAME = 0x0501,\n\tEC_TAG_SERVER_DESC = 0x0502,\n\tEC_TAG_SERVER_ADDRESS = 0x0503,\n\tEC_TAG_SERVER_PING = 0x0504,\n\tEC_TAG_SERVER_USERS = 0x0505,\n\tEC_TAG_SERVER_USERS_MAX = 0x0506,\n\tEC_TAG_SERVER_FILES = 0x0507,\n\tEC_TAG_SERVER_PRIO = 0x0508,\n\tEC_TAG_SERVER_FAILED = 0x0509,\n\tEC_TAG_SERVER_STATIC = 0x050a,\n\tEC_TAG_SERVER_VERSION = 0x050b,\n\tEC_TAG_SERVER_IP = 0x050c,\n\tEC_TAG_SERVER_PORT = 0x050d,\n\tEC_TAG_CLIENT = 0x0600,\n\tEC_TAG_CLIENT_SOFTWARE = 0x0601,\n\tEC_TAG_CLIENT_SCORE = 0x0602,\n\tEC_TAG_CLIENT_HASH = 0x0603,\n\tEC_TAG_CLIENT_FRIEND_SLOT = 0x0604,\n\tEC_TAG_CLIENT_WAIT_TIME = 0x0605,\n\tEC_TAG_CLIENT_XFER_TIME = 0x0606,\n\tEC_TAG_CLIENT_QUEUE_TIME = 0x0607,\n\tEC_TAG_CLIENT_LAST_TIME = 0x0608,\n\tEC_TAG_CLIENT_UPLOAD_SESSION = 0x0609,\n\tEC_TAG_CLIENT_UPLOAD_TOTAL = 0x060a,\n\tEC_TAG_CLIENT_DOWNLOAD_TOTAL = 0x060b,\n\tEC_TAG_CLIENT_DOWNLOAD_STATE = 0x060c,\n\tEC_TAG_CLIENT_UP_SPEED = 0x060d,\n\tEC_TAG_CLIENT_DOWN_SPEED = 0x060e,\n\tEC_TAG_CLIENT_FROM = 0x060f,\n\tEC_TAG_CLIENT_USER_IP = 0x0610,\n\tEC_TAG_CLIENT_USER_PORT = 0x0611,\n\tEC_TAG_CLIENT_SERVER_IP = 0x0612,\n\tEC_TAG_CLIENT_SERVER_PORT = 0x0613,\n\tEC_TAG_CLIENT_SERVER_NAME = 0x0614,\n\tEC_TAG_CLIENT_SOFT_VER_STR = 0x0615,\n\tEC_TAG_CLIENT_WAITING_POSITION = 0x0616,\n\tEC_TAG_CLIENT_IDENT_STATE = 0x0617,\n\tEC_TAG_CLIENT_OBFUSCATION_STATUS = 0x0618,\n\tEC_TAG_CLIENT_CURRENTLYUNUSED1 = 0x0619,\n\tEC_TAG_CLIENT_REMOTE_QUEUE_RANK = 0x061a,\n\tEC_TAG_CLIENT_DISABLE_VIEW_SHARED = 0x061b,\n\tEC_TAG_CLIENT_UPLOAD_STATE = 0x061c,\n\tEC_TAG_CLIENT_EXT_PROTOCOL = 0x061d,\n\tEC_TAG_CLIENT_USER_ID = 0x061e,\n\tEC_TAG_CLIENT_UPLOAD_FILE = 0x061f,\n\tEC_TAG_CLIENT_REQUEST_FILE = 0x0620,\n\tEC_TAG_CLIENT_A4AF_FILES = 0x0621,\n\tEC_TAG_CLIENT_OLD_REMOTE_QUEUE_RANK = 0x0622,\n\tEC_TAG_CLIENT_KAD_PORT = 0x0623,\n\tEC_TAG_CLIENT_PART_STATUS = 0x0624,\n\tEC_TAG_CLIENT_NEXT_REQUESTED_PART = 0x0625,\n\tEC_TAG_CLIENT_LAST_DOWNLOADING_PART = 0x0626,\n\tEC_TAG_CLIENT_REMOTE_FILENAME = 0x0627,\n\tEC_TAG_CLIENT_MOD_VERSION = 0x0628,\n\tEC_TAG_CLIENT_OS_INFO = 0x0629,\n\tEC_TAG_CLIENT_AVAILABLE_PARTS = 0x062a,\n\tEC_TAG_CLIENT_UPLOAD_PART_STATUS = 0x062b,\n\tEC_TAG_SEARCHFILE = 0x0700,\n\tEC_TAG_SEARCH_TYPE = 0x0701,\n\tEC_TAG_SEARCH_NAME = 0x0702,\n\tEC_TAG_SEARCH_MIN_SIZE = 0x0703,\n\tEC_TAG_SEARCH_MAX_SIZE = 0x0704,\n\tEC_TAG_SEARCH_FILE_TYPE = 0x0705,\n\tEC_TAG_SEARCH_EXTENSION = 0x0706,\n\tEC_TAG_SEARCH_AVAILABILITY = 0x0707,\n\tEC_TAG_SEARCH_STATUS = 0x0708,\n\tEC_TAG_SEARCH_PARENT = 0x0709,\n\tEC_TAG_FRIEND = 0x0800,\n\tEC_TAG_FRIEND_NAME = 0x0801,\n\tEC_TAG_FRIEND_HASH = 0x0802,\n\tEC_TAG_FRIEND_IP = 0x0803,\n\tEC_TAG_FRIEND_PORT = 0x0804,\n\tEC_TAG_FRIEND_CLIENT = 0x0805,\n\tEC_TAG_FRIEND_ADD = 0x0806,\n\tEC_TAG_FRIEND_REMOVE = 0x0807,\n\tEC_TAG_FRIEND_FRIENDSLOT = 0x0808,\n\tEC_TAG_FRIEND_SHARED = 0x0809,\n\tEC_TAG_SELECT_PREFS = 0x1000,\n\tEC_TAG_PREFS_CATEGORIES = 0x1100,\n\tEC_TAG_CATEGORY = 0x1101,\n\tEC_TAG_CATEGORY_TITLE = 0x1102,\n\tEC_TAG_CATEGORY_PATH = 0x1103,\n\tEC_TAG_CATEGORY_COMMENT = 0x1104,\n\tEC_TAG_CATEGORY_COLOR = 0x1105,\n\tEC_TAG_CATEGORY_PRIO = 0x1106,\n\tEC_TAG_PREFS_GENERAL = 0x1200,\n\tEC_TAG_USER_NICK = 0x1201,\n\tEC_TAG_USER_HASH = 0x1202,\n\tEC_TAG_USER_HOST = 0x1203,\n\tEC_TAG_GENERAL_CHECK_NEW_VERSION = 0x1204,\n\tEC_TAG_PREFS_CONNECTIONS = 0x1300,\n\tEC_TAG_CONN_DL_CAP = 0x1301,\n\tEC_TAG_CONN_UL_CAP = 0x1302,\n\tEC_TAG_CONN_MAX_DL = 0x1303,\n\tEC_TAG_CONN_MAX_UL = 0x1304,\n\tEC_TAG_CONN_SLOT_ALLOCATION = 0x1305,\n\tEC_TAG_CONN_TCP_PORT = 0x1306,\n\tEC_TAG_CONN_UDP_PORT = 0x1307,\n\tEC_TAG_CONN_UDP_DISABLE = 0x1308,\n\tEC_TAG_CONN_MAX_FILE_SOURCES = 0x1309,\n\tEC_TAG_CONN_MAX_CONN = 0x130a,\n\tEC_TAG_CONN_AUTOCONNECT = 0x130b,\n\tEC_TAG_CONN_RECONNECT = 0x130c,\n\tEC_TAG_NETWORK_ED2K = 0x130d,\n\tEC_TAG_NETWORK_KADEMLIA = 0x130e,\n\tEC_TAG_PREFS_MESSAGEFILTER = 0x1400,\n\tEC_TAG_MSGFILTER_ENABLED = 0x1401,\n\tEC_TAG_MSGFILTER_ALL = 0x1402,\n\tEC_TAG_MSGFILTER_FRIENDS = 0x1403,\n\tEC_TAG_MSGFILTER_SECURE = 0x1404,\n\tEC_TAG_MSGFILTER_BY_KEYWORD = 0x1405,\n\tEC_TAG_MSGFILTER_KEYWORDS = 0x1406,\n\tEC_TAG_PREFS_REMOTECTRL = 0x1500,\n\tEC_TAG_WEBSERVER_AUTORUN = 0x1501,\n\tEC_TAG_WEBSERVER_PORT = 0x1502,\n\tEC_TAG_WEBSERVER_GUEST = 0x1503,\n\tEC_TAG_WEBSERVER_USEGZIP = 0x1504,\n\tEC_TAG_WEBSERVER_REFRESH = 0x1505,\n\tEC_TAG_WEBSERVER_TEMPLATE = 0x1506,\n\tEC_TAG_PREFS_ONLINESIG = 0x1600,\n\tEC_TAG_ONLINESIG_ENABLED = 0x1601,\n\tEC_TAG_PREFS_SERVERS = 0x1700,\n\tEC_TAG_SERVERS_REMOVE_DEAD = 0x1701,\n\tEC_TAG_SERVERS_DEAD_SERVER_RETRIES = 0x1702,\n\tEC_TAG_SERVERS_AUTO_UPDATE = 0x1703,\n\tEC_TAG_SERVERS_URL_LIST = 0x1704,\n\tEC_TAG_SERVERS_ADD_FROM_SERVER = 0x1705,\n\tEC_TAG_SERVERS_ADD_FROM_CLIENT = 0x1706,\n\tEC_TAG_SERVERS_USE_SCORE_SYSTEM = 0x1707,\n\tEC_TAG_SERVERS_SMART_ID_CHECK = 0x1708,\n\tEC_TAG_SERVERS_SAFE_SERVER_CONNECT = 0x1709,\n\tEC_TAG_SERVERS_AUTOCONN_STATIC_ONLY = 0x170a,\n\tEC_TAG_SERVERS_MANUAL_HIGH_PRIO = 0x170b,\n\tEC_TAG_SERVERS_UPDATE_URL = 0x170c,\n\tEC_TAG_PREFS_FILES = 0x1800,\n\tEC_TAG_FILES_ICH_ENABLED = 0x1801,\n\tEC_TAG_FILES_AICH_TRUST = 0x1802,\n\tEC_TAG_FILES_NEW_PAUSED = 0x1803,\n\tEC_TAG_FILES_NEW_AUTO_DL_PRIO = 0x1804,\n\tEC_TAG_FILES_PREVIEW_PRIO = 0x1805,\n\tEC_TAG_FILES_NEW_AUTO_UL_PRIO = 0x1806,\n\tEC_TAG_FILES_UL_FULL_CHUNKS = 0x1807,\n\tEC_TAG_FILES_START_NEXT_PAUSED = 0x1808,\n\tEC_TAG_FILES_RESUME_SAME_CAT = 0x1809,\n\tEC_TAG_FILES_SAVE_SOURCES = 0x180a,\n\tEC_TAG_FILES_EXTRACT_METADATA = 0x180b,\n\tEC_TAG_FILES_ALLOC_FULL_SIZE = 0x180c,\n\tEC_TAG_FILES_CHECK_FREE_SPACE = 0x180d,\n\tEC_TAG_FILES_MIN_FREE_SPACE = 0x180e,\n\tEC_TAG_FILES_CREATE_NORMAL = 0x180f,\n\tEC_TAG_PREFS_DIRECTORIES = 0x1a00,\n\tEC_TAG_DIRECTORIES_INCOMING = 0x1a01,\n\tEC_TAG_DIRECTORIES_TEMP = 0x1a02,\n\tEC_TAG_DIRECTORIES_SHARED = 0x1a03,\n\tEC_TAG_DIRECTORIES_SHARE_HIDDEN = 0x1a04,\n\tEC_TAG_PREFS_STATISTICS = 0x1b00,\n\tEC_TAG_STATSGRAPH_WIDTH = 0x1b01,\n\tEC_TAG_STATSGRAPH_SCALE = 0x1b02,\n\tEC_TAG_STATSGRAPH_LAST = 0x1b03,\n\tEC_TAG_STATSGRAPH_DATA = 0x1b04,\n\tEC_TAG_STATTREE_CAPPING = 0x1b05,\n\tEC_TAG_STATTREE_NODE = 0x1b06,\n\tEC_TAG_STAT_NODE_VALUE = 0x1b07,\n\tEC_TAG_STAT_VALUE_TYPE = 0x1b08,\n\tEC_TAG_STATTREE_NODEID = 0x1b09,\n\tEC_TAG_PREFS_SECURITY = 0x1c00,\n\tEC_TAG_SECURITY_CAN_SEE_SHARES = 0x1c01,\n\tEC_TAG_IPFILTER_CLIENTS = 0x1c02,\n\tEC_TAG_IPFILTER_SERVERS = 0x1c03,\n\tEC_TAG_IPFILTER_AUTO_UPDATE = 0x1c04,\n\tEC_TAG_IPFILTER_UPDATE_URL = 0x1c05,\n\tEC_TAG_IPFILTER_LEVEL = 0x1c06,\n\tEC_TAG_IPFILTER_FILTER_LAN = 0x1c07,\n\tEC_TAG_SECURITY_USE_SECIDENT = 0x1c08,\n\tEC_TAG_SECURITY_OBFUSCATION_SUPPORTED = 0x1c09,\n\tEC_TAG_SECURITY_OBFUSCATION_REQUESTED = 0x1c0a,\n\tEC_TAG_SECURITY_OBFUSCATION_REQUIRED = 0x1c0b,\n\tEC_TAG_PREFS_CORETWEAKS = 0x1d00,\n\tEC_TAG_CORETW_MAX_CONN_PER_FIVE = 0x1d01,\n\tEC_TAG_CORETW_VERBOSE = 0x1d02,\n\tEC_TAG_CORETW_FILEBUFFER = 0x1d03,\n\tEC_TAG_CORETW_UL_QUEUE = 0x1d04,\n\tEC_TAG_CORETW_SRV_KEEPALIVE_TIMEOUT = 0x1d05,\n\tEC_TAG_PREFS_KADEMLIA = 0x1e00,\n\tEC_TAG_KADEMLIA_UPDATE_URL = 0x1e01,\n\tEC_TAG_UNKNOWN = 0xffff,\n}\n\nexport enum ECDetailLevel {\n\tEC_DETAIL_CMD = 0x00,\n\tEC_DETAIL_WEB = 0x01,\n\tEC_DETAIL_FULL = 0x02,\n\tEC_DETAIL_UPDATE = 0x03,\n\tEC_DETAIL_INC_UPDATE = 0x04,\n}\n\nexport enum ECSearchType {\n\tEC_SEARCH_LOCAL = 0x00,\n\tEC_SEARCH_GLOBAL = 0x01,\n\tEC_SEARCH_KAD = 0x02,\n\tEC_SEARCH_WEB = 0x03,\n}\n\nexport enum ECSearchFileDownloadStatus {\n\tNEW = 0,\n\tDOWNLOADED = 1,\n\tQUEUED = 2,\n\tCANCELED = 3,\n\tQUEUEDCANCELED = 4,\n}\n\nexport enum ECStatTreeNodeValueType {\n\tEC_VALUE_INTEGER = 0x00,\n\tEC_VALUE_ISTRING = 0x01,\n\tEC_VALUE_BYTES = 0x02,\n\tEC_VALUE_ISHORT = 0x03,\n\tEC_VALUE_TIME = 0x04,\n\tEC_VALUE_SPEED = 0x05,\n\tEC_VALUE_STRING = 0x06,\n\tEC_VALUE_DOUBLE = 0x07,\n}\n\nexport enum EcPrefs {\n\tEC_PREFS_CATEGORIES = 0x00000001,\n\tEC_PREFS_GENERAL = 0x00000002,\n\tEC_PREFS_CONNECTIONS = 0x00000004,\n\tEC_PREFS_MESSAGEFILTER = 0x00000008,\n\tEC_PREFS_REMOTECONTROLS = 0x00000010,\n\tEC_PREFS_ONLINESIG = 0x00000020,\n\tEC_PREFS_SERVERS = 0x00000040,\n\tEC_PREFS_FILES = 0x00000080,\n\tEC_PREFS_DIRECTORIES = 0x00000200,\n\tEC_PREFS_STATISTICS = 0x00000400,\n\tEC_PREFS_SECURITY = 0x00000800,\n\tEC_PREFS_CORETWEAKS = 0x00001000,\n\tEC_PREFS_KADEMLIA = 0x00002000,\n}\n\nexport enum ECTagType {\n\tEC_TAGTYPE_UNKNOWN = 0,\n\tEC_TAGTYPE_CUSTOM = 1,\n\tEC_TAGTYPE_UINT8 = 2,\n\tEC_TAGTYPE_UINT16 = 3,\n\tEC_TAGTYPE_UINT32 = 4,\n\tEC_TAGTYPE_UINT64 = 5,\n\tEC_TAGTYPE_STRING = 6,\n\tEC_TAGTYPE_DOUBLE = 7,\n\tEC_TAGTYPE_IPV4 = 8,\n\tEC_TAGTYPE_HASH16 = 9,\n\tEC_TAGTYPE_UINT128 = 10,\n}\n\n// Type sizes\nexport const LEN_UBYTE = 1;\nexport const LEN_USHORT = 2;\nexport const LEN_UINT = 4;\nexport const LEN_ULONG = 8;\nexport const LEN_UINT128 = 16;\n","// Tag definitions for EC protocol\n\nimport { ECTagName, ECTagType } from '../Codes';\n\nexport interface NumericTag {\n\tgetShort(): number;\n\tgetInt(): number;\n\tgetLong(): bigint;\n\tgetValue(): number | bigint;\n}\n\nexport abstract class Tag<T> {\n\tprotected value!: T;\n\tpublic nestedTags?: Tag<any>[];\n\n\tconstructor(\n\t\tpublic readonly name: ECTagName,\n\t\tpublic readonly type: ECTagType,\n\t\tnestedTags: Tag<any>[] = [],\n\t\tpublic readonly nameValue: number = name\n\t) {\n\t\tif (nestedTags.length > 0) {\n\t\t\tthis.nestedTags = nestedTags;\n\t\t}\n\t}\n\n\tabstract parseValue(value: Buffer): void;\n\tabstract encodeValue(): Buffer;\n\n\tgetValue(): T {\n\t\treturn this.value;\n\t}\n\n\tprotected setValue(value: T): void {\n\t\tthis.value = value;\n\t}\n}\n\nexport class CustomTag extends Tag<Buffer> {\n\tconstructor(name: ECTagName, value?: Buffer, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_CUSTOM, subtags, nameValue);\n\t\tif (value !== undefined) {\n\t\t\tthis.setValue(value);\n\t\t}\n\t}\n\n\tparseValue(value: Buffer): void {\n\t\tthis.setValue(value);\n\t}\n\n\tencodeValue(): Buffer {\n\t\treturn this.getValue();\n\t}\n}\n\nexport class UByteTag extends Tag<number> implements NumericTag {\n\tconstructor(name: ECTagName, value?: number, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_UINT8, subtags, nameValue);\n\t\tif (value !== undefined) {\n\t\t\tthis.setValue(value);\n\t\t}\n\t}\n\n\tstatic withValue(name: ECTagName, value: number, subtags: Tag<any>[] = []): UByteTag {\n\t\treturn new UByteTag(name, value, subtags);\n\t}\n\n\tparseValue(value: Buffer): void {\n\t\tif (value.length === 0) {\n\t\t\tthis.setValue(0);\n\t\t} else if (value.length === 1) {\n\t\t\tthis.setValue(value[0]);\n\t\t} else {\n\t\t\tthrow new Error('UInt8Tag value must be 1 byte long');\n\t\t}\n\t}\n\n\tencodeValue(): Buffer {\n\t\treturn Buffer.from([this.getValue()]);\n\t}\n\n\tgetShort(): number {\n\t\treturn this.getValue();\n\t}\n\n\tgetInt(): number {\n\t\treturn this.getValue();\n\t}\n\n\tgetLong(): bigint {\n\t\treturn BigInt(this.getValue());\n\t}\n}\n\nexport class UShortTag extends Tag<number> implements NumericTag {\n\tconstructor(name: ECTagName, value?: number, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_UINT16, subtags, nameValue);\n\t\tif (value !== undefined) {\n\t\t\tthis.setValue(value);\n\t\t}\n\t}\n\n\tstatic withValue(name: ECTagName, value: number, subtags: Tag<any>[] = []): UShortTag {\n\t\treturn new UShortTag(name, value, subtags);\n\t}\n\n\tparseValue(value: Buffer): void {\n\t\tif (value.length === 0) {\n\t\t\tthis.setValue(0);\n\t\t} else if (value.length === 2) {\n\t\t\tthis.setValue(value.readUInt16BE(0));\n\t\t} else {\n\t\t\tthrow new Error('UInt16Tag value must be 2 bytes long');\n\t\t}\n\t}\n\n\tencodeValue(): Buffer {\n\t\tconst buf = Buffer.allocUnsafe(2);\n\t\tbuf.writeUInt16BE(this.getValue());\n\t\treturn buf;\n\t}\n\n\tgetShort(): number {\n\t\treturn this.getValue();\n\t}\n\n\tgetInt(): number {\n\t\treturn this.getValue();\n\t}\n\n\tgetLong(): bigint {\n\t\treturn BigInt(this.getValue());\n\t}\n}\n\nexport class UIntTag extends Tag<number> implements NumericTag {\n\tconstructor(name: ECTagName, value?: number, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_UINT32, subtags, nameValue);\n\t\tif (value !== undefined) {\n\t\t\tthis.setValue(value);\n\t\t}\n\t}\n\n\tstatic withValue(name: ECTagName, value: number, subtags: Tag<any>[] = []): UIntTag {\n\t\treturn new UIntTag(name, value, subtags);\n\t}\n\n\tparseValue(value: Buffer): void {\n\t\tif (value.length === 0) {\n\t\t\tthis.setValue(0);\n\t\t} else if (value.length === 4) {\n\t\t\tthis.setValue(value.readUInt32BE(0));\n\t\t} else {\n\t\t\tthrow new Error('UInt32Tag value must be 4 bytes long');\n\t\t}\n\t}\n\n\tencodeValue(): Buffer {\n\t\tconst buf = Buffer.allocUnsafe(4);\n\t\tbuf.writeUInt32BE(this.getValue());\n\t\treturn buf;\n\t}\n\n\tgetShort(): number {\n\t\tthrow new Error('Unsigned Integer cannot be cast to short');\n\t}\n\n\tgetInt(): number {\n\t\treturn this.getValue();\n\t}\n\n\tgetLong(): bigint {\n\t\treturn BigInt(this.getValue());\n\t}\n}\n\nexport class ULongTag extends Tag<bigint> implements NumericTag {\n\tconstructor(name: ECTagName, value?: bigint, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_UINT64, subtags, nameValue);\n\t\tif (value !== undefined) {\n\t\t\tthis.setValue(value);\n\t\t}\n\t}\n\n\tstatic withValue(name: ECTagName, value: bigint, subtags: Tag<any>[] = []): ULongTag {\n\t\treturn new ULongTag(name, value, subtags);\n\t}\n\n\tparseValue(value: Buffer): void {\n\t\tif (value.length === 0) {\n\t\t\tthis.setValue(0n);\n\t\t} else if (value.length === 8) {\n\t\t\tthis.setValue(value.readBigUInt64BE(0));\n\t\t} else {\n\t\t\tthrow new Error('UInt64Tag value must be 8 bytes long');\n\t\t}\n\t}\n\n\tencodeValue(): Buffer {\n\t\tconst buf = Buffer.allocUnsafe(8);\n\t\tbuf.writeBigUInt64BE(this.getValue());\n\t\treturn buf;\n\t}\n\n\tgetShort(): number {\n\t\tthrow new Error('Unsigned Long cannot be cast to short');\n\t}\n\n\tgetInt(): number {\n\t\tthrow new Error('Unsigned Long cannot be cast to int');\n\t}\n\n\tgetLong(): bigint {\n\t\treturn this.getValue();\n\t}\n}\n\nexport class UInt128Tag extends Tag<bigint> {\n\tconstructor(name: ECTagName, value?: bigint, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_UINT128, subtags, nameValue);\n\t\tif (value !== undefined) {\n\t\t\tthis.setValue(value);\n\t\t}\n\t}\n\n\tstatic withValue(name: ECTagName, value: bigint, subtags: Tag<any>[] = []): UInt128Tag {\n\t\treturn new UInt128Tag(name, value, subtags);\n\t}\n\n\tparseValue(value: Buffer): void {\n\t\tif (value.length === 0) {\n\t\t\tthis.setValue(0n);\n\t\t} else {\n\t\t\t// Read as big-endian big integer\n\t\t\tlet result = 0n;\n\t\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\t\tresult = (result << 8n) | BigInt(value[i]);\n\t\t\t}\n\t\t\tthis.setValue(result);\n\t\t}\n\t}\n\n\tencodeValue(): Buffer {\n\t\t// Encode as big-endian\n\t\tconst val = this.getValue();\n\t\tconst bytes: number[] = [];\n\t\tlet remaining = val;\n\n\t\twhile (remaining > 0n) {\n\t\t\tbytes.unshift(Number(remaining & 0xffn));\n\t\t\tremaining >>= 8n;\n\t\t}\n\n\t\t// Pad to 16 bytes\n\t\twhile (bytes.length < 16) {\n\t\t\tbytes.unshift(0);\n\t\t}\n\n\t\treturn Buffer.from(bytes);\n\t}\n}\n\nexport class StringTag extends Tag<string> {\n\tconstructor(name: ECTagName, value?: string, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_STRING, subtags, nameValue);\n\t\tif (value !== undefined) {\n\t\t\tthis.setValue(value);\n\t\t}\n\t}\n\n\tstatic withValue(name: ECTagName, value: string, subtags: Tag<any>[] = []): StringTag {\n\t\treturn new StringTag(name, value, subtags);\n\t}\n\n\tparseValue(value: Buffer): void {\n\t\tif (value[value.length - 1] !== 0x00) {\n\t\t\tthrow new Error('StringTag value must be null terminated');\n\t\t}\n\t\tthis.setValue(value.toString('utf8', 0, value.length - 1));\n\t}\n\n\tencodeValue(): Buffer {\n\t\treturn Buffer.concat([Buffer.from(this.getValue(), 'utf8'), Buffer.from([0x00])]);\n\t}\n}\n\nexport class DoubleTag extends Tag<number> {\n\tconstructor(name: ECTagName, value?: number, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_DOUBLE, subtags, nameValue);\n\t\tif (value !== undefined) {\n\t\t\tthis.setValue(value);\n\t\t}\n\t}\n\n\tstatic withValue(name: ECTagName, value: number, subtags: Tag<any>[] = []): DoubleTag {\n\t\treturn new DoubleTag(name, value, subtags);\n\t}\n\n\tparseValue(value: Buffer): void {\n\t\tif (value[value.length - 1] !== 0x00) {\n\t\t\tthrow new Error('DoubleTag value must be null terminated');\n\t\t}\n\t\tthis.setValue(parseFloat(value.toString('utf8', 0, value.length - 1)));\n\t}\n\n\tencodeValue(): Buffer {\n\t\treturn Buffer.concat([Buffer.from(this.getValue().toString(), 'utf8'), Buffer.from([0x00])]);\n\t}\n}\n\nexport interface Ipv4Value {\n\taddress: string;\n\tport: number;\n}\n\nexport class Ipv4Tag extends Tag<Ipv4Value> {\n\tconstructor(name: ECTagName, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_IPV4, subtags, nameValue);\n\t}\n\n\tstatic withValue(name: ECTagName, value: Ipv4Value, subtags: Tag<any>[] = []): Ipv4Tag {\n\t\tconst tag = new Ipv4Tag(name, subtags);\n\t\ttag.setValue(value);\n\t\treturn tag;\n\t}\n\n\tparseValue(value: Buffer): void {\n\t\tif (value.length !== 6) {\n\t\t\tthrow new Error('Ipv4Tag value must be 6 bytes long');\n\t\t}\n\t\tconst address = `${value[0]}.${value[1]}.${value[2]}.${value[3]}`;\n\t\tconst port = value.readUInt16BE(4);\n\t\tthis.setValue({ address, port });\n\t}\n\n\tencodeValue(): Buffer {\n\t\tconst val = this.getValue();\n\t\tconst parts = val.address.split('.').map((p) => parseInt(p));\n\t\tconst buf = Buffer.allocUnsafe(6);\n\t\tbuf[0] = parts[0];\n\t\tbuf[1] = parts[1];\n\t\tbuf[2] = parts[2];\n\t\tbuf[3] = parts[3];\n\t\tbuf.writeUInt16BE(val.port, 4);\n\t\treturn buf;\n\t}\n}\n\nexport class Hash16Tag extends Tag<Buffer> {\n\tconstructor(name: ECTagName, value?: Buffer, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_HASH16, subtags, nameValue);\n\t\tif (value !== undefined) {\n\t\t\tthis.setValue(value);\n\t\t}\n\t}\n\n\tstatic withValue(name: ECTagName, value: Buffer, subtags: Tag<any>[] = []): Hash16Tag {\n\t\treturn new Hash16Tag(name, value, subtags);\n\t}\n\n\tparseValue(value: Buffer): void {\n\t\tif (value.length === 16) {\n\t\t\tthis.setValue(value);\n\t\t} else {\n\t\t\tthrow new Error('Hash16Tag value must be 16 bytes long');\n\t\t}\n\t}\n\n\tencodeValue(): Buffer {\n\t\treturn this.getValue();\n\t}\n}\n\n// Helper functions for tag extraction\nexport function findTag(tags: Tag<any>[], name: ECTagName): Tag<any> | undefined {\n\treturn tags.find((tag) => tag.name === name);\n}\n\nexport function findNumericTag(tags: Tag<any>[], name: ECTagName): NumericTag | undefined {\n\tconst tag = tags.find((tag) => tag.name === name);\n\tif (tag && 'getInt' in tag && 'getShort' in tag && 'getLong' in tag) {\n\t\treturn tag as NumericTag;\n\t}\n\treturn undefined;\n}\n","/**\n * Base Request class\n */\n\nimport { Packet } from '../ec/packet/Packet';\nimport { Flags } from '../ec/packet/Flags';\nimport { ECOpCode } from '../ec/Codes';\nimport type { Tag } from '../ec/tag/Tag';\n\nexport abstract class Request {\n\tprotected readonly opCode: ECOpCode;\n\tprotected readonly tags: Tag<any>[] = [];\n\n\tconstructor(opCode: ECOpCode) {\n\t\tthis.opCode = opCode;\n\t}\n\n\t/**\n\t * Add a tag to the request\n\t */\n\tprotected addTag(tag: Tag<any>): void {\n\t\tthis.tags.push(tag);\n\t}\n\n\t/**\n\t * Build the packet for this request\n\t */\n\tbuildPacket(): Packet {\n\t\tconst flags = Flags.useUtf8Numbers();\n\t\treturn new Packet(this.opCode, flags, this.tags);\n\t}\n}\n","/**\n * Stats Request - Request server statistics\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName, ECDetailLevel } from '../ec/Codes';\nimport { UByteTag } from '../ec/tag/Tag';\n\nexport class StatsRequest extends Request {\n\tconstructor(detailLevel: ECDetailLevel = ECDetailLevel.EC_DETAIL_FULL) {\n\t\tsuper(ECOpCode.EC_OP_STAT_REQ);\n\n\t\tthis.addTag(new UByteTag(ECTagName.EC_TAG_DETAIL_LEVEL, detailLevel));\n\t}\n}\n","/**\n * Stats Response - Server statistics\n */\n\nimport { Packet } from '../ec/packet/Packet';\nimport { ECTagName } from '../ec/Codes';\nimport { findNumericTag, findTag } from '../ec/tag/Tag';\nimport type { StatsResponse } from '../client/AmuleClient';\n\nexport class StatsResponseParser {\n\tstatic fromPacket(packet: Packet): StatsResponse {\n\t\t// Extract common stats\n\t\tconst uploadOverhead = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_UP_OVERHEAD)?.getValue() || 0;\n\t\tconst downloadOverhead = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_DOWN_OVERHEAD)?.getValue() || 0;\n\t\tconst bannedCount = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_BANNED_COUNT)?.getValue() || 0;\n\n\t\tconst totalSentBytes = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_TOTAL_SENT_BYTES)?.getValue() || 0;\n\t\tconst totalReceivedBytes = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_TOTAL_RECEIVED_BYTES)?.getValue() || 0;\n\t\tconst sharedFileCount = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_SHARED_FILE_COUNT)?.getValue() || 0;\n\n\t\tconst uploadSpeed = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_UL_SPEED)?.getValue() || 0;\n\t\tconst downloadSpeed = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_DL_SPEED)?.getValue() || 0;\n\t\tconst uploadSpeedLimit = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_UL_SPEED_LIMIT)?.getValue() || 0;\n\t\tconst downloadSpeedLimit = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_DL_SPEED_LIMIT)?.getValue() || 0;\n\n\t\tconst uploadQueueLength = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_UL_QUEUE_LEN)?.getValue() || 0;\n\t\tconst totalSourceCount = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_TOTAL_SRC_COUNT)?.getValue() || 0;\n\t\tconst ed2kUsers = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_ED2K_USERS)?.getValue() || 0;\n\t\tconst kadUsers = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_KAD_USERS)?.getValue() || 0;\n\t\tconst ed2kFiles = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_ED2K_FILES)?.getValue() || 0;\n\t\tconst kadFiles = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_KAD_FILES)?.getValue() || 0;\n\n\t\tconst kadNodes = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_KAD_NODES)?.getValue() || 0;\n\n\t\t// Connection State & Server Info\n\t\tconst connStateTag = findTag(packet.tags, ECTagName.EC_TAG_CONNSTATE);\n\t\tlet ed2kId = 0;\n\t\tlet clientId = 0;\n\t\tlet kadId: string | undefined;\n\t\tlet connectedServer: StatsResponse['connectedServer'];\n\n\t\tif (connStateTag && connStateTag.nestedTags) {\n\t\t\ted2kId = Number(findNumericTag(connStateTag.nestedTags, ECTagName.EC_TAG_ED2K_ID)?.getValue() || 0);\n\t\t\tclientId = Number(findNumericTag(connStateTag.nestedTags, ECTagName.EC_TAG_CLIENT_ID)?.getValue() || 0);\n\n\t\t\tconst kadIdTag = findTag(connStateTag.nestedTags, ECTagName.EC_TAG_KAD_ID);\n\t\t\tif (kadIdTag && kadIdTag.getValue() !== undefined) {\n\t\t\t\tconst val = kadIdTag.getValue();\n\t\t\t\tif (typeof val === 'bigint') {\n\t\t\t\t\tkadId = val.toString(16).padStart(32, '0');\n\t\t\t\t} else if (val instanceof Buffer) {\n\t\t\t\t\tkadId = val.toString('hex');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst serverTag = findTag(connStateTag.nestedTags, ECTagName.EC_TAG_SERVER);\n\t\t\tif (serverTag) {\n\t\t\t\tconst serverVal = serverTag.getValue() as any;\n\t\t\t\tif (serverVal && typeof serverVal === 'object' && 'address' in serverVal) {\n\t\t\t\t\tconnectedServer = {\n\t\t\t\t\t\tip: serverVal.address,\n\t\t\t\t\t\tport: serverVal.port,\n\t\t\t\t\t\tname: findTag(serverTag.nestedTags || [], ECTagName.EC_TAG_SERVER_NAME)?.getValue(),\n\t\t\t\t\t\tdescription: findTag(serverTag.nestedTags || [], ECTagName.EC_TAG_SERVER_DESC)?.getValue(),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fallback for ID if not in connState\n\t\tconst id = clientId || Number(findNumericTag(packet.tags, ECTagName.EC_TAG_CLIENT_ID)?.getValue() || 0);\n\n\t\t// Logger messages (if any)\n\t\tconst loggerMessage: string[] = [];\n\t\t// TODO: Parse logger messages from nested tags if present\n\n\t\treturn {\n\t\t\tid: Number(id),\n\t\t\ted2kId,\n\t\t\tkadId,\n\t\t\tconnectedServer,\n\t\t\tuploadOverhead: Number(uploadOverhead),\n\t\t\tdownloadOverhead: Number(downloadOverhead),\n\t\t\tbannedCount: Number(bannedCount),\n\t\t\tloggerMessage,\n\t\t\ttotalSentBytes: Number(totalSentBytes),\n\t\t\ttotalReceivedBytes: Number(totalReceivedBytes),\n\t\t\tsharedFileCount: Number(sharedFileCount),\n\t\t\tuploadSpeed: Number(uploadSpeed),\n\t\t\tdownloadSpeed: Number(downloadSpeed),\n\t\t\tuploadSpeedLimit: Number(uploadSpeedLimit),\n\t\t\tdownloadSpeedLimit: Number(downloadSpeedLimit),\n\t\t\tuploadQueueLength: Number(uploadQueueLength),\n\t\t\ttotalSourceCount: Number(totalSourceCount),\n\t\t\ted2kUsers: Number(ed2kUsers),\n\t\t\tkadUsers: Number(kadUsers),\n\t\t\ted2kFiles: Number(ed2kFiles),\n\t\t\tkadFiles: Number(kadFiles),\n\t\t\tkadNodes: Number(kadNodes),\n\t\t};\n\t}\n}\n","// Model types and interfaces\n\nexport interface AmuleFile {\n\tfileHashHexString?: string;\n\tfileName?: string;\n\tfilePath?: string;\n\tsizeFull?: number;\n\tfileEd2kLink?: string;\n\tupPrio: number;\n\tgetRequests: number;\n\tgetAllRequests: number;\n\tgetAccepts: number;\n\tgetAllAccepts: number;\n\tgetXferred: number;\n\tgetAllXferred: number;\n\tgetCompleteSourcesLow: number;\n\tgetCompleteSourcesHigh: number;\n\tgetCompleteSources: number;\n\tgetOnQueue: number;\n\tgetComment?: string;\n\tgetRating?: number;\n}\n\nexport interface AmuleTransferringFile extends AmuleFile {\n\tpartMetID?: number;\n\tsizeXfer?: number;\n\tsizeDone?: number;\n\tfileStatus: FileStatus;\n\tstopped: boolean;\n\tsourceCount: number;\n\tsourceNotCurrCount: number;\n\tsourceXferCount: number;\n\tsourceCountA4AF: number;\n\tspeed?: number;\n\tdownPrio: number;\n\tfileCat: number;\n\tlastSeenComplete: number;\n\tlastDateChanged: number;\n\tdownloadActiveTime: number;\n\tavailablePartCount: number;\n\ta4AFAuto: boolean;\n\thashingProgress: boolean;\n\tgetLostDueToCorruption: number;\n\tgetGainDueToCompression: number;\n\ttotalPacketsSavedDueToICH: number;\n}\n\nexport interface AmuleCategory {\n\tid: number;\n\tname: string;\n\tpath: string;\n\tcomment: string;\n\tcolor: number;\n\tpriority: number;\n}\n\nexport interface AmuleServer {\n\tname?: string;\n\tdescription?: string;\n\taddress?: string; // String representation usually\n\tip: string;\n\tport: number;\n\tping?: number;\n\tusers?: number;\n\tmaxUsers?: number;\n\tfiles?: number;\n\tpriority: number;\n\tversion?: string;\n\tisStatic: boolean;\n\tfailedCount: number;\n}\n\nexport enum FileStatus {\n\tREADY = 0,\n\tEMPTY = 1,\n\tWAITINGFORHASH = 2,\n\tHASHING = 3,\n\tERROR = 4,\n\tINSUFFICIENT = 5,\n\tUNKNOWN = 6,\n\tPAUSED = 7,\n\tCOMPLETING = 8,\n\tCOMPLETE = 9,\n\tALLOCATING = 10,\n}\n\nexport enum DownloadCommand {\n\tSWAP_A4AF_THIS = 0x16,\n\tSWAP_A4AF_THIS_AUTO = 0x17,\n\tSWAP_A4AF_OTHERS = 0x18,\n\tPAUSE = 0x19,\n\tRESUME = 0x1a,\n\tSTOP = 0x1b,\n\tDELETE = 0x1d,\n}\n\nexport enum SearchType {\n\tGLOBAL = 1,\n\tKAD = 2,\n\tLOCAL = 0,\n\tWEB = 3,\n}\n","/**\n * Search Request - Start a search\n *\n * In the EC protocol, search is structured as:\n * - EC_TAG_SEARCH_TYPE (UByte) containing subtag:\n * - EC_TAG_SEARCH_NAME (String) with the search query\n * - Uses non-UTF8 flags (Flags.noUtf8())\n */\n\nimport { Request } from './Request';\nimport { Packet } from '../ec/packet/Packet';\nimport { Flags } from '../ec/packet/Flags';\nimport { ECOpCode, ECTagName, ECSearchType } from '../ec/Codes';\nimport { StringTag, UByteTag, UIntTag, ULongTag } from '../ec/tag/Tag';\nimport { SearchType } from '../model';\nimport type { SearchFilters } from '../types';\n\nexport class SearchRequest extends Request {\n\tprivate readonly query: string;\n\tprivate readonly searchType: SearchType;\n\tprivate readonly filters?: SearchFilters;\n\n\tconstructor(query: string, searchType: SearchType = SearchType.LOCAL, filters?: SearchFilters) {\n\t\tsuper(ECOpCode.EC_OP_SEARCH_START);\n\t\tthis.query = query;\n\t\tthis.searchType = searchType;\n\t\tthis.filters = filters;\n\t}\n\n\t/**\n\t * Override buildPacket to use non-UTF8 flags and correct tag structure\n\t */\n\tbuildPacket(): Packet {\n\t\tconst flags = Flags.noUtf8();\n\t\tconst tags = this.buildTags();\n\t\treturn new Packet(this.opCode, flags, tags);\n\t}\n\n\tprivate buildTags(): any[] {\n\t\tconst tags: any[] = [];\n\n\t\t// EC_TAG_SEARCH_TYPE with EC_TAG_SEARCH_NAME as subtag\n\t\tconst ecSearchType = this.convertSearchType(this.searchType);\n\t\tconst searchNameTag = new StringTag(ECTagName.EC_TAG_SEARCH_NAME, this.query);\n\t\tconst searchTypeTag = new UByteTag(ECTagName.EC_TAG_SEARCH_TYPE, ecSearchType, [searchNameTag]);\n\t\ttags.push(searchTypeTag);\n\n\t\t// Add filters if provided\n\t\tif (this.filters) {\n\t\t\tif (this.filters.minSize !== undefined) {\n\t\t\t\ttags.push(new ULongTag(ECTagName.EC_TAG_SEARCH_MIN_SIZE, BigInt(this.filters.minSize)));\n\t\t\t}\n\t\t\tif (this.filters.maxSize !== undefined) {\n\t\t\t\ttags.push(new ULongTag(ECTagName.EC_TAG_SEARCH_MAX_SIZE, BigInt(this.filters.maxSize)));\n\t\t\t}\n\t\t\tif (this.filters.fileType !== undefined) {\n\t\t\t\ttags.push(new StringTag(ECTagName.EC_TAG_SEARCH_FILE_TYPE, this.filters.fileType));\n\t\t\t}\n\t\t\tif (this.filters.extension !== undefined) {\n\t\t\t\ttags.push(new StringTag(ECTagName.EC_TAG_SEARCH_EXTENSION, this.filters.extension));\n\t\t\t}\n\t\t\tif (this.filters.availability !== undefined) {\n\t\t\t\ttags.push(new UIntTag(ECTagName.EC_TAG_SEARCH_AVAILABILITY, this.filters.availability));\n\t\t\t}\n\t\t}\n\n\t\treturn tags;\n\t}\n\n\tprivate convertSearchType(searchType: SearchType): ECSearchType {\n\t\tswitch (searchType) {\n\t\t\tcase SearchType.LOCAL:\n\t\t\t\treturn ECSearchType.EC_SEARCH_LOCAL;\n\t\t\tcase SearchType.GLOBAL:\n\t\t\t\treturn ECSearchType.EC_SEARCH_GLOBAL;\n\t\t\tcase SearchType.KAD:\n\t\t\t\treturn ECSearchType.EC_SEARCH_KAD;\n\t\t\tcase SearchType.WEB:\n\t\t\t\treturn ECSearchType.EC_SEARCH_WEB;\n\t\t}\n\t}\n}\n","/**\n * Search Status Request - Get search progress\n */\n\nimport { Request } from './Request';\nimport { ECOpCode } from '../ec/Codes';\n\nexport class SearchStatusRequest extends Request {\n\tconstructor() {\n\t\tsuper(ECOpCode.EC_OP_SEARCH_PROGRESS);\n\t}\n}\n","/**\n * Search Progress Response - Search status/progress\n */\n\nimport { Packet } from '../ec/packet/Packet';\nimport { ECTagName } from '../ec/Codes';\nimport { findNumericTag } from '../ec/tag/Tag';\n\nexport class SearchProgressResponse {\n\tconstructor(public readonly progress: number) {}\n\n\tstatic fromPacket(packet: Packet): SearchProgressResponse {\n\t\tconst progressTag = findNumericTag(packet.tags, ECTagName.EC_TAG_SEARCH_STATUS);\n\t\tconst progress = progressTag ? Number(progressTag.getValue()) / 100.0 : 0;\n\n\t\treturn new SearchProgressResponse(progress);\n\t}\n}\n","/**\n * Search Results Request - Get search results\n */\n\nimport { Request } from './Request';\nimport { ECOpCode } from '../ec/Codes';\n\nexport class SearchResultsRequest extends Request {\n\tconstructor() {\n\t\tsuper(ECOpCode.EC_OP_SEARCH_RESULTS);\n\t}\n}\n","/**\n * Search Results Response - Search results\n */\n\nimport { Packet } from '../ec/packet/Packet';\nimport { ECTagName } from '../ec/Codes';\nimport { findNumericTag, findTag } from '../ec/tag/Tag';\nimport type { SearchResultsResponse } from '../client/AmuleClient';\n\nexport class SearchResultsResponseParser {\n\tstatic fromPacket(packet: Packet): SearchResultsResponse {\n\t\tconst files: SearchResultsResponse['files'] = [];\n\n\t\t// Find all search result tags\n\t\tconst searchFileTags = packet.tags.filter((tag) => tag.name === ECTagName.EC_TAG_SEARCHFILE);\n\n\t\tfor (const fileTag of searchFileTags) {\n\t\t\tconst nestedTags = fileTag.nestedTags || [];\n\n\t\t\t// Extract file information\n\t\t\tconst fileNameTag = findTag(nestedTags, ECTagName.EC_TAG_PARTFILE_NAME);\n\t\t\tconst hashTag = findTag(nestedTags, ECTagName.EC_TAG_PARTFILE_HASH);\n\t\t\tconst sizeTag = findNumericTag(nestedTags, ECTagName.EC_TAG_PARTFILE_SIZE_FULL);\n\t\t\tconst completeSourcesTag = findNumericTag(nestedTags, ECTagName.EC_TAG_PARTFILE_SOURCE_COUNT);\n\t\t\tconst sourceCountTag = findNumericTag(nestedTags, ECTagName.EC_TAG_PARTFILE_SOURCE_COUNT_XFER);\n\t\t\tconst downloadStatusTag = findNumericTag(nestedTags, ECTagName.EC_TAG_KNOWNFILE);\n\n\t\t\tif (fileNameTag && hashTag) {\n\t\t\t\tfiles.push({\n\t\t\t\t\tfileName: fileNameTag.getValue(),\n\t\t\t\t\thash: hashTag.getValue(),\n\t\t\t\t\tsizeFull: sizeTag ? Number(sizeTag.getLong()) : 0,\n\t\t\t\t\tdownloadStatus: downloadStatusTag ? downloadStatusTag.getInt() : 0,\n\t\t\t\t\tcompleteSourceCount: completeSourcesTag ? completeSourcesTag.getInt() : 0,\n\t\t\t\t\tsourceCount: sourceCountTag ? sourceCountTag.getInt() : 0,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn { files };\n\t}\n}\n","/**\n * Search Stop Request - Stop current search\n */\n\nimport { Request } from './Request';\nimport { ECOpCode } from '../ec/Codes';\n\nexport class SearchStopRequest extends Request {\n\tconstructor() {\n\t\tsuper(ECOpCode.EC_OP_SEARCH_STOP);\n\t}\n}\n","/**\n * Download File Request - Download a file from search results\n *\n * This request downloads a file that was found in search results.\n * It uses the file hash to identify the file to download.\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName } from '../ec/Codes';\nimport { Hash16Tag } from '../ec/tag/Tag';\n\nexport class DownloadFileRequest extends Request {\n\tconstructor(hash: Buffer) {\n\t\tsuper(ECOpCode.EC_OP_DOWNLOAD_SEARCH_RESULT);\n\n\t\t// Only send the hash - same as jamule DownloadSearchResultRequest\n\t\tthis.addTag(new Hash16Tag(ECTagName.EC_TAG_PARTFILE, hash));\n\t}\n}\n","/**\n * Add Link Request - Download from ED2K link\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName } from '../ec/Codes';\nimport { StringTag } from '../ec/tag/Tag';\n\nexport class AddLinkRequest extends Request {\n\tconstructor(link: string) {\n\t\tsuper(ECOpCode.EC_OP_ADD_LINK);\n\n\t\tthis.addTag(new StringTag(ECTagName.EC_TAG_PARTFILE_ED2K_LINK, link));\n\t}\n}\n","/**\n * Download Queue Request - Get download queue\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName, ECDetailLevel } from '../ec/Codes';\nimport { UByteTag } from '../ec/tag/Tag';\n\nexport class DownloadQueueRequest extends Request {\n\tconstructor(detailLevel: ECDetailLevel = ECDetailLevel.EC_DETAIL_FULL) {\n\t\tsuper(ECOpCode.EC_OP_GET_DLOAD_QUEUE);\n\n\t\tthis.addTag(new UByteTag(ECTagName.EC_TAG_DETAIL_LEVEL, detailLevel));\n\t}\n}\n","/**\n * Download Queue Response - Parse download queue\n */\n\nimport { Packet } from '../ec/packet/Packet';\nimport { ECTagName } from '../ec/Codes';\nimport { findNumericTag, findTag } from '../ec/tag/Tag';\nimport type { AmuleTransferringFile, FileStatus } from '../model';\n\nexport interface DownloadQueueResponse {\n\tfiles: AmuleTransferringFile[];\n}\n\n// Helper to convert bigint to number safely\nfunction toNumber(value: bigint | number | undefined, defaultValue: number = 0): number {\n\tif (value === undefined) return defaultValue;\n\treturn typeof value === 'bigint' ? Number(value) : value;\n}\n\nexport class DownloadQueueResponseParser {\n\tstatic fromPacket(packet: Packet): DownloadQueueResponse {\n\t\tconst files: AmuleTransferringFile[] = [];\n\n\t\t// Find all partfile tags\n\t\tconst partfileTags = packet.tags.filter((tag) => tag.name === ECTagName.EC_TAG_PARTFILE);\n\n\t\tfor (const fileTag of partfileTags) {\n\t\t\tconst tags = fileTag.nestedTags || [];\n\n\t\t\tconst hashTag = findTag(tags, ECTagName.EC_TAG_PARTFILE_HASH);\n\t\t\tconst fileNameTag = findTag(tags, ECTagName.EC_TAG_PARTFILE_NAME);\n\n\t\t\t// Basic file info\n\t\t\tconst file: AmuleTransferringFile = {\n\t\t\t\tfileHashHexString: hashTag ? hashTag.getValue().toString('hex') : undefined,\n\t\t\t\tfileName: fileNameTag ? fileNameTag.getValue() : undefined,\n\t\t\t\tfilePath: findTag(tags, ECTagName.EC_TAG_KNOWNFILE_FILENAME)?.getValue(),\n\t\t\t\tsizeFull: toNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SIZE_FULL)?.getLong()),\n\t\t\t\tfileEd2kLink: findTag(tags, ECTagName.EC_TAG_PARTFILE_ED2K_LINK)?.getValue(),\n\n\t\t\t\t// Transfer info\n\t\t\t\tpartMetID: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_PARTMETID)?.getShort(),\n\t\t\t\tsizeXfer: toNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SIZE_XFER)?.getLong()),\n\t\t\t\tsizeDone: toNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SIZE_DONE)?.getLong()),\n\t\t\t\tfileStatus: (findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_STATUS)?.getInt() ?? 0) as FileStatus,\n\t\t\t\tstopped: (findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_STOPPED)?.getInt() ?? 0) !== 0,\n\t\t\t\tsourceCount: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SOURCE_COUNT)?.getShort() ?? 0,\n\t\t\t\tsourceNotCurrCount: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SOURCE_COUNT_NOT_CURRENT)?.getShort() ?? 0,\n\t\t\t\tsourceXferCount: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SOURCE_COUNT_XFER)?.getShort() ?? 0,\n\t\t\t\tsourceCountA4AF: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SOURCE_COUNT_A4AF)?.getShort() ?? 0,\n\t\t\t\tspeed: toNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SPEED)?.getLong()),\n\t\t\t\tdownPrio: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_PRIO)?.getInt() ?? 0,\n\t\t\t\tfileCat: toNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_CAT)?.getLong()),\n\t\t\t\tlastSeenComplete: toNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_LAST_SEEN_COMP)?.getLong()),\n\t\t\t\tlastDateChanged: toNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_LAST_RECV)?.getLong()),\n\t\t\t\tdownloadActiveTime: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_DOWNLOAD_ACTIVE)?.getInt() ?? 0,\n\t\t\t\tavailablePartCount: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_AVAILABLE_PARTS)?.getShort() ?? 0,\n\t\t\t\ta4AFAuto: (findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_A4AFAUTO)?.getInt() ?? 0) !== 0,\n\t\t\t\thashingProgress: (findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_HASHED_PART_COUNT)?.getInt() ?? 0) !== 0,\n\n\t\t\t\t// Statistics\n\t\t\t\tgetLostDueToCorruption: toNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_LOST_CORRUPTION)?.getLong()),\n\t\t\t\tgetGainDueToCompression: toNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_GAINED_COMPRESSION)?.getLong()),\n\t\t\t\ttotalPacketsSavedDueToICH: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SAVED_ICH)?.getInt() ?? 0,\n\n\t\t\t\t// Known file shared info (defaults)\n\t\t\t\tupPrio: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_PRIO)?.getInt() ?? 0,\n\t\t\t\tgetRequests: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_REQ_COUNT)?.getShort() ?? 0,\n\t\t\t\tgetAllRequests: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_REQ_COUNT_ALL)?.getInt() ?? 0,\n\t\t\t\tgetAccepts: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_ACCEPT_COUNT)?.getShort() ?? 0,\n\t\t\t\tgetAllAccepts: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_ACCEPT_COUNT_ALL)?.getInt() ?? 0,\n\t\t\t\tgetXferred: toNumber(findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_XFERRED)?.getLong()),\n\t\t\t\tgetAllXferred: toNumber(findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_XFERRED_ALL)?.getLong()),\n\t\t\t\tgetCompleteSourcesLow: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMPLETE_SOURCES_LOW)?.getShort() ?? 0,\n\t\t\t\tgetCompleteSourcesHigh: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMPLETE_SOURCES_HIGH)?.getShort() ?? 0,\n\t\t\t\tgetCompleteSources: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMPLETE_SOURCES)?.getShort() ?? 0,\n\t\t\t\tgetOnQueue: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_ON_QUEUE)?.getShort() ?? 0,\n\t\t\t\tgetComment: findTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMMENT)?.getValue(),\n\t\t\t\tgetRating: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_RATING)?.getInt(),\n\t\t\t};\n\n\t\t\tfiles.push(file);\n\t\t}\n\n\t\treturn { files };\n\t}\n}\n","/**\n * Shared Files Request - Get shared files list\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName, ECDetailLevel } from '../ec/Codes';\nimport { UByteTag } from '../ec/tag/Tag';\n\nexport class SharedFilesRequest extends Request {\n\tconstructor(detailLevel: ECDetailLevel = ECDetailLevel.EC_DETAIL_FULL) {\n\t\tsuper(ECOpCode.EC_OP_GET_SHARED_FILES);\n\n\t\tthis.addTag(new UByteTag(ECTagName.EC_TAG_DETAIL_LEVEL, detailLevel));\n\t}\n}\n","/**\n * Shared Files Response - Parse shared files list\n */\n\nimport { Packet } from '../ec/packet/Packet';\nimport { ECTagName } from '../ec/Codes';\nimport { findNumericTag, findTag } from '../ec/tag/Tag';\nimport type { AmuleFile } from '../model';\n\nexport interface SharedFilesResponse {\n\tfiles: AmuleFile[];\n}\n\n// Helper to convert bigint to number safely\nfunction toNumber(value: bigint | number | undefined, defaultValue: number = 0): number {\n\tif (value === undefined) return defaultValue;\n\treturn typeof value === 'bigint' ? Number(value) : value;\n}\n\nexport class SharedFilesResponseParser {\n\tstatic fromPacket(packet: Packet): SharedFilesResponse {\n\t\tconst files: AmuleFile[] = [];\n\n\t\t// Find all knownfile tags\n\t\tconst knownfileTags = packet.tags.filter((tag) => tag.name === ECTagName.EC_TAG_KNOWNFILE);\n\n\t\tfor (const fileTag of knownfileTags) {\n\t\t\tconst tags = fileTag.nestedTags || [];\n\n\t\t\tconst hashTag = findTag(tags, ECTagName.EC_TAG_PARTFILE_HASH);\n\t\t\tconst fileNameTag = findTag(tags, ECTagName.EC_TAG_PARTFILE_NAME);\n\n\t\t\tconst file: AmuleFile = {\n\t\t\t\tfileHashHexString: hashTag ? hashTag.getValue().toString('hex') : undefined,\n\t\t\t\tfileName: fileNameTag ? fileNameTag.getValue() : undefined,\n\t\t\t\tfilePath: findTag(tags, ECTagName.EC_TAG_KNOWNFILE_FILENAME)?.getValue(),\n\t\t\t\tsizeFull: toNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SIZE_FULL)?.getLong()),\n\t\t\t\tfileEd2kLink: findTag(tags, ECTagName.EC_TAG_PARTFILE_ED2K_LINK)?.getValue(),\n\n\t\t\t\tupPrio: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_PRIO)?.getInt() ?? 0,\n\t\t\t\tgetRequests: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_REQ_COUNT)?.getShort() ?? 0,\n\t\t\t\tgetAllRequests: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_REQ_COUNT_ALL)?.getInt() ?? 0,\n\t\t\t\tgetAccepts: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_ACCEPT_COUNT)?.getShort() ?? 0,\n\t\t\t\tgetAllAccepts: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_ACCEPT_COUNT_ALL)?.getInt() ?? 0,\n\t\t\t\tgetXferred: toNumber(findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_XFERRED)?.getLong()),\n\t\t\t\tgetAllXferred: toNumber(findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_XFERRED_ALL)?.getLong()),\n\t\t\t\tgetCompleteSourcesLow: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMPLETE_SOURCES_LOW)?.getShort() ?? 0,\n\t\t\t\tgetCompleteSourcesHigh: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMPLETE_SOURCES_HIGH)?.getShort() ?? 0,\n\t\t\t\tgetCompleteSources: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMPLETE_SOURCES)?.getShort() ?? 0,\n\t\t\t\tgetOnQueue: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_ON_QUEUE)?.getShort() ?? 0,\n\t\t\t\tgetComment: findTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMMENT)?.getValue(),\n\t\t\t\tgetRating: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_RATING)?.getInt(),\n\t\t\t};\n\n\t\t\tfiles.push(file);\n\t\t}\n\n\t\treturn { files };\n\t}\n}\n","/**\n * Server List Request - Request the list of servers\n */\n\nimport { Request } from './Request';\nimport { ECOpCode } from '../ec/Codes';\n\nexport class ServerListRequest extends Request {\n\tconstructor() {\n\t\tsuper(ECOpCode.EC_OP_GET_SERVER_LIST);\n\t}\n}\n","/**\n * Server List Response - Parse the list of servers\n */\n\nimport { Packet } from '../ec/packet/Packet';\nimport { ECTagName } from '../ec/Codes';\nimport { findNumericTag, findTag } from '../ec/tag/Tag';\nimport type { AmuleServer } from '../model';\n\nexport interface ServerListResponse {\n\tservers: AmuleServer[];\n}\n\nexport class ServerListResponseParser {\n\tstatic fromPacket(packet: Packet): ServerListResponse {\n\t\tconst servers: AmuleServer[] = [];\n\n\t\t// Find all server tags\n\t\tconst serverTags = packet.tags.filter((tag) => tag.name === ECTagName.EC_TAG_SERVER);\n\n\t\tfor (const serverTag of serverTags) {\n\t\t\tconst nested = serverTag.nestedTags || [];\n\n\t\t\t// aMule often sends IP and Port combined in an Ipv4Tag (6 bytes)\n\t\t\t// Or as separate UInt32/UInt16 tags.\n\t\t\t// In many cases, the top-level EC_TAG_SERVER itself IS the Ipv4Tag.\n\t\t\tconst ipv4Tag =\n\t\t\t\tfindTag(nested, ECTagName.EC_TAG_SERVER_IP) ||\n\t\t\t\tfindTag(nested, ECTagName.EC_TAG_SERVER_ADDRESS) ||\n\t\t\t\t(serverTag.constructor.name.includes('Ipv4') ? serverTag : null);\n\n\t\t\tlet ip = '';\n\t\t\tlet port = 0;\n\n\t\t\tif (ipv4Tag && ipv4Tag.getValue() && typeof ipv4Tag.getValue() === 'object' && 'address' in (ipv4Tag.getValue() as any)) {\n\t\t\t\tconst val = ipv4Tag.getValue() as any;\n\t\t\t\tip = val.address;\n\t\t\t\tport = val.port;\n\t\t\t} else {\n\t\t\t\t// Fallback to separate tags if not combined or if top-level\n\t\t\t\tconst ipNum = findNumericTag(nested, ECTagName.EC_TAG_SERVER_IP)?.getInt() || findNumericTag(packet.tags, ECTagName.EC_TAG_SERVER_IP)?.getInt();\n\n\t\t\t\tport =\n\t\t\t\t\tfindNumericTag(nested, ECTagName.EC_TAG_SERVER_PORT)?.getInt() || findNumericTag(packet.tags, ECTagName.EC_TAG_SERVER_PORT)?.getInt() || 0;\n\n\t\t\t\tip = this.formatIp(ipNum);\n\t\t\t}\n\n\t\t\t// Some servers might have port in EC_TAG_SERVER_PORT even if IP is in combined tag\n\t\t\tif (port === 0) {\n\t\t\t\tport = findNumericTag(nested, ECTagName.EC_TAG_SERVER_PORT)?.getInt() || 0;\n\t\t\t}\n\n\t\t\tservers.push({\n\t\t\t\tname: findTag(nested, ECTagName.EC_TAG_SERVER_NAME)?.getValue() || 'Unknown',\n\t\t\t\tdescription: findTag(nested, ECTagName.EC_TAG_SERVER_DESC)?.getValue(),\n\t\t\t\taddress: findTag(nested, ECTagName.EC_TAG_SERVER_ADDRESS)?.getValue(),\n\t\t\t\tip: ip,\n\t\t\t\tport: port,\n\t\t\t\tping: findNumericTag(nested, ECTagName.EC_TAG_SERVER_PING)?.getInt(),\n\t\t\t\tusers: findNumericTag(nested, ECTagName.EC_TAG_SERVER_USERS)?.getInt(),\n\t\t\t\tmaxUsers: findNumericTag(nested, ECTagName.EC_TAG_SERVER_USERS_MAX)?.getInt(),\n\t\t\t\tfiles: findNumericTag(nested, ECTagName.EC_TAG_SERVER_FILES)?.getInt(),\n\t\t\t\tpriority: findNumericTag(nested, ECTagName.EC_TAG_SERVER_PRIO)?.getInt() || 0,\n\t\t\t\tversion: findTag(nested, ECTagName.EC_TAG_SERVER_VERSION)?.getValue(),\n\t\t\t\tisStatic: !!findNumericTag(nested, ECTagName.EC_TAG_SERVER_STATIC)?.getInt(),\n\t\t\t\tfailedCount: findNumericTag(nested, ECTagName.EC_TAG_SERVER_FAILED)?.getInt() || 0,\n\t\t\t});\n\t\t}\n\n\t\treturn { servers };\n\t}\n\n\tprivate static formatIp(ip: number | undefined): string {\n\t\tif (ip === undefined) return '';\n\t\t// EC protocol uses network byte order (big-endian) for IP addresses in UINT32\n\t\treturn [(ip >>> 24) & 0xff, (ip >>> 16) & 0xff, (ip >>> 8) & 0xff, ip & 0xff].join('.');\n\t}\n}\n","/**\n * Server Connect Request - Connect to a specific server\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName } from '../ec/Codes';\nimport { UIntTag, UShortTag } from '../ec/tag/Tag';\n\nexport class ServerConnectRequest extends Request {\n\tconstructor(ip: string, port: number) {\n\t\tsuper(ECOpCode.EC_OP_SERVER_CONNECT);\n\n\t\tthis.addTag(new UIntTag(ECTagName.EC_TAG_SERVER_IP, this.ipToNumber(ip)));\n\t\tthis.addTag(new UShortTag(ECTagName.EC_TAG_SERVER_PORT, port));\n\t}\n\n\tprivate ipToNumber(ip: string): number {\n\t\tconst parts = ip.split('.').map((p) => parseInt(p, 10));\n\t\treturn ((parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3]) >>> 0;\n\t}\n}\n","/**\n * Server Disconnect Request - Disconnect from the current server\n */\n\nimport { Request } from './Request';\nimport { ECOpCode } from '../ec/Codes';\n\nexport class ServerDisconnectRequest extends Request {\n\tconstructor() {\n\t\tsuper(ECOpCode.EC_OP_SERVER_DISCONNECT);\n\t}\n}\n","/**\n * Create Category Request - Create a new category\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName } from '../ec/Codes';\nimport { StringTag, UByteTag, UIntTag } from '../ec/tag/Tag';\nimport type { AmuleCategory } from '../model';\n\nexport class CreateCategoryRequest extends Request {\n\tconstructor(category: AmuleCategory) {\n\t\tsuper(ECOpCode.EC_OP_CREATE_CATEGORY);\n\n\t\tconst subtags = [\n\t\t\tnew StringTag(ECTagName.EC_TAG_CATEGORY_TITLE, category.name),\n\t\t\tnew StringTag(ECTagName.EC_TAG_CATEGORY_PATH, category.path),\n\t\t\tnew StringTag(ECTagName.EC_TAG_CATEGORY_COMMENT, category.comment),\n\t\t\tnew UByteTag(ECTagName.EC_TAG_CATEGORY_COLOR, category.color),\n\t\t\tnew UIntTag(ECTagName.EC_TAG_CATEGORY_PRIO, category.priority),\n\t\t];\n\n\t\t// Category tag is a container for all category properties\n\t\tthis.addTag(new UIntTag(ECTagName.EC_TAG_CATEGORY, 0, subtags));\n\t}\n}\n","/**\n * Update Category Request - Update an existing category\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName } from '../ec/Codes';\nimport { StringTag, UByteTag, UIntTag } from '../ec/tag/Tag';\nimport type { AmuleCategory } from '../model';\n\nexport class UpdateCategoryRequest extends Request {\n\tconstructor(id: number, category: AmuleCategory) {\n\t\tsuper(ECOpCode.EC_OP_UPDATE_CATEGORY);\n\n\t\tconst subtags = [\n\t\t\tnew StringTag(ECTagName.EC_TAG_CATEGORY_TITLE, category.name),\n\t\t\tnew StringTag(ECTagName.EC_TAG_CATEGORY_PATH, category.path),\n\t\t\tnew StringTag(ECTagName.EC_TAG_CATEGORY_COMMENT, category.comment),\n\t\t\tnew UByteTag(ECTagName.EC_TAG_CATEGORY_COLOR, category.color),\n\t\t\tnew UIntTag(ECTagName.EC_TAG_CATEGORY_PRIO, category.priority),\n\t\t];\n\n\t\t// Category tag is a container for all category properties\n\t\tthis.addTag(new UIntTag(ECTagName.EC_TAG_CATEGORY, id, subtags));\n\t}\n}\n","/**\n * Delete Category Request - Delete an existing category\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName } from '../ec/Codes';\nimport { UIntTag } from '../ec/tag/Tag';\n\nexport class DeleteCategoryRequest extends Request {\n\tconstructor(id: number) {\n\t\tsuper(ECOpCode.EC_OP_DELETE_CATEGORY);\n\n\t\tthis.addTag(new UIntTag(ECTagName.EC_TAG_CATEGORY, id));\n\t}\n}\n","/**\n * Preferences Request - Get preferences\n */\n\nimport { Request } from './Request';\nimport { ECDetailLevel, ECOpCode, EcPrefs, ECTagName } from '../ec/Codes';\nimport { UByteTag, UIntTag } from '../ec/tag/Tag';\n\nexport class GetPreferencesRequest extends Request {\n\tconstructor(pref: EcPrefs) {\n\t\tsuper(ECOpCode.EC_OP_GET_PREFERENCES);\n\t\tthis.addTag(new UByteTag(ECTagName.EC_TAG_DETAIL_LEVEL, ECDetailLevel.EC_DETAIL_FULL));\n\t\tthis.addTag(new UIntTag(ECTagName.EC_TAG_SELECT_PREFS, pref));\n\t}\n}\n","/**\n * Preferences Response - Contains aMule preferences, including categories\n */\n\nimport { Packet } from '../ec/packet/Packet';\nimport { ECTagName } from '../ec/Codes';\nimport { findTag, findNumericTag, NumericTag } from '../ec/tag/Tag';\nimport type { AmuleCategory } from '../model';\n\nexport class PreferencesResponse {\n\tconstructor(public readonly categories: AmuleCategory[]) {}\n}\n\nexport class PreferencesResponseParser {\n\tstatic fromPacket(packet: Packet): PreferencesResponse {\n\t\tconst categories: AmuleCategory[] = [];\n\n\t\tconst prefsCategoriesTag = findTag(packet.tags, ECTagName.EC_TAG_PREFS_CATEGORIES);\n\n\t\tif (prefsCategoriesTag && prefsCategoriesTag.nestedTags) {\n\t\t\tfor (const categoryTag of prefsCategoriesTag.nestedTags) {\n\t\t\t\tif (categoryTag.name === ECTagName.EC_TAG_CATEGORY) {\n\t\t\t\t\tconst nestedTags = categoryTag.nestedTags || [];\n\n\t\t\t\t\tconst idTag = categoryTag;\n\t\t\t\t\tconst nameTag = findTag(nestedTags, ECTagName.EC_TAG_CATEGORY_TITLE);\n\t\t\t\t\tconst pathTag = findTag(nestedTags, ECTagName.EC_TAG_CATEGORY_PATH);\n\t\t\t\t\tconst commentTag = findTag(nestedTags, ECTagName.EC_TAG_CATEGORY_COMMENT);\n\t\t\t\t\tconst colorTag = findNumericTag(nestedTags, ECTagName.EC_TAG_CATEGORY_COLOR);\n\t\t\t\t\tconst priorityTag = findNumericTag(nestedTags, ECTagName.EC_TAG_CATEGORY_PRIO);\n\n\t\t\t\t\tif (nameTag) {\n\t\t\t\t\t\tcategories.push({\n\t\t\t\t\t\t\tid: idTag ? Number((idTag as unknown as NumericTag).getInt()) : 0,\n\t\t\t\t\t\t\tname: nameTag.getValue() || '',\n\t\t\t\t\t\t\tpath: pathTag ? pathTag.getValue() : '',\n\t\t\t\t\t\t\tcomment: commentTag ? commentTag.getValue() : '',\n\t\t\t\t\t\t\tcolor: colorTag ? Number((colorTag as unknown as NumericTag).getInt()) : 0,\n\t\t\t\t\t\t\tpriority: priorityTag ? Number((priorityTag as unknown as NumericTag).getInt()) : 0,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn new PreferencesResponse(categories);\n\t}\n}\n","/**\n * Set File Category Request - Change category of a file\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName } from '../ec/Codes';\nimport { Hash16Tag, UByteTag } from '../ec/tag/Tag';\n\nexport class SetFileCategoryRequest extends Request {\n\tconstructor(hash: Buffer, categoryId: number) {\n\t\tsuper(ECOpCode.EC_OP_PARTFILE_SET_CAT);\n\n\t\t// Hash tag with category as subtag\n\t\tthis.addTag(new Hash16Tag(ECTagName.EC_TAG_PARTFILE, hash, [new UByteTag(ECTagName.EC_TAG_PARTFILE_CAT, categoryId)]));\n\t}\n}\n","/**\n * Download Command Request - Send commands to files in download queue\n * Commands: PAUSE, RESUME, STOP, DELETE, SWAP_A4AF_THIS, etc.\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName } from '../ec/Codes';\nimport { Hash16Tag } from '../ec/tag/Tag';\nimport { DownloadCommand } from '../model';\n\nexport class DownloadCommandRequest extends Request {\n\tconstructor(hash: Buffer, command: DownloadCommand) {\n\t\t// The command IS the opcode\n\t\tsuper(DownloadCommandRequest.commandToOpCode(command));\n\n\t\tthis.addTag(new Hash16Tag(ECTagName.EC_TAG_PARTFILE, hash));\n\t}\n\n\tprivate static commandToOpCode(command: DownloadCommand): ECOpCode {\n\t\tswitch (command) {\n\t\t\tcase DownloadCommand.SWAP_A4AF_THIS:\n\t\t\t\treturn ECOpCode.EC_OP_PARTFILE_SWAP_A4AF_THIS;\n\t\t\tcase DownloadCommand.SWAP_A4AF_THIS_AUTO:\n\t\t\t\treturn ECOpCode.EC_OP_PARTFILE_SWAP_A4AF_THIS_AUTO;\n\t\t\tcase DownloadCommand.SWAP_A4AF_OTHERS:\n\t\t\t\treturn ECOpCode.EC_OP_PARTFILE_SWAP_A4AF_OTHERS;\n\t\t\tcase DownloadCommand.PAUSE:\n\t\t\t\treturn ECOpCode.EC_OP_PARTFILE_PAUSE;\n\t\t\tcase DownloadCommand.RESUME:\n\t\t\t\treturn ECOpCode.EC_OP_PARTFILE_RESUME;\n\t\t\tcase DownloadCommand.STOP:\n\t\t\t\treturn ECOpCode.EC_OP_PARTFILE_STOP;\n\t\t\tcase DownloadCommand.DELETE:\n\t\t\t\treturn ECOpCode.EC_OP_PARTFILE_DELETE;\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown download command: ${command}`);\n\t\t}\n\t}\n}\n","/**\n * AmuleConnection - Manages the low-level connection to aMule EC\n */\n\nimport * as net from 'net';\nimport { CommunicationException, ServerException } from '../exceptions';\nimport { Packet } from '../ec/packet/Packet';\nimport { PacketParser } from '../ec/packet/PacketParser';\nimport { PacketWriter } from '../ec/packet/PacketWriter';\nimport { Flags } from '../ec/packet/Flags';\nimport { ECOpCode } from '../ec/Codes';\nimport { AuthClientInfoRequest, AuthPasswordRequest } from '../request/AuthRequest';\nimport type { Request } from '../request/Request';\nimport { AuthSaltResponse } from '../response/AuthSaltResponse';\nimport { PasswordHasher } from '../auth/PasswordHasher';\n\nexport class AmuleConnection {\n\tprivate socket?: net.Socket;\n\tprivate connected = false;\n\tprivate buffer: Buffer = Buffer.allocUnsafe(0);\n\tprivate pendingResponse?: {\n\t\tresolve: (packet: Packet) => void;\n\t\treject: (error: Error) => void;\n\t};\n\n\t// Debug logging flag (disabled by default)\n\tprivate debug = false;\n\n\t/**\n\t * Enable or disable debug logging\n\t */\n\tpublic setDebug(enabled: boolean): void {\n\t\tthis.debug = !!enabled;\n\t}\n\n\t/**\n\t * Internal debug logger\n\t */\n\tprivate log(...args: any[]): void {\n\t\tif (!this.debug) {\n\t\t\treturn;\n\t\t}\n\t\tconsole.log('[DEBUG]', ...args);\n\t}\n\n\tconstructor(\n\t\tprivate host: string,\n\t\tprivate port: number,\n\t\tprivate password: string,\n\t\tprivate timeout: number\n\t) {}\n\n\t/**\n\t * Reconnect to the server\n\t */\n\tasync reconnect(): Promise<void> {\n\t\tthis.connected = false;\n\t\tif (this.socket) {\n\t\t\tthis.socket.destroy();\n\t\t}\n\n\t\t// Create new socket\n\t\tthis.socket = new net.Socket();\n\t\tif (this.timeout > 0) {\n\t\t\tthis.socket.setTimeout(this.timeout);\n\t\t}\n\n\t\t// Setup event handlers\n\t\tthis.socket.on('data', (data) => this.handleData(Buffer.isBuffer(data) ? data : Buffer.from(data)));\n\t\tthis.socket.on('error', (error) => this.handleError(error));\n\t\tthis.socket.on('timeout', () => this.handleTimeout());\n\t\tthis.socket.on('close', () => this.handleClose());\n\n\t\t// Connect\n\t\tawait this.connectSocket();\n\n\t\t// Perform authentication\n\t\tawait this.authenticate();\n\n\t\tthis.connected = true;\n\t}\n\n\t/**\n\t * Connect socket to server\n\t */\n\tprivate connectSocket(): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!this.socket) {\n\t\t\t\treturn reject(new CommunicationException('Socket not initialized'));\n\t\t\t}\n\n\t\t\tthis.socket.connect(this.port, this.host, () => {\n\t\t\t\tresolve();\n\t\t\t});\n\n\t\t\tthis.socket.once('error', reject);\n\t\t});\n\t}\n\n\t/**\n\t * Perform authentication handshake\n\t */\n\tprivate async authenticate(): Promise<void> {\n\t\tthis.log('Starting authentication...');\n\t\t// Step 1: Send client info\n\t\tconst clientInfoRequest = new AuthClientInfoRequest();\n\t\tthis.log('Sending client info...');\n\t\tconst saltPacket = await this.sendRequestNoAuth(clientInfoRequest);\n\t\tthis.log('Received salt response');\n\n\t\tif (saltPacket.opCode === ECOpCode.EC_OP_AUTH_FAIL) {\n\t\t\tthrow new ServerException('Authentication failed: server rejected client');\n\t\t}\n\n\t\tif (saltPacket.opCode !== ECOpCode.EC_OP_AUTH_SALT) {\n\t\t\tthrow new ServerException(`Unexpected response to client info: ${saltPacket.opCode}`);\n\t\t}\n\n\t\tconst saltResponse = AuthSaltResponse.fromPacket(saltPacket);\n\t\tthis.log('Salt:', saltResponse.salt);\n\n\t\t// Step 2: Hash password with salt\n\t\tconst hashedPassword = PasswordHasher.hash(this.password, saltResponse.salt);\n\t\tthis.log('Hashed password:', hashedPassword.toString('hex'));\n\n\t\t// Step 3: Send hashed password\n\t\tconst authRequest = new AuthPasswordRequest(hashedPassword);\n\t\tthis.log('Sending hashed password...');\n\t\tconst authPacket = await this.sendRequestNoAuth(authRequest);\n\t\tthis.log('Received auth response');\n\n\t\tif (authPacket.opCode === ECOpCode.EC_OP_AUTH_FAIL) {\n\t\t\tthrow new ServerException('Authentication failed: invalid password');\n\t\t}\n\n\t\tif (authPacket.opCode !== ECOpCode.EC_OP_AUTH_OK) {\n\t\t\tthrow new ServerException(`Unexpected auth response: ${authPacket.opCode}`);\n\t\t}\n\t\tthis.log('Authentication successful!');\n\t}\n\n\t/**\n\t * Handle incoming data\n\t */\n\tprivate handleData(data: Buffer): void {\n\t\tthis.log('Received data:', data.length, 'bytes, hex:', data.toString('hex').substring(0, 100));\n\t\t// Append to buffer\n\t\tthis.buffer = Buffer.concat([this.buffer, data]);\n\n\t\t// Try to parse packet\n\t\tif (PacketParser.hasCompletePacket(this.buffer)) {\n\t\t\ttry {\n\t\t\t\tconst packet = PacketParser.parse(this.buffer);\n\t\t\t\tthis.log('Parsed packet, opCode:', packet.opCode);\n\n\t\t\t\t// Calculate consumed bytes\n\t\t\t\tconst consumedBytes = PacketParser.getExpectedPacketSize(this.buffer);\n\t\t\t\tthis.buffer = this.buffer.subarray(consumedBytes);\n\n\t\t\t\t// Resolve pending response\n\t\t\t\tif (this.pendingResponse) {\n\t\t\t\t\tthis.pendingResponse.resolve(packet);\n\t\t\t\t\tthis.pendingResponse = undefined;\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.log('Parse error:', error);\n\t\t\t\tif (this.pendingResponse) {\n\t\t\t\t\tthis.pendingResponse.reject(error as Error);\n\t\t\t\t\tthis.pendingResponse = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.log('Incomplete packet, waiting for more data...');\n\t\t}\n\t}\n\n\t/**\n\t * Handle socket error\n\t */\n\tprivate handleError(error: Error): void {\n\t\tthis.connected = false;\n\t\tif (this.pendingResponse) {\n\t\t\tthis.pendingResponse.reject(new CommunicationException(`Socket error: ${error.message}`));\n\t\t\tthis.pendingResponse = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Handle socket timeout\n\t */\n\tprivate handleTimeout(): void {\n\t\tthis.connected = false;\n\t\tif (this.pendingResponse) {\n\t\t\tthis.pendingResponse.reject(new CommunicationException('Socket timeout'));\n\t\t\tthis.pendingResponse = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Handle socket close\n\t */\n\tprivate handleClose(): void {\n\t\tthis.log('Socket closed! connected:', this.connected, 'pendingResponse:', !!this.pendingResponse);\n\t\tthis.connected = false;\n\t\tif (this.pendingResponse) {\n\t\t\tthis.pendingResponse.reject(new CommunicationException('Socket closed'));\n\t\t\tthis.pendingResponse = undefined;\n\t\t}\n\t}\n\n\t/**\n\t * Send a request and wait for response\n\t */\n\tasync sendRequest(request: Request): Promise<Packet> {\n\t\tif (!this.connected) {\n\t\t\tawait this.reconnect();\n\t\t}\n\n\t\ttry {\n\t\t\treturn await this.sendRequestNoAuth(request);\n\t\t} catch (error) {\n\t\t\tthis.connected = false;\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Send a request without checking authentication\n\t */\n\tprivate async sendRequestNoAuth(request: Request): Promise<Packet> {\n\t\tif (!this.socket) {\n\t\t\tthrow new CommunicationException('Socket not initialized');\n\t\t}\n\n\t\t// Build and write packet\n\t\tconst packet = request.buildPacket();\n\t\tconst buffer = PacketWriter.write(packet);\n\t\tthis.log('Sending request:', packet.opCode.toString(16), 'Size:', buffer.length);\n\n\t\t// Create promise for response\n\t\tconst responsePromise = new Promise<Packet>((resolve, reject) => {\n\t\t\tthis.pendingResponse = { resolve, reject };\n\t\t});\n\n\t\t// Send packet\n\t\tthis.socket.write(buffer);\n\n\t\treturn responsePromise;\n\t}\n}\n","// Base exception classes\n\nexport class AmuleException extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic cause?: Error\n\t) {\n\t\tsuper(message);\n\t\tthis.name = 'AmuleException';\n\t}\n}\n\nexport class InvalidECException extends AmuleException {\n\tconstructor(message: string, cause?: Error) {\n\t\tsuper(message, cause);\n\t\tthis.name = 'InvalidECException';\n\t}\n}\n\nexport class CommunicationException extends AmuleException {\n\tconstructor(message: string, cause?: Error) {\n\t\tsuper(message, cause);\n\t\tthis.name = 'CommunicationException';\n\t}\n}\n\nexport class ServerException extends AmuleException {\n\tconstructor(message: string, cause?: Error) {\n\t\tsuper(message, cause);\n\t\tthis.name = 'ServerException';\n\t}\n}\n","/**\n * Packet Parser - Deserializes EC packets from binary data\n */\n\nimport * as zlib from 'zlib';\nimport { Packet } from './Packet';\nimport { Flags } from './Flags';\nimport { ECOpCode } from '../Codes';\nimport { TagParser } from '../tag/TagParser';\nimport { InvalidECException } from '../../exceptions';\n\nexport class PacketParser {\n\tprivate static readonly HEADER_SIZE = 8; // flags(4) + data_length(4)\n\n\t/**\n\t * Parse a packet from a buffer\n\t */\n\tstatic parse(buffer: Buffer): Packet {\n\t\tif (buffer.length < this.HEADER_SIZE) {\n\t\t\tthrow new InvalidECException(`Buffer too small: ${buffer.length} bytes`);\n\t\t}\n\n\t\t// Read flags\n\t\tconst flags = Flags.fromBuffer(buffer, 0);\n\n\t\t// Read data length\n\t\tconst dataLength = buffer.readUInt32BE(4);\n\n\t\tif (buffer.length < this.HEADER_SIZE + dataLength) {\n\t\t\tthrow new InvalidECException(`Incomplete packet: expected ${this.HEADER_SIZE + dataLength} bytes, got ${buffer.length}`);\n\t\t}\n\n\t\t// Extract data\n\t\tlet data = buffer.subarray(this.HEADER_SIZE, this.HEADER_SIZE + dataLength);\n\n\t\t// Decompress if needed\n\t\tif (flags.isZlib()) {\n\t\t\tdata = this.decompress(data);\n\t\t}\n\n\t\t// Parse packet data\n\t\treturn this.parsePacketData(data, flags);\n\t}\n\n\t/**\n\t * Parse packet data (after decompression)\n\t */\n\tprivate static parsePacketData(data: Buffer, flags: Flags): Packet {\n\t\tlet offset = 0;\n\n\t\t// Read opcode\n\t\tconst opCode = data.readUInt8(offset) as ECOpCode;\n\t\toffset += 1;\n\n\t\t// Read tag count\n\t\tconst useUtf8 = flags.isUtf8Numbers();\n\t\tlet tagCount: number;\n\n\t\tif (useUtf8) {\n\t\t\t// UTF-8 encoded number - not implemented in full yet, assume simple case\n\t\t\ttagCount = data.readUInt8(offset);\n\t\t\toffset += 1;\n\t\t} else {\n\t\t\ttagCount = data.readUInt16BE(offset);\n\t\t\toffset += 2;\n\t\t}\n\n\t\t// Parse tags\n\t\tconst tagParser = new TagParser(data, offset, useUtf8);\n\t\tconst tags = tagParser.parseTags(tagCount);\n\n\t\treturn new Packet(opCode, flags, tags);\n\t}\n\n\t/**\n\t * Decompress ZLIB data\n\t */\n\tprivate static decompress(data: Buffer): Buffer {\n\t\ttry {\n\t\t\treturn zlib.inflateSync(data);\n\t\t} catch (error) {\n\t\t\tthrow new InvalidECException(`Failed to decompress packet: ${error}`);\n\t\t}\n\t}\n\n\t/**\n\t * Calculate expected packet size from header\n\t */\n\tstatic getExpectedPacketSize(headerBuffer: Buffer): number {\n\t\tif (headerBuffer.length < this.HEADER_SIZE) {\n\t\t\tthrow new InvalidECException('Header buffer too small');\n\t\t}\n\n\t\tconst dataLength = headerBuffer.readUInt32BE(4);\n\t\treturn this.HEADER_SIZE + dataLength;\n\t}\n\n\t/**\n\t * Check if buffer contains a complete packet\n\t */\n\tstatic hasCompletePacket(buffer: Buffer): boolean {\n\t\tif (buffer.length < this.HEADER_SIZE) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst expectedSize = this.getExpectedPacketSize(buffer);\n\t\treturn buffer.length >= expectedSize;\n\t}\n}\n","/**\n * Tag Parser - Deserializes tags from binary data\n *\n * This implementation follows jamule's TagParser logic closely.\n * Key insight: tagLength is calculated using FIXED header sizes (not UTF-8 sizes),\n * even when the wire format uses UTF-8 encoding. So we must track \"theoreticalLength\"\n * using fixed sizes to correctly calculate the value size.\n */\n\nimport { ECTagType, ECTagName } from '../Codes';\nimport { Tag, CustomTag, UByteTag, UShortTag, UIntTag, ULongTag, UInt128Tag, StringTag, DoubleTag, Ipv4Tag, Hash16Tag } from './Tag';\nimport { readUtf8Number } from '../Encoding';\nimport { InvalidECException } from '../../exceptions';\n\n// Fixed header sizes (from jamule TypeSizes.kt)\nconst TAG_NAME_SIZE = 2; // UShort\nconst TAG_TYPE_SIZE = 1; // UByte\nconst TAG_LENGTH_SIZE = 4; // UInt\nconst SUBTAG_COUNT_SIZE = 2; // UShort\n\ninterface TagParseResult {\n\ttag: Tag<any>;\n\ttheoreticalLength: number;\n\tendIndex: number;\n}\n\nexport class TagParser {\n\tprivate buffer: Buffer;\n\tprivate offset: number;\n\tprivate readonly useUtf8Numbers: boolean;\n\n\tconstructor(buffer: Buffer, offset: number = 0, useUtf8Numbers: boolean = false) {\n\t\tthis.buffer = buffer;\n\t\tthis.offset = offset;\n\t\tthis.useUtf8Numbers = useUtf8Numbers;\n\t}\n\n\t/**\n\t * Parse a single tag from the current position\n\t */\n\tparseTag(): Tag<any> {\n\t\treturn this.parseTagWithMetadata().tag;\n\t}\n\n\t/**\n\t * Internal parse that returns metadata needed for nested tag calculation\n\t */\n\tprivate parseTagWithMetadata(): TagParseResult {\n\t\t// First part is the tag name and the flag indicating if it has subtags\n\t\tconst tagNameAndSubtags = this.readNumber(TAG_NAME_SIZE);\n\t\tconst tagNameRaw = (tagNameAndSubtags >> 1) & 0xffff;\n\t\tconst tagName = tagNameRaw as ECTagName;\n\t\tconst hasSubtags = (tagNameAndSubtags & 1) !== 0;\n\n\t\t// Then is the tag type\n\t\tconst tagType = this.buffer.readUInt8(this.offset) as ECTagType;\n\t\tthis.offset += TAG_TYPE_SIZE;\n\n\t\t// Then is the tag length, indicating the tag's own content length + length of children (with headers)\n\t\tconst tagLength = this.readNumber(TAG_LENGTH_SIZE);\n\n\t\t// The next byte is the first byte of the tag's value\n\t\t// This is mutable because it will be updated if the tag has subtags\n\t\tlet valueStartIndex = this.offset;\n\n\t\t// If the tag has subtags, we need to parse them\n\t\tconst subTags: Tag<any>[] = [];\n\n\t\t// Theoretical length is the length of the tag, including the length of the subtags (with headers)\n\t\t// All numbers are considered to be non-UTF-8 (fixed sizes)\n\t\tlet theoreticalLength = 0;\n\n\t\t// The last byte of the tag's value\n\t\tlet valueEndIndex: number;\n\n\t\tif (!hasSubtags) {\n\t\t\tvalueEndIndex = valueStartIndex + tagLength - 1;\n\t\t} else {\n\t\t\t// The first part to read is the subtags count\n\t\t\tconst subTagCount = this.readNumber(SUBTAG_COUNT_SIZE);\n\n\t\t\t// We reuse valueStartIndex to store the index after reading subtag count\n\t\t\tvalueStartIndex = this.offset;\n\n\t\t\tfor (let i = 0; i < subTagCount; i++) {\n\t\t\t\tconst result = this.parseTagWithMetadata();\n\t\t\t\tsubTags.push(result.tag);\n\t\t\t\ttheoreticalLength += result.theoreticalLength;\n\t\t\t}\n\n\t\t\tif (subTags.length > subTagCount) {\n\t\t\t\tthrow new InvalidECException(`Error parsing subtags list - Expected subtags ${subTagCount} found subtags ${subTags.length}`);\n\t\t\t}\n\n\t\t\t// Calculate value end using tagLength minus theoreticalLength (fixed sizes)\n\t\t\tvalueEndIndex = this.offset + (tagLength - theoreticalLength - 1);\n\t\t\ttheoreticalLength += SUBTAG_COUNT_SIZE;\n\t\t}\n\n\t\t// Read the tag value\n\t\tconst valueSize = valueEndIndex - this.offset + 1;\n\t\tconst tagValue = this.buffer.subarray(this.offset, this.offset + valueSize);\n\t\tthis.offset += valueSize;\n\n\t\t// Update theoretical length with the value and header sizes\n\t\ttheoreticalLength += tagValue.length;\n\t\ttheoreticalLength += TAG_NAME_SIZE;\n\t\ttheoreticalLength += TAG_TYPE_SIZE;\n\t\ttheoreticalLength += TAG_LENGTH_SIZE;\n\n\t\t// Create the tag\n\t\tconst tag = this.createTagFromValue(tagName, tagType, tagValue);\n\t\tif (subTags.length > 0) {\n\t\t\ttag.nestedTags = subTags;\n\t\t}\n\n\t\treturn {\n\t\t\ttag,\n\t\t\ttheoreticalLength,\n\t\t\tendIndex: this.offset - 1,\n\t\t};\n\t}\n\n\t/**\n\t * Parse multiple tags\n\t */\n\tparseTags(count: number): Tag<any>[] {\n\t\tconst tags: Tag<any>[] = [];\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\ttags.push(this.parseTag());\n\t\t}\n\t\treturn tags;\n\t}\n\n\t/**\n\t * Read a number with the given fixed size.\n\t * In UTF-8 mode, reads as UTF-8 codepoint. Otherwise reads as big-endian integer.\n\t */\n\tprivate readNumber(fixedSize: number): number {\n\t\tif (this.useUtf8Numbers) {\n\t\t\tconst result = readUtf8Number(this.buffer, this.offset);\n\t\t\tthis.offset = result.newOffset;\n\t\t\treturn Number(result.value);\n\t\t} else {\n\t\t\tlet value: number;\n\t\t\tswitch (fixedSize) {\n\t\t\t\tcase 1:\n\t\t\t\t\tvalue = this.buffer.readUInt8(this.offset);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\tvalue = this.buffer.readUInt16BE(this.offset);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t\tvalue = this.buffer.readUInt32BE(this.offset);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new InvalidECException(`Unsupported number size: ${fixedSize}`);\n\t\t\t}\n\t\t\tthis.offset += fixedSize;\n\t\t\treturn value;\n\t\t}\n\t}\n\n\t/**\n\t * Create a tag instance based on type and raw value bytes\n\t */\n\tprivate createTagFromValue(name: ECTagName, type: ECTagType, value: Buffer): Tag<any> {\n\t\tswitch (type) {\n\t\t\tcase ECTagType.EC_TAGTYPE_CUSTOM:\n\t\t\t\treturn new CustomTag(name, value);\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT8: {\n\t\t\t\tconst numValue = value.length > 0 ? value.readUInt8(0) : 0;\n\t\t\t\treturn new UByteTag(name, numValue);\n\t\t\t}\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT16: {\n\t\t\t\tconst numValue = value.length >= 2 ? value.readUInt16BE(0) : 0;\n\t\t\t\treturn new UShortTag(name, numValue);\n\t\t\t}\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT32: {\n\t\t\t\tconst numValue = value.length >= 4 ? value.readUInt32BE(0) : 0;\n\t\t\t\treturn new UIntTag(name, numValue);\n\t\t\t}\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT64: {\n\t\t\t\tconst numValue = value.length >= 8 ? value.readBigUInt64BE(0) : 0n;\n\t\t\t\treturn new ULongTag(name, numValue);\n\t\t\t}\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT128:\n\t\t\t\tconst numValue = value.length >= 16 ? this.parseUInt128(value) : 0n;\n\t\t\t\treturn new UInt128Tag(name, numValue);\n\n\t\t\tcase ECTagType.EC_TAGTYPE_STRING: {\n\t\t\t\t// Remove null terminator if present\n\t\t\t\tconst strValue = value[value.length - 1] === 0x00 ? value.toString('utf-8', 0, value.length - 1) : value.toString('utf-8');\n\t\t\t\treturn new StringTag(name, strValue);\n\t\t\t}\n\n\t\t\tcase ECTagType.EC_TAGTYPE_DOUBLE: {\n\t\t\t\t// Double is stored as a null-terminated string representation\n\t\t\t\tconst strValue = value[value.length - 1] === 0x00 ? value.toString('utf-8', 0, value.length - 1) : value.toString('utf-8');\n\t\t\t\treturn new DoubleTag(name, parseFloat(strValue));\n\t\t\t}\n\n\t\t\tcase ECTagType.EC_TAGTYPE_IPV4: {\n\t\t\t\t// Read 4 bytes for IP address, 2 bytes for port (BE)\n\t\t\t\tif (value.length !== 6) {\n\t\t\t\t\tthrow new InvalidECException(`Ipv4Tag value must be 6 bytes long, got ${value.length}`);\n\t\t\t\t}\n\t\t\t\tconst address = `${value[0]}.${value[1]}.${value[2]}.${value[3]}`;\n\t\t\t\tconst port = value.readUInt16BE(4);\n\t\t\t\tconst tag = new Ipv4Tag(name);\n\t\t\t\ttag['value'] = { address, port };\n\t\t\t\treturn tag;\n\t\t\t}\n\n\t\t\tcase ECTagType.EC_TAGTYPE_HASH16:\n\t\t\t\treturn new Hash16Tag(name, value);\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UNKNOWN:\n\t\t\tdefault:\n\t\t\t\tthrow new InvalidECException(`Unknown tag type: ${type} for tag ${name}`);\n\t\t}\n\t}\n\n\tprivate parseUInt128(value: Buffer): bigint {\n\t\tif (value.length < 16) {\n\t\t\tthrow new InvalidECException(`UInt128 value must be at least 16 bytes long, got ${value.length}`);\n\t\t}\n\t\treturn (value.readBigUInt64BE(0) << 64n) | value.readBigUInt64BE(8);\n\t}\n\n\t/**\n\t * Get current offset\n\t */\n\tgetOffset(): number {\n\t\treturn this.offset;\n\t}\n}\n","// Utility functions for encoding/decoding numbers and buffers\n\n/**\n * Reads a UTF-8 encoded number from a buffer\n * Treats UTF-8 bytes as a Unicode code point and returns the numeric value\n */\nexport function readUtf8Number(buffer: Buffer, offset: number): { value: bigint; newOffset: number } {\n\t// Determine the length of the UTF-8 sequence from the first byte\n\tconst firstByte = buffer[offset];\n\tlet length: number;\n\n\tif ((firstByte & 0x80) === 0) {\n\t\t// 0xxxxxxx - 1 byte (ASCII)\n\t\tlength = 1;\n\t} else if ((firstByte & 0xe0) === 0xc0) {\n\t\t// 110xxxxx - 2 bytes\n\t\tlength = 2;\n\t} else if ((firstByte & 0xf0) === 0xe0) {\n\t\t// 1110xxxx - 3 bytes\n\t\tlength = 3;\n\t} else if ((firstByte & 0xf8) === 0xf0) {\n\t\t// 11110xxx - 4 bytes\n\t\tlength = 4;\n\t} else {\n\t\tthrow new Error(`Invalid UTF-8 first byte: 0x${firstByte.toString(16)}`);\n\t}\n\n\t// Extract the UTF-8 sequence and decode it\n\tconst utf8Bytes = buffer.subarray(offset, offset + length);\n\tconst str = utf8Bytes.toString('utf-8');\n\tconst codePoint = str.codePointAt(0);\n\n\tif (codePoint === undefined) {\n\t\tthrow new Error('Failed to decode UTF-8 number');\n\t}\n\n\treturn {\n\t\tvalue: BigInt(codePoint),\n\t\tnewOffset: offset + length,\n\t};\n}\n\n/**\n * Encodes a number as UTF-8 code point\n * Treats the number as a Unicode code point and encodes it as UTF-8\n */\nexport function encodeUtf8Number(value: number | bigint): Buffer {\n\tconst num = Number(value);\n\n\t// Encode the number as a UTF-8 code point\n\t// Create a string from the code point and encode as UTF-8\n\tconst str = String.fromCodePoint(num);\n\treturn Buffer.from(str, 'utf-8');\n}\n\n/**\n * Reads a 16-bit unsigned integer\n */\nexport function readUInt16(buffer: Buffer, offset: number, utf8: boolean): number {\n\tif (utf8) {\n\t\tconst result = readUtf8Number(buffer, offset);\n\t\treturn Number(result.value);\n\t}\n\treturn buffer.readUInt16BE(offset);\n}\n\n/**\n * Reads a 32-bit unsigned integer\n */\nexport function readUInt32(buffer: Buffer, offset: number, utf8: boolean): number {\n\tif (utf8) {\n\t\tconst result = readUtf8Number(buffer, offset);\n\t\treturn Number(result.value);\n\t}\n\treturn buffer.readUInt32BE(offset);\n}\n\n/**\n * Reads a 64-bit unsigned integer as bigint\n */\nexport function readUInt64(buffer: Buffer, offset: number): bigint {\n\treturn buffer.readBigUInt64BE(offset);\n}\n\n/**\n * Encodes a 16-bit unsigned integer\n */\nexport function encodeUInt16(value: number, utf8: boolean): Buffer {\n\tif (utf8) {\n\t\treturn encodeUtf8Number(value);\n\t}\n\tconst buf = Buffer.allocUnsafe(2);\n\tbuf.writeUInt16BE(value);\n\treturn buf;\n}\n\n/**\n * Encodes a 32-bit unsigned integer\n */\nexport function encodeUInt32(value: number, utf8: boolean): Buffer {\n\tif (utf8) {\n\t\treturn encodeUtf8Number(value);\n\t}\n\tconst buf = Buffer.allocUnsafe(4);\n\tbuf.writeUInt32BE(value);\n\treturn buf;\n}\n\n/**\n * Encodes a 64-bit unsigned integer\n */\nexport function encodeUInt64(value: bigint): Buffer {\n\tconst buf = Buffer.allocUnsafe(8);\n\tbuf.writeBigUInt64BE(value);\n\treturn buf;\n}\n\n/**\n * Gets the number of bytes needed to encode a value as UTF-8 code point\n */\nexport function numberLength(value: number | bigint): number {\n\tconst num = Number(value);\n\n\t// Determine UTF-8 length based on code point value\n\tif (num < 0x80) {\n\t\treturn 1; // ASCII range\n\t} else if (num < 0x800) {\n\t\treturn 2; // 2-byte UTF-8\n\t} else if (num < 0x10000) {\n\t\treturn 3; // 3-byte UTF-8\n\t} else if (num < 0x110000) {\n\t\treturn 4; // 4-byte UTF-8\n\t} else {\n\t\tthrow new Error(`Code point out of range: ${num}`);\n\t}\n}\n","/**\n * Packet Writer - Serializes EC packets to binary data\n */\n\nimport * as zlib from 'zlib';\nimport { Packet } from './Packet';\nimport { Flags } from './Flags';\nimport { TagEncoder } from '../tag/TagEncoder';\nimport { encodeUtf8Number } from '../Encoding';\n\nexport class PacketWriter {\n\tprivate static readonly HEADER_SIZE = 8; // flags(4) + data_length(4)\n\n\t/**\n\t * Write a packet to a buffer\n\t */\n\tstatic write(packet: Packet): Buffer {\n\t\tconst useUtf8 = packet.flags.isUtf8Numbers();\n\t\tconst useZlib = packet.flags.isZlib();\n\n\t\t// Encode packet data\n\t\tlet data = this.encodePacketData(packet, useUtf8);\n\n\t\t// Compress if needed\n\t\tif (useZlib) {\n\t\t\tdata = this.compress(data);\n\t\t}\n\n\t\t// Create final buffer with header\n\t\tconst buffer = Buffer.allocUnsafe(this.HEADER_SIZE + data.length);\n\n\t\t// Write flags\n\t\tpacket.flags.writeToBuffer(buffer, 0);\n\n\t\t// Write data length\n\t\tbuffer.writeUInt32BE(data.length, 4);\n\n\t\t// Write data\n\t\tdata.copy(buffer, this.HEADER_SIZE);\n\n\t\treturn buffer;\n\t}\n\n\t/**\n\t * Encode packet data (before compression)\n\t */\n\tprivate static encodePacketData(packet: Packet, useUtf8: boolean): Buffer {\n\t\tconst encoder = new TagEncoder(useUtf8);\n\n\t\t// Calculate size\n\t\tlet size = 1; // opcode\n\n\t\tif (useUtf8) {\n\t\t\tconst countBuf = encodeUtf8Number(packet.tags.length);\n\t\t\tsize += countBuf.length;\n\t\t} else {\n\t\t\tsize += 2; // tag count (uint16)\n\t\t}\n\n\t\t// Calculate tags size\n\t\tfor (const tag of packet.tags) {\n\t\t\tsize += encoder.calculateTagSize(tag);\n\t\t}\n\n\t\t// Create buffer\n\t\tconst buffer = Buffer.allocUnsafe(size);\n\t\tlet offset = 0;\n\n\t\t// Write opcode\n\t\tbuffer.writeUInt8(packet.opCode, offset);\n\t\toffset += 1;\n\n\t\t// Write tag count\n\t\tif (useUtf8) {\n\t\t\tconst countBuf = encodeUtf8Number(packet.tags.length);\n\t\t\tcountBuf.copy(buffer, offset);\n\t\t\toffset += countBuf.length;\n\t\t} else {\n\t\t\tbuffer.writeUInt16BE(packet.tags.length, offset);\n\t\t\toffset += 2;\n\t\t}\n\n\t\t// Write tags\n\t\tfor (const tag of packet.tags) {\n\t\t\toffset = encoder.encodeTag(tag, buffer, offset);\n\t\t}\n\n\t\treturn buffer;\n\t}\n\n\t/**\n\t * Compress data with ZLIB\n\t */\n\tprivate static compress(data: Buffer): Buffer {\n\t\treturn zlib.deflateSync(data, {\n\t\t\tlevel: zlib.constants.Z_BEST_COMPRESSION,\n\t\t});\n\t}\n}\n","/**\n * Tag Encoder - Serializes tags to binary data\n */\n\nimport { ECTagType } from '../Codes';\nimport type { Tag } from './Tag';\nimport { encodeUtf8Number, numberLength } from '../Encoding';\n\nexport class TagEncoder {\n\tprivate readonly useUtf8Numbers: boolean;\n\n\tconstructor(useUtf8Numbers: boolean = false) {\n\t\tthis.useUtf8Numbers = useUtf8Numbers;\n\t}\n\n\t/**\n\t * Calculate total size needed for a tag (Physical Buffer Size)\n\t */\n\tcalculateTagSize(tag: Tag<any>): number {\n\t\tlet size = 0;\n\n\t\t// Tag name (with subtags bit)\n\t\tif (this.useUtf8Numbers) {\n\t\t\tconst hasSubtags = (tag.nestedTags?.length ?? 0) > 0 ? 1 : 0;\n\t\t\tconst nameAndSubtags = ((tag.name & 0xffff) << 1) | hasSubtags;\n\t\t\tsize += numberLength(nameAndSubtags);\n\t\t} else {\n\t\t\tsize += 2; // name (uint16)\n\t\t}\n\n\t\t// Type is always a single byte\n\t\tsize += 1; // type (uint8)\n\n\t\t// Tag length (subtags + value)\n\t\t// CRITICAL: The length field itself reports \"Logical Length\" (using fixed header sizes),\n\t\t// NOT the physical byte length. This matches Jamule/aMule protocol expectation.\n\t\t// However, the SIZE of the length field depends on the encoded value of this logical length.\n\t\tconst reportedLength = this.calculateReportedLength(tag);\n\t\tif (this.useUtf8Numbers) {\n\t\t\tsize += numberLength(reportedLength);\n\t\t} else {\n\t\t\tsize += 4; // uint32\n\t\t}\n\n\t\t// Nested tags count (only if has subtags)\n\t\tconst hasSubtags = (tag.nestedTags?.length ?? 0) > 0;\n\t\tif (hasSubtags) {\n\t\t\tconst nestedCount = tag.nestedTags?.length ?? 0;\n\t\t\tif (this.useUtf8Numbers) {\n\t\t\t\tsize += numberLength(nestedCount);\n\t\t\t} else {\n\t\t\t\t// In non-UTF8 mode, nested count is UInt16 (not UInt32)\n\t\t\t\tsize += 2; // uint16\n\t\t\t}\n\t\t}\n\n\t\t// Nested tags\n\t\tif (tag.nestedTags) {\n\t\t\tfor (const nestedTag of tag.nestedTags) {\n\t\t\t\tsize += this.calculateTagSize(nestedTag);\n\t\t\t}\n\t\t}\n\n\t\t// Tag value size\n\t\tsize += this.calculateValueSize(tag);\n\n\t\treturn size;\n\t}\n\n\t/**\n\t * Calculate the \"Reported Length\" of the tag content.\n\t * This logic mimics Jamule's computeTagLength, which assumes FIXED header sizes\n\t * (2 bytes name, 1 byte type, 4 bytes length, 2 bytes subtag count)\n\t * even when UTF-8 encoding is used.\n\t */\n\tprivate calculateReportedLength(tag: Tag<any>): number {\n\t\tlet length = 0;\n\n\t\t// Subtags\n\t\tif (tag.nestedTags) {\n\t\t\tfor (const nestedTag of tag.nestedTags) {\n\t\t\t\t// Reported length of subtag content\n\t\t\t\tlength += this.calculateReportedLength(nestedTag);\n\n\t\t\t\t// Add Fixed Header Overhead\n\t\t\t\t// TAG_NAME_SIZE (2) + TAG_TYPE_SIZE (1) + TAG_LENGTH_SIZE (4)\n\t\t\t\tlength += 7;\n\n\t\t\t\tif ((nestedTag.nestedTags?.length ?? 0) > 0) {\n\t\t\t\t\t// SUBTAG_COUNT_SIZE (2)\n\t\t\t\t\tlength += 2;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Value of this tag\n\t\tlength += this.calculateValueSize(tag);\n\n\t\treturn length;\n\t}\n\n\t/**\n\t * Calculate size of tag value\n\t */\n\tprivate calculateValueSize(tag: Tag<any>): number {\n\t\tconst encoded = tag.encodeValue();\n\n\t\tswitch (tag.type) {\n\t\t\tcase ECTagType.EC_TAGTYPE_CUSTOM:\n\t\t\t\t// Empty custom tags (capability flags) have no data\n\t\t\t\tif (encoded.length === 0) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\t// Custom tags with data have no length prefix\n\t\t\t\treturn encoded.length;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_STRING:\n\t\t\t\t// String value is just the UTF-8 string + null terminator\n\t\t\t\t// No length prefix\n\t\t\t\treturn encoded.length;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT8:\n\t\t\t\treturn 1;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT16:\n\t\t\t\treturn 2;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT32:\n\t\t\t\treturn 4;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT64:\n\t\t\t\treturn 8;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT128:\n\t\t\t\treturn 16;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_DOUBLE:\n\t\t\t\treturn 8;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_IPV4:\n\t\t\t\treturn 6; // 4 bytes IP + 2 bytes port\n\n\t\t\tcase ECTagType.EC_TAGTYPE_HASH16:\n\t\t\t\treturn 16;\n\n\t\t\tdefault:\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\n\t/**\n\t * Encode a tag to a buffer\n\t */\n\tencodeTag(tag: Tag<any>, buffer: Buffer, offset: number): number {\n\t\tlet currentOffset = offset;\n\n\t\t// Write tag name with subtags bit\n\t\tconst hasSubtags = (tag.nestedTags?.length ?? 0) > 0 ? 1 : 0;\n\t\tconst nameAndSubtags = ((tag.name & 0xffff) << 1) | hasSubtags;\n\n\t\tif (this.useUtf8Numbers) {\n\t\t\tconst encoded = encodeUtf8Number(nameAndSubtags);\n\t\t\tencoded.copy(buffer, currentOffset);\n\t\t\tcurrentOffset += encoded.length;\n\t\t} else {\n\t\t\t// In non-UTF8 mode, also encode name with subtags bit\n\t\t\tbuffer.writeUInt16BE(nameAndSubtags, currentOffset);\n\t\t\tcurrentOffset += 2;\n\t\t}\n\n\t\t// Write type (always a single byte)\n\t\tbuffer.writeUInt8(tag.type, currentOffset);\n\t\tcurrentOffset += 1;\n\n\t\t// Write tag length (subtags + value)\n\t\t// Use Reported Length (Logical) for the Value\n\t\tconst tagLength = this.calculateReportedLength(tag);\n\t\tif (this.useUtf8Numbers) {\n\t\t\tconst encoded = encodeUtf8Number(tagLength);\n\t\t\tencoded.copy(buffer, currentOffset);\n\t\t\tcurrentOffset += encoded.length;\n\t\t} else {\n\t\t\tbuffer.writeUInt32BE(tagLength, currentOffset);\n\t\t\tcurrentOffset += 4;\n\t\t}\n\n\t\t// Write nested tags count if has subtags\n\t\tconst nestedCount = tag.nestedTags?.length ?? 0;\n\t\tif (hasSubtags) {\n\t\t\tif (this.useUtf8Numbers) {\n\t\t\t\tconst encoded = encodeUtf8Number(nestedCount);\n\t\t\t\tencoded.copy(buffer, currentOffset);\n\t\t\t\tcurrentOffset += encoded.length;\n\t\t\t} else {\n\t\t\t\t// In non-UTF8 mode, nested count is UInt16 (not UInt32)\n\t\t\t\tbuffer.writeUInt16BE(nestedCount, currentOffset);\n\t\t\t\tcurrentOffset += 2;\n\t\t\t}\n\t\t}\n\n\t\t// Write nested tags\n\t\tif (tag.nestedTags) {\n\t\t\tfor (const nestedTag of tag.nestedTags) {\n\t\t\t\tcurrentOffset = this.encodeTag(nestedTag, buffer, currentOffset);\n\t\t\t}\n\t\t}\n\n\t\t// Write tag value (AFTER subtags)\n\t\tcurrentOffset = this.encodeValue(tag, buffer, currentOffset);\n\n\t\treturn currentOffset;\n\t}\n\n\t/**\n\t * Encode tag value to buffer\n\t */\n\tprivate encodeValue(tag: Tag<any>, buffer: Buffer, offset: number): number {\n\t\tconst encoded = tag.encodeValue();\n\n\t\tswitch (tag.type) {\n\t\t\tcase ECTagType.EC_TAGTYPE_CUSTOM:\n\t\t\t\t// For empty custom tags (like capability flags), don't write any data\n\t\t\t\tif (encoded.length > 0) {\n\t\t\t\t\t// Custom tags with data have no additional length prefix\n\t\t\t\t\t// The tagLength header already specifies the size\n\t\t\t\t\tencoded.copy(buffer, offset);\n\t\t\t\t\treturn offset + encoded.length;\n\t\t\t\t}\n\t\t\t\treturn offset; // Empty custom tag, no data to write\n\n\t\t\tcase ECTagType.EC_TAGTYPE_STRING:\n\t\t\t\t// String value is just the UTF-8 string + null terminator\n\t\t\t\t// No additional length prefix - tagLength header already specifies the size\n\t\t\t\tencoded.copy(buffer, offset);\n\t\t\t\treturn offset + encoded.length;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT8:\n\t\t\t\tbuffer.writeUInt8(tag.getValue(), offset);\n\t\t\t\treturn offset + 1;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT16:\n\t\t\t\tbuffer.writeUInt16BE(tag.getValue(), offset);\n\t\t\t\treturn offset + 2;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT32:\n\t\t\t\tbuffer.writeUInt32BE(tag.getValue(), offset);\n\t\t\t\treturn offset + 4;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT64:\n\t\t\t\tbuffer.writeBigUInt64BE(tag.getValue(), offset);\n\t\t\t\treturn offset + 8;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_DOUBLE:\n\t\t\t\tbuffer.writeDoubleBE(tag.getValue(), offset);\n\t\t\t\treturn offset + 8;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_IPV4:\n\t\t\t\tbuffer.writeUInt32BE(tag.getValue().ip, offset);\n\t\t\t\tbuffer.writeUInt16BE(tag.getValue().port, offset + 4);\n\t\t\t\treturn offset + 6;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT128:\n\t\t\tcase ECTagType.EC_TAGTYPE_HASH16:\n\t\t\t\tencoded.copy(buffer, offset);\n\t\t\t\treturn offset + encoded.length;\n\n\t\t\tdefault:\n\t\t\t\treturn offset;\n\t\t}\n\t}\n\n\t/**\n\t * Encode multiple tags\n\t */\n\tencodeTags(tags: Tag<any>[]): Buffer {\n\t\t// Calculate total size\n\t\tlet totalSize = 0;\n\t\tfor (const tag of tags) {\n\t\t\ttotalSize += this.calculateTagSize(tag);\n\t\t}\n\n\t\t// Allocate buffer and encode\n\t\tconst buffer = Buffer.allocUnsafe(totalSize);\n\t\tlet offset = 0;\n\t\tfor (const tag of tags) {\n\t\t\toffset = this.encodeTag(tag, buffer, offset);\n\t\t}\n\n\t\treturn buffer;\n\t}\n}\n","/**\n * Auth Request - Send client info to initiate authentication\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName } from '../ec/Codes';\nimport { Hash16Tag, UShortTag, StringTag, CustomTag } from '../ec/tag/Tag';\n\nexport class AuthClientInfoRequest extends Request {\n\tconstructor(clientName: string = 'amule-ts-client', clientVersion: string = '1.0.0') {\n\t\tsuper(ECOpCode.EC_OP_AUTH_REQ);\n\n\t\t// Add client info\n\t\tthis.addTag(new StringTag(ECTagName.EC_TAG_CLIENT_NAME, clientName));\n\t\tthis.addTag(new StringTag(ECTagName.EC_TAG_CLIENT_VERSION, clientVersion));\n\n\t\t// Add protocol version\n\t\tthis.addTag(new UShortTag(ECTagName.EC_TAG_PROTOCOL_VERSION, 0x0204));\n\n\t\t// Add capability flags as empty CustomTag (like jamule does)\n\t\tthis.addTag(new CustomTag(ECTagName.EC_TAG_CAN_ZLIB, Buffer.alloc(0)));\n\t\tthis.addTag(new CustomTag(ECTagName.EC_TAG_CAN_UTF8_NUMBERS, Buffer.alloc(0)));\n\t}\n}\n\n/**\n * Auth Password Request - Send hashed password after receiving salt\n */\nexport class AuthPasswordRequest extends Request {\n\tconstructor(hashedPassword: Buffer) {\n\t\tsuper(ECOpCode.EC_OP_AUTH_PASSWD);\n\n\t\t// Add password hash\n\t\tthis.addTag(new Hash16Tag(ECTagName.EC_TAG_PASSWD_HASH, hashedPassword));\n\t}\n}\n","/**\n * Auth Salt Response - Contains authentication salt\n */\n\nimport { Packet } from '../ec/packet/Packet';\nimport { ECTagName } from '../ec/Codes';\nimport { findNumericTag } from '../ec/tag/Tag';\nimport { InvalidECException } from '../exceptions';\n\nexport class AuthSaltResponse {\n\tconstructor(public readonly salt: bigint) {}\n\n\tstatic fromPacket(packet: Packet): AuthSaltResponse {\n\t\tconst saltTag = findNumericTag(packet.tags, ECTagName.EC_TAG_PASSWD_SALT);\n\t\tif (!saltTag) {\n\t\t\tthrow new InvalidECException('Missing salt tag in auth salt response');\n\t\t}\n\n\t\treturn new AuthSaltResponse(saltTag.value);\n\t}\n}\n","/**\n * Password Hasher for aMule EC authentication\n */\n\nimport * as crypto from 'crypto';\n\nexport class PasswordHasher {\n\t/**\n\t * Hash a password with salt using MD5\n\t *\n\t * This matches aMule's password hashing algorithm (from jamule):\n\t * 1. saltHash = MD5(salt.toHexString().uppercase())\n\t * 2. passwordHash = MD5(password)\n\t * 3. return MD5(passwordHash.toHex().lowercase() + saltHash.toHex().lowercase())\n\t *\n\t * @param password The password to hash\n\t * @param salt The salt received from the server\n\t * @returns The hashed password as a Buffer\n\t */\n\tstatic hash(password: string, salt: bigint): Buffer {\n\t\t// Step 1: Hash the salt (as uppercase hex string)\n\t\tconst saltHexUpper = salt.toString(16).toUpperCase().padStart(16, '0');\n\t\tconst saltHash = crypto.createHash('md5').update(saltHexUpper, 'utf-8').digest();\n\n\t\t// Step 2: Hash the password\n\t\tconst passwordHash = crypto.createHash('md5').update(password, 'utf-8').digest();\n\n\t\t// Step 3: Hash the concatenation of both hashes (as lowercase hex strings)\n\t\tconst passwordHashHex = passwordHash.toString('hex').toLowerCase();\n\t\tconst saltHashHex = saltHash.toString('hex').toLowerCase();\n\t\tconst finalHash = crypto\n\t\t\t.createHash('md5')\n\t\t\t.update(passwordHashHex + saltHashHex, 'utf-8')\n\t\t\t.digest();\n\n\t\treturn finalHash;\n\t}\n\n\t/**\n\t * Hash a password without salt (for testing)\n\t */\n\tstatic hashWithoutSalt(password: string): Buffer {\n\t\tconst lowerPassword = password.toLowerCase();\n\t\tconst md5Hash = crypto.createHash('md5');\n\t\tmd5Hash.update(lowerPassword, 'utf-8');\n\t\treturn md5Hash.digest();\n\t}\n}\n","/**\n * Main aMule EC Client\n */\n\nimport { AmuleConnection } from './AmuleConnection';\nimport type { AmuleFile, AmuleTransferringFile, AmuleCategory, AmuleServer, DownloadCommand, SearchType } from '../model';\nimport type { SearchFilters } from '../types';\nimport { EcPrefs } from '../ec/Codes';\n\nexport interface AmuleClientOptions {\n\thost: string;\n\tport: number;\n\tpassword: string;\n\ttimeout?: number;\n}\n\nexport interface StatsResponse {\n\tid: number;\n\ted2kId: number;\n\tkadId?: string;\n\tconnectedServer?: {\n\t\tname?: string;\n\t\tdescription?: string;\n\t\tip: string;\n\t\tport: number;\n\t};\n\tconnectionState?: any; // Will be properly typed later\n\tuploadOverhead: number;\n\tdownloadOverhead: number;\n\tbannedCount: number;\n\tloggerMessage: string[];\n\ttotalSentBytes: number;\n\ttotalReceivedBytes: number;\n\tsharedFileCount: number;\n\tuploadSpeed: number;\n\tdownloadSpeed: number;\n\tuploadSpeedLimit: number;\n\tdownloadSpeedLimit: number;\n\tuploadQueueLength: number;\n\ttotalSourceCount: number;\n\ted2kUsers: number;\n\tkadUsers: number;\n\ted2kFiles: number;\n\tkadFiles: number;\n\tkadNodes: number;\n}\n\nexport interface SearchResultsResponse {\n\tfiles: Array<{\n\t\tfileName: string;\n\t\thash: Buffer;\n\t\tsizeFull: number;\n\t\tdownloadStatus: number;\n\t\tcompleteSourceCount: number;\n\t\tsourceCount: number;\n\t}>;\n}\n\nexport class AmuleClient {\n\tprivate connection: AmuleConnection;\n\n\tconstructor(options: AmuleClientOptions) {\n\t\tthis.connection = new AmuleConnection(options.host, options.port, options.password, options.timeout || 0);\n\t}\n\n\t/**\n\t * Reconnect to the server\n\t */\n\tasync reconnect(): Promise<void> {\n\t\tawait this.connection.reconnect();\n\t}\n\n\t/**\n\t * Get server statistics\n\t */\n\tasync getStats(): Promise<StatsResponse> {\n\t\tconst { StatsRequest } = await import('../request/StatsRequest');\n\t\tconst { StatsResponseParser } = await import('../response/StatsResponse');\n\n\t\tconst request = new StatsRequest();\n\t\tconst packet = await this.connection.sendRequest(request);\n\n\t\treturn StatsResponseParser.fromPacket(packet);\n\t}\n\n\t/**\n\t * Start an asynchronous search\n\t */\n\tasync searchAsync(query: string, searchType?: SearchType, filters?: SearchFilters): Promise<string> {\n\t\tconst { SearchRequest } = await import('../request/SearchRequest');\n\n\t\tconst request = new SearchRequest(query, searchType, filters);\n\t\tawait this.connection.sendRequest(request);\n\n\t\treturn query;\n\t}\n\n\t/**\n\t * Get search status (0-1)\n\t */\n\tasync searchStatus(): Promise<number> {\n\t\tconst { SearchStatusRequest } = await import('../request/SearchStatusRequest');\n\t\tconst { SearchProgressResponse } = await import('../response/SearchProgressResponse');\n\n\t\tconst request = new SearchStatusRequest();\n\t\tconst packet = await this.connection.sendRequest(request);\n\n\t\tconst response = SearchProgressResponse.fromPacket(packet);\n\t\treturn response.progress;\n\t}\n\n\t/**\n\t * Get search results\n\t */\n\tasync searchResults(): Promise<SearchResultsResponse> {\n\t\tconst { SearchResultsRequest } = await import('../request/SearchResultsRequest');\n\t\tconst { SearchResultsResponseParser } = await import('../response/SearchResultsResponse');\n\n\t\tconst request = new SearchResultsRequest();\n\t\tconst packet = await this.connection.sendRequest(request);\n\n\t\treturn SearchResultsResponseParser.fromPacket(packet);\n\t}\n\n\t/**\n\t * Perform a synchronous search (waits for results)\n\t */\n\tasync searchSync(query: string, searchType?: SearchType, filters?: SearchFilters, timeout: number = 30000): Promise<SearchResultsResponse> {\n\t\t// Start search\n\t\tawait this.searchAsync(query, searchType, filters);\n\n\t\t// Wait for completion\n\t\tconst startTime = Date.now();\n\t\twhile (Date.now() - startTime < timeout) {\n\t\t\tconst progress = await this.searchStatus();\n\n\t\t\tif (progress >= 1.0) {\n\t\t\t\treturn await this.searchResults();\n\t\t\t}\n\n\t\t\t// Wait a bit before checking again\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 500));\n\t\t}\n\n\t\tthrow new Error('Search timeout');\n\t}\n\n\t/**\n\t * Stop current search\n\t */\n\tasync searchStop(): Promise<void> {\n\t\tconst { SearchStopRequest } = await import('../request/SearchStopRequest');\n\n\t\tconst request = new SearchStopRequest();\n\t\tawait this.connection.sendRequest(request);\n\t}\n\n\t/**\n\t * Download a file from search results\n\t */\n\tasync downloadSearchResult(hash: Buffer): Promise<void> {\n\t\tconst { DownloadFileRequest } = await import('../request/DownloadFileRequest');\n\n\t\tconst request = new DownloadFileRequest(hash);\n\t\tawait this.connection.sendRequest(request);\n\t}\n\n\t/**\n\t * Download from an ed2k link\n\t */\n\tasync downloadEd2kLink(link: string): Promise<void> {\n\t\tconst { AddLinkRequest } = await import('../request/AddLinkRequest');\n\n\t\tconst request = new AddLinkRequest(link);\n\t\tawait this.connection.sendRequest(request);\n\t}\n\n\t/**\n\t * Get download queue\n\t */\n\tasync getDownloadQueue(): Promise<AmuleTransferringFile[]> {\n\t\tconst { DownloadQueueRequest } = await import('../request/DownloadQueueRequest');\n\t\tconst { DownloadQueueResponseParser } = await import('../response/DownloadQueueResponse');\n\n\t\tconst request = new DownloadQueueRequest();\n\t\tconst packet = await this.connection.sendRequest(request);\n\n\t\treturn DownloadQueueResponseParser.fromPacket(packet).files;\n\t}\n\n\t/**\n\t * Get shared files\n\t */\n\tasync getSharedFiles(): Promise<AmuleFile[]> {\n\t\tconst { SharedFilesRequest } = await import('../request/SharedFilesRequest');\n\t\tconst { SharedFilesResponseParser } = await import('../response/SharedFilesResponse');\n\n\t\tconst request = new SharedFilesRequest();\n\t\tconst packet = await this.connection.sendRequest(request);\n\n\t\treturn SharedFilesResponseParser.fromPacket(packet).files;\n\t}\n\n\t/**\n\t * Get the list of servers\n\t */\n\tasync getServerList(): Promise<AmuleServer[]> {\n\t\tconst { ServerListRequest } = await import('../request/ServerListRequest');\n\t\tconst { ServerListResponseParser } = await import('../response/ServerListResponse');\n\n\t\tconst request = new ServerListRequest();\n\t\tconst packet = await this.connection.sendRequest(request);\n\n\t\treturn ServerListResponseParser.fromPacket(packet).servers;\n\t}\n\n\t/**\n\t * Connect to a specific server\n\t */\n\tasync connectToServer(ip: string, port: number): Promise<void> {\n\t\tconst { ServerConnectRequest } = await import('../request/ServerConnectRequest');\n\n\t\tconst request = new ServerConnectRequest(ip, port);\n\t\tawait this.connection.sendRequest(request);\n\t}\n\n\t/**\n\t * Disconnect from the current server\n\t */\n\tasync disconnectFromServer(): Promise<void> {\n\t\tconst { ServerDisconnectRequest } = await import('../request/ServerDisconnectRequest');\n\n\t\tconst request = new ServerDisconnectRequest();\n\t\tawait this.connection.sendRequest(request);\n\t}\n\n\t/**\n\t * Create a category\n\t */\n\tasync createCategory(category: AmuleCategory): Promise<void> {\n\t\tconst { CreateCategoryRequest } = await import('../request/CreateCategoryRequest');\n\n\t\tconst request = new CreateCategoryRequest(category);\n\t\tawait this.connection.sendRequest(request);\n\t}\n\n\t/**\n\t * Update a category\n\t */\n\tasync updateCategory(id: number, category: AmuleCategory): Promise<void> {\n\t\tconst { UpdateCategoryRequest } = await import('../request/UpdateCategoryRequest');\n\n\t\tconst request = new UpdateCategoryRequest(id, category);\n\t\tawait this.connection.sendRequest(request);\n\t}\n\n\t/**\n\t * Delete a category\n\t */\n\tasync deleteCategory(id: number): Promise<void> {\n\t\tconst { DeleteCategoryRequest } = await import('../request/DeleteCategoryRequest');\n\n\t\tconst request = new DeleteCategoryRequest(id);\n\t\tawait this.connection.sendRequest(request);\n\t}\n\n\t/**\n\t * Get all categories\n\t */\n\tasync getCategories(): Promise<AmuleCategory[]> {\n\t\tconst { GetPreferencesRequest } = await import('../request/GetPreferencesRequest');\n\t\tconst { PreferencesResponseParser } = await import('../response/PreferencesResponse');\n\n\t\tconst request = new GetPreferencesRequest(EcPrefs.EC_PREFS_CATEGORIES);\n\t\tconst packet = await this.connection.sendRequest(request);\n\t\treturn PreferencesResponseParser.fromPacket(packet).categories;\n\t}\n\n\t/**\n\t * Set file category\n\t */\n\tasync setFileCategory(hash: Buffer, categoryId: number): Promise<void> {\n\t\tconst { SetFileCategoryRequest } = await import('../request/SetFileCategoryRequest');\n\n\t\tconst request = new SetFileCategoryRequest(hash, categoryId);\n\t\tawait this.connection.sendRequest(request);\n\t}\n\n\t/**\n\t * Send a download command (PAUSE, RESUME, STOP, DELETE, etc.)\n\t */\n\tasync sendDownloadCommand(hash: Buffer, command: DownloadCommand): Promise<void> {\n\t\tconst { DownloadCommandRequest } = await import('../request/DownloadCommandRequest');\n\n\t\tconst request = new DownloadCommandRequest(hash, command);\n\t\tawait this.connection.sendRequest(request);\n\t}\n\n\t/**\n\t * Pause a download\n\t */\n\tasync pauseDownload(hash: Buffer): Promise<void> {\n\t\tconst { DownloadCommand } = await import('../model');\n\t\tawait this.sendDownloadCommand(hash, DownloadCommand.PAUSE);\n\t}\n\n\t/**\n\t * Resume a download\n\t */\n\tasync resumeDownload(hash: Buffer): Promise<void> {\n\t\tconst { DownloadCommand } = await import('../model');\n\t\tawait this.sendDownloadCommand(hash, DownloadCommand.RESUME);\n\t}\n\n\t/**\n\t * Stop a download\n\t */\n\tasync stopDownload(hash: Buffer): Promise<void> {\n\t\tconst { DownloadCommand } = await import('../model');\n\t\tawait this.sendDownloadCommand(hash, DownloadCommand.STOP);\n\t}\n\n\t/**\n\t * Delete a download\n\t */\n\tasync deleteDownload(hash: Buffer): Promise<void> {\n\t\tconst { DownloadCommand } = await import('../model');\n\t\tawait this.sendDownloadCommand(hash, DownloadCommand.DELETE);\n\t}\n}\n","/**\n * aMule EC Client for TypeScript\n *\n * A TypeScript client library for interacting with aMule's External Connection (EC) protocol.\n *\n * @packageDocumentation\n */\n\n// Main client\nexport { AmuleClient } from './client/AmuleClient';\nexport type { AmuleClientOptions, StatsResponse, SearchResultsResponse } from './client/AmuleClient';\n\n// Models\nexport * from './model';\n\n// Enums and constants\nexport { ECOpCode, ECTagName, ECDetailLevel, ECSearchType, EcPrefs, ProtocolVersion } from './ec/Codes';\n\n// Exceptions\nexport { AmuleException, InvalidECException, CommunicationException, ServerException } from './exceptions';\n\n// Types\nexport type { SearchFilters, ConnectionState, SearchFileDownloadStatus } from './types';\n\n// Protocol components (for advanced usage)\nexport { Packet } from './ec/packet/Packet';\nexport { Flags } from './ec/packet/Flags';\nexport { PacketWriter } from './ec/packet/PacketWriter';\nexport { PacketParser } from './ec/packet/PacketParser';\n\n// Tags (for advanced usage)\nexport { Tag, CustomTag, UByteTag, UShortTag, UIntTag, ULongTag, UInt128Tag, StringTag, DoubleTag, Ipv4Tag, Hash16Tag } from './ec/tag/Tag';\n"],"mappings":"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","names":["ProtocolVersion","ECOpCode","ECTagName","ECDetailLevel","ECSearchType","EcPrefs","tag","FileStatus","DownloadCommand","SearchType","toNumber","numValue","zlib","hasSubtags","StatsRequest","StatsResponseParser","SearchRequest","SearchStatusRequest","SearchProgressResponse","SearchResultsRequest","SearchResultsResponseParser","SearchStopRequest","DownloadFileRequest","AddLinkRequest","DownloadQueueRequest","DownloadQueueResponseParser","SharedFilesRequest","SharedFilesResponseParser","ServerListRequest","ServerListResponseParser","ServerConnectRequest","ServerDisconnectRequest","CreateCategoryRequest","UpdateCategoryRequest","DeleteCategoryRequest","GetPreferencesRequest","PreferencesResponseParser","SetFileCategoryRequest","DownloadCommandRequest","DownloadCommand"]}
|
|
1
|
+
{"version":3,"sources":["../src/ec/packet/Flags.ts","../src/ec/packet/Packet.ts","../src/ec/Codes.ts","../src/ec/tag/Tag.ts","../src/request/Request.ts","../src/request/StatsRequest.ts","../src/response/StatsResponse.ts","../src/model/index.ts","../src/request/SearchRequest.ts","../src/request/SearchStatusRequest.ts","../src/response/SearchProgressResponse.ts","../src/request/SearchResultsRequest.ts","../src/response/SearchResultsResponse.ts","../src/request/SearchStopRequest.ts","../src/request/DownloadFileRequest.ts","../src/request/AddLinkRequest.ts","../src/request/DownloadQueueRequest.ts","../src/response/DownloadQueueResponse.ts","../src/request/SharedFilesRequest.ts","../src/response/SharedFilesResponse.ts","../src/request/ServerListRequest.ts","../src/response/ServerListResponse.ts","../src/request/ServerConnectRequest.ts","../src/request/ServerDisconnectRequest.ts","../src/request/CreateCategoryRequest.ts","../src/request/UpdateCategoryRequest.ts","../src/request/DeleteCategoryRequest.ts","../src/request/GetPreferencesRequest.ts","../src/response/PreferencesResponse.ts","../src/request/SetFileCategoryRequest.ts","../src/request/DownloadCommandRequest.ts","../src/client/AmuleConnection.ts","../src/exceptions/index.ts","../src/ec/packet/PacketParser.ts","../src/ec/tag/TagParser.ts","../src/ec/Encoding.ts","../src/ec/packet/PacketWriter.ts","../src/ec/tag/TagEncoder.ts","../src/request/AuthRequest.ts","../src/response/AuthSaltResponse.ts","../src/auth/PasswordHasher.ts","../src/client/AmuleClient.ts","../src/index.ts"],"sourcesContent":["/**\n * Packet flags for EC protocol\n */\n\nexport class Flags {\n\tprivate static readonly FLAG_ACCEPTS = 0x10;\n\tprivate static readonly FLAG_ZLIB = 0x01;\n\tprivate static readonly FLAG_UTF8_NUMBERS = 0x02;\n\tprivate static readonly FLAG_ALWAYS_SET = 0x20; // Bit 5 always set to distinguish from older clients\n\n\tprivate readonly flags: number;\n\n\tconstructor(flags?: number) {\n\t\tthis.flags = flags ?? 0;\n\t}\n\n\t/**\n\t * Create flags from buffer\n\t */\n\tstatic fromBuffer(buffer: Buffer, offset: number = 0): Flags {\n\t\tconst flags = buffer.readUInt32BE(offset);\n\t\treturn new Flags(flags);\n\t}\n\n\t/**\n\t * Write flags to buffer\n\t */\n\twriteToBuffer(buffer: Buffer, offset: number = 0): void {\n\t\tbuffer.writeUInt32BE(this.flags, offset);\n\t}\n\n\t/**\n\t * Check if UTF-8 number encoding is supported/accepted\n\t */\n\tisUtf8NumbersAccepted(): boolean {\n\t\treturn (this.flags & Flags.FLAG_ACCEPTS) > 0 && (this.flags & Flags.FLAG_UTF8_NUMBERS) > 0;\n\t}\n\n\t/**\n\t * Check if ZLIB compression is supported/accepted\n\t */\n\tisZlibAccepted(): boolean {\n\t\treturn (this.flags & Flags.FLAG_ACCEPTS) > 0 && (this.flags & Flags.FLAG_ZLIB) > 0;\n\t}\n\n\t/**\n\t * Check if UTF-8 number encoding is used\n\t */\n\tisUtf8Numbers(): boolean {\n\t\treturn (this.flags & Flags.FLAG_UTF8_NUMBERS) > 0;\n\t}\n\n\t/**\n\t * Check if ZLIB compression is used\n\t */\n\tisZlib(): boolean {\n\t\treturn (this.flags & Flags.FLAG_ZLIB) > 0;\n\t}\n\n\t/**\n\t * Create flags accepting UTF-8 numbers and ZLIB\n\t */\n\tstatic accept(): Flags {\n\t\treturn new Flags(Flags.FLAG_ACCEPTS | Flags.FLAG_UTF8_NUMBERS | Flags.FLAG_ZLIB | Flags.FLAG_ALWAYS_SET);\n\t}\n\n\t/**\n\t * Create flags using UTF-8 numbers\n\t */\n\tstatic useUtf8Numbers(): Flags {\n\t\treturn new Flags(Flags.FLAG_UTF8_NUMBERS | Flags.FLAG_ALWAYS_SET);\n\t}\n\n\t/**\n\t * Create flags without UTF-8 numbers (required for search)\n\t */\n\tstatic noUtf8(): Flags {\n\t\treturn new Flags(Flags.FLAG_ALWAYS_SET);\n\t}\n\n\t/**\n\t * Create flags using ZLIB compression\n\t */\n\tstatic useZlib(): Flags {\n\t\treturn new Flags(Flags.FLAG_ZLIB | Flags.FLAG_ALWAYS_SET);\n\t}\n\n\t/**\n\t * Get numeric value of flags\n\t */\n\tgetValue(): number {\n\t\treturn this.flags;\n\t}\n}\n","/**\n * EC Packet structure\n */\n\nimport { ECOpCode } from '../Codes';\nimport { Flags } from './Flags';\nimport type { Tag } from '../tag/Tag';\n\nexport class Packet {\n\tprivate static readonly EC_CURRENT_PROTOCOL_VERSION = 0x0204;\n\n\tconstructor(\n\t\tpublic readonly opCode: ECOpCode,\n\t\tpublic readonly flags: Flags = new Flags(),\n\t\tpublic readonly tags: Tag<any>[] = []\n\t) {}\n\n\t/**\n\t * Add a tag to the packet\n\t */\n\taddTag(tag: Tag<any>): this {\n\t\tthis.tags.push(tag);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Add multiple tags to the packet\n\t */\n\taddTags(tags: Tag<any>[]): this {\n\t\tthis.tags.push(...tags);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Get protocol version\n\t */\n\tstatic getProtocolVersion(): number {\n\t\treturn Packet.EC_CURRENT_PROTOCOL_VERSION;\n\t}\n\n\t/**\n\t * Find a tag by name\n\t */\n\tfindTag(tagName: number): Tag<any> | undefined {\n\t\treturn this.tags.find((tag) => tag.name === tagName);\n\t}\n\n\t/**\n\t * Get all tags with a specific name\n\t */\n\tfindAllTags(tagName: number): Tag<any>[] {\n\t\treturn this.tags.filter((tag) => tag.name === tagName);\n\t}\n\n\t/**\n\t * Check if packet has a specific tag\n\t */\n\thasTag(tagName: number): boolean {\n\t\treturn this.findTag(tagName) !== undefined;\n\t}\n}\n","// EC Protocol constants and enumerations\n\nexport enum ProtocolVersion {\n\tEC_CURRENT_PROTOCOL_VERSION = 0x0204,\n}\n\nexport enum ECFlag {\n\tEC_FLAG_ZLIB = 0x00000001,\n\tEC_FLAG_UTF8_NUMBERS = 0x00000002,\n\tEC_FLAG_HAS_ID = 0x00000004,\n\tEC_FLAG_ACCEPTS = 0x00000010,\n\tEC_FLAG_UNKNOWN_MASK = 0xff7f7f08,\n}\n\nexport enum ECOpCode {\n\tEC_OP_NOOP = 0x01,\n\tEC_OP_AUTH_REQ = 0x02,\n\tEC_OP_AUTH_FAIL = 0x03,\n\tEC_OP_AUTH_OK = 0x04,\n\tEC_OP_FAILED = 0x05,\n\tEC_OP_STRINGS = 0x06,\n\tEC_OP_MISC_DATA = 0x07,\n\tEC_OP_SHUTDOWN = 0x08,\n\tEC_OP_ADD_LINK = 0x09,\n\tEC_OP_STAT_REQ = 0x0a,\n\tEC_OP_GET_CONNSTATE = 0x0b,\n\tEC_OP_STATS = 0x0c,\n\tEC_OP_GET_DLOAD_QUEUE = 0x0d,\n\tEC_OP_GET_ULOAD_QUEUE = 0x0e,\n\tEC_OP_GET_SHARED_FILES = 0x10,\n\tEC_OP_SHARED_SET_PRIO = 0x11,\n\tEC_OP_PARTFILE_SWAP_A4AF_THIS = 0x16,\n\tEC_OP_PARTFILE_SWAP_A4AF_THIS_AUTO = 0x17,\n\tEC_OP_PARTFILE_SWAP_A4AF_OTHERS = 0x18,\n\tEC_OP_PARTFILE_PAUSE = 0x19,\n\tEC_OP_PARTFILE_RESUME = 0x1a,\n\tEC_OP_PARTFILE_STOP = 0x1b,\n\tEC_OP_PARTFILE_PRIO_SET = 0x1c,\n\tEC_OP_PARTFILE_DELETE = 0x1d,\n\tEC_OP_PARTFILE_SET_CAT = 0x1e,\n\tEC_OP_DLOAD_QUEUE = 0x1f,\n\tEC_OP_ULOAD_QUEUE = 0x20,\n\tEC_OP_SHARED_FILES = 0x22,\n\tEC_OP_SHAREDFILES_RELOAD = 0x23,\n\tEC_OP_RENAME_FILE = 0x25,\n\tEC_OP_SEARCH_START = 0x26,\n\tEC_OP_SEARCH_STOP = 0x27,\n\tEC_OP_SEARCH_RESULTS = 0x28,\n\tEC_OP_SEARCH_PROGRESS = 0x29,\n\tEC_OP_DOWNLOAD_SEARCH_RESULT = 0x2a,\n\tEC_OP_IPFILTER_RELOAD = 0x2b,\n\tEC_OP_GET_SERVER_LIST = 0x2c,\n\tEC_OP_SERVER_LIST = 0x2d,\n\tEC_OP_SERVER_DISCONNECT = 0x2e,\n\tEC_OP_SERVER_CONNECT = 0x2f,\n\tEC_OP_SERVER_REMOVE = 0x30,\n\tEC_OP_SERVER_ADD = 0x31,\n\tEC_OP_SERVER_UPDATE_FROM_URL = 0x32,\n\tEC_OP_ADDLOGLINE = 0x33,\n\tEC_OP_ADDDEBUGLOGLINE = 0x34,\n\tEC_OP_GET_LOG = 0x35,\n\tEC_OP_GET_DEBUGLOG = 0x36,\n\tEC_OP_GET_SERVERINFO = 0x37,\n\tEC_OP_LOG = 0x38,\n\tEC_OP_DEBUGLOG = 0x39,\n\tEC_OP_SERVERINFO = 0x3a,\n\tEC_OP_RESET_LOG = 0x3b,\n\tEC_OP_RESET_DEBUGLOG = 0x3c,\n\tEC_OP_CLEAR_SERVERINFO = 0x3d,\n\tEC_OP_GET_LAST_LOG_ENTRY = 0x3e,\n\tEC_OP_GET_PREFERENCES = 0x3f,\n\tEC_OP_SET_PREFERENCES = 0x40,\n\tEC_OP_CREATE_CATEGORY = 0x41,\n\tEC_OP_UPDATE_CATEGORY = 0x42,\n\tEC_OP_DELETE_CATEGORY = 0x43,\n\tEC_OP_GET_STATSGRAPHS = 0x44,\n\tEC_OP_STATSGRAPHS = 0x45,\n\tEC_OP_GET_STATSTREE = 0x46,\n\tEC_OP_STATSTREE = 0x47,\n\tEC_OP_KAD_START = 0x48,\n\tEC_OP_KAD_STOP = 0x49,\n\tEC_OP_CONNECT = 0x4a,\n\tEC_OP_DISCONNECT = 0x4b,\n\tEC_OP_KAD_UPDATE_FROM_URL = 0x4d,\n\tEC_OP_KAD_BOOTSTRAP_FROM_IP = 0x4e,\n\tEC_OP_AUTH_SALT = 0x4f,\n\tEC_OP_AUTH_PASSWD = 0x50,\n\tEC_OP_IPFILTER_UPDATE = 0x51,\n\tEC_OP_GET_UPDATE = 0x52,\n\tEC_OP_CLEAR_COMPLETED = 0x53,\n\tEC_OP_CLIENT_SWAP_TO_ANOTHER_FILE = 0x54,\n\tEC_OP_SHARED_FILE_SET_COMMENT = 0x55,\n\tEC_OP_SERVER_SET_STATIC_PRIO = 0x56,\n\tEC_OP_FRIEND = 0x57,\n}\n\nexport enum ECTagName {\n\tEC_TAG_STRING = 0x0000,\n\tEC_TAG_PASSWD_HASH = 0x0001,\n\tEC_TAG_PROTOCOL_VERSION = 0x0002,\n\tEC_TAG_VERSION_ID = 0x0003,\n\tEC_TAG_DETAIL_LEVEL = 0x0004,\n\tEC_TAG_CONNSTATE = 0x0005,\n\tEC_TAG_ED2K_ID = 0x0006,\n\tEC_TAG_LOG_TO_STATUS = 0x0007,\n\tEC_TAG_BOOTSTRAP_IP = 0x0008,\n\tEC_TAG_BOOTSTRAP_PORT = 0x0009,\n\tEC_TAG_CLIENT_ID = 0x000a,\n\tEC_TAG_PASSWD_SALT = 0x000b,\n\tEC_TAG_CAN_ZLIB = 0x000c,\n\tEC_TAG_CAN_UTF8_NUMBERS = 0x000d,\n\tEC_TAG_CAN_NOTIFY = 0x000e,\n\tEC_TAG_ECID = 0x000f,\n\tEC_TAG_KAD_ID = 0x0010,\n\tEC_TAG_CLIENT_NAME = 0x0100,\n\tEC_TAG_CLIENT_VERSION = 0x0101,\n\tEC_TAG_CLIENT_MOD = 0x0102,\n\tEC_TAG_STATS_UL_SPEED = 0x0200,\n\tEC_TAG_STATS_DL_SPEED = 0x0201,\n\tEC_TAG_STATS_UL_SPEED_LIMIT = 0x0202,\n\tEC_TAG_STATS_DL_SPEED_LIMIT = 0x0203,\n\tEC_TAG_STATS_UP_OVERHEAD = 0x0204,\n\tEC_TAG_STATS_DOWN_OVERHEAD = 0x0205,\n\tEC_TAG_STATS_TOTAL_SRC_COUNT = 0x0206,\n\tEC_TAG_STATS_BANNED_COUNT = 0x0207,\n\tEC_TAG_STATS_UL_QUEUE_LEN = 0x0208,\n\tEC_TAG_STATS_ED2K_USERS = 0x0209,\n\tEC_TAG_STATS_KAD_USERS = 0x020a,\n\tEC_TAG_STATS_ED2K_FILES = 0x020b,\n\tEC_TAG_STATS_KAD_FILES = 0x020c,\n\tEC_TAG_STATS_LOGGER_MESSAGE = 0x020d,\n\tEC_TAG_STATS_KAD_FIREWALLED_UDP = 0x020e,\n\tEC_TAG_STATS_KAD_INDEXED_SOURCES = 0x020f,\n\tEC_TAG_STATS_KAD_INDEXED_KEYWORDS = 0x0210,\n\tEC_TAG_STATS_KAD_INDEXED_NOTES = 0x0211,\n\tEC_TAG_STATS_KAD_INDEXED_LOAD = 0x0212,\n\tEC_TAG_STATS_KAD_IP_ADRESS = 0x0213,\n\tEC_TAG_STATS_BUDDY_STATUS = 0x0214,\n\tEC_TAG_STATS_BUDDY_IP = 0x0215,\n\tEC_TAG_STATS_BUDDY_PORT = 0x0216,\n\tEC_TAG_STATS_KAD_IN_LAN_MODE = 0x0217,\n\tEC_TAG_STATS_TOTAL_SENT_BYTES = 0x0218,\n\tEC_TAG_STATS_TOTAL_RECEIVED_BYTES = 0x0219,\n\tEC_TAG_STATS_SHARED_FILE_COUNT = 0x021a,\n\tEC_TAG_STATS_KAD_NODES = 0x021b,\n\tEC_TAG_PARTFILE = 0x0300,\n\tEC_TAG_PARTFILE_NAME = 0x0301,\n\tEC_TAG_PARTFILE_PARTMETID = 0x0302,\n\tEC_TAG_PARTFILE_SIZE_FULL = 0x0303,\n\tEC_TAG_PARTFILE_SIZE_XFER = 0x0304,\n\tEC_TAG_PARTFILE_SIZE_XFER_UP = 0x0305,\n\tEC_TAG_PARTFILE_SIZE_DONE = 0x0306,\n\tEC_TAG_PARTFILE_SPEED = 0x0307,\n\tEC_TAG_PARTFILE_STATUS = 0x0308,\n\tEC_TAG_PARTFILE_PRIO = 0x0309,\n\tEC_TAG_PARTFILE_SOURCE_COUNT = 0x030a,\n\tEC_TAG_PARTFILE_SOURCE_COUNT_A4AF = 0x030b,\n\tEC_TAG_PARTFILE_SOURCE_COUNT_NOT_CURRENT = 0x030c,\n\tEC_TAG_PARTFILE_SOURCE_COUNT_XFER = 0x030d,\n\tEC_TAG_PARTFILE_ED2K_LINK = 0x030e,\n\tEC_TAG_PARTFILE_CAT = 0x030f,\n\tEC_TAG_PARTFILE_LAST_RECV = 0x0310,\n\tEC_TAG_PARTFILE_LAST_SEEN_COMP = 0x0311,\n\tEC_TAG_PARTFILE_PART_STATUS = 0x0312,\n\tEC_TAG_PARTFILE_GAP_STATUS = 0x0313,\n\tEC_TAG_PARTFILE_REQ_STATUS = 0x0314,\n\tEC_TAG_PARTFILE_SOURCE_NAMES = 0x0315,\n\tEC_TAG_PARTFILE_COMMENTS = 0x0316,\n\tEC_TAG_PARTFILE_STOPPED = 0x0317,\n\tEC_TAG_PARTFILE_DOWNLOAD_ACTIVE = 0x0318,\n\tEC_TAG_PARTFILE_LOST_CORRUPTION = 0x0319,\n\tEC_TAG_PARTFILE_GAINED_COMPRESSION = 0x031a,\n\tEC_TAG_PARTFILE_SAVED_ICH = 0x031b,\n\tEC_TAG_PARTFILE_SOURCE_NAMES_COUNTS = 0x031c,\n\tEC_TAG_PARTFILE_AVAILABLE_PARTS = 0x031d,\n\tEC_TAG_PARTFILE_HASH = 0x031e,\n\tEC_TAG_PARTFILE_SHARED = 0x031f,\n\tEC_TAG_PARTFILE_HASHED_PART_COUNT = 0x0320,\n\tEC_TAG_PARTFILE_A4AFAUTO = 0x0321,\n\tEC_TAG_PARTFILE_A4AF_SOURCES = 0x0322,\n\tEC_TAG_KNOWNFILE = 0x0400,\n\tEC_TAG_KNOWNFILE_XFERRED = 0x0401,\n\tEC_TAG_KNOWNFILE_XFERRED_ALL = 0x0402,\n\tEC_TAG_KNOWNFILE_REQ_COUNT = 0x0403,\n\tEC_TAG_KNOWNFILE_REQ_COUNT_ALL = 0x0404,\n\tEC_TAG_KNOWNFILE_ACCEPT_COUNT = 0x0405,\n\tEC_TAG_KNOWNFILE_ACCEPT_COUNT_ALL = 0x0406,\n\tEC_TAG_KNOWNFILE_AICH_MASTERHASH = 0x0407,\n\tEC_TAG_KNOWNFILE_FILENAME = 0x0408,\n\tEC_TAG_KNOWNFILE_COMPLETE_SOURCES_LOW = 0x0409,\n\tEC_TAG_KNOWNFILE_COMPLETE_SOURCES_HIGH = 0x040a,\n\tEC_TAG_KNOWNFILE_PRIO = 0x040b,\n\tEC_TAG_KNOWNFILE_ON_QUEUE = 0x040c,\n\tEC_TAG_KNOWNFILE_COMPLETE_SOURCES = 0x040d,\n\tEC_TAG_KNOWNFILE_COMMENT = 0x040e,\n\tEC_TAG_KNOWNFILE_RATING = 0x040f,\n\tEC_TAG_SERVER = 0x0500,\n\tEC_TAG_SERVER_NAME = 0x0501,\n\tEC_TAG_SERVER_DESC = 0x0502,\n\tEC_TAG_SERVER_ADDRESS = 0x0503,\n\tEC_TAG_SERVER_PING = 0x0504,\n\tEC_TAG_SERVER_USERS = 0x0505,\n\tEC_TAG_SERVER_USERS_MAX = 0x0506,\n\tEC_TAG_SERVER_FILES = 0x0507,\n\tEC_TAG_SERVER_PRIO = 0x0508,\n\tEC_TAG_SERVER_FAILED = 0x0509,\n\tEC_TAG_SERVER_STATIC = 0x050a,\n\tEC_TAG_SERVER_VERSION = 0x050b,\n\tEC_TAG_SERVER_IP = 0x050c,\n\tEC_TAG_SERVER_PORT = 0x050d,\n\tEC_TAG_CLIENT = 0x0600,\n\tEC_TAG_CLIENT_SOFTWARE = 0x0601,\n\tEC_TAG_CLIENT_SCORE = 0x0602,\n\tEC_TAG_CLIENT_HASH = 0x0603,\n\tEC_TAG_CLIENT_FRIEND_SLOT = 0x0604,\n\tEC_TAG_CLIENT_WAIT_TIME = 0x0605,\n\tEC_TAG_CLIENT_XFER_TIME = 0x0606,\n\tEC_TAG_CLIENT_QUEUE_TIME = 0x0607,\n\tEC_TAG_CLIENT_LAST_TIME = 0x0608,\n\tEC_TAG_CLIENT_UPLOAD_SESSION = 0x0609,\n\tEC_TAG_CLIENT_UPLOAD_TOTAL = 0x060a,\n\tEC_TAG_CLIENT_DOWNLOAD_TOTAL = 0x060b,\n\tEC_TAG_CLIENT_DOWNLOAD_STATE = 0x060c,\n\tEC_TAG_CLIENT_UP_SPEED = 0x060d,\n\tEC_TAG_CLIENT_DOWN_SPEED = 0x060e,\n\tEC_TAG_CLIENT_FROM = 0x060f,\n\tEC_TAG_CLIENT_USER_IP = 0x0610,\n\tEC_TAG_CLIENT_USER_PORT = 0x0611,\n\tEC_TAG_CLIENT_SERVER_IP = 0x0612,\n\tEC_TAG_CLIENT_SERVER_PORT = 0x0613,\n\tEC_TAG_CLIENT_SERVER_NAME = 0x0614,\n\tEC_TAG_CLIENT_SOFT_VER_STR = 0x0615,\n\tEC_TAG_CLIENT_WAITING_POSITION = 0x0616,\n\tEC_TAG_CLIENT_IDENT_STATE = 0x0617,\n\tEC_TAG_CLIENT_OBFUSCATION_STATUS = 0x0618,\n\tEC_TAG_CLIENT_CURRENTLYUNUSED1 = 0x0619,\n\tEC_TAG_CLIENT_REMOTE_QUEUE_RANK = 0x061a,\n\tEC_TAG_CLIENT_DISABLE_VIEW_SHARED = 0x061b,\n\tEC_TAG_CLIENT_UPLOAD_STATE = 0x061c,\n\tEC_TAG_CLIENT_EXT_PROTOCOL = 0x061d,\n\tEC_TAG_CLIENT_USER_ID = 0x061e,\n\tEC_TAG_CLIENT_UPLOAD_FILE = 0x061f,\n\tEC_TAG_CLIENT_REQUEST_FILE = 0x0620,\n\tEC_TAG_CLIENT_A4AF_FILES = 0x0621,\n\tEC_TAG_CLIENT_OLD_REMOTE_QUEUE_RANK = 0x0622,\n\tEC_TAG_CLIENT_KAD_PORT = 0x0623,\n\tEC_TAG_CLIENT_PART_STATUS = 0x0624,\n\tEC_TAG_CLIENT_NEXT_REQUESTED_PART = 0x0625,\n\tEC_TAG_CLIENT_LAST_DOWNLOADING_PART = 0x0626,\n\tEC_TAG_CLIENT_REMOTE_FILENAME = 0x0627,\n\tEC_TAG_CLIENT_MOD_VERSION = 0x0628,\n\tEC_TAG_CLIENT_OS_INFO = 0x0629,\n\tEC_TAG_CLIENT_AVAILABLE_PARTS = 0x062a,\n\tEC_TAG_CLIENT_UPLOAD_PART_STATUS = 0x062b,\n\tEC_TAG_SEARCHFILE = 0x0700,\n\tEC_TAG_SEARCH_TYPE = 0x0701,\n\tEC_TAG_SEARCH_NAME = 0x0702,\n\tEC_TAG_SEARCH_MIN_SIZE = 0x0703,\n\tEC_TAG_SEARCH_MAX_SIZE = 0x0704,\n\tEC_TAG_SEARCH_FILE_TYPE = 0x0705,\n\tEC_TAG_SEARCH_EXTENSION = 0x0706,\n\tEC_TAG_SEARCH_AVAILABILITY = 0x0707,\n\tEC_TAG_SEARCH_STATUS = 0x0708,\n\tEC_TAG_SEARCH_PARENT = 0x0709,\n\tEC_TAG_FRIEND = 0x0800,\n\tEC_TAG_FRIEND_NAME = 0x0801,\n\tEC_TAG_FRIEND_HASH = 0x0802,\n\tEC_TAG_FRIEND_IP = 0x0803,\n\tEC_TAG_FRIEND_PORT = 0x0804,\n\tEC_TAG_FRIEND_CLIENT = 0x0805,\n\tEC_TAG_FRIEND_ADD = 0x0806,\n\tEC_TAG_FRIEND_REMOVE = 0x0807,\n\tEC_TAG_FRIEND_FRIENDSLOT = 0x0808,\n\tEC_TAG_FRIEND_SHARED = 0x0809,\n\tEC_TAG_SELECT_PREFS = 0x1000,\n\tEC_TAG_PREFS_CATEGORIES = 0x1100,\n\tEC_TAG_CATEGORY = 0x1101,\n\tEC_TAG_CATEGORY_TITLE = 0x1102,\n\tEC_TAG_CATEGORY_PATH = 0x1103,\n\tEC_TAG_CATEGORY_COMMENT = 0x1104,\n\tEC_TAG_CATEGORY_COLOR = 0x1105,\n\tEC_TAG_CATEGORY_PRIO = 0x1106,\n\tEC_TAG_PREFS_GENERAL = 0x1200,\n\tEC_TAG_USER_NICK = 0x1201,\n\tEC_TAG_USER_HASH = 0x1202,\n\tEC_TAG_USER_HOST = 0x1203,\n\tEC_TAG_GENERAL_CHECK_NEW_VERSION = 0x1204,\n\tEC_TAG_PREFS_CONNECTIONS = 0x1300,\n\tEC_TAG_CONN_DL_CAP = 0x1301,\n\tEC_TAG_CONN_UL_CAP = 0x1302,\n\tEC_TAG_CONN_MAX_DL = 0x1303,\n\tEC_TAG_CONN_MAX_UL = 0x1304,\n\tEC_TAG_CONN_SLOT_ALLOCATION = 0x1305,\n\tEC_TAG_CONN_TCP_PORT = 0x1306,\n\tEC_TAG_CONN_UDP_PORT = 0x1307,\n\tEC_TAG_CONN_UDP_DISABLE = 0x1308,\n\tEC_TAG_CONN_MAX_FILE_SOURCES = 0x1309,\n\tEC_TAG_CONN_MAX_CONN = 0x130a,\n\tEC_TAG_CONN_AUTOCONNECT = 0x130b,\n\tEC_TAG_CONN_RECONNECT = 0x130c,\n\tEC_TAG_NETWORK_ED2K = 0x130d,\n\tEC_TAG_NETWORK_KADEMLIA = 0x130e,\n\tEC_TAG_PREFS_MESSAGEFILTER = 0x1400,\n\tEC_TAG_MSGFILTER_ENABLED = 0x1401,\n\tEC_TAG_MSGFILTER_ALL = 0x1402,\n\tEC_TAG_MSGFILTER_FRIENDS = 0x1403,\n\tEC_TAG_MSGFILTER_SECURE = 0x1404,\n\tEC_TAG_MSGFILTER_BY_KEYWORD = 0x1405,\n\tEC_TAG_MSGFILTER_KEYWORDS = 0x1406,\n\tEC_TAG_PREFS_REMOTECTRL = 0x1500,\n\tEC_TAG_WEBSERVER_AUTORUN = 0x1501,\n\tEC_TAG_WEBSERVER_PORT = 0x1502,\n\tEC_TAG_WEBSERVER_GUEST = 0x1503,\n\tEC_TAG_WEBSERVER_USEGZIP = 0x1504,\n\tEC_TAG_WEBSERVER_REFRESH = 0x1505,\n\tEC_TAG_WEBSERVER_TEMPLATE = 0x1506,\n\tEC_TAG_PREFS_ONLINESIG = 0x1600,\n\tEC_TAG_ONLINESIG_ENABLED = 0x1601,\n\tEC_TAG_PREFS_SERVERS = 0x1700,\n\tEC_TAG_SERVERS_REMOVE_DEAD = 0x1701,\n\tEC_TAG_SERVERS_DEAD_SERVER_RETRIES = 0x1702,\n\tEC_TAG_SERVERS_AUTO_UPDATE = 0x1703,\n\tEC_TAG_SERVERS_URL_LIST = 0x1704,\n\tEC_TAG_SERVERS_ADD_FROM_SERVER = 0x1705,\n\tEC_TAG_SERVERS_ADD_FROM_CLIENT = 0x1706,\n\tEC_TAG_SERVERS_USE_SCORE_SYSTEM = 0x1707,\n\tEC_TAG_SERVERS_SMART_ID_CHECK = 0x1708,\n\tEC_TAG_SERVERS_SAFE_SERVER_CONNECT = 0x1709,\n\tEC_TAG_SERVERS_AUTOCONN_STATIC_ONLY = 0x170a,\n\tEC_TAG_SERVERS_MANUAL_HIGH_PRIO = 0x170b,\n\tEC_TAG_SERVERS_UPDATE_URL = 0x170c,\n\tEC_TAG_PREFS_FILES = 0x1800,\n\tEC_TAG_FILES_ICH_ENABLED = 0x1801,\n\tEC_TAG_FILES_AICH_TRUST = 0x1802,\n\tEC_TAG_FILES_NEW_PAUSED = 0x1803,\n\tEC_TAG_FILES_NEW_AUTO_DL_PRIO = 0x1804,\n\tEC_TAG_FILES_PREVIEW_PRIO = 0x1805,\n\tEC_TAG_FILES_NEW_AUTO_UL_PRIO = 0x1806,\n\tEC_TAG_FILES_UL_FULL_CHUNKS = 0x1807,\n\tEC_TAG_FILES_START_NEXT_PAUSED = 0x1808,\n\tEC_TAG_FILES_RESUME_SAME_CAT = 0x1809,\n\tEC_TAG_FILES_SAVE_SOURCES = 0x180a,\n\tEC_TAG_FILES_EXTRACT_METADATA = 0x180b,\n\tEC_TAG_FILES_ALLOC_FULL_SIZE = 0x180c,\n\tEC_TAG_FILES_CHECK_FREE_SPACE = 0x180d,\n\tEC_TAG_FILES_MIN_FREE_SPACE = 0x180e,\n\tEC_TAG_FILES_CREATE_NORMAL = 0x180f,\n\tEC_TAG_PREFS_DIRECTORIES = 0x1a00,\n\tEC_TAG_DIRECTORIES_INCOMING = 0x1a01,\n\tEC_TAG_DIRECTORIES_TEMP = 0x1a02,\n\tEC_TAG_DIRECTORIES_SHARED = 0x1a03,\n\tEC_TAG_DIRECTORIES_SHARE_HIDDEN = 0x1a04,\n\tEC_TAG_PREFS_STATISTICS = 0x1b00,\n\tEC_TAG_STATSGRAPH_WIDTH = 0x1b01,\n\tEC_TAG_STATSGRAPH_SCALE = 0x1b02,\n\tEC_TAG_STATSGRAPH_LAST = 0x1b03,\n\tEC_TAG_STATSGRAPH_DATA = 0x1b04,\n\tEC_TAG_STATTREE_CAPPING = 0x1b05,\n\tEC_TAG_STATTREE_NODE = 0x1b06,\n\tEC_TAG_STAT_NODE_VALUE = 0x1b07,\n\tEC_TAG_STAT_VALUE_TYPE = 0x1b08,\n\tEC_TAG_STATTREE_NODEID = 0x1b09,\n\tEC_TAG_PREFS_SECURITY = 0x1c00,\n\tEC_TAG_SECURITY_CAN_SEE_SHARES = 0x1c01,\n\tEC_TAG_IPFILTER_CLIENTS = 0x1c02,\n\tEC_TAG_IPFILTER_SERVERS = 0x1c03,\n\tEC_TAG_IPFILTER_AUTO_UPDATE = 0x1c04,\n\tEC_TAG_IPFILTER_UPDATE_URL = 0x1c05,\n\tEC_TAG_IPFILTER_LEVEL = 0x1c06,\n\tEC_TAG_IPFILTER_FILTER_LAN = 0x1c07,\n\tEC_TAG_SECURITY_USE_SECIDENT = 0x1c08,\n\tEC_TAG_SECURITY_OBFUSCATION_SUPPORTED = 0x1c09,\n\tEC_TAG_SECURITY_OBFUSCATION_REQUESTED = 0x1c0a,\n\tEC_TAG_SECURITY_OBFUSCATION_REQUIRED = 0x1c0b,\n\tEC_TAG_PREFS_CORETWEAKS = 0x1d00,\n\tEC_TAG_CORETW_MAX_CONN_PER_FIVE = 0x1d01,\n\tEC_TAG_CORETW_VERBOSE = 0x1d02,\n\tEC_TAG_CORETW_FILEBUFFER = 0x1d03,\n\tEC_TAG_CORETW_UL_QUEUE = 0x1d04,\n\tEC_TAG_CORETW_SRV_KEEPALIVE_TIMEOUT = 0x1d05,\n\tEC_TAG_PREFS_KADEMLIA = 0x1e00,\n\tEC_TAG_KADEMLIA_UPDATE_URL = 0x1e01,\n\tEC_TAG_UNKNOWN = 0xffff,\n}\n\nexport enum ECDetailLevel {\n\tEC_DETAIL_CMD = 0x00,\n\tEC_DETAIL_WEB = 0x01,\n\tEC_DETAIL_FULL = 0x02,\n\tEC_DETAIL_UPDATE = 0x03,\n\tEC_DETAIL_INC_UPDATE = 0x04,\n}\n\nexport enum ECSearchType {\n\tEC_SEARCH_LOCAL = 0x00,\n\tEC_SEARCH_GLOBAL = 0x01,\n\tEC_SEARCH_KAD = 0x02,\n\tEC_SEARCH_WEB = 0x03,\n}\n\nexport enum ECSearchFileDownloadStatus {\n\tNEW = 0,\n\tDOWNLOADED = 1,\n\tQUEUED = 2,\n\tCANCELED = 3,\n\tQUEUEDCANCELED = 4,\n}\n\nexport enum ECStatTreeNodeValueType {\n\tEC_VALUE_INTEGER = 0x00,\n\tEC_VALUE_ISTRING = 0x01,\n\tEC_VALUE_BYTES = 0x02,\n\tEC_VALUE_ISHORT = 0x03,\n\tEC_VALUE_TIME = 0x04,\n\tEC_VALUE_SPEED = 0x05,\n\tEC_VALUE_STRING = 0x06,\n\tEC_VALUE_DOUBLE = 0x07,\n}\n\nexport enum EcPrefs {\n\tEC_PREFS_CATEGORIES = 0x00000001,\n\tEC_PREFS_GENERAL = 0x00000002,\n\tEC_PREFS_CONNECTIONS = 0x00000004,\n\tEC_PREFS_MESSAGEFILTER = 0x00000008,\n\tEC_PREFS_REMOTECONTROLS = 0x00000010,\n\tEC_PREFS_ONLINESIG = 0x00000020,\n\tEC_PREFS_SERVERS = 0x00000040,\n\tEC_PREFS_FILES = 0x00000080,\n\tEC_PREFS_DIRECTORIES = 0x00000200,\n\tEC_PREFS_STATISTICS = 0x00000400,\n\tEC_PREFS_SECURITY = 0x00000800,\n\tEC_PREFS_CORETWEAKS = 0x00001000,\n\tEC_PREFS_KADEMLIA = 0x00002000,\n}\n\nexport enum ECTagType {\n\tEC_TAGTYPE_UNKNOWN = 0,\n\tEC_TAGTYPE_CUSTOM = 1,\n\tEC_TAGTYPE_UINT8 = 2,\n\tEC_TAGTYPE_UINT16 = 3,\n\tEC_TAGTYPE_UINT32 = 4,\n\tEC_TAGTYPE_UINT64 = 5,\n\tEC_TAGTYPE_STRING = 6,\n\tEC_TAGTYPE_DOUBLE = 7,\n\tEC_TAGTYPE_IPV4 = 8,\n\tEC_TAGTYPE_HASH16 = 9,\n\tEC_TAGTYPE_UINT128 = 10,\n}\n\n// Type sizes\nexport const LEN_UBYTE = 1;\nexport const LEN_USHORT = 2;\nexport const LEN_UINT = 4;\nexport const LEN_ULONG = 8;\nexport const LEN_UINT128 = 16;\n","// Tag definitions for EC protocol\n\nimport { ECTagName, ECTagType } from '../Codes';\n\nexport interface NumericTag {\n\tgetShort(): number;\n\tgetInt(): number;\n\tgetLong(): bigint;\n\tgetValue(): number | bigint;\n}\n\nexport abstract class Tag<T> {\n\tprotected value!: T;\n\tpublic nestedTags?: Tag<any>[];\n\n\tconstructor(\n\t\tpublic readonly name: ECTagName,\n\t\tpublic readonly type: ECTagType,\n\t\tnestedTags: Tag<any>[] = [],\n\t\tpublic readonly nameValue: number = name\n\t) {\n\t\tif (nestedTags.length > 0) {\n\t\t\tthis.nestedTags = nestedTags;\n\t\t}\n\t}\n\n\tabstract parseValue(value: Buffer): void;\n\tabstract encodeValue(): Buffer;\n\n\tgetValue(): T {\n\t\treturn this.value;\n\t}\n\n\tprotected setValue(value: T): void {\n\t\tthis.value = value;\n\t}\n}\n\nexport class CustomTag extends Tag<Buffer> {\n\tconstructor(name: ECTagName, value?: Buffer, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_CUSTOM, subtags, nameValue);\n\t\tif (value !== undefined) {\n\t\t\tthis.setValue(value);\n\t\t}\n\t}\n\n\tparseValue(value: Buffer): void {\n\t\tthis.setValue(value);\n\t}\n\n\tencodeValue(): Buffer {\n\t\treturn this.getValue();\n\t}\n}\n\nexport class UByteTag extends Tag<number> implements NumericTag {\n\tconstructor(name: ECTagName, value?: number, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_UINT8, subtags, nameValue);\n\t\tif (value !== undefined) {\n\t\t\tthis.setValue(value);\n\t\t}\n\t}\n\n\tstatic withValue(name: ECTagName, value: number, subtags: Tag<any>[] = []): UByteTag {\n\t\treturn new UByteTag(name, value, subtags);\n\t}\n\n\tparseValue(value: Buffer): void {\n\t\tif (value.length === 0) {\n\t\t\tthis.setValue(0);\n\t\t} else if (value.length === 1) {\n\t\t\tthis.setValue(value[0]);\n\t\t} else {\n\t\t\tthrow new Error('UInt8Tag value must be 1 byte long');\n\t\t}\n\t}\n\n\tencodeValue(): Buffer {\n\t\treturn Buffer.from([this.getValue()]);\n\t}\n\n\tgetShort(): number {\n\t\treturn this.getValue();\n\t}\n\n\tgetInt(): number {\n\t\treturn this.getValue();\n\t}\n\n\tgetLong(): bigint {\n\t\treturn BigInt(this.getValue());\n\t}\n}\n\nexport class UShortTag extends Tag<number> implements NumericTag {\n\tconstructor(name: ECTagName, value?: number, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_UINT16, subtags, nameValue);\n\t\tif (value !== undefined) {\n\t\t\tthis.setValue(value);\n\t\t}\n\t}\n\n\tstatic withValue(name: ECTagName, value: number, subtags: Tag<any>[] = []): UShortTag {\n\t\treturn new UShortTag(name, value, subtags);\n\t}\n\n\tparseValue(value: Buffer): void {\n\t\tif (value.length === 0) {\n\t\t\tthis.setValue(0);\n\t\t} else if (value.length === 2) {\n\t\t\tthis.setValue(value.readUInt16BE(0));\n\t\t} else {\n\t\t\tthrow new Error('UInt16Tag value must be 2 bytes long');\n\t\t}\n\t}\n\n\tencodeValue(): Buffer {\n\t\tconst buf = Buffer.allocUnsafe(2);\n\t\tbuf.writeUInt16BE(this.getValue());\n\t\treturn buf;\n\t}\n\n\tgetShort(): number {\n\t\treturn this.getValue();\n\t}\n\n\tgetInt(): number {\n\t\treturn this.getValue();\n\t}\n\n\tgetLong(): bigint {\n\t\treturn BigInt(this.getValue());\n\t}\n}\n\nexport class UIntTag extends Tag<number> implements NumericTag {\n\tconstructor(name: ECTagName, value?: number, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_UINT32, subtags, nameValue);\n\t\tif (value !== undefined) {\n\t\t\tthis.setValue(value);\n\t\t}\n\t}\n\n\tstatic withValue(name: ECTagName, value: number, subtags: Tag<any>[] = []): UIntTag {\n\t\treturn new UIntTag(name, value, subtags);\n\t}\n\n\tparseValue(value: Buffer): void {\n\t\tif (value.length === 0) {\n\t\t\tthis.setValue(0);\n\t\t} else if (value.length === 4) {\n\t\t\tthis.setValue(value.readUInt32BE(0));\n\t\t} else {\n\t\t\tthrow new Error('UInt32Tag value must be 4 bytes long');\n\t\t}\n\t}\n\n\tencodeValue(): Buffer {\n\t\tconst buf = Buffer.allocUnsafe(4);\n\t\tbuf.writeUInt32BE(this.getValue());\n\t\treturn buf;\n\t}\n\n\tgetShort(): number {\n\t\tthrow new Error('Unsigned Integer cannot be cast to short');\n\t}\n\n\tgetInt(): number {\n\t\treturn this.getValue();\n\t}\n\n\tgetLong(): bigint {\n\t\treturn BigInt(this.getValue());\n\t}\n}\n\nexport class ULongTag extends Tag<bigint> implements NumericTag {\n\tconstructor(name: ECTagName, value?: bigint, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_UINT64, subtags, nameValue);\n\t\tif (value !== undefined) {\n\t\t\tthis.setValue(value);\n\t\t}\n\t}\n\n\tstatic withValue(name: ECTagName, value: bigint, subtags: Tag<any>[] = []): ULongTag {\n\t\treturn new ULongTag(name, value, subtags);\n\t}\n\n\tparseValue(value: Buffer): void {\n\t\tif (value.length === 0) {\n\t\t\tthis.setValue(0n);\n\t\t} else if (value.length === 8) {\n\t\t\tthis.setValue(value.readBigUInt64BE(0));\n\t\t} else {\n\t\t\tthrow new Error('UInt64Tag value must be 8 bytes long');\n\t\t}\n\t}\n\n\tencodeValue(): Buffer {\n\t\tconst buf = Buffer.allocUnsafe(8);\n\t\tbuf.writeBigUInt64BE(this.getValue());\n\t\treturn buf;\n\t}\n\n\tgetShort(): number {\n\t\tthrow new Error('Unsigned Long cannot be cast to short');\n\t}\n\n\tgetInt(): number {\n\t\tthrow new Error('Unsigned Long cannot be cast to int');\n\t}\n\n\tgetLong(): bigint {\n\t\treturn this.getValue();\n\t}\n}\n\nexport class UInt128Tag extends Tag<bigint> {\n\tconstructor(name: ECTagName, value?: bigint, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_UINT128, subtags, nameValue);\n\t\tif (value !== undefined) {\n\t\t\tthis.setValue(value);\n\t\t}\n\t}\n\n\tstatic withValue(name: ECTagName, value: bigint, subtags: Tag<any>[] = []): UInt128Tag {\n\t\treturn new UInt128Tag(name, value, subtags);\n\t}\n\n\tparseValue(value: Buffer): void {\n\t\tif (value.length === 0) {\n\t\t\tthis.setValue(0n);\n\t\t} else {\n\t\t\t// Read as big-endian big integer\n\t\t\tlet result = 0n;\n\t\t\tfor (let i = 0; i < value.length; i++) {\n\t\t\t\tresult = (result << 8n) | BigInt(value[i]);\n\t\t\t}\n\t\t\tthis.setValue(result);\n\t\t}\n\t}\n\n\tencodeValue(): Buffer {\n\t\t// Encode as big-endian\n\t\tconst val = this.getValue();\n\t\tconst bytes: number[] = [];\n\t\tlet remaining = val;\n\n\t\twhile (remaining > 0n) {\n\t\t\tbytes.unshift(Number(remaining & 0xffn));\n\t\t\tremaining >>= 8n;\n\t\t}\n\n\t\t// Pad to 16 bytes\n\t\twhile (bytes.length < 16) {\n\t\t\tbytes.unshift(0);\n\t\t}\n\n\t\treturn Buffer.from(bytes);\n\t}\n}\n\nexport class StringTag extends Tag<string> {\n\tconstructor(name: ECTagName, value?: string, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_STRING, subtags, nameValue);\n\t\tif (value !== undefined) {\n\t\t\tthis.setValue(value);\n\t\t}\n\t}\n\n\tstatic withValue(name: ECTagName, value: string, subtags: Tag<any>[] = []): StringTag {\n\t\treturn new StringTag(name, value, subtags);\n\t}\n\n\tparseValue(value: Buffer): void {\n\t\tif (value[value.length - 1] !== 0x00) {\n\t\t\tthrow new Error('StringTag value must be null terminated');\n\t\t}\n\t\tthis.setValue(value.toString('utf8', 0, value.length - 1));\n\t}\n\n\tencodeValue(): Buffer {\n\t\treturn Buffer.concat([Buffer.from(this.getValue(), 'utf8'), Buffer.from([0x00])]);\n\t}\n}\n\nexport class DoubleTag extends Tag<number> {\n\tconstructor(name: ECTagName, value?: number, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_DOUBLE, subtags, nameValue);\n\t\tif (value !== undefined) {\n\t\t\tthis.setValue(value);\n\t\t}\n\t}\n\n\tstatic withValue(name: ECTagName, value: number, subtags: Tag<any>[] = []): DoubleTag {\n\t\treturn new DoubleTag(name, value, subtags);\n\t}\n\n\tparseValue(value: Buffer): void {\n\t\tif (value[value.length - 1] !== 0x00) {\n\t\t\tthrow new Error('DoubleTag value must be null terminated');\n\t\t}\n\t\tthis.setValue(parseFloat(value.toString('utf8', 0, value.length - 1)));\n\t}\n\n\tencodeValue(): Buffer {\n\t\treturn Buffer.concat([Buffer.from(this.getValue().toString(), 'utf8'), Buffer.from([0x00])]);\n\t}\n}\n\nexport interface Ipv4Value {\n\taddress: string;\n\tport: number;\n}\n\nexport class Ipv4Tag extends Tag<Ipv4Value> {\n\tconstructor(name: ECTagName, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_IPV4, subtags, nameValue);\n\t}\n\n\tstatic withValue(name: ECTagName, value: Ipv4Value, subtags: Tag<any>[] = []): Ipv4Tag {\n\t\tconst tag = new Ipv4Tag(name, subtags);\n\t\ttag.setValue(value);\n\t\treturn tag;\n\t}\n\n\tparseValue(value: Buffer): void {\n\t\tif (value.length !== 6) {\n\t\t\tthrow new Error('Ipv4Tag value must be 6 bytes long');\n\t\t}\n\t\tconst address = `${value[0]}.${value[1]}.${value[2]}.${value[3]}`;\n\t\tconst port = value.readUInt16BE(4);\n\t\tthis.setValue({ address, port });\n\t}\n\n\tencodeValue(): Buffer {\n\t\tconst val = this.getValue();\n\t\tconst parts = val.address.split('.').map((p) => parseInt(p));\n\t\tconst buf = Buffer.allocUnsafe(6);\n\t\tbuf[0] = parts[0];\n\t\tbuf[1] = parts[1];\n\t\tbuf[2] = parts[2];\n\t\tbuf[3] = parts[3];\n\t\tbuf.writeUInt16BE(val.port, 4);\n\t\treturn buf;\n\t}\n}\n\nexport class Hash16Tag extends Tag<Buffer> {\n\tconstructor(name: ECTagName, value?: Buffer, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_HASH16, subtags, nameValue);\n\t\tif (value !== undefined) {\n\t\t\tthis.setValue(value);\n\t\t}\n\t}\n\n\tstatic withValue(name: ECTagName, value: Buffer, subtags: Tag<any>[] = []): Hash16Tag {\n\t\treturn new Hash16Tag(name, value, subtags);\n\t}\n\n\tparseValue(value: Buffer): void {\n\t\tif (value.length === 16) {\n\t\t\tthis.setValue(value);\n\t\t} else {\n\t\t\tthrow new Error('Hash16Tag value must be 16 bytes long');\n\t\t}\n\t}\n\n\tencodeValue(): Buffer {\n\t\treturn this.getValue();\n\t}\n}\n\n// Helper functions for tag extraction\nexport function findTag(tags: Tag<any>[], name: ECTagName): Tag<any> | undefined {\n\treturn tags.find((tag) => tag.name === name);\n}\n\nexport function findNumericTag(tags: Tag<any>[], name: ECTagName): NumericTag | undefined {\n\tconst tag = tags.find((tag) => tag.name === name);\n\tif (tag && 'getInt' in tag && 'getShort' in tag && 'getLong' in tag) {\n\t\treturn tag as NumericTag;\n\t}\n\treturn undefined;\n}\n","/**\n * Base Request class\n */\n\nimport { Packet } from '../ec/packet/Packet';\nimport { Flags } from '../ec/packet/Flags';\nimport { ECOpCode } from '../ec/Codes';\nimport type { Tag } from '../ec/tag/Tag';\n\nexport abstract class Request {\n\tprotected readonly opCode: ECOpCode;\n\tprotected readonly tags: Tag<any>[] = [];\n\n\tconstructor(opCode: ECOpCode) {\n\t\tthis.opCode = opCode;\n\t}\n\n\t/**\n\t * Add a tag to the request\n\t */\n\tprotected addTag(tag: Tag<any>): void {\n\t\tthis.tags.push(tag);\n\t}\n\n\t/**\n\t * Build the packet for this request\n\t */\n\tbuildPacket(): Packet {\n\t\tconst flags = Flags.useUtf8Numbers();\n\t\treturn new Packet(this.opCode, flags, this.tags);\n\t}\n}\n","/**\n * Stats Request - Request server statistics\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName, ECDetailLevel } from '../ec/Codes';\nimport { UByteTag } from '../ec/tag/Tag';\n\nexport class StatsRequest extends Request {\n\tconstructor(detailLevel: ECDetailLevel = ECDetailLevel.EC_DETAIL_FULL) {\n\t\tsuper(ECOpCode.EC_OP_STAT_REQ);\n\n\t\tthis.addTag(new UByteTag(ECTagName.EC_TAG_DETAIL_LEVEL, detailLevel));\n\t}\n}\n","/**\n * Stats Response - Server statistics\n */\n\nimport { Packet } from '../ec/packet/Packet';\nimport { ECTagName } from '../ec/Codes';\nimport { findNumericTag, findTag } from '../ec/tag/Tag';\nimport type { StatsResponse } from '../client/AmuleClient';\n\nexport class StatsResponseParser {\n\tstatic fromPacket(packet: Packet): StatsResponse {\n\t\t// Extract common stats\n\t\tconst uploadOverhead = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_UP_OVERHEAD)?.getValue() || 0;\n\t\tconst downloadOverhead = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_DOWN_OVERHEAD)?.getValue() || 0;\n\t\tconst bannedCount = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_BANNED_COUNT)?.getValue() || 0;\n\n\t\tconst totalSentBytes = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_TOTAL_SENT_BYTES)?.getValue() || 0;\n\t\tconst totalReceivedBytes = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_TOTAL_RECEIVED_BYTES)?.getValue() || 0;\n\t\tconst sharedFileCount = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_SHARED_FILE_COUNT)?.getValue() || 0;\n\n\t\tconst uploadSpeed = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_UL_SPEED)?.getValue() || 0;\n\t\tconst downloadSpeed = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_DL_SPEED)?.getValue() || 0;\n\t\tconst uploadSpeedLimit = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_UL_SPEED_LIMIT)?.getValue() || 0;\n\t\tconst downloadSpeedLimit = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_DL_SPEED_LIMIT)?.getValue() || 0;\n\n\t\tconst uploadQueueLength = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_UL_QUEUE_LEN)?.getValue() || 0;\n\t\tconst totalSourceCount = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_TOTAL_SRC_COUNT)?.getValue() || 0;\n\t\tconst ed2kUsers = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_ED2K_USERS)?.getValue() || 0;\n\t\tconst kadUsers = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_KAD_USERS)?.getValue() || 0;\n\t\tconst ed2kFiles = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_ED2K_FILES)?.getValue() || 0;\n\t\tconst kadFiles = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_KAD_FILES)?.getValue() || 0;\n\n\t\tconst kadNodes = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_KAD_NODES)?.getValue() || 0;\n\n\t\t// Connection State & Server Info\n\t\tconst connStateTag = findTag(packet.tags, ECTagName.EC_TAG_CONNSTATE);\n\t\tlet ed2kId = 0;\n\t\tlet clientId = 0;\n\t\tlet kadId: string | undefined;\n\t\tlet connectedServer: StatsResponse['connectedServer'];\n\n\t\tif (connStateTag && connStateTag.nestedTags) {\n\t\t\ted2kId = Number(findNumericTag(connStateTag.nestedTags, ECTagName.EC_TAG_ED2K_ID)?.getValue() || 0);\n\t\t\tclientId = Number(findNumericTag(connStateTag.nestedTags, ECTagName.EC_TAG_CLIENT_ID)?.getValue() || 0);\n\n\t\t\tconst kadIdTag = findTag(connStateTag.nestedTags, ECTagName.EC_TAG_KAD_ID);\n\t\t\tif (kadIdTag && kadIdTag.getValue() !== undefined) {\n\t\t\t\tconst val = kadIdTag.getValue();\n\t\t\t\tif (typeof val === 'bigint') {\n\t\t\t\t\tkadId = val.toString(16).padStart(32, '0');\n\t\t\t\t} else if (val instanceof Buffer) {\n\t\t\t\t\tkadId = val.toString('hex');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst serverTag = findTag(connStateTag.nestedTags, ECTagName.EC_TAG_SERVER);\n\t\t\tif (serverTag) {\n\t\t\t\tconst serverVal = serverTag.getValue() as any;\n\t\t\t\tif (serverVal && typeof serverVal === 'object' && 'address' in serverVal) {\n\t\t\t\t\tconnectedServer = {\n\t\t\t\t\t\tip: serverVal.address,\n\t\t\t\t\t\tport: serverVal.port,\n\t\t\t\t\t\tname: findTag(serverTag.nestedTags || [], ECTagName.EC_TAG_SERVER_NAME)?.getValue(),\n\t\t\t\t\t\tdescription: findTag(serverTag.nestedTags || [], ECTagName.EC_TAG_SERVER_DESC)?.getValue(),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Fallback for ID if not in connState\n\t\tconst id = clientId || Number(findNumericTag(packet.tags, ECTagName.EC_TAG_CLIENT_ID)?.getValue() || 0);\n\n\t\t// Logger messages (if any)\n\t\tconst loggerMessage: string[] = [];\n\t\t// TODO: Parse logger messages from nested tags if present\n\n\t\treturn {\n\t\t\tid: Number(id),\n\t\t\ted2kId,\n\t\t\tkadId,\n\t\t\tconnectedServer,\n\t\t\tuploadOverhead: Number(uploadOverhead),\n\t\t\tdownloadOverhead: Number(downloadOverhead),\n\t\t\tbannedCount: Number(bannedCount),\n\t\t\tloggerMessage,\n\t\t\ttotalSentBytes: Number(totalSentBytes),\n\t\t\ttotalReceivedBytes: Number(totalReceivedBytes),\n\t\t\tsharedFileCount: Number(sharedFileCount),\n\t\t\tuploadSpeed: Number(uploadSpeed),\n\t\t\tdownloadSpeed: Number(downloadSpeed),\n\t\t\tuploadSpeedLimit: Number(uploadSpeedLimit),\n\t\t\tdownloadSpeedLimit: Number(downloadSpeedLimit),\n\t\t\tuploadQueueLength: Number(uploadQueueLength),\n\t\t\ttotalSourceCount: Number(totalSourceCount),\n\t\t\ted2kUsers: Number(ed2kUsers),\n\t\t\tkadUsers: Number(kadUsers),\n\t\t\ted2kFiles: Number(ed2kFiles),\n\t\t\tkadFiles: Number(kadFiles),\n\t\t\tkadNodes: Number(kadNodes),\n\t\t};\n\t}\n}\n","// Model types and interfaces\n\nexport interface AmuleFile {\n\tfileHashHexString?: string;\n\tfileName?: string;\n\tfilePath?: string;\n\tsizeFull?: number;\n\tfileEd2kLink?: string;\n\tupPrio: number;\n\tgetRequests: number;\n\tgetAllRequests: number;\n\tgetAccepts: number;\n\tgetAllAccepts: number;\n\tgetXferred: number;\n\tgetAllXferred: number;\n\tgetCompleteSourcesLow: number;\n\tgetCompleteSourcesHigh: number;\n\tgetCompleteSources: number;\n\tgetOnQueue: number;\n\tgetComment?: string;\n\tgetRating?: number;\n}\n\nexport interface AmuleTransferringFile extends AmuleFile {\n\tpartMetID?: number;\n\tsizeXfer?: number;\n\tsizeDone?: number;\n\tfileStatus: FileStatus;\n\tstopped: boolean;\n\tsourceCount: number;\n\tsourceNotCurrCount: number;\n\tsourceXferCount: number;\n\tsourceCountA4AF: number;\n\tspeed?: number;\n\tdownPrio: number;\n\tfileCat: number;\n\tlastSeenComplete: number;\n\tlastDateChanged: number;\n\tdownloadActiveTime: number;\n\tavailablePartCount: number;\n\ta4AFAuto: boolean;\n\thashingProgress: boolean;\n\tgetLostDueToCorruption: number;\n\tgetGainDueToCompression: number;\n\ttotalPacketsSavedDueToICH: number;\n}\n\nexport interface AmuleCategory {\n\tid: number;\n\tname: string;\n\tpath: string;\n\tcomment: string;\n\tcolor: number;\n\tpriority: number;\n}\n\nexport interface AmuleServer {\n\tname?: string;\n\tdescription?: string;\n\taddress?: string; // String representation usually\n\tip: string;\n\tport: number;\n\tping?: number;\n\tusers?: number;\n\tmaxUsers?: number;\n\tfiles?: number;\n\tpriority: number;\n\tversion?: string;\n\tisStatic: boolean;\n\tfailedCount: number;\n}\n\nexport enum FileStatus {\n\tREADY = 0,\n\tEMPTY = 1,\n\tWAITINGFORHASH = 2,\n\tHASHING = 3,\n\tERROR = 4,\n\tINSUFFICIENT = 5,\n\tUNKNOWN = 6,\n\tPAUSED = 7,\n\tCOMPLETING = 8,\n\tCOMPLETE = 9,\n\tALLOCATING = 10,\n}\n\nexport enum DownloadCommand {\n\tSWAP_A4AF_THIS = 0x16,\n\tSWAP_A4AF_THIS_AUTO = 0x17,\n\tSWAP_A4AF_OTHERS = 0x18,\n\tPAUSE = 0x19,\n\tRESUME = 0x1a,\n\tSTOP = 0x1b,\n\tDELETE = 0x1d,\n}\n\nexport enum SearchType {\n\tGLOBAL = 1,\n\tKAD = 2,\n\tLOCAL = 0,\n\tWEB = 3,\n}\n","/**\n * Search Request - Start a search\n *\n * In the EC protocol, search is structured as:\n * - EC_TAG_SEARCH_TYPE (UByte) containing subtag:\n * - EC_TAG_SEARCH_NAME (String) with the search query\n * - Uses non-UTF8 flags (Flags.noUtf8())\n */\n\nimport { Request } from './Request';\nimport { Packet } from '../ec/packet/Packet';\nimport { Flags } from '../ec/packet/Flags';\nimport { ECOpCode, ECTagName, ECSearchType } from '../ec/Codes';\nimport { StringTag, UByteTag, UIntTag, ULongTag } from '../ec/tag/Tag';\nimport { SearchType } from '../model';\nimport type { SearchFilters } from '../types';\n\nexport class SearchRequest extends Request {\n\tprivate readonly query: string;\n\tprivate readonly searchType: SearchType;\n\tprivate readonly filters?: SearchFilters;\n\n\tconstructor(query: string, searchType: SearchType = SearchType.LOCAL, filters?: SearchFilters) {\n\t\tsuper(ECOpCode.EC_OP_SEARCH_START);\n\t\tthis.query = query;\n\t\tthis.searchType = searchType;\n\t\tthis.filters = filters;\n\t}\n\n\t/**\n\t * Override buildPacket to use non-UTF8 flags and correct tag structure\n\t */\n\tbuildPacket(): Packet {\n\t\tconst flags = Flags.noUtf8();\n\t\tconst tags = this.buildTags();\n\t\treturn new Packet(this.opCode, flags, tags);\n\t}\n\n\tprivate buildTags(): any[] {\n\t\tconst tags: any[] = [];\n\n\t\t// EC_TAG_SEARCH_TYPE with EC_TAG_SEARCH_NAME as subtag\n\t\tconst ecSearchType = this.convertSearchType(this.searchType);\n\t\tconst searchNameTag = new StringTag(ECTagName.EC_TAG_SEARCH_NAME, this.query);\n\t\tconst searchTypeTag = new UByteTag(ECTagName.EC_TAG_SEARCH_TYPE, ecSearchType, [searchNameTag]);\n\t\ttags.push(searchTypeTag);\n\n\t\t// Add filters if provided\n\t\tif (this.filters) {\n\t\t\tif (this.filters.minSize !== undefined) {\n\t\t\t\ttags.push(new ULongTag(ECTagName.EC_TAG_SEARCH_MIN_SIZE, BigInt(this.filters.minSize)));\n\t\t\t}\n\t\t\tif (this.filters.maxSize !== undefined) {\n\t\t\t\ttags.push(new ULongTag(ECTagName.EC_TAG_SEARCH_MAX_SIZE, BigInt(this.filters.maxSize)));\n\t\t\t}\n\t\t\tif (this.filters.fileType !== undefined) {\n\t\t\t\ttags.push(new StringTag(ECTagName.EC_TAG_SEARCH_FILE_TYPE, this.filters.fileType));\n\t\t\t}\n\t\t\tif (this.filters.extension !== undefined) {\n\t\t\t\ttags.push(new StringTag(ECTagName.EC_TAG_SEARCH_EXTENSION, this.filters.extension));\n\t\t\t}\n\t\t\tif (this.filters.availability !== undefined) {\n\t\t\t\ttags.push(new UIntTag(ECTagName.EC_TAG_SEARCH_AVAILABILITY, this.filters.availability));\n\t\t\t}\n\t\t}\n\n\t\treturn tags;\n\t}\n\n\tprivate convertSearchType(searchType: SearchType): ECSearchType {\n\t\tswitch (searchType) {\n\t\t\tcase SearchType.LOCAL:\n\t\t\t\treturn ECSearchType.EC_SEARCH_LOCAL;\n\t\t\tcase SearchType.GLOBAL:\n\t\t\t\treturn ECSearchType.EC_SEARCH_GLOBAL;\n\t\t\tcase SearchType.KAD:\n\t\t\t\treturn ECSearchType.EC_SEARCH_KAD;\n\t\t\tcase SearchType.WEB:\n\t\t\t\treturn ECSearchType.EC_SEARCH_WEB;\n\t\t}\n\t}\n}\n","/**\n * Search Status Request - Get search progress\n */\n\nimport { Request } from './Request';\nimport { ECOpCode } from '../ec/Codes';\n\nexport class SearchStatusRequest extends Request {\n\tconstructor() {\n\t\tsuper(ECOpCode.EC_OP_SEARCH_PROGRESS);\n\t}\n}\n","/**\n * Search Progress Response - Search status/progress\n */\n\nimport { Packet } from '../ec/packet/Packet';\nimport { ECTagName } from '../ec/Codes';\nimport { findNumericTag } from '../ec/tag/Tag';\n\nexport class SearchProgressResponse {\n\tconstructor(public readonly progress: number) {}\n\n\tstatic fromPacket(packet: Packet): SearchProgressResponse {\n\t\tconst progressTag = findNumericTag(packet.tags, ECTagName.EC_TAG_SEARCH_STATUS);\n\t\tconst progress = progressTag ? Number(progressTag.getValue()) / 100.0 : 0;\n\n\t\treturn new SearchProgressResponse(progress);\n\t}\n}\n","/**\n * Search Results Request - Get search results\n */\n\nimport { Request } from './Request';\nimport { ECOpCode } from '../ec/Codes';\n\nexport class SearchResultsRequest extends Request {\n\tconstructor() {\n\t\tsuper(ECOpCode.EC_OP_SEARCH_RESULTS);\n\t}\n}\n","/**\n * Search Results Response - Search results\n */\n\nimport { Packet } from '../ec/packet/Packet';\nimport { ECTagName } from '../ec/Codes';\nimport { findNumericTag, findTag } from '../ec/tag/Tag';\nimport type { SearchResultsResponse } from '../client/AmuleClient';\n\nexport class SearchResultsResponseParser {\n\tstatic fromPacket(packet: Packet): SearchResultsResponse {\n\t\tconst files: SearchResultsResponse['files'] = [];\n\n\t\t// Find all search result tags\n\t\tconst searchFileTags = packet.tags.filter((tag) => tag.name === ECTagName.EC_TAG_SEARCHFILE);\n\n\t\tfor (const fileTag of searchFileTags) {\n\t\t\tconst nestedTags = fileTag.nestedTags || [];\n\n\t\t\t// Extract file information\n\t\t\tconst fileNameTag = findTag(nestedTags, ECTagName.EC_TAG_PARTFILE_NAME);\n\t\t\tconst hashTag = findTag(nestedTags, ECTagName.EC_TAG_PARTFILE_HASH);\n\t\t\tconst sizeTag = findNumericTag(nestedTags, ECTagName.EC_TAG_PARTFILE_SIZE_FULL);\n\t\t\tconst completeSourcesTag = findNumericTag(nestedTags, ECTagName.EC_TAG_PARTFILE_SOURCE_COUNT);\n\t\t\tconst sourceCountTag = findNumericTag(nestedTags, ECTagName.EC_TAG_PARTFILE_SOURCE_COUNT_XFER);\n\t\t\tconst downloadStatusTag = findNumericTag(nestedTags, ECTagName.EC_TAG_KNOWNFILE);\n\n\t\t\tif (fileNameTag && hashTag) {\n\t\t\t\tfiles.push({\n\t\t\t\t\tfileName: fileNameTag.getValue(),\n\t\t\t\t\thash: hashTag.getValue(),\n\t\t\t\t\tsizeFull: sizeTag ? Number(sizeTag.getLong()) : 0,\n\t\t\t\t\tdownloadStatus: downloadStatusTag ? downloadStatusTag.getInt() : 0,\n\t\t\t\t\tcompleteSourceCount: completeSourcesTag ? completeSourcesTag.getInt() : 0,\n\t\t\t\t\tsourceCount: sourceCountTag ? sourceCountTag.getInt() : 0,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn { files };\n\t}\n}\n","/**\n * Search Stop Request - Stop current search\n */\n\nimport { Request } from './Request';\nimport { ECOpCode } from '../ec/Codes';\n\nexport class SearchStopRequest extends Request {\n\tconstructor() {\n\t\tsuper(ECOpCode.EC_OP_SEARCH_STOP);\n\t}\n}\n","/**\n * Download File Request - Download a file from search results\n *\n * This request downloads a file that was found in search results.\n * It uses the file hash to identify the file to download.\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName } from '../ec/Codes';\nimport { Hash16Tag } from '../ec/tag/Tag';\n\nexport class DownloadFileRequest extends Request {\n\tconstructor(hash: Buffer) {\n\t\tsuper(ECOpCode.EC_OP_DOWNLOAD_SEARCH_RESULT);\n\n\t\t// Only send the hash - same as jamule DownloadSearchResultRequest\n\t\tthis.addTag(new Hash16Tag(ECTagName.EC_TAG_PARTFILE, hash));\n\t}\n}\n","/**\n * Add Link Request - Download from ED2K link\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName } from '../ec/Codes';\nimport { StringTag } from '../ec/tag/Tag';\n\nexport class AddLinkRequest extends Request {\n\tconstructor(link: string) {\n\t\tsuper(ECOpCode.EC_OP_ADD_LINK);\n\n\t\tthis.addTag(new StringTag(ECTagName.EC_TAG_PARTFILE_ED2K_LINK, link));\n\t}\n}\n","/**\n * Download Queue Request - Get download queue\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName, ECDetailLevel } from '../ec/Codes';\nimport { UByteTag } from '../ec/tag/Tag';\n\nexport class DownloadQueueRequest extends Request {\n\tconstructor(detailLevel: ECDetailLevel = ECDetailLevel.EC_DETAIL_FULL) {\n\t\tsuper(ECOpCode.EC_OP_GET_DLOAD_QUEUE);\n\n\t\tthis.addTag(new UByteTag(ECTagName.EC_TAG_DETAIL_LEVEL, detailLevel));\n\t}\n}\n","/**\n * Download Queue Response - Parse download queue\n */\n\nimport { Packet } from '../ec/packet/Packet';\nimport { ECTagName } from '../ec/Codes';\nimport { findNumericTag, findTag } from '../ec/tag/Tag';\nimport type { AmuleTransferringFile, FileStatus } from '../model';\n\nexport interface DownloadQueueResponse {\n\tfiles: AmuleTransferringFile[];\n}\n\n// Helper to convert bigint to number safely\nfunction toNumber(value: bigint | number | undefined, defaultValue: number = 0): number {\n\tif (value === undefined) return defaultValue;\n\treturn typeof value === 'bigint' ? Number(value) : value;\n}\n\nexport class DownloadQueueResponseParser {\n\tstatic fromPacket(packet: Packet): DownloadQueueResponse {\n\t\tconst files: AmuleTransferringFile[] = [];\n\n\t\t// Find all partfile tags\n\t\tconst partfileTags = packet.tags.filter((tag) => tag.name === ECTagName.EC_TAG_PARTFILE);\n\n\t\tfor (const fileTag of partfileTags) {\n\t\t\tconst tags = fileTag.nestedTags || [];\n\n\t\t\tconst hashTag = findTag(tags, ECTagName.EC_TAG_PARTFILE_HASH);\n\t\t\tconst fileNameTag = findTag(tags, ECTagName.EC_TAG_PARTFILE_NAME);\n\n\t\t\t// Basic file info\n\t\t\tconst file: AmuleTransferringFile = {\n\t\t\t\tfileHashHexString: hashTag ? hashTag.getValue().toString('hex') : undefined,\n\t\t\t\tfileName: fileNameTag ? fileNameTag.getValue() : undefined,\n\t\t\t\tfilePath: findTag(tags, ECTagName.EC_TAG_KNOWNFILE_FILENAME)?.getValue(),\n\t\t\t\tsizeFull: toNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SIZE_FULL)?.getLong()),\n\t\t\t\tfileEd2kLink: findTag(tags, ECTagName.EC_TAG_PARTFILE_ED2K_LINK)?.getValue(),\n\n\t\t\t\t// Transfer info\n\t\t\t\tpartMetID: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_PARTMETID)?.getShort(),\n\t\t\t\tsizeXfer: toNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SIZE_XFER)?.getLong()),\n\t\t\t\tsizeDone: toNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SIZE_DONE)?.getLong()),\n\t\t\t\tfileStatus: (findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_STATUS)?.getInt() ?? 0) as FileStatus,\n\t\t\t\tstopped: (findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_STOPPED)?.getInt() ?? 0) !== 0,\n\t\t\t\tsourceCount: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SOURCE_COUNT)?.getShort() ?? 0,\n\t\t\t\tsourceNotCurrCount: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SOURCE_COUNT_NOT_CURRENT)?.getShort() ?? 0,\n\t\t\t\tsourceXferCount: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SOURCE_COUNT_XFER)?.getShort() ?? 0,\n\t\t\t\tsourceCountA4AF: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SOURCE_COUNT_A4AF)?.getShort() ?? 0,\n\t\t\t\tspeed: toNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SPEED)?.getLong()),\n\t\t\t\tdownPrio: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_PRIO)?.getInt() ?? 0,\n\t\t\t\tfileCat: toNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_CAT)?.getLong()),\n\t\t\t\tlastSeenComplete: toNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_LAST_SEEN_COMP)?.getLong()),\n\t\t\t\tlastDateChanged: toNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_LAST_RECV)?.getLong()),\n\t\t\t\tdownloadActiveTime: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_DOWNLOAD_ACTIVE)?.getInt() ?? 0,\n\t\t\t\tavailablePartCount: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_AVAILABLE_PARTS)?.getShort() ?? 0,\n\t\t\t\ta4AFAuto: (findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_A4AFAUTO)?.getInt() ?? 0) !== 0,\n\t\t\t\thashingProgress: (findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_HASHED_PART_COUNT)?.getInt() ?? 0) !== 0,\n\n\t\t\t\t// Statistics\n\t\t\t\tgetLostDueToCorruption: toNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_LOST_CORRUPTION)?.getLong()),\n\t\t\t\tgetGainDueToCompression: toNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_GAINED_COMPRESSION)?.getLong()),\n\t\t\t\ttotalPacketsSavedDueToICH: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SAVED_ICH)?.getInt() ?? 0,\n\n\t\t\t\t// Known file shared info (defaults)\n\t\t\t\tupPrio: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_PRIO)?.getInt() ?? 0,\n\t\t\t\tgetRequests: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_REQ_COUNT)?.getShort() ?? 0,\n\t\t\t\tgetAllRequests: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_REQ_COUNT_ALL)?.getInt() ?? 0,\n\t\t\t\tgetAccepts: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_ACCEPT_COUNT)?.getShort() ?? 0,\n\t\t\t\tgetAllAccepts: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_ACCEPT_COUNT_ALL)?.getInt() ?? 0,\n\t\t\t\tgetXferred: toNumber(findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_XFERRED)?.getLong()),\n\t\t\t\tgetAllXferred: toNumber(findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_XFERRED_ALL)?.getLong()),\n\t\t\t\tgetCompleteSourcesLow: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMPLETE_SOURCES_LOW)?.getShort() ?? 0,\n\t\t\t\tgetCompleteSourcesHigh: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMPLETE_SOURCES_HIGH)?.getShort() ?? 0,\n\t\t\t\tgetCompleteSources: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMPLETE_SOURCES)?.getShort() ?? 0,\n\t\t\t\tgetOnQueue: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_ON_QUEUE)?.getShort() ?? 0,\n\t\t\t\tgetComment: findTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMMENT)?.getValue(),\n\t\t\t\tgetRating: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_RATING)?.getInt(),\n\t\t\t};\n\n\t\t\tfiles.push(file);\n\t\t}\n\n\t\treturn { files };\n\t}\n}\n","/**\n * Shared Files Request - Get shared files list\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName, ECDetailLevel } from '../ec/Codes';\nimport { UByteTag } from '../ec/tag/Tag';\n\nexport class SharedFilesRequest extends Request {\n\tconstructor(detailLevel: ECDetailLevel = ECDetailLevel.EC_DETAIL_FULL) {\n\t\tsuper(ECOpCode.EC_OP_GET_SHARED_FILES);\n\n\t\tthis.addTag(new UByteTag(ECTagName.EC_TAG_DETAIL_LEVEL, detailLevel));\n\t}\n}\n","/**\n * Shared Files Response - Parse shared files list\n */\n\nimport { Packet } from '../ec/packet/Packet';\nimport { ECTagName } from '../ec/Codes';\nimport { findNumericTag, findTag } from '../ec/tag/Tag';\nimport type { AmuleFile } from '../model';\n\nexport interface SharedFilesResponse {\n\tfiles: AmuleFile[];\n}\n\n// Helper to convert bigint to number safely\nfunction toNumber(value: bigint | number | undefined, defaultValue: number = 0): number {\n\tif (value === undefined) return defaultValue;\n\treturn typeof value === 'bigint' ? Number(value) : value;\n}\n\nexport class SharedFilesResponseParser {\n\tstatic fromPacket(packet: Packet): SharedFilesResponse {\n\t\tconst files: AmuleFile[] = [];\n\n\t\t// Find all knownfile tags\n\t\tconst knownfileTags = packet.tags.filter((tag) => tag.name === ECTagName.EC_TAG_KNOWNFILE);\n\n\t\tfor (const fileTag of knownfileTags) {\n\t\t\tconst tags = fileTag.nestedTags || [];\n\n\t\t\tconst hashTag = findTag(tags, ECTagName.EC_TAG_PARTFILE_HASH);\n\t\t\tconst fileNameTag = findTag(tags, ECTagName.EC_TAG_PARTFILE_NAME);\n\n\t\t\tconst file: AmuleFile = {\n\t\t\t\tfileHashHexString: hashTag ? hashTag.getValue().toString('hex') : undefined,\n\t\t\t\tfileName: fileNameTag ? fileNameTag.getValue() : undefined,\n\t\t\t\tfilePath: findTag(tags, ECTagName.EC_TAG_KNOWNFILE_FILENAME)?.getValue(),\n\t\t\t\tsizeFull: toNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SIZE_FULL)?.getLong()),\n\t\t\t\tfileEd2kLink: findTag(tags, ECTagName.EC_TAG_PARTFILE_ED2K_LINK)?.getValue(),\n\n\t\t\t\tupPrio: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_PRIO)?.getInt() ?? 0,\n\t\t\t\tgetRequests: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_REQ_COUNT)?.getShort() ?? 0,\n\t\t\t\tgetAllRequests: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_REQ_COUNT_ALL)?.getInt() ?? 0,\n\t\t\t\tgetAccepts: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_ACCEPT_COUNT)?.getShort() ?? 0,\n\t\t\t\tgetAllAccepts: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_ACCEPT_COUNT_ALL)?.getInt() ?? 0,\n\t\t\t\tgetXferred: toNumber(findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_XFERRED)?.getLong()),\n\t\t\t\tgetAllXferred: toNumber(findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_XFERRED_ALL)?.getLong()),\n\t\t\t\tgetCompleteSourcesLow: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMPLETE_SOURCES_LOW)?.getShort() ?? 0,\n\t\t\t\tgetCompleteSourcesHigh: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMPLETE_SOURCES_HIGH)?.getShort() ?? 0,\n\t\t\t\tgetCompleteSources: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMPLETE_SOURCES)?.getShort() ?? 0,\n\t\t\t\tgetOnQueue: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_ON_QUEUE)?.getShort() ?? 0,\n\t\t\t\tgetComment: findTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMMENT)?.getValue(),\n\t\t\t\tgetRating: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_RATING)?.getInt(),\n\t\t\t};\n\n\t\t\tfiles.push(file);\n\t\t}\n\n\t\treturn { files };\n\t}\n}\n","/**\n * Server List Request - Request the list of servers\n */\n\nimport { Request } from './Request';\nimport { ECOpCode } from '../ec/Codes';\n\nexport class ServerListRequest extends Request {\n\tconstructor() {\n\t\tsuper(ECOpCode.EC_OP_GET_SERVER_LIST);\n\t}\n}\n","/**\n * Server List Response - Parse the list of servers\n */\n\nimport { Packet } from '../ec/packet/Packet';\nimport { ECTagName } from '../ec/Codes';\nimport { findNumericTag, findTag } from '../ec/tag/Tag';\nimport type { AmuleServer } from '../model';\n\nexport interface ServerListResponse {\n\tservers: AmuleServer[];\n}\n\nexport class ServerListResponseParser {\n\tstatic fromPacket(packet: Packet): ServerListResponse {\n\t\tconst servers: AmuleServer[] = [];\n\n\t\t// Find all server tags\n\t\tconst serverTags = packet.tags.filter((tag) => tag.name === ECTagName.EC_TAG_SERVER);\n\n\t\tfor (const serverTag of serverTags) {\n\t\t\tconst nested = serverTag.nestedTags || [];\n\n\t\t\t// aMule often sends IP and Port combined in an Ipv4Tag (6 bytes)\n\t\t\t// Or as separate UInt32/UInt16 tags.\n\t\t\t// In many cases, the top-level EC_TAG_SERVER itself IS the Ipv4Tag.\n\t\t\tconst ipv4Tag =\n\t\t\t\tfindTag(nested, ECTagName.EC_TAG_SERVER_IP) ||\n\t\t\t\tfindTag(nested, ECTagName.EC_TAG_SERVER_ADDRESS) ||\n\t\t\t\t(serverTag.constructor.name.includes('Ipv4') ? serverTag : null);\n\n\t\t\tlet ip = '';\n\t\t\tlet port = 0;\n\n\t\t\tif (ipv4Tag && ipv4Tag.getValue() && typeof ipv4Tag.getValue() === 'object' && 'address' in (ipv4Tag.getValue() as any)) {\n\t\t\t\tconst val = ipv4Tag.getValue() as any;\n\t\t\t\tip = val.address;\n\t\t\t\tport = val.port;\n\t\t\t} else {\n\t\t\t\t// Fallback to separate tags if not combined or if top-level\n\t\t\t\tconst ipNum = findNumericTag(nested, ECTagName.EC_TAG_SERVER_IP)?.getInt() || findNumericTag(packet.tags, ECTagName.EC_TAG_SERVER_IP)?.getInt();\n\n\t\t\t\tport =\n\t\t\t\t\tfindNumericTag(nested, ECTagName.EC_TAG_SERVER_PORT)?.getInt() || findNumericTag(packet.tags, ECTagName.EC_TAG_SERVER_PORT)?.getInt() || 0;\n\n\t\t\t\tip = this.formatIp(ipNum);\n\t\t\t}\n\n\t\t\t// Some servers might have port in EC_TAG_SERVER_PORT even if IP is in combined tag\n\t\t\tif (port === 0) {\n\t\t\t\tport = findNumericTag(nested, ECTagName.EC_TAG_SERVER_PORT)?.getInt() || 0;\n\t\t\t}\n\n\t\t\tservers.push({\n\t\t\t\tname: findTag(nested, ECTagName.EC_TAG_SERVER_NAME)?.getValue() || 'Unknown',\n\t\t\t\tdescription: findTag(nested, ECTagName.EC_TAG_SERVER_DESC)?.getValue(),\n\t\t\t\taddress: findTag(nested, ECTagName.EC_TAG_SERVER_ADDRESS)?.getValue(),\n\t\t\t\tip: ip,\n\t\t\t\tport: port,\n\t\t\t\tping: findNumericTag(nested, ECTagName.EC_TAG_SERVER_PING)?.getInt(),\n\t\t\t\tusers: findNumericTag(nested, ECTagName.EC_TAG_SERVER_USERS)?.getInt(),\n\t\t\t\tmaxUsers: findNumericTag(nested, ECTagName.EC_TAG_SERVER_USERS_MAX)?.getInt(),\n\t\t\t\tfiles: findNumericTag(nested, ECTagName.EC_TAG_SERVER_FILES)?.getInt(),\n\t\t\t\tpriority: findNumericTag(nested, ECTagName.EC_TAG_SERVER_PRIO)?.getInt() || 0,\n\t\t\t\tversion: findTag(nested, ECTagName.EC_TAG_SERVER_VERSION)?.getValue(),\n\t\t\t\tisStatic: !!findNumericTag(nested, ECTagName.EC_TAG_SERVER_STATIC)?.getInt(),\n\t\t\t\tfailedCount: findNumericTag(nested, ECTagName.EC_TAG_SERVER_FAILED)?.getInt() || 0,\n\t\t\t});\n\t\t}\n\n\t\treturn { servers };\n\t}\n\n\tprivate static formatIp(ip: number | undefined): string {\n\t\tif (ip === undefined) return '';\n\t\t// EC protocol uses network byte order (big-endian) for IP addresses in UINT32\n\t\treturn [(ip >>> 24) & 0xff, (ip >>> 16) & 0xff, (ip >>> 8) & 0xff, ip & 0xff].join('.');\n\t}\n}\n","/**\n * Server Connect Request - Connect to a specific server\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName } from '../ec/Codes';\nimport { UIntTag, UShortTag } from '../ec/tag/Tag';\n\nexport class ServerConnectRequest extends Request {\n\tconstructor(ip: string, port: number) {\n\t\tsuper(ECOpCode.EC_OP_SERVER_CONNECT);\n\n\t\tthis.addTag(new UIntTag(ECTagName.EC_TAG_SERVER_IP, this.ipToNumber(ip)));\n\t\tthis.addTag(new UShortTag(ECTagName.EC_TAG_SERVER_PORT, port));\n\t}\n\n\tprivate ipToNumber(ip: string): number {\n\t\tconst parts = ip.split('.').map((p) => parseInt(p, 10));\n\t\treturn ((parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3]) >>> 0;\n\t}\n}\n","/**\n * Server Disconnect Request - Disconnect from the current server\n */\n\nimport { Request } from './Request';\nimport { ECOpCode } from '../ec/Codes';\n\nexport class ServerDisconnectRequest extends Request {\n\tconstructor() {\n\t\tsuper(ECOpCode.EC_OP_SERVER_DISCONNECT);\n\t}\n}\n","/**\n * Create Category Request - Create a new category\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName } from '../ec/Codes';\nimport { StringTag, UByteTag, UIntTag } from '../ec/tag/Tag';\nimport type { AmuleCategory } from '../model';\n\nexport class CreateCategoryRequest extends Request {\n\tconstructor(category: AmuleCategory) {\n\t\tsuper(ECOpCode.EC_OP_CREATE_CATEGORY);\n\n\t\tconst subtags = [\n\t\t\tnew StringTag(ECTagName.EC_TAG_CATEGORY_TITLE, category.name),\n\t\t\tnew StringTag(ECTagName.EC_TAG_CATEGORY_PATH, category.path),\n\t\t\tnew StringTag(ECTagName.EC_TAG_CATEGORY_COMMENT, category.comment),\n\t\t\tnew UByteTag(ECTagName.EC_TAG_CATEGORY_COLOR, category.color),\n\t\t\tnew UIntTag(ECTagName.EC_TAG_CATEGORY_PRIO, category.priority),\n\t\t];\n\n\t\t// Category tag is a container for all category properties\n\t\tthis.addTag(new UIntTag(ECTagName.EC_TAG_CATEGORY, 0, subtags));\n\t}\n}\n","/**\n * Update Category Request - Update an existing category\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName } from '../ec/Codes';\nimport { StringTag, UByteTag, UIntTag } from '../ec/tag/Tag';\nimport type { AmuleCategory } from '../model';\n\nexport class UpdateCategoryRequest extends Request {\n\tconstructor(id: number, category: AmuleCategory) {\n\t\tsuper(ECOpCode.EC_OP_UPDATE_CATEGORY);\n\n\t\tconst subtags = [\n\t\t\tnew StringTag(ECTagName.EC_TAG_CATEGORY_TITLE, category.name),\n\t\t\tnew StringTag(ECTagName.EC_TAG_CATEGORY_PATH, category.path),\n\t\t\tnew StringTag(ECTagName.EC_TAG_CATEGORY_COMMENT, category.comment),\n\t\t\tnew UByteTag(ECTagName.EC_TAG_CATEGORY_COLOR, category.color),\n\t\t\tnew UIntTag(ECTagName.EC_TAG_CATEGORY_PRIO, category.priority),\n\t\t];\n\n\t\t// Category tag is a container for all category properties\n\t\tthis.addTag(new UIntTag(ECTagName.EC_TAG_CATEGORY, id, subtags));\n\t}\n}\n","/**\n * Delete Category Request - Delete an existing category\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName } from '../ec/Codes';\nimport { UIntTag } from '../ec/tag/Tag';\n\nexport class DeleteCategoryRequest extends Request {\n\tconstructor(id: number) {\n\t\tsuper(ECOpCode.EC_OP_DELETE_CATEGORY);\n\n\t\tthis.addTag(new UIntTag(ECTagName.EC_TAG_CATEGORY, id));\n\t}\n}\n","/**\n * Preferences Request - Get preferences\n */\n\nimport { Request } from './Request';\nimport { ECDetailLevel, ECOpCode, EcPrefs, ECTagName } from '../ec/Codes';\nimport { UByteTag, UIntTag } from '../ec/tag/Tag';\n\nexport class GetPreferencesRequest extends Request {\n\tconstructor(pref: EcPrefs) {\n\t\tsuper(ECOpCode.EC_OP_GET_PREFERENCES);\n\t\tthis.addTag(new UByteTag(ECTagName.EC_TAG_DETAIL_LEVEL, ECDetailLevel.EC_DETAIL_FULL));\n\t\tthis.addTag(new UIntTag(ECTagName.EC_TAG_SELECT_PREFS, pref));\n\t}\n}\n","/**\n * Preferences Response - Contains aMule preferences, including categories\n */\n\nimport { Packet } from '../ec/packet/Packet';\nimport { ECTagName } from '../ec/Codes';\nimport { findTag, findNumericTag, NumericTag } from '../ec/tag/Tag';\nimport type { AmuleCategory } from '../model';\n\nexport class PreferencesResponse {\n\tconstructor(public readonly categories: AmuleCategory[]) {}\n}\n\nexport class PreferencesResponseParser {\n\tstatic fromPacket(packet: Packet): PreferencesResponse {\n\t\tconst categories: AmuleCategory[] = [];\n\n\t\tconst prefsCategoriesTag = findTag(packet.tags, ECTagName.EC_TAG_PREFS_CATEGORIES);\n\n\t\tif (prefsCategoriesTag && prefsCategoriesTag.nestedTags) {\n\t\t\tfor (const categoryTag of prefsCategoriesTag.nestedTags) {\n\t\t\t\tif (categoryTag.name === ECTagName.EC_TAG_CATEGORY) {\n\t\t\t\t\tconst nestedTags = categoryTag.nestedTags || [];\n\n\t\t\t\t\tconst idTag = categoryTag;\n\t\t\t\t\tconst nameTag = findTag(nestedTags, ECTagName.EC_TAG_CATEGORY_TITLE);\n\t\t\t\t\tconst pathTag = findTag(nestedTags, ECTagName.EC_TAG_CATEGORY_PATH);\n\t\t\t\t\tconst commentTag = findTag(nestedTags, ECTagName.EC_TAG_CATEGORY_COMMENT);\n\t\t\t\t\tconst colorTag = findNumericTag(nestedTags, ECTagName.EC_TAG_CATEGORY_COLOR);\n\t\t\t\t\tconst priorityTag = findNumericTag(nestedTags, ECTagName.EC_TAG_CATEGORY_PRIO);\n\n\t\t\t\t\tif (nameTag) {\n\t\t\t\t\t\tcategories.push({\n\t\t\t\t\t\t\tid: idTag ? Number((idTag as unknown as NumericTag).getInt()) : 0,\n\t\t\t\t\t\t\tname: nameTag.getValue() || '',\n\t\t\t\t\t\t\tpath: pathTag ? pathTag.getValue() : '',\n\t\t\t\t\t\t\tcomment: commentTag ? commentTag.getValue() : '',\n\t\t\t\t\t\t\tcolor: colorTag ? Number((colorTag as unknown as NumericTag).getInt()) : 0,\n\t\t\t\t\t\t\tpriority: priorityTag ? Number((priorityTag as unknown as NumericTag).getInt()) : 0,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn new PreferencesResponse(categories);\n\t}\n}\n","/**\n * Set File Category Request - Change category of a file\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName } from '../ec/Codes';\nimport { Hash16Tag, UByteTag } from '../ec/tag/Tag';\n\nexport class SetFileCategoryRequest extends Request {\n\tconstructor(hash: Buffer, categoryId: number) {\n\t\tsuper(ECOpCode.EC_OP_PARTFILE_SET_CAT);\n\n\t\t// Hash tag with category as subtag\n\t\tthis.addTag(new Hash16Tag(ECTagName.EC_TAG_PARTFILE, hash, [new UByteTag(ECTagName.EC_TAG_PARTFILE_CAT, categoryId)]));\n\t}\n}\n","/**\n * Download Command Request - Send commands to files in download queue\n * Commands: PAUSE, RESUME, STOP, DELETE, SWAP_A4AF_THIS, etc.\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName } from '../ec/Codes';\nimport { Hash16Tag } from '../ec/tag/Tag';\nimport { DownloadCommand } from '../model';\n\nexport class DownloadCommandRequest extends Request {\n\tconstructor(hash: Buffer, command: DownloadCommand) {\n\t\t// The command IS the opcode\n\t\tsuper(DownloadCommandRequest.commandToOpCode(command));\n\n\t\tthis.addTag(new Hash16Tag(ECTagName.EC_TAG_PARTFILE, hash));\n\t}\n\n\tprivate static commandToOpCode(command: DownloadCommand): ECOpCode {\n\t\tswitch (command) {\n\t\t\tcase DownloadCommand.SWAP_A4AF_THIS:\n\t\t\t\treturn ECOpCode.EC_OP_PARTFILE_SWAP_A4AF_THIS;\n\t\t\tcase DownloadCommand.SWAP_A4AF_THIS_AUTO:\n\t\t\t\treturn ECOpCode.EC_OP_PARTFILE_SWAP_A4AF_THIS_AUTO;\n\t\t\tcase DownloadCommand.SWAP_A4AF_OTHERS:\n\t\t\t\treturn ECOpCode.EC_OP_PARTFILE_SWAP_A4AF_OTHERS;\n\t\t\tcase DownloadCommand.PAUSE:\n\t\t\t\treturn ECOpCode.EC_OP_PARTFILE_PAUSE;\n\t\t\tcase DownloadCommand.RESUME:\n\t\t\t\treturn ECOpCode.EC_OP_PARTFILE_RESUME;\n\t\t\tcase DownloadCommand.STOP:\n\t\t\t\treturn ECOpCode.EC_OP_PARTFILE_STOP;\n\t\t\tcase DownloadCommand.DELETE:\n\t\t\t\treturn ECOpCode.EC_OP_PARTFILE_DELETE;\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unknown download command: ${command}`);\n\t\t}\n\t}\n}\n","/**\n * AmuleConnection - Manages the low-level connection to aMule EC\n */\n\nimport * as net from 'net';\nimport { CommunicationException, ServerException } from '../exceptions';\nimport { Packet } from '../ec/packet/Packet';\nimport { PacketParser } from '../ec/packet/PacketParser';\nimport { PacketWriter } from '../ec/packet/PacketWriter';\nimport { ECOpCode } from '../ec/Codes';\nimport { AuthClientInfoRequest, AuthPasswordRequest } from '../request/AuthRequest';\nimport type { Request } from '../request/Request';\nimport { AuthSaltResponse } from '../response/AuthSaltResponse';\nimport { PasswordHasher } from '../auth/PasswordHasher';\n\nexport class AmuleConnection {\n\tprivate socket?: net.Socket;\n\tprivate connected = false;\n\tprivate buffer: Buffer = Buffer.allocUnsafe(0);\n\tprivate pendingResponses: {\n\t\tresolve: (packet: Packet) => void;\n\t\treject: (error: Error) => void;\n\t}[] = [];\n\tprivate connectionPromise?: Promise<void>;\n\n\t// Debug logging flag (disabled by default)\n\tprivate debug = false;\n\n\t/**\n\t * Enable or disable debug logging\n\t */\n\tpublic setDebug(enabled: boolean): void {\n\t\tthis.debug = !!enabled;\n\t}\n\n\t/**\n\t * Internal debug logger\n\t */\n\tprivate log(...args: any[]): void {\n\t\tif (!this.debug) {\n\t\t\treturn;\n\t\t}\n\t\tconsole.log('[DEBUG]', ...args);\n\t}\n\n\tconstructor(\n\t\tprivate host: string,\n\t\tprivate port: number,\n\t\tprivate password: string,\n\t\tprivate timeout: number\n\t) {}\n\n\t/**\n\t * Reconnect to the server\n\t */\n\tasync reconnect(): Promise<void> {\n\t\tif (this.connectionPromise) {\n\t\t\treturn this.connectionPromise;\n\t\t}\n\n\t\tthis.connectionPromise = (async () => {\n\t\t\tthis.connected = false;\n\t\t\tif (this.socket) {\n\t\t\t\tthis.socket.destroy();\n\t\t\t}\n\n\t\t\t// Create new socket\n\t\t\tthis.socket = new net.Socket();\n\t\t\tif (this.timeout > 0) {\n\t\t\t\tthis.socket.setTimeout(this.timeout);\n\t\t\t}\n\n\t\t\t// Setup event handlers\n\t\t\tthis.socket.on('data', (data) => this.handleData(Buffer.isBuffer(data) ? data : Buffer.from(data)));\n\t\t\tthis.socket.on('error', (error) => this.handleError(error));\n\t\t\tthis.socket.on('timeout', () => this.handleTimeout());\n\t\t\tthis.socket.on('close', () => this.handleClose());\n\n\t\t\ttry {\n\t\t\t\t// Connect\n\t\t\t\tawait this.connectSocket();\n\n\t\t\t\t// Perform authentication\n\t\t\t\tawait this.authenticate();\n\n\t\t\t\tthis.connected = true;\n\t\t\t} finally {\n\t\t\t\tthis.connectionPromise = undefined;\n\t\t\t}\n\t\t})();\n\n\t\treturn this.connectionPromise;\n\t}\n\n\t/**\n\t * Connect socket to server\n\t */\n\tprivate connectSocket(): Promise<void> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tif (!this.socket) {\n\t\t\t\treturn reject(new CommunicationException('Socket not initialized'));\n\t\t\t}\n\n\t\t\tthis.socket.connect(this.port, this.host, () => {\n\t\t\t\tresolve();\n\t\t\t});\n\n\t\t\tthis.socket.once('error', reject);\n\t\t});\n\t}\n\n\t/**\n\t * Perform authentication handshake\n\t */\n\tprivate async authenticate(): Promise<void> {\n\t\tthis.log('Starting authentication...');\n\t\t// Step 1: Send client info\n\t\tconst clientInfoRequest = new AuthClientInfoRequest();\n\t\tthis.log('Sending client info...');\n\t\tconst saltPacket = await this.sendRequestNoAuth(clientInfoRequest);\n\t\tthis.log('Received salt response');\n\n\t\tif (saltPacket.opCode === ECOpCode.EC_OP_AUTH_FAIL) {\n\t\t\tthrow new ServerException('Authentication failed: server rejected client');\n\t\t}\n\n\t\tif (saltPacket.opCode !== ECOpCode.EC_OP_AUTH_SALT) {\n\t\t\tthrow new ServerException(`Unexpected response to client info: ${saltPacket.opCode}`);\n\t\t}\n\n\t\tconst saltResponse = AuthSaltResponse.fromPacket(saltPacket);\n\t\tthis.log('Salt:', saltResponse.salt);\n\n\t\t// Step 2: Hash password with salt\n\t\tconst hashedPassword = PasswordHasher.hash(this.password, saltResponse.salt);\n\t\tthis.log('Hashed password:', hashedPassword.toString('hex'));\n\n\t\t// Step 3: Send hashed password\n\t\tconst authRequest = new AuthPasswordRequest(hashedPassword);\n\t\tthis.log('Sending hashed password...');\n\t\tconst authPacket = await this.sendRequestNoAuth(authRequest);\n\t\tthis.log('Received auth response');\n\n\t\tif (authPacket.opCode === ECOpCode.EC_OP_AUTH_FAIL) {\n\t\t\tthrow new ServerException('Authentication failed: invalid password');\n\t\t}\n\n\t\tif (authPacket.opCode !== ECOpCode.EC_OP_AUTH_OK) {\n\t\t\tthrow new ServerException(`Unexpected auth response: ${authPacket.opCode}`);\n\t\t}\n\t\tthis.log('Authentication successful!');\n\t}\n\n\t/**\n\t * Handle incoming data\n\t */\n\tprivate handleData(data: Buffer): void {\n\t\tthis.log('Received data:', data.length, 'bytes, hex:', data.toString('hex').substring(0, 100));\n\t\t// Append to buffer\n\t\tthis.buffer = Buffer.concat([this.buffer, data]);\n\n\t\t// Try to parse packets\n\t\twhile (PacketParser.hasCompletePacket(this.buffer)) {\n\t\t\ttry {\n\t\t\t\tconst packet = PacketParser.parse(this.buffer);\n\t\t\t\tthis.log('Parsed packet, opCode:', packet.opCode);\n\n\t\t\t\t// Calculate consumed bytes\n\t\t\t\tconst consumedBytes = PacketParser.getExpectedPacketSize(this.buffer);\n\t\t\t\tthis.buffer = this.buffer.subarray(consumedBytes);\n\n\t\t\t\t// Resolve pending response\n\t\t\t\tconst pending = this.pendingResponses.shift();\n\t\t\t\tif (pending) {\n\t\t\t\t\tpending.resolve(packet);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis.log('Parse error:', error);\n\t\t\t\tconst pending = this.pendingResponses.shift();\n\t\t\t\tif (pending) {\n\t\t\t\t\tpending.reject(error as Error);\n\t\t\t\t}\n\t\t\t\t// If we have a parse error, the buffer might be corrupted for further packets\n\t\t\t\tthis.buffer = Buffer.allocUnsafe(0);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Handle socket error\n\t */\n\tprivate handleError(error: Error): void {\n\t\tthis.connected = false;\n\t\twhile (this.pendingResponses.length > 0) {\n\t\t\tconst pending = this.pendingResponses.shift();\n\t\t\tpending?.reject(new CommunicationException(`Socket error: ${error.message}`));\n\t\t}\n\t}\n\n\t/**\n\t * Handle socket timeout\n\t */\n\tprivate handleTimeout(): void {\n\t\tthis.connected = false;\n\t\twhile (this.pendingResponses.length > 0) {\n\t\t\tconst pending = this.pendingResponses.shift();\n\t\t\tpending?.reject(new CommunicationException('Socket timeout'));\n\t\t}\n\t}\n\n\t/**\n\t * Handle socket close\n\t */\n\tprivate handleClose(): void {\n\t\tthis.log('Socket closed! connected:', this.connected, 'pendingResponses:', this.pendingResponses.length);\n\t\tthis.connected = false;\n\t\twhile (this.pendingResponses.length > 0) {\n\t\t\tconst pending = this.pendingResponses.shift();\n\t\t\tpending?.reject(new CommunicationException('Socket closed'));\n\t\t}\n\t}\n\n\t/**\n\t * Send a request and wait for response\n\t */\n\tasync sendRequest(request: Request): Promise<Packet> {\n\t\tif (!this.connected) {\n\t\t\tawait this.reconnect();\n\t\t}\n\n\t\ttry {\n\t\t\treturn await this.sendRequestNoAuth(request);\n\t\t} catch (error) {\n\t\t\tthis.connected = false;\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Send a request without checking authentication\n\t */\n\tprivate async sendRequestNoAuth(request: Request): Promise<Packet> {\n\t\tif (!this.socket) {\n\t\t\tthrow new CommunicationException('Socket not initialized');\n\t\t}\n\n\t\t// Build and write packet\n\t\tconst packet = request.buildPacket();\n\t\tconst buffer = PacketWriter.write(packet);\n\t\tthis.log('Sending request:', packet.opCode.toString(16), 'Size:', buffer.length);\n\n\t\t// Create promise for response\n\t\tconst responsePromise = new Promise<Packet>((resolve, reject) => {\n\t\t\tthis.pendingResponses.push({ resolve, reject });\n\t\t});\n\n\t\t// Send packet\n\t\tthis.socket.write(buffer);\n\n\t\treturn responsePromise;\n\t}\n}\n","// Base exception classes\n\nexport class AmuleException extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic cause?: Error\n\t) {\n\t\tsuper(message);\n\t\tthis.name = 'AmuleException';\n\t}\n}\n\nexport class InvalidECException extends AmuleException {\n\tconstructor(message: string, cause?: Error) {\n\t\tsuper(message, cause);\n\t\tthis.name = 'InvalidECException';\n\t}\n}\n\nexport class CommunicationException extends AmuleException {\n\tconstructor(message: string, cause?: Error) {\n\t\tsuper(message, cause);\n\t\tthis.name = 'CommunicationException';\n\t}\n}\n\nexport class ServerException extends AmuleException {\n\tconstructor(message: string, cause?: Error) {\n\t\tsuper(message, cause);\n\t\tthis.name = 'ServerException';\n\t}\n}\n","/**\n * Packet Parser - Deserializes EC packets from binary data\n */\n\nimport * as zlib from 'zlib';\nimport { Packet } from './Packet';\nimport { Flags } from './Flags';\nimport { ECOpCode } from '../Codes';\nimport { TagParser } from '../tag/TagParser';\nimport { InvalidECException } from '../../exceptions';\n\nexport class PacketParser {\n\tprivate static readonly HEADER_SIZE = 8; // flags(4) + data_length(4)\n\n\t/**\n\t * Parse a packet from a buffer\n\t */\n\tstatic parse(buffer: Buffer): Packet {\n\t\tif (buffer.length < this.HEADER_SIZE) {\n\t\t\tthrow new InvalidECException(`Buffer too small: ${buffer.length} bytes`);\n\t\t}\n\n\t\t// Read flags\n\t\tconst flags = Flags.fromBuffer(buffer, 0);\n\n\t\t// Read data length\n\t\tconst dataLength = buffer.readUInt32BE(4);\n\n\t\tif (buffer.length < this.HEADER_SIZE + dataLength) {\n\t\t\tthrow new InvalidECException(`Incomplete packet: expected ${this.HEADER_SIZE + dataLength} bytes, got ${buffer.length}`);\n\t\t}\n\n\t\t// Extract data\n\t\tlet data = buffer.subarray(this.HEADER_SIZE, this.HEADER_SIZE + dataLength);\n\n\t\t// Decompress if needed\n\t\tif (flags.isZlib()) {\n\t\t\tdata = this.decompress(data);\n\t\t}\n\n\t\t// Parse packet data\n\t\treturn this.parsePacketData(data, flags);\n\t}\n\n\t/**\n\t * Parse packet data (after decompression)\n\t */\n\tprivate static parsePacketData(data: Buffer, flags: Flags): Packet {\n\t\tlet offset = 0;\n\n\t\t// Read opcode\n\t\tconst opCode = data.readUInt8(offset) as ECOpCode;\n\t\toffset += 1;\n\n\t\t// Read tag count\n\t\tconst useUtf8 = flags.isUtf8Numbers();\n\t\tlet tagCount: number;\n\n\t\tif (useUtf8) {\n\t\t\t// UTF-8 encoded number - not implemented in full yet, assume simple case\n\t\t\ttagCount = data.readUInt8(offset);\n\t\t\toffset += 1;\n\t\t} else {\n\t\t\ttagCount = data.readUInt16BE(offset);\n\t\t\toffset += 2;\n\t\t}\n\n\t\t// Parse tags\n\t\tconst tagParser = new TagParser(data, offset, useUtf8);\n\t\tconst tags = tagParser.parseTags(tagCount);\n\n\t\treturn new Packet(opCode, flags, tags);\n\t}\n\n\t/**\n\t * Decompress ZLIB data\n\t */\n\tprivate static decompress(data: Buffer): Buffer {\n\t\ttry {\n\t\t\treturn zlib.inflateSync(data);\n\t\t} catch (error) {\n\t\t\tthrow new InvalidECException(`Failed to decompress packet: ${error}`);\n\t\t}\n\t}\n\n\t/**\n\t * Calculate expected packet size from header\n\t */\n\tstatic getExpectedPacketSize(headerBuffer: Buffer): number {\n\t\tif (headerBuffer.length < this.HEADER_SIZE) {\n\t\t\tthrow new InvalidECException('Header buffer too small');\n\t\t}\n\n\t\tconst dataLength = headerBuffer.readUInt32BE(4);\n\t\treturn this.HEADER_SIZE + dataLength;\n\t}\n\n\t/**\n\t * Check if buffer contains a complete packet\n\t */\n\tstatic hasCompletePacket(buffer: Buffer): boolean {\n\t\tif (buffer.length < this.HEADER_SIZE) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst expectedSize = this.getExpectedPacketSize(buffer);\n\t\treturn buffer.length >= expectedSize;\n\t}\n}\n","/**\n * Tag Parser - Deserializes tags from binary data\n *\n * This implementation follows jamule's TagParser logic closely.\n * Key insight: tagLength is calculated using FIXED header sizes (not UTF-8 sizes),\n * even when the wire format uses UTF-8 encoding. So we must track \"theoreticalLength\"\n * using fixed sizes to correctly calculate the value size.\n */\n\nimport { ECTagType, ECTagName } from '../Codes';\nimport { Tag, CustomTag, UByteTag, UShortTag, UIntTag, ULongTag, UInt128Tag, StringTag, DoubleTag, Ipv4Tag, Hash16Tag } from './Tag';\nimport { readUtf8Number } from '../Encoding';\nimport { InvalidECException } from '../../exceptions';\n\n// Fixed header sizes (from jamule TypeSizes.kt)\nconst TAG_NAME_SIZE = 2; // UShort\nconst TAG_TYPE_SIZE = 1; // UByte\nconst TAG_LENGTH_SIZE = 4; // UInt\nconst SUBTAG_COUNT_SIZE = 2; // UShort\n\ninterface TagParseResult {\n\ttag: Tag<any>;\n\ttheoreticalLength: number;\n\tendIndex: number;\n}\n\nexport class TagParser {\n\tprivate buffer: Buffer;\n\tprivate offset: number;\n\tprivate readonly useUtf8Numbers: boolean;\n\n\tconstructor(buffer: Buffer, offset: number = 0, useUtf8Numbers: boolean = false) {\n\t\tthis.buffer = buffer;\n\t\tthis.offset = offset;\n\t\tthis.useUtf8Numbers = useUtf8Numbers;\n\t}\n\n\t/**\n\t * Parse a single tag from the current position\n\t */\n\tparseTag(): Tag<any> {\n\t\treturn this.parseTagWithMetadata().tag;\n\t}\n\n\t/**\n\t * Internal parse that returns metadata needed for nested tag calculation\n\t */\n\tprivate parseTagWithMetadata(): TagParseResult {\n\t\t// First part is the tag name and the flag indicating if it has subtags\n\t\tconst tagNameAndSubtags = this.readNumber(TAG_NAME_SIZE);\n\t\tconst tagNameRaw = (tagNameAndSubtags >> 1) & 0xffff;\n\t\tconst tagName = tagNameRaw as ECTagName;\n\t\tconst hasSubtags = (tagNameAndSubtags & 1) !== 0;\n\n\t\t// Then is the tag type\n\t\tconst tagType = this.buffer.readUInt8(this.offset) as ECTagType;\n\t\tthis.offset += TAG_TYPE_SIZE;\n\n\t\t// Then is the tag length, indicating the tag's own content length + length of children (with headers)\n\t\tconst tagLength = this.readNumber(TAG_LENGTH_SIZE);\n\n\t\t// The next byte is the first byte of the tag's value\n\t\t// This is mutable because it will be updated if the tag has subtags\n\t\tlet valueStartIndex = this.offset;\n\n\t\t// If the tag has subtags, we need to parse them\n\t\tconst subTags: Tag<any>[] = [];\n\n\t\t// Theoretical length is the length of the tag, including the length of the subtags (with headers)\n\t\t// All numbers are considered to be non-UTF-8 (fixed sizes)\n\t\tlet theoreticalLength = 0;\n\n\t\t// The last byte of the tag's value\n\t\tlet valueEndIndex: number;\n\n\t\tif (!hasSubtags) {\n\t\t\tvalueEndIndex = valueStartIndex + tagLength - 1;\n\t\t} else {\n\t\t\t// The first part to read is the subtags count\n\t\t\tconst subTagCount = this.readNumber(SUBTAG_COUNT_SIZE);\n\n\t\t\t// We reuse valueStartIndex to store the index after reading subtag count\n\t\t\tvalueStartIndex = this.offset;\n\n\t\t\tfor (let i = 0; i < subTagCount; i++) {\n\t\t\t\tconst result = this.parseTagWithMetadata();\n\t\t\t\tsubTags.push(result.tag);\n\t\t\t\ttheoreticalLength += result.theoreticalLength;\n\t\t\t}\n\n\t\t\tif (subTags.length > subTagCount) {\n\t\t\t\tthrow new InvalidECException(`Error parsing subtags list - Expected subtags ${subTagCount} found subtags ${subTags.length}`);\n\t\t\t}\n\n\t\t\t// Calculate value end using tagLength minus theoreticalLength (fixed sizes)\n\t\t\tvalueEndIndex = this.offset + (tagLength - theoreticalLength - 1);\n\t\t\ttheoreticalLength += SUBTAG_COUNT_SIZE;\n\t\t}\n\n\t\t// Read the tag value\n\t\tconst valueSize = valueEndIndex - this.offset + 1;\n\t\tconst tagValue = this.buffer.subarray(this.offset, this.offset + valueSize);\n\t\tthis.offset += valueSize;\n\n\t\t// Update theoretical length with the value and header sizes\n\t\ttheoreticalLength += tagValue.length;\n\t\ttheoreticalLength += TAG_NAME_SIZE;\n\t\ttheoreticalLength += TAG_TYPE_SIZE;\n\t\ttheoreticalLength += TAG_LENGTH_SIZE;\n\n\t\t// Create the tag\n\t\tconst tag = this.createTagFromValue(tagName, tagType, tagValue);\n\t\tif (subTags.length > 0) {\n\t\t\ttag.nestedTags = subTags;\n\t\t}\n\n\t\treturn {\n\t\t\ttag,\n\t\t\ttheoreticalLength,\n\t\t\tendIndex: this.offset - 1,\n\t\t};\n\t}\n\n\t/**\n\t * Parse multiple tags\n\t */\n\tparseTags(count: number): Tag<any>[] {\n\t\tconst tags: Tag<any>[] = [];\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\ttags.push(this.parseTag());\n\t\t}\n\t\treturn tags;\n\t}\n\n\t/**\n\t * Read a number with the given fixed size.\n\t * In UTF-8 mode, reads as UTF-8 codepoint. Otherwise reads as big-endian integer.\n\t */\n\tprivate readNumber(fixedSize: number): number {\n\t\tif (this.useUtf8Numbers) {\n\t\t\tconst result = readUtf8Number(this.buffer, this.offset);\n\t\t\tthis.offset = result.newOffset;\n\t\t\treturn Number(result.value);\n\t\t} else {\n\t\t\tlet value: number;\n\t\t\tswitch (fixedSize) {\n\t\t\t\tcase 1:\n\t\t\t\t\tvalue = this.buffer.readUInt8(this.offset);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\tvalue = this.buffer.readUInt16BE(this.offset);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t\tvalue = this.buffer.readUInt32BE(this.offset);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new InvalidECException(`Unsupported number size: ${fixedSize}`);\n\t\t\t}\n\t\t\tthis.offset += fixedSize;\n\t\t\treturn value;\n\t\t}\n\t}\n\n\t/**\n\t * Create a tag instance based on type and raw value bytes\n\t */\n\tprivate createTagFromValue(name: ECTagName, type: ECTagType, value: Buffer): Tag<any> {\n\t\tswitch (type) {\n\t\t\tcase ECTagType.EC_TAGTYPE_CUSTOM:\n\t\t\t\treturn new CustomTag(name, value);\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT8: {\n\t\t\t\tconst numValue = value.length > 0 ? value.readUInt8(0) : 0;\n\t\t\t\treturn new UByteTag(name, numValue);\n\t\t\t}\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT16: {\n\t\t\t\tconst numValue = value.length >= 2 ? value.readUInt16BE(0) : 0;\n\t\t\t\treturn new UShortTag(name, numValue);\n\t\t\t}\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT32: {\n\t\t\t\tconst numValue = value.length >= 4 ? value.readUInt32BE(0) : 0;\n\t\t\t\treturn new UIntTag(name, numValue);\n\t\t\t}\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT64: {\n\t\t\t\tconst numValue = value.length >= 8 ? value.readBigUInt64BE(0) : 0n;\n\t\t\t\treturn new ULongTag(name, numValue);\n\t\t\t}\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT128:\n\t\t\t\tconst numValue = value.length >= 16 ? this.parseUInt128(value) : 0n;\n\t\t\t\treturn new UInt128Tag(name, numValue);\n\n\t\t\tcase ECTagType.EC_TAGTYPE_STRING: {\n\t\t\t\t// Remove null terminator if present\n\t\t\t\tconst strValue = value[value.length - 1] === 0x00 ? value.toString('utf-8', 0, value.length - 1) : value.toString('utf-8');\n\t\t\t\treturn new StringTag(name, strValue);\n\t\t\t}\n\n\t\t\tcase ECTagType.EC_TAGTYPE_DOUBLE: {\n\t\t\t\t// Double is stored as a null-terminated string representation\n\t\t\t\tconst strValue = value[value.length - 1] === 0x00 ? value.toString('utf-8', 0, value.length - 1) : value.toString('utf-8');\n\t\t\t\treturn new DoubleTag(name, parseFloat(strValue));\n\t\t\t}\n\n\t\t\tcase ECTagType.EC_TAGTYPE_IPV4: {\n\t\t\t\t// Read 4 bytes for IP address, 2 bytes for port (BE)\n\t\t\t\tif (value.length !== 6) {\n\t\t\t\t\tthrow new InvalidECException(`Ipv4Tag value must be 6 bytes long, got ${value.length}`);\n\t\t\t\t}\n\t\t\t\tconst address = `${value[0]}.${value[1]}.${value[2]}.${value[3]}`;\n\t\t\t\tconst port = value.readUInt16BE(4);\n\t\t\t\tconst tag = new Ipv4Tag(name);\n\t\t\t\ttag['value'] = { address, port };\n\t\t\t\treturn tag;\n\t\t\t}\n\n\t\t\tcase ECTagType.EC_TAGTYPE_HASH16:\n\t\t\t\treturn new Hash16Tag(name, value);\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UNKNOWN:\n\t\t\tdefault:\n\t\t\t\tthrow new InvalidECException(`Unknown tag type: ${type} for tag ${name}`);\n\t\t}\n\t}\n\n\tprivate parseUInt128(value: Buffer): bigint {\n\t\tif (value.length < 16) {\n\t\t\tthrow new InvalidECException(`UInt128 value must be at least 16 bytes long, got ${value.length}`);\n\t\t}\n\t\treturn (value.readBigUInt64BE(0) << 64n) | value.readBigUInt64BE(8);\n\t}\n\n\t/**\n\t * Get current offset\n\t */\n\tgetOffset(): number {\n\t\treturn this.offset;\n\t}\n}\n","// Utility functions for encoding/decoding numbers and buffers\n\n/**\n * Reads a UTF-8 encoded number from a buffer\n * Treats UTF-8 bytes as a Unicode code point and returns the numeric value\n */\nexport function readUtf8Number(buffer: Buffer, offset: number): { value: bigint; newOffset: number } {\n\t// Determine the length of the UTF-8 sequence from the first byte\n\tconst firstByte = buffer[offset];\n\tlet length: number;\n\n\tif ((firstByte & 0x80) === 0) {\n\t\t// 0xxxxxxx - 1 byte (ASCII)\n\t\tlength = 1;\n\t} else if ((firstByte & 0xe0) === 0xc0) {\n\t\t// 110xxxxx - 2 bytes\n\t\tlength = 2;\n\t} else if ((firstByte & 0xf0) === 0xe0) {\n\t\t// 1110xxxx - 3 bytes\n\t\tlength = 3;\n\t} else if ((firstByte & 0xf8) === 0xf0) {\n\t\t// 11110xxx - 4 bytes\n\t\tlength = 4;\n\t} else {\n\t\tthrow new Error(`Invalid UTF-8 first byte: 0x${firstByte.toString(16)}`);\n\t}\n\n\t// Extract the UTF-8 sequence and decode it\n\tconst utf8Bytes = buffer.subarray(offset, offset + length);\n\tconst str = utf8Bytes.toString('utf-8');\n\tconst codePoint = str.codePointAt(0);\n\n\tif (codePoint === undefined) {\n\t\tthrow new Error('Failed to decode UTF-8 number');\n\t}\n\n\treturn {\n\t\tvalue: BigInt(codePoint),\n\t\tnewOffset: offset + length,\n\t};\n}\n\n/**\n * Encodes a number as UTF-8 code point\n * Treats the number as a Unicode code point and encodes it as UTF-8\n */\nexport function encodeUtf8Number(value: number | bigint): Buffer {\n\tconst num = Number(value);\n\n\t// Encode the number as a UTF-8 code point\n\t// Create a string from the code point and encode as UTF-8\n\tconst str = String.fromCodePoint(num);\n\treturn Buffer.from(str, 'utf-8');\n}\n\n/**\n * Reads a 16-bit unsigned integer\n */\nexport function readUInt16(buffer: Buffer, offset: number, utf8: boolean): number {\n\tif (utf8) {\n\t\tconst result = readUtf8Number(buffer, offset);\n\t\treturn Number(result.value);\n\t}\n\treturn buffer.readUInt16BE(offset);\n}\n\n/**\n * Reads a 32-bit unsigned integer\n */\nexport function readUInt32(buffer: Buffer, offset: number, utf8: boolean): number {\n\tif (utf8) {\n\t\tconst result = readUtf8Number(buffer, offset);\n\t\treturn Number(result.value);\n\t}\n\treturn buffer.readUInt32BE(offset);\n}\n\n/**\n * Reads a 64-bit unsigned integer as bigint\n */\nexport function readUInt64(buffer: Buffer, offset: number): bigint {\n\treturn buffer.readBigUInt64BE(offset);\n}\n\n/**\n * Encodes a 16-bit unsigned integer\n */\nexport function encodeUInt16(value: number, utf8: boolean): Buffer {\n\tif (utf8) {\n\t\treturn encodeUtf8Number(value);\n\t}\n\tconst buf = Buffer.allocUnsafe(2);\n\tbuf.writeUInt16BE(value);\n\treturn buf;\n}\n\n/**\n * Encodes a 32-bit unsigned integer\n */\nexport function encodeUInt32(value: number, utf8: boolean): Buffer {\n\tif (utf8) {\n\t\treturn encodeUtf8Number(value);\n\t}\n\tconst buf = Buffer.allocUnsafe(4);\n\tbuf.writeUInt32BE(value);\n\treturn buf;\n}\n\n/**\n * Encodes a 64-bit unsigned integer\n */\nexport function encodeUInt64(value: bigint): Buffer {\n\tconst buf = Buffer.allocUnsafe(8);\n\tbuf.writeBigUInt64BE(value);\n\treturn buf;\n}\n\n/**\n * Gets the number of bytes needed to encode a value as UTF-8 code point\n */\nexport function numberLength(value: number | bigint): number {\n\tconst num = Number(value);\n\n\t// Determine UTF-8 length based on code point value\n\tif (num < 0x80) {\n\t\treturn 1; // ASCII range\n\t} else if (num < 0x800) {\n\t\treturn 2; // 2-byte UTF-8\n\t} else if (num < 0x10000) {\n\t\treturn 3; // 3-byte UTF-8\n\t} else if (num < 0x110000) {\n\t\treturn 4; // 4-byte UTF-8\n\t} else {\n\t\tthrow new Error(`Code point out of range: ${num}`);\n\t}\n}\n","/**\n * Packet Writer - Serializes EC packets to binary data\n */\n\nimport * as zlib from 'zlib';\nimport { Packet } from './Packet';\nimport { Flags } from './Flags';\nimport { TagEncoder } from '../tag/TagEncoder';\nimport { encodeUtf8Number } from '../Encoding';\n\nexport class PacketWriter {\n\tprivate static readonly HEADER_SIZE = 8; // flags(4) + data_length(4)\n\n\t/**\n\t * Write a packet to a buffer\n\t */\n\tstatic write(packet: Packet): Buffer {\n\t\tconst useUtf8 = packet.flags.isUtf8Numbers();\n\t\tconst useZlib = packet.flags.isZlib();\n\n\t\t// Encode packet data\n\t\tlet data = this.encodePacketData(packet, useUtf8);\n\n\t\t// Compress if needed\n\t\tif (useZlib) {\n\t\t\tdata = this.compress(data);\n\t\t}\n\n\t\t// Create final buffer with header\n\t\tconst buffer = Buffer.allocUnsafe(this.HEADER_SIZE + data.length);\n\n\t\t// Write flags\n\t\tpacket.flags.writeToBuffer(buffer, 0);\n\n\t\t// Write data length\n\t\tbuffer.writeUInt32BE(data.length, 4);\n\n\t\t// Write data\n\t\tdata.copy(buffer, this.HEADER_SIZE);\n\n\t\treturn buffer;\n\t}\n\n\t/**\n\t * Encode packet data (before compression)\n\t */\n\tprivate static encodePacketData(packet: Packet, useUtf8: boolean): Buffer {\n\t\tconst encoder = new TagEncoder(useUtf8);\n\n\t\t// Calculate size\n\t\tlet size = 1; // opcode\n\n\t\tif (useUtf8) {\n\t\t\tconst countBuf = encodeUtf8Number(packet.tags.length);\n\t\t\tsize += countBuf.length;\n\t\t} else {\n\t\t\tsize += 2; // tag count (uint16)\n\t\t}\n\n\t\t// Calculate tags size\n\t\tfor (const tag of packet.tags) {\n\t\t\tsize += encoder.calculateTagSize(tag);\n\t\t}\n\n\t\t// Create buffer\n\t\tconst buffer = Buffer.allocUnsafe(size);\n\t\tlet offset = 0;\n\n\t\t// Write opcode\n\t\tbuffer.writeUInt8(packet.opCode, offset);\n\t\toffset += 1;\n\n\t\t// Write tag count\n\t\tif (useUtf8) {\n\t\t\tconst countBuf = encodeUtf8Number(packet.tags.length);\n\t\t\tcountBuf.copy(buffer, offset);\n\t\t\toffset += countBuf.length;\n\t\t} else {\n\t\t\tbuffer.writeUInt16BE(packet.tags.length, offset);\n\t\t\toffset += 2;\n\t\t}\n\n\t\t// Write tags\n\t\tfor (const tag of packet.tags) {\n\t\t\toffset = encoder.encodeTag(tag, buffer, offset);\n\t\t}\n\n\t\treturn buffer;\n\t}\n\n\t/**\n\t * Compress data with ZLIB\n\t */\n\tprivate static compress(data: Buffer): Buffer {\n\t\treturn zlib.deflateSync(data, {\n\t\t\tlevel: zlib.constants.Z_BEST_COMPRESSION,\n\t\t});\n\t}\n}\n","/**\n * Tag Encoder - Serializes tags to binary data\n */\n\nimport { ECTagType } from '../Codes';\nimport type { Tag } from './Tag';\nimport { encodeUtf8Number, numberLength } from '../Encoding';\n\nexport class TagEncoder {\n\tprivate readonly useUtf8Numbers: boolean;\n\n\tconstructor(useUtf8Numbers: boolean = false) {\n\t\tthis.useUtf8Numbers = useUtf8Numbers;\n\t}\n\n\t/**\n\t * Calculate total size needed for a tag (Physical Buffer Size)\n\t */\n\tcalculateTagSize(tag: Tag<any>): number {\n\t\tlet size = 0;\n\n\t\t// Tag name (with subtags bit)\n\t\tif (this.useUtf8Numbers) {\n\t\t\tconst hasSubtags = (tag.nestedTags?.length ?? 0) > 0 ? 1 : 0;\n\t\t\tconst nameAndSubtags = ((tag.name & 0xffff) << 1) | hasSubtags;\n\t\t\tsize += numberLength(nameAndSubtags);\n\t\t} else {\n\t\t\tsize += 2; // name (uint16)\n\t\t}\n\n\t\t// Type is always a single byte\n\t\tsize += 1; // type (uint8)\n\n\t\t// Tag length (subtags + value)\n\t\t// CRITICAL: The length field itself reports \"Logical Length\" (using fixed header sizes),\n\t\t// NOT the physical byte length. This matches Jamule/aMule protocol expectation.\n\t\t// However, the SIZE of the length field depends on the encoded value of this logical length.\n\t\tconst reportedLength = this.calculateReportedLength(tag);\n\t\tif (this.useUtf8Numbers) {\n\t\t\tsize += numberLength(reportedLength);\n\t\t} else {\n\t\t\tsize += 4; // uint32\n\t\t}\n\n\t\t// Nested tags count (only if has subtags)\n\t\tconst hasSubtags = (tag.nestedTags?.length ?? 0) > 0;\n\t\tif (hasSubtags) {\n\t\t\tconst nestedCount = tag.nestedTags?.length ?? 0;\n\t\t\tif (this.useUtf8Numbers) {\n\t\t\t\tsize += numberLength(nestedCount);\n\t\t\t} else {\n\t\t\t\t// In non-UTF8 mode, nested count is UInt16 (not UInt32)\n\t\t\t\tsize += 2; // uint16\n\t\t\t}\n\t\t}\n\n\t\t// Nested tags\n\t\tif (tag.nestedTags) {\n\t\t\tfor (const nestedTag of tag.nestedTags) {\n\t\t\t\tsize += this.calculateTagSize(nestedTag);\n\t\t\t}\n\t\t}\n\n\t\t// Tag value size\n\t\tsize += this.calculateValueSize(tag);\n\n\t\treturn size;\n\t}\n\n\t/**\n\t * Calculate the \"Reported Length\" of the tag content.\n\t * This logic mimics Jamule's computeTagLength, which assumes FIXED header sizes\n\t * (2 bytes name, 1 byte type, 4 bytes length, 2 bytes subtag count)\n\t * even when UTF-8 encoding is used.\n\t */\n\tprivate calculateReportedLength(tag: Tag<any>): number {\n\t\tlet length = 0;\n\n\t\t// Subtags\n\t\tif (tag.nestedTags) {\n\t\t\tfor (const nestedTag of tag.nestedTags) {\n\t\t\t\t// Reported length of subtag content\n\t\t\t\tlength += this.calculateReportedLength(nestedTag);\n\n\t\t\t\t// Add Fixed Header Overhead\n\t\t\t\t// TAG_NAME_SIZE (2) + TAG_TYPE_SIZE (1) + TAG_LENGTH_SIZE (4)\n\t\t\t\tlength += 7;\n\n\t\t\t\tif ((nestedTag.nestedTags?.length ?? 0) > 0) {\n\t\t\t\t\t// SUBTAG_COUNT_SIZE (2)\n\t\t\t\t\tlength += 2;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Value of this tag\n\t\tlength += this.calculateValueSize(tag);\n\n\t\treturn length;\n\t}\n\n\t/**\n\t * Calculate size of tag value\n\t */\n\tprivate calculateValueSize(tag: Tag<any>): number {\n\t\tconst encoded = tag.encodeValue();\n\n\t\tswitch (tag.type) {\n\t\t\tcase ECTagType.EC_TAGTYPE_CUSTOM:\n\t\t\t\t// Empty custom tags (capability flags) have no data\n\t\t\t\tif (encoded.length === 0) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t\t// Custom tags with data have no length prefix\n\t\t\t\treturn encoded.length;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_STRING:\n\t\t\t\t// String value is just the UTF-8 string + null terminator\n\t\t\t\t// No length prefix\n\t\t\t\treturn encoded.length;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT8:\n\t\t\t\treturn 1;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT16:\n\t\t\t\treturn 2;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT32:\n\t\t\t\treturn 4;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT64:\n\t\t\t\treturn 8;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT128:\n\t\t\t\treturn 16;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_DOUBLE:\n\t\t\t\treturn 8;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_IPV4:\n\t\t\t\treturn 6; // 4 bytes IP + 2 bytes port\n\n\t\t\tcase ECTagType.EC_TAGTYPE_HASH16:\n\t\t\t\treturn 16;\n\n\t\t\tdefault:\n\t\t\t\treturn 0;\n\t\t}\n\t}\n\n\t/**\n\t * Encode a tag to a buffer\n\t */\n\tencodeTag(tag: Tag<any>, buffer: Buffer, offset: number): number {\n\t\tlet currentOffset = offset;\n\n\t\t// Write tag name with subtags bit\n\t\tconst hasSubtags = (tag.nestedTags?.length ?? 0) > 0 ? 1 : 0;\n\t\tconst nameAndSubtags = ((tag.name & 0xffff) << 1) | hasSubtags;\n\n\t\tif (this.useUtf8Numbers) {\n\t\t\tconst encoded = encodeUtf8Number(nameAndSubtags);\n\t\t\tencoded.copy(buffer, currentOffset);\n\t\t\tcurrentOffset += encoded.length;\n\t\t} else {\n\t\t\t// In non-UTF8 mode, also encode name with subtags bit\n\t\t\tbuffer.writeUInt16BE(nameAndSubtags, currentOffset);\n\t\t\tcurrentOffset += 2;\n\t\t}\n\n\t\t// Write type (always a single byte)\n\t\tbuffer.writeUInt8(tag.type, currentOffset);\n\t\tcurrentOffset += 1;\n\n\t\t// Write tag length (subtags + value)\n\t\t// Use Reported Length (Logical) for the Value\n\t\tconst tagLength = this.calculateReportedLength(tag);\n\t\tif (this.useUtf8Numbers) {\n\t\t\tconst encoded = encodeUtf8Number(tagLength);\n\t\t\tencoded.copy(buffer, currentOffset);\n\t\t\tcurrentOffset += encoded.length;\n\t\t} else {\n\t\t\tbuffer.writeUInt32BE(tagLength, currentOffset);\n\t\t\tcurrentOffset += 4;\n\t\t}\n\n\t\t// Write nested tags count if has subtags\n\t\tconst nestedCount = tag.nestedTags?.length ?? 0;\n\t\tif (hasSubtags) {\n\t\t\tif (this.useUtf8Numbers) {\n\t\t\t\tconst encoded = encodeUtf8Number(nestedCount);\n\t\t\t\tencoded.copy(buffer, currentOffset);\n\t\t\t\tcurrentOffset += encoded.length;\n\t\t\t} else {\n\t\t\t\t// In non-UTF8 mode, nested count is UInt16 (not UInt32)\n\t\t\t\tbuffer.writeUInt16BE(nestedCount, currentOffset);\n\t\t\t\tcurrentOffset += 2;\n\t\t\t}\n\t\t}\n\n\t\t// Write nested tags\n\t\tif (tag.nestedTags) {\n\t\t\tfor (const nestedTag of tag.nestedTags) {\n\t\t\t\tcurrentOffset = this.encodeTag(nestedTag, buffer, currentOffset);\n\t\t\t}\n\t\t}\n\n\t\t// Write tag value (AFTER subtags)\n\t\tcurrentOffset = this.encodeValue(tag, buffer, currentOffset);\n\n\t\treturn currentOffset;\n\t}\n\n\t/**\n\t * Encode tag value to buffer\n\t */\n\tprivate encodeValue(tag: Tag<any>, buffer: Buffer, offset: number): number {\n\t\tconst encoded = tag.encodeValue();\n\n\t\tswitch (tag.type) {\n\t\t\tcase ECTagType.EC_TAGTYPE_CUSTOM:\n\t\t\t\t// For empty custom tags (like capability flags), don't write any data\n\t\t\t\tif (encoded.length > 0) {\n\t\t\t\t\t// Custom tags with data have no additional length prefix\n\t\t\t\t\t// The tagLength header already specifies the size\n\t\t\t\t\tencoded.copy(buffer, offset);\n\t\t\t\t\treturn offset + encoded.length;\n\t\t\t\t}\n\t\t\t\treturn offset; // Empty custom tag, no data to write\n\n\t\t\tcase ECTagType.EC_TAGTYPE_STRING:\n\t\t\t\t// String value is just the UTF-8 string + null terminator\n\t\t\t\t// No additional length prefix - tagLength header already specifies the size\n\t\t\t\tencoded.copy(buffer, offset);\n\t\t\t\treturn offset + encoded.length;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT8:\n\t\t\t\tbuffer.writeUInt8(tag.getValue(), offset);\n\t\t\t\treturn offset + 1;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT16:\n\t\t\t\tbuffer.writeUInt16BE(tag.getValue(), offset);\n\t\t\t\treturn offset + 2;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT32:\n\t\t\t\tbuffer.writeUInt32BE(tag.getValue(), offset);\n\t\t\t\treturn offset + 4;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT64:\n\t\t\t\tbuffer.writeBigUInt64BE(tag.getValue(), offset);\n\t\t\t\treturn offset + 8;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_DOUBLE:\n\t\t\t\tbuffer.writeDoubleBE(tag.getValue(), offset);\n\t\t\t\treturn offset + 8;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_IPV4:\n\t\t\t\tbuffer.writeUInt32BE(tag.getValue().ip, offset);\n\t\t\t\tbuffer.writeUInt16BE(tag.getValue().port, offset + 4);\n\t\t\t\treturn offset + 6;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT128:\n\t\t\tcase ECTagType.EC_TAGTYPE_HASH16:\n\t\t\t\tencoded.copy(buffer, offset);\n\t\t\t\treturn offset + encoded.length;\n\n\t\t\tdefault:\n\t\t\t\treturn offset;\n\t\t}\n\t}\n\n\t/**\n\t * Encode multiple tags\n\t */\n\tencodeTags(tags: Tag<any>[]): Buffer {\n\t\t// Calculate total size\n\t\tlet totalSize = 0;\n\t\tfor (const tag of tags) {\n\t\t\ttotalSize += this.calculateTagSize(tag);\n\t\t}\n\n\t\t// Allocate buffer and encode\n\t\tconst buffer = Buffer.allocUnsafe(totalSize);\n\t\tlet offset = 0;\n\t\tfor (const tag of tags) {\n\t\t\toffset = this.encodeTag(tag, buffer, offset);\n\t\t}\n\n\t\treturn buffer;\n\t}\n}\n","/**\n * Auth Request - Send client info to initiate authentication\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName } from '../ec/Codes';\nimport { Hash16Tag, UShortTag, StringTag, CustomTag } from '../ec/tag/Tag';\n\nexport class AuthClientInfoRequest extends Request {\n\tconstructor(clientName: string = 'amule-ts-client', clientVersion: string = '1.0.0') {\n\t\tsuper(ECOpCode.EC_OP_AUTH_REQ);\n\n\t\t// Add client info\n\t\tthis.addTag(new StringTag(ECTagName.EC_TAG_CLIENT_NAME, clientName));\n\t\tthis.addTag(new StringTag(ECTagName.EC_TAG_CLIENT_VERSION, clientVersion));\n\n\t\t// Add protocol version\n\t\tthis.addTag(new UShortTag(ECTagName.EC_TAG_PROTOCOL_VERSION, 0x0204));\n\n\t\t// Add capability flags as empty CustomTag (like jamule does)\n\t\tthis.addTag(new CustomTag(ECTagName.EC_TAG_CAN_ZLIB, Buffer.alloc(0)));\n\t\tthis.addTag(new CustomTag(ECTagName.EC_TAG_CAN_UTF8_NUMBERS, Buffer.alloc(0)));\n\t}\n}\n\n/**\n * Auth Password Request - Send hashed password after receiving salt\n */\nexport class AuthPasswordRequest extends Request {\n\tconstructor(hashedPassword: Buffer) {\n\t\tsuper(ECOpCode.EC_OP_AUTH_PASSWD);\n\n\t\t// Add password hash\n\t\tthis.addTag(new Hash16Tag(ECTagName.EC_TAG_PASSWD_HASH, hashedPassword));\n\t}\n}\n","/**\n * Auth Salt Response - Contains authentication salt\n */\n\nimport { Packet } from '../ec/packet/Packet';\nimport { ECTagName } from '../ec/Codes';\nimport { findNumericTag } from '../ec/tag/Tag';\nimport { InvalidECException } from '../exceptions';\n\nexport class AuthSaltResponse {\n\tconstructor(public readonly salt: bigint) {}\n\n\tstatic fromPacket(packet: Packet): AuthSaltResponse {\n\t\tconst saltTag = findNumericTag(packet.tags, ECTagName.EC_TAG_PASSWD_SALT);\n\t\tif (!saltTag) {\n\t\t\tthrow new InvalidECException('Missing salt tag in auth salt response');\n\t\t}\n\n\t\treturn new AuthSaltResponse(saltTag.value);\n\t}\n}\n","/**\n * Password Hasher for aMule EC authentication\n */\n\nimport * as crypto from 'crypto';\n\nexport class PasswordHasher {\n\t/**\n\t * Hash a password with salt using MD5\n\t *\n\t * This matches aMule's password hashing algorithm (from jamule):\n\t * 1. saltHash = MD5(salt.toHexString().uppercase())\n\t * 2. passwordHash = MD5(password)\n\t * 3. return MD5(passwordHash.toHex().lowercase() + saltHash.toHex().lowercase())\n\t *\n\t * @param password The password to hash\n\t * @param salt The salt received from the server\n\t * @returns The hashed password as a Buffer\n\t */\n\tstatic hash(password: string, salt: bigint): Buffer {\n\t\t// Step 1: Hash the salt (as uppercase hex string)\n\t\tconst saltHexUpper = salt.toString(16).toUpperCase().padStart(16, '0');\n\t\tconst saltHash = crypto.createHash('md5').update(saltHexUpper, 'utf-8').digest();\n\n\t\t// Step 2: Hash the password\n\t\tconst passwordHash = crypto.createHash('md5').update(password, 'utf-8').digest();\n\n\t\t// Step 3: Hash the concatenation of both hashes (as lowercase hex strings)\n\t\tconst passwordHashHex = passwordHash.toString('hex').toLowerCase();\n\t\tconst saltHashHex = saltHash.toString('hex').toLowerCase();\n\t\tconst finalHash = crypto\n\t\t\t.createHash('md5')\n\t\t\t.update(passwordHashHex + saltHashHex, 'utf-8')\n\t\t\t.digest();\n\n\t\treturn finalHash;\n\t}\n\n\t/**\n\t * Hash a password without salt (for testing)\n\t */\n\tstatic hashWithoutSalt(password: string): Buffer {\n\t\tconst lowerPassword = password.toLowerCase();\n\t\tconst md5Hash = crypto.createHash('md5');\n\t\tmd5Hash.update(lowerPassword, 'utf-8');\n\t\treturn md5Hash.digest();\n\t}\n}\n","/**\n * Main aMule EC Client\n */\n\nimport { AmuleConnection } from './AmuleConnection';\nimport type { AmuleFile, AmuleTransferringFile, AmuleCategory, AmuleServer, DownloadCommand, SearchType } from '../model';\nimport type { SearchFilters } from '../types';\nimport { EcPrefs } from '../ec/Codes';\n\nexport interface AmuleClientOptions {\n\thost: string;\n\tport: number;\n\tpassword: string;\n\ttimeout?: number;\n}\n\nexport interface StatsResponse {\n\tid: number;\n\ted2kId: number;\n\tkadId?: string;\n\tconnectedServer?: {\n\t\tname?: string;\n\t\tdescription?: string;\n\t\tip: string;\n\t\tport: number;\n\t};\n\tconnectionState?: any; // Will be properly typed later\n\tuploadOverhead: number;\n\tdownloadOverhead: number;\n\tbannedCount: number;\n\tloggerMessage: string[];\n\ttotalSentBytes: number;\n\ttotalReceivedBytes: number;\n\tsharedFileCount: number;\n\tuploadSpeed: number;\n\tdownloadSpeed: number;\n\tuploadSpeedLimit: number;\n\tdownloadSpeedLimit: number;\n\tuploadQueueLength: number;\n\ttotalSourceCount: number;\n\ted2kUsers: number;\n\tkadUsers: number;\n\ted2kFiles: number;\n\tkadFiles: number;\n\tkadNodes: number;\n}\n\nexport interface SearchResultsResponse {\n\tfiles: Array<{\n\t\tfileName: string;\n\t\thash: Buffer;\n\t\tsizeFull: number;\n\t\tdownloadStatus: number;\n\t\tcompleteSourceCount: number;\n\t\tsourceCount: number;\n\t}>;\n}\n\nexport class AmuleClient {\n\tprivate connection: AmuleConnection;\n\n\tconstructor(options: AmuleClientOptions) {\n\t\tthis.connection = new AmuleConnection(options.host, options.port, options.password, options.timeout || 0);\n\t}\n\n\t/**\n\t * Reconnect to the server\n\t */\n\tasync reconnect(): Promise<void> {\n\t\tawait this.connection.reconnect();\n\t}\n\n\t/**\n\t * Get server statistics\n\t */\n\tasync getStats(): Promise<StatsResponse> {\n\t\tconst { StatsRequest } = await import('../request/StatsRequest');\n\t\tconst { StatsResponseParser } = await import('../response/StatsResponse');\n\n\t\tconst request = new StatsRequest();\n\t\tconst packet = await this.connection.sendRequest(request);\n\n\t\treturn StatsResponseParser.fromPacket(packet);\n\t}\n\n\t/**\n\t * Start an asynchronous search\n\t */\n\tasync searchAsync(query: string, searchType?: SearchType, filters?: SearchFilters): Promise<string> {\n\t\tconst { SearchRequest } = await import('../request/SearchRequest');\n\n\t\tconst request = new SearchRequest(query, searchType, filters);\n\t\tawait this.connection.sendRequest(request);\n\n\t\treturn query;\n\t}\n\n\t/**\n\t * Get search status (0-1)\n\t */\n\tasync searchStatus(): Promise<number> {\n\t\tconst { SearchStatusRequest } = await import('../request/SearchStatusRequest');\n\t\tconst { SearchProgressResponse } = await import('../response/SearchProgressResponse');\n\n\t\tconst request = new SearchStatusRequest();\n\t\tconst packet = await this.connection.sendRequest(request);\n\n\t\tconst response = SearchProgressResponse.fromPacket(packet);\n\t\treturn response.progress;\n\t}\n\n\t/**\n\t * Get search results\n\t */\n\tasync searchResults(): Promise<SearchResultsResponse> {\n\t\tconst { SearchResultsRequest } = await import('../request/SearchResultsRequest');\n\t\tconst { SearchResultsResponseParser } = await import('../response/SearchResultsResponse');\n\n\t\tconst request = new SearchResultsRequest();\n\t\tconst packet = await this.connection.sendRequest(request);\n\n\t\treturn SearchResultsResponseParser.fromPacket(packet);\n\t}\n\n\t/**\n\t * Perform a synchronous search (waits for results)\n\t */\n\tasync searchSync(query: string, searchType?: SearchType, filters?: SearchFilters, timeout: number = 30000): Promise<SearchResultsResponse> {\n\t\t// Start search\n\t\tawait this.searchAsync(query, searchType, filters);\n\n\t\t// Wait for completion\n\t\tconst startTime = Date.now();\n\t\twhile (Date.now() - startTime < timeout) {\n\t\t\tconst progress = await this.searchStatus();\n\n\t\t\tif (progress >= 1.0) {\n\t\t\t\treturn await this.searchResults();\n\t\t\t}\n\n\t\t\t// Wait a bit before checking again\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 500));\n\t\t}\n\n\t\tthrow new Error('Search timeout');\n\t}\n\n\t/**\n\t * Stop current search\n\t */\n\tasync searchStop(): Promise<void> {\n\t\tconst { SearchStopRequest } = await import('../request/SearchStopRequest');\n\n\t\tconst request = new SearchStopRequest();\n\t\tawait this.connection.sendRequest(request);\n\t}\n\n\t/**\n\t * Download a file from search results\n\t */\n\tasync downloadSearchResult(hash: Buffer): Promise<void> {\n\t\tconst { DownloadFileRequest } = await import('../request/DownloadFileRequest');\n\n\t\tconst request = new DownloadFileRequest(hash);\n\t\tawait this.connection.sendRequest(request);\n\t}\n\n\t/**\n\t * Download from an ed2k link\n\t */\n\tasync downloadEd2kLink(link: string): Promise<void> {\n\t\tconst { AddLinkRequest } = await import('../request/AddLinkRequest');\n\n\t\tconst request = new AddLinkRequest(link);\n\t\tawait this.connection.sendRequest(request);\n\t}\n\n\t/**\n\t * Get download queue\n\t */\n\tasync getDownloadQueue(): Promise<AmuleTransferringFile[]> {\n\t\tconst { DownloadQueueRequest } = await import('../request/DownloadQueueRequest');\n\t\tconst { DownloadQueueResponseParser } = await import('../response/DownloadQueueResponse');\n\n\t\tconst request = new DownloadQueueRequest();\n\t\tconst packet = await this.connection.sendRequest(request);\n\n\t\treturn DownloadQueueResponseParser.fromPacket(packet).files;\n\t}\n\n\t/**\n\t * Get shared files\n\t */\n\tasync getSharedFiles(): Promise<AmuleFile[]> {\n\t\tconst { SharedFilesRequest } = await import('../request/SharedFilesRequest');\n\t\tconst { SharedFilesResponseParser } = await import('../response/SharedFilesResponse');\n\n\t\tconst request = new SharedFilesRequest();\n\t\tconst packet = await this.connection.sendRequest(request);\n\n\t\treturn SharedFilesResponseParser.fromPacket(packet).files;\n\t}\n\n\t/**\n\t * Get the list of servers\n\t */\n\tasync getServerList(): Promise<AmuleServer[]> {\n\t\tconst { ServerListRequest } = await import('../request/ServerListRequest');\n\t\tconst { ServerListResponseParser } = await import('../response/ServerListResponse');\n\n\t\tconst request = new ServerListRequest();\n\t\tconst packet = await this.connection.sendRequest(request);\n\n\t\treturn ServerListResponseParser.fromPacket(packet).servers;\n\t}\n\n\t/**\n\t * Connect to a specific server\n\t */\n\tasync connectToServer(ip: string, port: number): Promise<void> {\n\t\tconst { ServerConnectRequest } = await import('../request/ServerConnectRequest');\n\n\t\tconst request = new ServerConnectRequest(ip, port);\n\t\tawait this.connection.sendRequest(request);\n\t}\n\n\t/**\n\t * Disconnect from the current server\n\t */\n\tasync disconnectFromServer(): Promise<void> {\n\t\tconst { ServerDisconnectRequest } = await import('../request/ServerDisconnectRequest');\n\n\t\tconst request = new ServerDisconnectRequest();\n\t\tawait this.connection.sendRequest(request);\n\t}\n\n\t/**\n\t * Create a category\n\t */\n\tasync createCategory(category: AmuleCategory): Promise<void> {\n\t\tconst { CreateCategoryRequest } = await import('../request/CreateCategoryRequest');\n\n\t\tconst request = new CreateCategoryRequest(category);\n\t\tawait this.connection.sendRequest(request);\n\t}\n\n\t/**\n\t * Update a category\n\t */\n\tasync updateCategory(id: number, category: AmuleCategory): Promise<void> {\n\t\tconst { UpdateCategoryRequest } = await import('../request/UpdateCategoryRequest');\n\n\t\tconst request = new UpdateCategoryRequest(id, category);\n\t\tawait this.connection.sendRequest(request);\n\t}\n\n\t/**\n\t * Delete a category\n\t */\n\tasync deleteCategory(id: number): Promise<void> {\n\t\tconst { DeleteCategoryRequest } = await import('../request/DeleteCategoryRequest');\n\n\t\tconst request = new DeleteCategoryRequest(id);\n\t\tawait this.connection.sendRequest(request);\n\t}\n\n\t/**\n\t * Get all categories\n\t */\n\tasync getCategories(): Promise<AmuleCategory[]> {\n\t\tconst { GetPreferencesRequest } = await import('../request/GetPreferencesRequest');\n\t\tconst { PreferencesResponseParser } = await import('../response/PreferencesResponse');\n\n\t\tconst request = new GetPreferencesRequest(EcPrefs.EC_PREFS_CATEGORIES);\n\t\tconst packet = await this.connection.sendRequest(request);\n\t\treturn PreferencesResponseParser.fromPacket(packet).categories;\n\t}\n\n\t/**\n\t * Set file category\n\t */\n\tasync setFileCategory(hash: Buffer, categoryId: number): Promise<void> {\n\t\tconst { SetFileCategoryRequest } = await import('../request/SetFileCategoryRequest');\n\n\t\tconst request = new SetFileCategoryRequest(hash, categoryId);\n\t\tawait this.connection.sendRequest(request);\n\t}\n\n\t/**\n\t * Send a download command (PAUSE, RESUME, STOP, DELETE, etc.)\n\t */\n\tasync sendDownloadCommand(hash: Buffer, command: DownloadCommand): Promise<void> {\n\t\tconst { DownloadCommandRequest } = await import('../request/DownloadCommandRequest');\n\n\t\tconst request = new DownloadCommandRequest(hash, command);\n\t\tawait this.connection.sendRequest(request);\n\t}\n\n\t/**\n\t * Pause a download\n\t */\n\tasync pauseDownload(hash: Buffer): Promise<void> {\n\t\tconst { DownloadCommand } = await import('../model');\n\t\tawait this.sendDownloadCommand(hash, DownloadCommand.PAUSE);\n\t}\n\n\t/**\n\t * Resume a download\n\t */\n\tasync resumeDownload(hash: Buffer): Promise<void> {\n\t\tconst { DownloadCommand } = await import('../model');\n\t\tawait this.sendDownloadCommand(hash, DownloadCommand.RESUME);\n\t}\n\n\t/**\n\t * Stop a download\n\t */\n\tasync stopDownload(hash: Buffer): Promise<void> {\n\t\tconst { DownloadCommand } = await import('../model');\n\t\tawait this.sendDownloadCommand(hash, DownloadCommand.STOP);\n\t}\n\n\t/**\n\t * Delete a download\n\t */\n\tasync deleteDownload(hash: Buffer): Promise<void> {\n\t\tconst { DownloadCommand } = await import('../model');\n\t\tawait this.sendDownloadCommand(hash, DownloadCommand.DELETE);\n\t}\n}\n","/**\n * aMule EC Client for TypeScript\n *\n * A TypeScript client library for interacting with aMule's External Connection (EC) protocol.\n *\n * @packageDocumentation\n */\n\n// Main client\nexport { AmuleClient } from './client/AmuleClient';\nexport type { AmuleClientOptions, StatsResponse, SearchResultsResponse } from './client/AmuleClient';\n\n// Models\nexport * from './model';\n\n// Enums and constants\nexport { ECOpCode, ECTagName, ECDetailLevel, ECSearchType, EcPrefs, ProtocolVersion } from './ec/Codes';\n\n// Exceptions\nexport { AmuleException, InvalidECException, CommunicationException, ServerException } from './exceptions';\n\n// Types\nexport type { SearchFilters, ConnectionState, SearchFileDownloadStatus } from './types';\n\n// Protocol components (for advanced usage)\nexport { Packet } from './ec/packet/Packet';\nexport { Flags } from './ec/packet/Flags';\nexport { PacketWriter } from './ec/packet/PacketWriter';\nexport { PacketParser } from './ec/packet/PacketParser';\n\n// Tags (for advanced usage)\nexport { Tag, CustomTag, UByteTag, UShortTag, UIntTag, ULongTag, UInt128Tag, StringTag, DoubleTag, Ipv4Tag, Hash16Tag } from './ec/tag/Tag';\n"],"mappings":"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","names":["ProtocolVersion","ECOpCode","ECTagName","ECDetailLevel","ECSearchType","EcPrefs","tag","FileStatus","DownloadCommand","SearchType","toNumber","numValue","zlib","hasSubtags","StatsRequest","StatsResponseParser","SearchRequest","SearchStatusRequest","SearchProgressResponse","SearchResultsRequest","SearchResultsResponseParser","SearchStopRequest","DownloadFileRequest","AddLinkRequest","DownloadQueueRequest","DownloadQueueResponseParser","SharedFilesRequest","SharedFilesResponseParser","ServerListRequest","ServerListResponseParser","ServerConnectRequest","ServerDisconnectRequest","CreateCategoryRequest","UpdateCategoryRequest","DeleteCategoryRequest","GetPreferencesRequest","PreferencesResponseParser","SetFileCategoryRequest","DownloadCommandRequest","DownloadCommand"]}
|