amule-ec-client 0.3.0 → 0.3.2

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