amule-ec-client 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -49,6 +49,21 @@ interface AmuleCategory {
49
49
  color: number;
50
50
  priority: number;
51
51
  }
52
+ interface AmuleServer {
53
+ name?: string;
54
+ description?: string;
55
+ address?: string;
56
+ ip: string;
57
+ port: number;
58
+ ping?: number;
59
+ users?: number;
60
+ maxUsers?: number;
61
+ files?: number;
62
+ priority: number;
63
+ version?: string;
64
+ isStatic: boolean;
65
+ failedCount: number;
66
+ }
52
67
  declare enum FileStatus {
53
68
  READY = 0,
54
69
  EMPTY = 1,
@@ -128,6 +143,15 @@ interface AmuleClientOptions {
128
143
  timeout?: number;
129
144
  }
130
145
  interface StatsResponse {
146
+ id: number;
147
+ ed2kId: number;
148
+ kadId?: string;
149
+ connectedServer?: {
150
+ name?: string;
151
+ description?: string;
152
+ ip: string;
153
+ port: number;
154
+ };
131
155
  connectionState?: any;
132
156
  uploadOverhead: number;
133
157
  downloadOverhead: number;
@@ -205,6 +229,18 @@ declare class AmuleClient {
205
229
  * Get shared files
206
230
  */
207
231
  getSharedFiles(): Promise<AmuleFile[]>;
232
+ /**
233
+ * Get the list of servers
234
+ */
235
+ getServerList(): Promise<AmuleServer[]>;
236
+ /**
237
+ * Connect to a specific server
238
+ */
239
+ connectToServer(ip: string, port: number): Promise<void>;
240
+ /**
241
+ * Disconnect from the current server
242
+ */
243
+ disconnectFromServer(): Promise<void>;
208
244
  /**
209
245
  * Create a category
210
246
  */
@@ -899,4 +935,4 @@ declare class PacketParser {
899
935
  static hasCompletePacket(buffer: Buffer): boolean;
900
936
  }
901
937
 
902
- export { type AmuleCategory, AmuleClient, type AmuleClientOptions, AmuleException, type AmuleFile, type AmuleTransferringFile, CommunicationException, type ConnectionState, CustomTag, DoubleTag, DownloadCommand, ECDetailLevel, ECOpCode, ECSearchType, ECTagName, EcPrefs, FileStatus, Flags, Hash16Tag, InvalidECException, Ipv4Tag, Packet, PacketParser, PacketWriter, ProtocolVersion, SearchFileDownloadStatus, type SearchFilters, type SearchResultsResponse, SearchType, ServerException, type StatsResponse, StringTag, Tag, UByteTag, UInt128Tag, UIntTag, ULongTag, UShortTag };
938
+ export { type AmuleCategory, AmuleClient, type AmuleClientOptions, AmuleException, type AmuleFile, type AmuleServer, type AmuleTransferringFile, CommunicationException, type ConnectionState, CustomTag, DoubleTag, DownloadCommand, ECDetailLevel, ECOpCode, ECSearchType, ECTagName, EcPrefs, FileStatus, Flags, Hash16Tag, InvalidECException, Ipv4Tag, Packet, PacketParser, PacketWriter, ProtocolVersion, SearchFileDownloadStatus, type SearchFilters, type SearchResultsResponse, SearchType, ServerException, type StatsResponse, StringTag, Tag, UByteTag, UInt128Tag, UIntTag, ULongTag, UShortTag };
package/dist/index.js CHANGED
@@ -952,8 +952,43 @@ var init_StatsResponse = __esm({
952
952
  const ed2kFiles = findNumericTag(packet.tags, 523 /* EC_TAG_STATS_ED2K_FILES */)?.value || 0;
953
953
  const kadFiles = findNumericTag(packet.tags, 524 /* EC_TAG_STATS_KAD_FILES */)?.value || 0;
954
954
  const kadNodes = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_KAD_NODES_TOTAL)?.value || 0;
955
+ const connStateTag = findTag(packet.tags, 5 /* EC_TAG_CONNSTATE */);
956
+ let ed2kId = 0;
957
+ let clientId = 0;
958
+ let kadId;
959
+ let connectedServer;
960
+ if (connStateTag && connStateTag.nestedTags) {
961
+ ed2kId = Number(findNumericTag(connStateTag.nestedTags, 6 /* EC_TAG_ED2K_ID */)?.value || 0);
962
+ clientId = Number(findNumericTag(connStateTag.nestedTags, 10 /* EC_TAG_CLIENT_ID */)?.value || 0);
963
+ const kadIdTag = findTag(connStateTag.nestedTags, 16 /* EC_TAG_KAD_ID */);
964
+ if (kadIdTag && kadIdTag.getValue() !== void 0) {
965
+ const val = kadIdTag.getValue();
966
+ if (typeof val === "bigint") {
967
+ kadId = val.toString(16).padStart(32, "0");
968
+ } else if (val instanceof Buffer) {
969
+ kadId = val.toString("hex");
970
+ }
971
+ }
972
+ const serverTag = findTag(connStateTag.nestedTags, 1280 /* EC_TAG_SERVER */);
973
+ if (serverTag) {
974
+ const serverVal = serverTag.getValue();
975
+ if (serverVal && typeof serverVal === "object" && "address" in serverVal) {
976
+ connectedServer = {
977
+ ip: serverVal.address,
978
+ port: serverVal.port,
979
+ name: findTag(serverTag.nestedTags || [], 1281 /* EC_TAG_SERVER_NAME */)?.getValue(),
980
+ description: findTag(serverTag.nestedTags || [], 1282 /* EC_TAG_SERVER_DESC */)?.getValue()
981
+ };
982
+ }
983
+ }
984
+ }
985
+ const id = clientId || findNumericTag(packet.tags, 10 /* EC_TAG_CLIENT_ID */)?.value || 0;
955
986
  const loggerMessage = [];
956
987
  return {
988
+ id: Number(id),
989
+ ed2kId,
990
+ kadId,
991
+ connectedServer,
957
992
  uploadOverhead: Number(uploadOverhead),
958
993
  downloadOverhead: Number(downloadOverhead),
959
994
  bannedCount: Number(bannedCount),
@@ -1428,6 +1463,128 @@ var init_SharedFilesResponse = __esm({
1428
1463
  }
1429
1464
  });
1430
1465
 
1466
+ // src/request/ServerListRequest.ts
1467
+ var ServerListRequest_exports = {};
1468
+ __export(ServerListRequest_exports, {
1469
+ ServerListRequest: () => ServerListRequest
1470
+ });
1471
+ var ServerListRequest;
1472
+ var init_ServerListRequest = __esm({
1473
+ "src/request/ServerListRequest.ts"() {
1474
+ "use strict";
1475
+ init_Request();
1476
+ init_Codes();
1477
+ ServerListRequest = class extends Request {
1478
+ constructor() {
1479
+ super(44 /* EC_OP_GET_SERVER_LIST */);
1480
+ }
1481
+ };
1482
+ }
1483
+ });
1484
+
1485
+ // src/response/ServerListResponse.ts
1486
+ var ServerListResponse_exports = {};
1487
+ __export(ServerListResponse_exports, {
1488
+ ServerListResponseParser: () => ServerListResponseParser
1489
+ });
1490
+ var ServerListResponseParser;
1491
+ var init_ServerListResponse = __esm({
1492
+ "src/response/ServerListResponse.ts"() {
1493
+ "use strict";
1494
+ init_Codes();
1495
+ init_Tag();
1496
+ ServerListResponseParser = class {
1497
+ static fromPacket(packet) {
1498
+ const servers = [];
1499
+ const serverTags = packet.tags.filter((tag) => tag.name === 1280 /* EC_TAG_SERVER */);
1500
+ for (const serverTag of serverTags) {
1501
+ const nested = serverTag.nestedTags || [];
1502
+ const ipv4Tag = findTag(nested, 1292 /* EC_TAG_SERVER_IP */) || findTag(nested, 1283 /* EC_TAG_SERVER_ADDRESS */) || (serverTag.constructor.name.includes("Ipv4") ? serverTag : null);
1503
+ let ip = "";
1504
+ let port = 0;
1505
+ if (ipv4Tag && ipv4Tag.getValue() && typeof ipv4Tag.getValue() === "object" && "address" in ipv4Tag.getValue()) {
1506
+ const val = ipv4Tag.getValue();
1507
+ ip = val.address;
1508
+ port = val.port;
1509
+ } else {
1510
+ const ipNum = findNumericTag(nested, 1292 /* EC_TAG_SERVER_IP */)?.getInt() || findNumericTag(packet.tags, 1292 /* EC_TAG_SERVER_IP */)?.getInt();
1511
+ port = findNumericTag(nested, 1293 /* EC_TAG_SERVER_PORT */)?.getInt() || findNumericTag(packet.tags, 1293 /* EC_TAG_SERVER_PORT */)?.getInt() || 0;
1512
+ ip = this.formatIp(ipNum);
1513
+ }
1514
+ if (port === 0) {
1515
+ port = findNumericTag(nested, 1293 /* EC_TAG_SERVER_PORT */)?.getInt() || 0;
1516
+ }
1517
+ servers.push({
1518
+ name: findTag(nested, 1281 /* EC_TAG_SERVER_NAME */)?.getValue() || "Unknown",
1519
+ description: findTag(nested, 1282 /* EC_TAG_SERVER_DESC */)?.getValue(),
1520
+ address: findTag(nested, 1283 /* EC_TAG_SERVER_ADDRESS */)?.getValue(),
1521
+ ip,
1522
+ port,
1523
+ ping: findNumericTag(nested, 1284 /* EC_TAG_SERVER_PING */)?.getInt(),
1524
+ users: findNumericTag(nested, 1285 /* EC_TAG_SERVER_USERS */)?.getInt(),
1525
+ maxUsers: findNumericTag(nested, 1286 /* EC_TAG_SERVER_USERS_MAX */)?.getInt(),
1526
+ files: findNumericTag(nested, 1287 /* EC_TAG_SERVER_FILES */)?.getInt(),
1527
+ priority: findNumericTag(nested, 1288 /* EC_TAG_SERVER_PRIO */)?.getInt() || 0,
1528
+ version: findTag(nested, 1291 /* EC_TAG_SERVER_VERSION */)?.getValue(),
1529
+ isStatic: !!findNumericTag(nested, 1290 /* EC_TAG_SERVER_STATIC */)?.getInt(),
1530
+ failedCount: findNumericTag(nested, 1289 /* EC_TAG_SERVER_FAILED */)?.getInt() || 0
1531
+ });
1532
+ }
1533
+ return { servers };
1534
+ }
1535
+ static formatIp(ip) {
1536
+ if (ip === void 0) return "";
1537
+ return [ip >>> 24 & 255, ip >>> 16 & 255, ip >>> 8 & 255, ip & 255].join(".");
1538
+ }
1539
+ };
1540
+ }
1541
+ });
1542
+
1543
+ // src/request/ServerConnectRequest.ts
1544
+ var ServerConnectRequest_exports = {};
1545
+ __export(ServerConnectRequest_exports, {
1546
+ ServerConnectRequest: () => ServerConnectRequest
1547
+ });
1548
+ var ServerConnectRequest;
1549
+ var init_ServerConnectRequest = __esm({
1550
+ "src/request/ServerConnectRequest.ts"() {
1551
+ "use strict";
1552
+ init_Request();
1553
+ init_Codes();
1554
+ init_Tag();
1555
+ ServerConnectRequest = class extends Request {
1556
+ constructor(ip, port) {
1557
+ super(47 /* EC_OP_SERVER_CONNECT */);
1558
+ this.addTag(new UIntTag(1292 /* EC_TAG_SERVER_IP */, this.ipToNumber(ip)));
1559
+ this.addTag(new UShortTag(1293 /* EC_TAG_SERVER_PORT */, port));
1560
+ }
1561
+ ipToNumber(ip) {
1562
+ const parts = ip.split(".").map((p) => parseInt(p, 10));
1563
+ return (parts[0] << 24 | parts[1] << 16 | parts[2] << 8 | parts[3]) >>> 0;
1564
+ }
1565
+ };
1566
+ }
1567
+ });
1568
+
1569
+ // src/request/ServerDisconnectRequest.ts
1570
+ var ServerDisconnectRequest_exports = {};
1571
+ __export(ServerDisconnectRequest_exports, {
1572
+ ServerDisconnectRequest: () => ServerDisconnectRequest
1573
+ });
1574
+ var ServerDisconnectRequest;
1575
+ var init_ServerDisconnectRequest = __esm({
1576
+ "src/request/ServerDisconnectRequest.ts"() {
1577
+ "use strict";
1578
+ init_Request();
1579
+ init_Codes();
1580
+ ServerDisconnectRequest = class extends Request {
1581
+ constructor() {
1582
+ super(46 /* EC_OP_SERVER_DISCONNECT */);
1583
+ }
1584
+ };
1585
+ }
1586
+ });
1587
+
1431
1588
  // src/request/SetFileCategoryRequest.ts
1432
1589
  var SetFileCategoryRequest_exports = {};
1433
1590
  __export(SetFileCategoryRequest_exports, {
@@ -2202,6 +2359,23 @@ var AmuleConnection = class {
2202
2359
  connected = false;
2203
2360
  buffer = Buffer.allocUnsafe(0);
2204
2361
  pendingResponse;
2362
+ // Debug logging flag (disabled by default)
2363
+ debug = false;
2364
+ /**
2365
+ * Enable or disable debug logging
2366
+ */
2367
+ setDebug(enabled) {
2368
+ this.debug = !!enabled;
2369
+ }
2370
+ /**
2371
+ * Internal debug logger
2372
+ */
2373
+ log(...args) {
2374
+ if (!this.debug) {
2375
+ return;
2376
+ }
2377
+ console.log("[DEBUG]", ...args);
2378
+ }
2205
2379
  /**
2206
2380
  * Reconnect to the server
2207
2381
  */
@@ -2240,11 +2414,11 @@ var AmuleConnection = class {
2240
2414
  * Perform authentication handshake
2241
2415
  */
2242
2416
  async authenticate() {
2243
- console.log("[DEBUG] Starting authentication...");
2417
+ this.log("Starting authentication...");
2244
2418
  const clientInfoRequest = new AuthClientInfoRequest();
2245
- console.log("[DEBUG] Sending client info...");
2419
+ this.log("Sending client info...");
2246
2420
  const saltPacket = await this.sendRequestNoAuth(clientInfoRequest);
2247
- console.log("[DEBUG] Received salt response");
2421
+ this.log("Received salt response");
2248
2422
  if (saltPacket.opCode === 3 /* EC_OP_AUTH_FAIL */) {
2249
2423
  throw new ServerException("Authentication failed: server rejected client");
2250
2424
  }
@@ -2252,31 +2426,31 @@ var AmuleConnection = class {
2252
2426
  throw new ServerException(`Unexpected response to client info: ${saltPacket.opCode}`);
2253
2427
  }
2254
2428
  const saltResponse = AuthSaltResponse.fromPacket(saltPacket);
2255
- console.log("[DEBUG] Salt:", saltResponse.salt);
2429
+ this.log("Salt:", saltResponse.salt);
2256
2430
  const hashedPassword = PasswordHasher.hash(this.password, saltResponse.salt);
2257
- console.log("[DEBUG] Hashed password:", hashedPassword.toString("hex"));
2431
+ this.log("Hashed password:", hashedPassword.toString("hex"));
2258
2432
  const authRequest = new AuthPasswordRequest(hashedPassword);
2259
- console.log("[DEBUG] Sending hashed password...");
2433
+ this.log("Sending hashed password...");
2260
2434
  const authPacket = await this.sendRequestNoAuth(authRequest);
2261
- console.log("[DEBUG] Received auth response");
2435
+ this.log("Received auth response");
2262
2436
  if (authPacket.opCode === 3 /* EC_OP_AUTH_FAIL */) {
2263
2437
  throw new ServerException("Authentication failed: invalid password");
2264
2438
  }
2265
2439
  if (authPacket.opCode !== 4 /* EC_OP_AUTH_OK */) {
2266
2440
  throw new ServerException(`Unexpected auth response: ${authPacket.opCode}`);
2267
2441
  }
2268
- console.log("[DEBUG] Authentication successful!");
2442
+ this.log("Authentication successful!");
2269
2443
  }
2270
2444
  /**
2271
2445
  * Handle incoming data
2272
2446
  */
2273
2447
  handleData(data) {
2274
- console.log("[DEBUG] Received data:", data.length, "bytes, hex:", data.toString("hex").substring(0, 100));
2448
+ this.log("Received data:", data.length, "bytes, hex:", data.toString("hex").substring(0, 100));
2275
2449
  this.buffer = Buffer.concat([this.buffer, data]);
2276
2450
  if (PacketParser.hasCompletePacket(this.buffer)) {
2277
2451
  try {
2278
2452
  const packet = PacketParser.parse(this.buffer);
2279
- console.log("[DEBUG] Parsed packet, opCode:", packet.opCode);
2453
+ this.log("Parsed packet, opCode:", packet.opCode);
2280
2454
  const consumedBytes = PacketParser.getExpectedPacketSize(this.buffer);
2281
2455
  this.buffer = this.buffer.subarray(consumedBytes);
2282
2456
  if (this.pendingResponse) {
@@ -2284,14 +2458,14 @@ var AmuleConnection = class {
2284
2458
  this.pendingResponse = void 0;
2285
2459
  }
2286
2460
  } catch (error) {
2287
- console.log("[DEBUG] Parse error:", error);
2461
+ this.log("Parse error:", error);
2288
2462
  if (this.pendingResponse) {
2289
2463
  this.pendingResponse.reject(error);
2290
2464
  this.pendingResponse = void 0;
2291
2465
  }
2292
2466
  }
2293
2467
  } else {
2294
- console.log("[DEBUG] Incomplete packet, waiting for more data...");
2468
+ this.log("Incomplete packet, waiting for more data...");
2295
2469
  }
2296
2470
  }
2297
2471
  /**
@@ -2318,7 +2492,7 @@ var AmuleConnection = class {
2318
2492
  * Handle socket close
2319
2493
  */
2320
2494
  handleClose() {
2321
- console.log("[DEBUG] Socket closed! connected:", this.connected, "pendingResponse:", !!this.pendingResponse);
2495
+ this.log("Socket closed! connected:", this.connected, "pendingResponse:", !!this.pendingResponse);
2322
2496
  this.connected = false;
2323
2497
  if (this.pendingResponse) {
2324
2498
  this.pendingResponse.reject(new CommunicationException("Socket closed"));
@@ -2348,8 +2522,8 @@ var AmuleConnection = class {
2348
2522
  }
2349
2523
  const packet = request.buildPacket();
2350
2524
  const buffer = PacketWriter.write(packet);
2351
- console.log("[DEBUG] Sending packet: opCode", packet.opCode, "flags", packet.flags.getValue(), "tags", packet.tags.length, "bytes", buffer.length);
2352
- console.log("[DEBUG] Packet hex:", buffer.toString("hex"));
2525
+ this.log("Sending packet: opCode", packet.opCode, "flags", packet.flags.getValue(), "tags", packet.tags.length, "bytes", buffer.length);
2526
+ this.log("Packet hex:", buffer.toString("hex"));
2353
2527
  const responsePromise = new Promise((resolve, reject) => {
2354
2528
  this.pendingResponse = { resolve, reject };
2355
2529
  });
@@ -2469,6 +2643,32 @@ var AmuleClient = class {
2469
2643
  const packet = await this.connection.sendRequest(request);
2470
2644
  return SharedFilesResponseParser2.fromPacket(packet).files;
2471
2645
  }
2646
+ /**
2647
+ * Get the list of servers
2648
+ */
2649
+ async getServerList() {
2650
+ const { ServerListRequest: ServerListRequest2 } = await Promise.resolve().then(() => (init_ServerListRequest(), ServerListRequest_exports));
2651
+ const { ServerListResponseParser: ServerListResponseParser2 } = await Promise.resolve().then(() => (init_ServerListResponse(), ServerListResponse_exports));
2652
+ const request = new ServerListRequest2();
2653
+ const packet = await this.connection.sendRequest(request);
2654
+ return ServerListResponseParser2.fromPacket(packet).servers;
2655
+ }
2656
+ /**
2657
+ * Connect to a specific server
2658
+ */
2659
+ async connectToServer(ip, port) {
2660
+ const { ServerConnectRequest: ServerConnectRequest2 } = await Promise.resolve().then(() => (init_ServerConnectRequest(), ServerConnectRequest_exports));
2661
+ const request = new ServerConnectRequest2(ip, port);
2662
+ await this.connection.sendRequest(request);
2663
+ }
2664
+ /**
2665
+ * Disconnect from the current server
2666
+ */
2667
+ async disconnectFromServer() {
2668
+ const { ServerDisconnectRequest: ServerDisconnectRequest2 } = await Promise.resolve().then(() => (init_ServerDisconnectRequest(), ServerDisconnectRequest_exports));
2669
+ const request = new ServerDisconnectRequest2();
2670
+ await this.connection.sendRequest(request);
2671
+ }
2472
2672
  /**
2473
2673
  * Create a category
2474
2674
  */
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/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}\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, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_UINT128, subtags, nameValue);\n\t}\n\n\tstatic withValue(name: ECTagName, value: bigint, subtags: Tag<any>[] = []): UInt128Tag {\n\t\tconst tag = new UInt128Tag(name, subtags);\n\t\ttag.setValue(value);\n\t\treturn tag;\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_UL_SPEED_OVERHEAD)?.value || 0;\n\t\tconst downloadOverhead = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_DL_SPEED_OVERHEAD)?.value || 0;\n\t\tconst bannedCount = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_BANNED_COUNT)?.value || 0;\n\n\t\tconst totalSentBytes = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_TOTAL_SENT_BYTES)?.value || 0;\n\t\tconst totalReceivedBytes = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_TOTAL_RECEIVED_BYTES)?.value || 0;\n\t\tconst sharedFileCount = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_SHARED_FILE_COUNT)?.value || 0;\n\n\t\tconst uploadSpeed = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_UL_SPEED)?.value || 0;\n\t\tconst downloadSpeed = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_DL_SPEED)?.value || 0;\n\t\tconst uploadSpeedLimit = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_UL_SPEED_LIMIT)?.value || 0;\n\t\tconst downloadSpeedLimit = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_DL_SPEED_LIMIT)?.value || 0;\n\n\t\tconst uploadQueueLength = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_UL_QUEUE_LEN)?.value || 0;\n\t\tconst totalSourceCount = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_TOTAL_SRC_COUNT)?.value || 0;\n\n\t\tconst ed2kUsers = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_ED2K_USERS)?.value || 0;\n\t\tconst kadUsers = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_KAD_USERS)?.value || 0;\n\t\tconst ed2kFiles = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_ED2K_FILES)?.value || 0;\n\t\tconst kadFiles = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_KAD_FILES)?.value || 0;\n\n\t\tconst kadNodes = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_KAD_NODES_TOTAL)?.value || 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\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 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.value) / 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 * 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\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(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\tconsole.log('[DEBUG] Starting authentication...');\n\t\t// Step 1: Send client info\n\t\tconst clientInfoRequest = new AuthClientInfoRequest();\n\t\tconsole.log('[DEBUG] Sending client info...');\n\t\tconst saltPacket = await this.sendRequestNoAuth(clientInfoRequest);\n\t\tconsole.log('[DEBUG] 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\tconsole.log('[DEBUG] 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\tconsole.log('[DEBUG] Hashed password:', hashedPassword.toString('hex'));\n\n\t\t// Step 3: Send hashed password\n\t\tconst authRequest = new AuthPasswordRequest(hashedPassword);\n\t\tconsole.log('[DEBUG] Sending hashed password...');\n\t\tconst authPacket = await this.sendRequestNoAuth(authRequest);\n\t\tconsole.log('[DEBUG] 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\tconsole.log('[DEBUG] Authentication successful!');\n\t}\n\n\t/**\n\t * Handle incoming data\n\t */\n\tprivate handleData(data: Buffer): void {\n\t\tconsole.log('[DEBUG] 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\tconsole.log('[DEBUG] 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\tconsole.log('[DEBUG] 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\tconsole.log('[DEBUG] 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\tconsole.log('[DEBUG] 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\tconsole.log('[DEBUG] Sending packet: opCode', packet.opCode, 'flags', packet.flags.getValue(), 'tags', packet.tags.length, 'bytes', buffer.length);\n\t\tconsole.log('[DEBUG] Packet hex:', buffer.toString('hex'));\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\treturn new UInt128Tag(name, value);\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\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\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\tconst tagLength = this.calculateTagLength(tag);\n\t\tif (this.useUtf8Numbers) {\n\t\t\tsize += numberLength(tagLength);\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 tag length field.\n\t * The tag length includes:\n\t * - The value of this tag\n\t * - All subtags with their full headers (name, type, length, [subtag count], value)\n\t *\n\t * IMPORTANT: The tag length does NOT include the subtag count field of THIS tag.\n\t * The subtag count is written separately after the tag length field.\n\t */\n\tprivate calculateTagLength(tag: Tag<any>): number {\n\t\tlet length = 0;\n\n\t\t// Subtags themselves (full size with headers)\n\t\t// Note: We do NOT add the subtag count field here - it's written separately\n\t\tif (tag.nestedTags) {\n\t\t\tfor (const nestedTag of tag.nestedTags) {\n\t\t\t\t// For each subtag, add: name + type + length + [its own subtag count if any] + value\n\t\t\t\tlength += this.calculateNestedTagFullSize(nestedTag);\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 the full size of a nested tag (for inclusion in parent's tagLength)\n\t * This includes: name + type + length + [subtag count] + subtag data + value\n\t */\n\tprivate calculateNestedTagFullSize(tag: Tag<any>): number {\n\t\tlet size = 0;\n\n\t\t// Tag name\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; // uint16\n\t\t}\n\n\t\t// Type (always 1 byte)\n\t\tsize += 1;\n\n\t\t// Tag length field\n\t\tif (this.useUtf8Numbers) {\n\t\t\tsize += numberLength(this.calculateTagLength(tag));\n\t\t} else {\n\t\t\tsize += 4; // uint32\n\t\t}\n\n\t\t// Subtag count (only if has subtags)\n\t\tconst nestedCount = tag.nestedTags?.length ?? 0;\n\t\tif (nestedCount > 0) {\n\t\t\tif (this.useUtf8Numbers) {\n\t\t\t\tsize += numberLength(nestedCount);\n\t\t\t} else {\n\t\t\t\tsize += 2; // uint16\n\t\t\t}\n\t\t}\n\n\t\t// Subtags data (recursively)\n\t\tif (tag.nestedTags) {\n\t\t\tfor (const nestedTag of tag.nestedTags) {\n\t\t\t\tsize += this.calculateNestedTagFullSize(nestedTag);\n\t\t\t}\n\t\t}\n\n\t\t// Value\n\t\tsize += this.calculateValueSize(tag);\n\n\t\treturn size;\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\tconst tagLength = this.calculateTagLength(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.value, offset);\n\t\t\t\treturn offset + 1;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT16:\n\t\t\t\tbuffer.writeUInt16BE(tag.value, offset);\n\t\t\t\treturn offset + 2;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT32:\n\t\t\t\tbuffer.writeUInt32BE(tag.value, offset);\n\t\t\t\treturn offset + 4;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT64:\n\t\t\t\tbuffer.writeBigUInt64BE(tag.value, offset);\n\t\t\t\treturn offset + 8;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_DOUBLE:\n\t\t\t\tbuffer.writeDoubleBE(tag.value, offset);\n\t\t\t\treturn offset + 8;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_IPV4:\n\t\t\t\tbuffer.writeUInt32BE(tag.value.ip, offset);\n\t\t\t\tbuffer.writeUInt16BE(tag.value.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, DownloadCommand, SearchType } from '../model';\nimport type { SearchFilters } from '../types';\n\nexport interface AmuleClientOptions {\n\thost: string;\n\tport: number;\n\tpassword: string;\n\ttimeout?: number;\n}\n\nexport interface StatsResponse {\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 * Create a category\n\t */\n\tasync createCategory(category: AmuleCategory): Promise<void> {\n\t\t// TODO: Implement category creation (requires complex tag structure)\n\t\tthrow new Error('Not implemented yet');\n\t}\n\n\t/**\n\t * Get all categories\n\t */\n\tasync getCategories(): Promise<AmuleCategory[]> {\n\t\t// TODO: Implement get categories (part of preferences)\n\t\treturn [];\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","zlib","hasSubtags","StatsRequest","StatsResponseParser","SearchRequest","SearchStatusRequest","SearchProgressResponse","SearchResultsRequest","SearchResultsResponseParser","SearchStopRequest","DownloadFileRequest","AddLinkRequest","DownloadQueueRequest","DownloadQueueResponseParser","SharedFilesRequest","SharedFilesResponseParser","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/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}\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, subtags: Tag<any>[] = [], nameValue: number = name) {\n\t\tsuper(name, ECTagType.EC_TAGTYPE_UINT128, subtags, nameValue);\n\t}\n\n\tstatic withValue(name: ECTagName, value: bigint, subtags: Tag<any>[] = []): UInt128Tag {\n\t\tconst tag = new UInt128Tag(name, subtags);\n\t\ttag.setValue(value);\n\t\treturn tag;\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_UL_SPEED_OVERHEAD)?.value || 0;\n\t\tconst downloadOverhead = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_DL_SPEED_OVERHEAD)?.value || 0;\n\t\tconst bannedCount = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_BANNED_COUNT)?.value || 0;\n\n\t\tconst totalSentBytes = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_TOTAL_SENT_BYTES)?.value || 0;\n\t\tconst totalReceivedBytes = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_TOTAL_RECEIVED_BYTES)?.value || 0;\n\t\tconst sharedFileCount = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_SHARED_FILE_COUNT)?.value || 0;\n\n\t\tconst uploadSpeed = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_UL_SPEED)?.value || 0;\n\t\tconst downloadSpeed = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_DL_SPEED)?.value || 0;\n\t\tconst uploadSpeedLimit = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_UL_SPEED_LIMIT)?.value || 0;\n\t\tconst downloadSpeedLimit = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_DL_SPEED_LIMIT)?.value || 0;\n\n\t\tconst uploadQueueLength = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_UL_QUEUE_LEN)?.value || 0;\n\t\tconst totalSourceCount = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_TOTAL_SRC_COUNT)?.value || 0;\n\n\t\tconst ed2kUsers = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_ED2K_USERS)?.value || 0;\n\t\tconst kadUsers = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_KAD_USERS)?.value || 0;\n\t\tconst ed2kFiles = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_ED2K_FILES)?.value || 0;\n\t\tconst kadFiles = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_KAD_FILES)?.value || 0;\n\n\t\tconst kadNodes = findNumericTag(packet.tags, ECTagName.EC_TAG_STATS_KAD_NODES_TOTAL)?.value || 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)?.value || 0);\n\t\t\tclientId = Number(findNumericTag(connStateTag.nestedTags, ECTagName.EC_TAG_CLIENT_ID)?.value || 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 || findNumericTag(packet.tags, ECTagName.EC_TAG_CLIENT_ID)?.value || 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.value) / 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 * 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(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 packet: opCode', packet.opCode, 'flags', packet.flags.getValue(), 'tags', packet.tags.length, 'bytes', buffer.length);\n\t\tthis.log('Packet hex:', buffer.toString('hex'));\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\treturn new UInt128Tag(name, value);\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\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\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\tconst tagLength = this.calculateTagLength(tag);\n\t\tif (this.useUtf8Numbers) {\n\t\t\tsize += numberLength(tagLength);\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 tag length field.\n\t * The tag length includes:\n\t * - The value of this tag\n\t * - All subtags with their full headers (name, type, length, [subtag count], value)\n\t *\n\t * IMPORTANT: The tag length does NOT include the subtag count field of THIS tag.\n\t * The subtag count is written separately after the tag length field.\n\t */\n\tprivate calculateTagLength(tag: Tag<any>): number {\n\t\tlet length = 0;\n\n\t\t// Subtags themselves (full size with headers)\n\t\t// Note: We do NOT add the subtag count field here - it's written separately\n\t\tif (tag.nestedTags) {\n\t\t\tfor (const nestedTag of tag.nestedTags) {\n\t\t\t\t// For each subtag, add: name + type + length + [its own subtag count if any] + value\n\t\t\t\tlength += this.calculateNestedTagFullSize(nestedTag);\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 the full size of a nested tag (for inclusion in parent's tagLength)\n\t * This includes: name + type + length + [subtag count] + subtag data + value\n\t */\n\tprivate calculateNestedTagFullSize(tag: Tag<any>): number {\n\t\tlet size = 0;\n\n\t\t// Tag name\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; // uint16\n\t\t}\n\n\t\t// Type (always 1 byte)\n\t\tsize += 1;\n\n\t\t// Tag length field\n\t\tif (this.useUtf8Numbers) {\n\t\t\tsize += numberLength(this.calculateTagLength(tag));\n\t\t} else {\n\t\t\tsize += 4; // uint32\n\t\t}\n\n\t\t// Subtag count (only if has subtags)\n\t\tconst nestedCount = tag.nestedTags?.length ?? 0;\n\t\tif (nestedCount > 0) {\n\t\t\tif (this.useUtf8Numbers) {\n\t\t\t\tsize += numberLength(nestedCount);\n\t\t\t} else {\n\t\t\t\tsize += 2; // uint16\n\t\t\t}\n\t\t}\n\n\t\t// Subtags data (recursively)\n\t\tif (tag.nestedTags) {\n\t\t\tfor (const nestedTag of tag.nestedTags) {\n\t\t\t\tsize += this.calculateNestedTagFullSize(nestedTag);\n\t\t\t}\n\t\t}\n\n\t\t// Value\n\t\tsize += this.calculateValueSize(tag);\n\n\t\treturn size;\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\tconst tagLength = this.calculateTagLength(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.value, offset);\n\t\t\t\treturn offset + 1;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT16:\n\t\t\t\tbuffer.writeUInt16BE(tag.value, offset);\n\t\t\t\treturn offset + 2;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT32:\n\t\t\t\tbuffer.writeUInt32BE(tag.value, offset);\n\t\t\t\treturn offset + 4;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_UINT64:\n\t\t\t\tbuffer.writeBigUInt64BE(tag.value, offset);\n\t\t\t\treturn offset + 8;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_DOUBLE:\n\t\t\t\tbuffer.writeDoubleBE(tag.value, offset);\n\t\t\t\treturn offset + 8;\n\n\t\t\tcase ECTagType.EC_TAGTYPE_IPV4:\n\t\t\t\tbuffer.writeUInt32BE(tag.value.ip, offset);\n\t\t\t\tbuffer.writeUInt16BE(tag.value.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';\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\t// TODO: Implement category creation (requires complex tag structure)\n\t\tthrow new Error('Not implemented yet');\n\t}\n\n\t/**\n\t * Get all categories\n\t */\n\tasync getCategories(): Promise<AmuleCategory[]> {\n\t\t// TODO: Implement get categories (part of preferences)\n\t\treturn [];\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","zlib","hasSubtags","StatsRequest","StatsResponseParser","SearchRequest","SearchStatusRequest","SearchProgressResponse","SearchResultsRequest","SearchResultsResponseParser","SearchStopRequest","DownloadFileRequest","AddLinkRequest","DownloadQueueRequest","DownloadQueueResponseParser","SharedFilesRequest","SharedFilesResponseParser","ServerListRequest","ServerListResponseParser","ServerConnectRequest","ServerDisconnectRequest","SetFileCategoryRequest","DownloadCommandRequest","DownloadCommand"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "amule-ec-client",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "description": "A TypeScript client for Amule EC API.",
5
5
  "author": "José Carlos HR <joecarlhr@gmail.com>",
6
6
  "license": "MIT",