amule-ec-client 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/README.md +10 -2
  2. package/dist/{AddLinkRequest-DwUbSMXD.mjs → AddLinkRequest-DEKGy-R2.js} +2 -5
  3. package/dist/{ClientQueueRequest-D9FaX5K9.mjs → ClientQueueRequest-DrLXSxtp.js} +2 -5
  4. package/dist/{ClientQueueResponse-FVQBR_8b.mjs → ClientQueueResponse-CXxY_9wU.js} +6 -6
  5. package/dist/{CreateCategoryRequest-Br6yfDhZ.mjs → CreateCategoryRequest-COulF12x.js} +2 -5
  6. package/dist/{DeleteCategoryRequest-C2-p6sx0.mjs → DeleteCategoryRequest-D-mljaNV.js} +2 -5
  7. package/dist/{DownloadCommandRequest-CaULjfNi.mjs → DownloadCommandRequest-Bf1Ez8Da.js} +3 -6
  8. package/dist/{DownloadFileRequest-CcNqsBo7.mjs → DownloadFileRequest-WfOIV07R.js} +2 -5
  9. package/dist/{DownloadQueueRequest-bd7lFiMj.mjs → DownloadQueueRequest-Br-pgrRt.js} +2 -5
  10. package/dist/DownloadQueueResponse-C-5d4teB.js +241 -0
  11. package/dist/{GetPreferencesRequest-C94Su9IH.mjs → GetPreferencesRequest-BE3RbRRn.js} +2 -5
  12. package/dist/{PreferencesDetailsResponse-BjMxbvVY.mjs → PreferencesDetailsResponse-D8lBd8Ot.js} +1 -4
  13. package/dist/{PreferencesResponse-Dth-n2sA.mjs → PreferencesResponse-BmGTQM30.js} +1 -4
  14. package/dist/{ReloadSharedFilesRequest-CPwAEJYG.mjs → ReloadSharedFilesRequest-BbDUeGcq.js} +2 -4
  15. package/dist/{Request-C0UUuQIX.mjs → Request-BvScDpeu.js} +3 -11
  16. package/dist/{SearchProgressResponse-Bputc9Ww.mjs → SearchProgressResponse-BQPliUup.js} +1 -4
  17. package/dist/{SearchRequest-CNqz-K1Z.mjs → SearchRequest-DOakj8fA.js} +3 -6
  18. package/dist/{SearchResultsRequest-DKG508KF.mjs → SearchResultsRequest-oZBs5KKm.js} +2 -4
  19. package/dist/{SearchResultsResponse-ChNrKJ6_.mjs → SearchResultsResponse-C9I9x035.js} +1 -4
  20. package/dist/{SearchStatusRequest-Bv6iaC9Y.mjs → SearchStatusRequest-B1ZzSQlE.js} +2 -4
  21. package/dist/{SearchStopRequest-rET-2Nsz.mjs → SearchStopRequest-FfXf_DCn.js} +2 -4
  22. package/dist/{ServerConnectRequest-CcO2-Eqd.mjs → ServerConnectRequest-Cdiw-KWu.js} +2 -5
  23. package/dist/{ServerDisconnectRequest-DEORM3SF.mjs → ServerDisconnectRequest-BVXSumxX.js} +2 -4
  24. package/dist/{ServerListRequest-FwFQBp12.mjs → ServerListRequest-3yMrgZID.js} +2 -4
  25. package/dist/{ServerListResponse-ZAKSSCPZ.mjs → ServerListResponse-Do3iRai0.js} +5 -6
  26. package/dist/{ServerUpdateFromUrlRequest-D4xBqJDJ.mjs → ServerUpdateFromUrlRequest-DpxBII5W.js} +2 -5
  27. package/dist/{SetFileCategoryRequest-BwEPJVeR.mjs → SetFileCategoryRequest-CFgkJB-H.js} +2 -5
  28. package/dist/{SetPreferencesRequest-D2fVIH3P.mjs → SetPreferencesRequest-BdZ40Ao_.js} +2 -5
  29. package/dist/{SharedFilePriorityRequest-j6ImgagV.mjs → SharedFilePriorityRequest-BMNmaL06.js} +2 -5
  30. package/dist/{SharedFilesRequest-D2M3K0eB.mjs → SharedFilesRequest-BZKz0oyn.js} +2 -5
  31. package/dist/SharedFilesResponse-DE0cd1DT.js +45 -0
  32. package/dist/{StatsRequest-B8v9LLHG.mjs → StatsRequest-DVwx5wk1.js} +2 -5
  33. package/dist/{StatsResponse-BVUxNPbz.mjs → StatsResponse-CP2F2zt0.js} +25 -4
  34. package/dist/{Codes-CjiW7Pdl.mjs → Tag-B5gWV2XF.js} +268 -3
  35. package/dist/{UpdateCategoryRequest-CgzH7SxP.mjs → UpdateCategoryRequest-Bu22YjOm.js} +2 -5
  36. package/dist/{UpdateRequest-Bunl73Ga.mjs → UpdateRequest-CaQ867p8.js} +2 -5
  37. package/dist/UpdateState-Dn-SuAsj.js +173 -0
  38. package/dist/{download-details-OM0FJUhZ.mjs → download-details-OM0FJUhZ.js} +0 -2
  39. package/dist/{index.d.mts → index.d.ts} +358 -337
  40. package/dist/{index.mjs → index.js} +94 -54
  41. package/dist/rolldown-runtime-D7D4PA-g.js +13 -0
  42. package/dist/{utils-DBnUQnZ-.mjs → utils-CNoUroOI.js} +11 -3
  43. package/package.json +1 -1
  44. package/dist/AddLinkRequest-DwUbSMXD.mjs.map +0 -1
  45. package/dist/ClientQueueRequest-D9FaX5K9.mjs.map +0 -1
  46. package/dist/ClientQueueResponse-FVQBR_8b.mjs.map +0 -1
  47. package/dist/Codes-CjiW7Pdl.mjs.map +0 -1
  48. package/dist/CreateCategoryRequest-Br6yfDhZ.mjs.map +0 -1
  49. package/dist/DeleteCategoryRequest-C2-p6sx0.mjs.map +0 -1
  50. package/dist/DownloadCommandRequest-CaULjfNi.mjs.map +0 -1
  51. package/dist/DownloadFileRequest-CcNqsBo7.mjs.map +0 -1
  52. package/dist/DownloadQueueRequest-bd7lFiMj.mjs.map +0 -1
  53. package/dist/DownloadQueueResponse-DyP1rLTV.mjs +0 -261
  54. package/dist/DownloadQueueResponse-DyP1rLTV.mjs.map +0 -1
  55. package/dist/GetPreferencesRequest-C94Su9IH.mjs.map +0 -1
  56. package/dist/PreferencesDetailsResponse-BjMxbvVY.mjs.map +0 -1
  57. package/dist/PreferencesResponse-Dth-n2sA.mjs.map +0 -1
  58. package/dist/ReloadSharedFilesRequest-CPwAEJYG.mjs.map +0 -1
  59. package/dist/Request-C0UUuQIX.mjs.map +0 -1
  60. package/dist/SearchProgressResponse-Bputc9Ww.mjs.map +0 -1
  61. package/dist/SearchRequest-CNqz-K1Z.mjs.map +0 -1
  62. package/dist/SearchResultsRequest-DKG508KF.mjs.map +0 -1
  63. package/dist/SearchResultsResponse-ChNrKJ6_.mjs.map +0 -1
  64. package/dist/SearchStatusRequest-Bv6iaC9Y.mjs.map +0 -1
  65. package/dist/SearchStopRequest-rET-2Nsz.mjs.map +0 -1
  66. package/dist/ServerConnectRequest-CcO2-Eqd.mjs.map +0 -1
  67. package/dist/ServerDisconnectRequest-DEORM3SF.mjs.map +0 -1
  68. package/dist/ServerListRequest-FwFQBp12.mjs.map +0 -1
  69. package/dist/ServerListResponse-ZAKSSCPZ.mjs.map +0 -1
  70. package/dist/ServerUpdateFromUrlRequest-D4xBqJDJ.mjs.map +0 -1
  71. package/dist/SetFileCategoryRequest-BwEPJVeR.mjs.map +0 -1
  72. package/dist/SetPreferencesRequest-D2fVIH3P.mjs.map +0 -1
  73. package/dist/SharedFilePriorityRequest-j6ImgagV.mjs.map +0 -1
  74. package/dist/SharedFilesRequest-D2M3K0eB.mjs.map +0 -1
  75. package/dist/SharedFilesResponse-BiXT_oCx.mjs +0 -41
  76. package/dist/SharedFilesResponse-BiXT_oCx.mjs.map +0 -1
  77. package/dist/StatsRequest-B8v9LLHG.mjs.map +0 -1
  78. package/dist/StatsResponse-BVUxNPbz.mjs.map +0 -1
  79. package/dist/Tag-CZF6BRMY.mjs +0 -262
  80. package/dist/Tag-CZF6BRMY.mjs.map +0 -1
  81. package/dist/UpdateCategoryRequest-CgzH7SxP.mjs.map +0 -1
  82. package/dist/UpdateRequest-Bunl73Ga.mjs.map +0 -1
  83. package/dist/UpdateResponse-1LhyH9Zf.mjs +0 -47
  84. package/dist/UpdateResponse-1LhyH9Zf.mjs.map +0 -1
  85. package/dist/download-details-OM0FJUhZ.mjs.map +0 -1
  86. package/dist/index.mjs.map +0 -1
  87. package/dist/utils-DBnUQnZ-.mjs.map +0 -1
@@ -1,261 +0,0 @@
1
- import "./Codes-CjiW7Pdl.mjs";
2
- import { f as findNumericTag, p as findTag } from "./Tag-CZF6BRMY.mjs";
3
- import { n as PARTSIZE, t as ChunkStatus } from "./download-details-OM0FJUhZ.mjs";
4
- import { i as toOptionalNumber, n as toOptionalBool, t as formatIp } from "./utils-DBnUQnZ-.mjs";
5
- //#region src/response/DownloadDetailsResponse.ts
6
- function rleDecode(buf) {
7
- const output = [];
8
- let index = 0;
9
- while (index < buf.length) if (index < buf.length - 2 && buf[index + 1] === buf[index]) {
10
- const value = buf[index];
11
- const count = buf[index + 2];
12
- for (let i = 0; i < count; i++) output.push(value);
13
- index += 3;
14
- } else {
15
- output.push(buf[index]);
16
- index += 1;
17
- }
18
- return Buffer.from(output);
19
- }
20
- function decodePartStatus(buf) {
21
- const decoded = rleDecode(buf);
22
- const result = new Array(decoded.length);
23
- for (let i = 0; i < decoded.length; i++) result[i] = decoded[i];
24
- return result;
25
- }
26
- function decodeUint64Array(buf) {
27
- const decoded = rleDecode(buf);
28
- if (decoded.length === 0 || decoded.length % 8 !== 0) return [];
29
- const valueCount = decoded.length / 8;
30
- const values = new Array(valueCount);
31
- for (let i = 0; i < valueCount; i++) {
32
- let value = 0;
33
- for (let byte = 7; byte >= 0; byte--) value = value * 256 + decoded[i + byte * valueCount];
34
- values[i] = value;
35
- }
36
- return values;
37
- }
38
- function stringValue(tag) {
39
- if (!tag) return "";
40
- const value = tag.getValue();
41
- return typeof value === "string" ? value : "";
42
- }
43
- function bufferValue(tag) {
44
- if (!tag) return;
45
- const value = tag.getValue();
46
- return Buffer.isBuffer(value) ? value : void 0;
47
- }
48
- function nestedTag(parent, tagName) {
49
- return parent.nestedTags ? findTag(parent.nestedTags, tagName) : void 0;
50
- }
51
- function nestedNumeric(parent, tagName) {
52
- if (!parent.nestedTags) return 0;
53
- const numeric = findNumericTag(parent.nestedTags, tagName);
54
- if (numeric) return Number(numeric.getValue());
55
- const tag = findTag(parent.nestedTags, tagName);
56
- if (!tag) return 0;
57
- const value = tag.getValue();
58
- if (typeof value === "number") return value;
59
- if (typeof value === "bigint") return Number(value);
60
- return 0;
61
- }
62
- function nestedString(parent, tagName) {
63
- if (!parent.nestedTags) return "";
64
- return stringValue(findTag(parent.nestedTags, tagName));
65
- }
66
- function nestedIp(parent, tagName) {
67
- const ipAsNumber = nestedNumeric(parent, tagName);
68
- if (ipAsNumber === 0) return "";
69
- return formatIp(ipAsNumber);
70
- }
71
- var DownloadChunkDetailsResponseParser = class {
72
- static fromPacket(packet) {
73
- const result = {};
74
- const partfileTags = packet.tags.filter((tag) => tag.name === 768);
75
- for (const fileTag of partfileTags) {
76
- const hash = bufferValue(nestedTag(fileTag, 798));
77
- if (!hash) continue;
78
- const fileHash = hash.toString("hex");
79
- const sizeFull = nestedNumeric(fileTag, 771);
80
- const partCount = sizeFull > 0 ? Math.ceil(sizeFull / PARTSIZE) : 0;
81
- const partStatusBuf = bufferValue(nestedTag(fileTag, 786));
82
- const gapStatusBuf = bufferValue(nestedTag(fileTag, 787));
83
- const reqStatusBuf = bufferValue(nestedTag(fileTag, 788));
84
- const availability = new Array(partCount).fill(0);
85
- if (partStatusBuf && partStatusBuf.length > 0) {
86
- const decodedAvailability = decodePartStatus(partStatusBuf);
87
- for (let i = 0; i < Math.min(decodedAvailability.length, partCount); i++) availability[i] = decodedAvailability[i];
88
- }
89
- const chunks = new Array(partCount).fill(ChunkStatus.COMPLETE);
90
- if (partCount > 0 && gapStatusBuf && gapStatusBuf.length > 0) {
91
- const gapValues = decodeUint64Array(gapStatusBuf);
92
- for (let i = 0; i + 1 < gapValues.length; i += 2) {
93
- const gapStart = gapValues[i];
94
- const gapEnd = gapValues[i + 1];
95
- if (gapStart > sizeFull || gapEnd > sizeFull || gapStart >= gapEnd) continue;
96
- const startPart = Math.floor(gapStart / PARTSIZE);
97
- const endPart = Math.min(Math.floor(gapEnd / PARTSIZE) + 1, partCount);
98
- for (let part = startPart; part < endPart; part++) {
99
- const chunkStart = part * PARTSIZE;
100
- if (gapStart < Math.min((part + 1) * 9728e3, sizeFull) && gapEnd > chunkStart) chunks[part] = availability[part] > 0 ? ChunkStatus.AVAILABLE : ChunkStatus.UNAVAILABLE;
101
- }
102
- }
103
- }
104
- if (partCount > 0 && reqStatusBuf && reqStatusBuf.length > 0) {
105
- const reqValues = decodeUint64Array(reqStatusBuf);
106
- for (let i = 0; i + 1 < reqValues.length; i += 2) {
107
- const reqStart = reqValues[i];
108
- const reqEnd = reqValues[i + 1];
109
- if (reqStart > sizeFull || reqEnd > sizeFull || reqStart >= reqEnd) continue;
110
- const startPart = Math.floor(reqStart / PARTSIZE);
111
- const endPart = Math.min(Math.floor(reqEnd / PARTSIZE) + 1, partCount);
112
- for (let part = startPart; part < endPart; part++) {
113
- if (chunks[part] === ChunkStatus.COMPLETE) continue;
114
- const chunkStart = part * PARTSIZE;
115
- if (reqStart < Math.min((part + 1) * 9728e3, sizeFull) && reqEnd > chunkStart) chunks[part] = ChunkStatus.DOWNLOADING;
116
- }
117
- }
118
- }
119
- result[fileHash] = {
120
- chunks,
121
- availability,
122
- partCount,
123
- sizeFull
124
- };
125
- }
126
- return result;
127
- }
128
- };
129
- var DownloadSourceDetailsResponseParser = class {
130
- static fromPacket(packet) {
131
- const result = {};
132
- const partfileTags = packet.tags.filter((tag) => tag.name === 768);
133
- for (const fileTag of partfileTags) {
134
- const hash = bufferValue(nestedTag(fileTag, 798));
135
- if (!hash) continue;
136
- const fileHash = hash.toString("hex");
137
- const sourceNames = [];
138
- const sources = [];
139
- for (const nested of fileTag.nestedTags || []) {
140
- if (nested.name !== 1536) continue;
141
- sources.push({
142
- clientName: nestedString(nested, 256) || "Unknown",
143
- userHash: bufferValue(nestedTag(nested, 1539))?.toString("hex") || "",
144
- software: nestedString(nested, 1537),
145
- softwareVersion: nestedString(nested, 1557),
146
- score: nestedNumeric(nested, 1538),
147
- uploadSpeed: nestedNumeric(nested, 1549),
148
- downloadSpeed: nestedNumeric(nested, 1550),
149
- uploadState: nestedNumeric(nested, 1564),
150
- downloadState: nestedNumeric(nested, 1548),
151
- ip: nestedIp(nested, 1552),
152
- port: nestedNumeric(nested, 1553),
153
- remoteQueueRank: nestedNumeric(nested, 1562),
154
- waitingPosition: nestedNumeric(nested, 1558),
155
- identState: nestedNumeric(nested, 1559),
156
- obfuscationStatus: nestedNumeric(nested, 1560),
157
- remoteFilename: nestedString(nested, 1575),
158
- availableParts: nestedNumeric(nested, 1578),
159
- sourceFrom: nestedNumeric(nested, 1551)
160
- });
161
- }
162
- const namesTag = nestedTag(fileTag, 789);
163
- const countsTag = nestedTag(fileTag, 796);
164
- const nameTags = namesTag?.nestedTags || [];
165
- const countTags = countsTag?.nestedTags || [];
166
- for (let i = 0; i < nameTags.length; i++) {
167
- const name = stringValue(nameTags[i]);
168
- if (!name) continue;
169
- const rawCount = countTags[i]?.getValue();
170
- const count = typeof rawCount === "number" ? rawCount : typeof rawCount === "bigint" ? Number(rawCount) : 1;
171
- sourceNames.push({
172
- name,
173
- count
174
- });
175
- }
176
- result[fileHash] = {
177
- sources,
178
- sourceNames
179
- };
180
- }
181
- return result;
182
- }
183
- };
184
- //#endregion
185
- //#region src/response/DownloadQueueResponse.ts
186
- var DownloadQueueResponseParser = class {
187
- static fromPacket(packet) {
188
- const files = [];
189
- const chunkDetailsByHash = DownloadChunkDetailsResponseParser.fromPacket(packet);
190
- const sourceDetailsByHash = DownloadSourceDetailsResponseParser.fromPacket(packet);
191
- const partfileTags = packet.tags.filter((tag) => tag.name === 768);
192
- for (const fileTag of partfileTags) {
193
- const tags = fileTag.nestedTags || [];
194
- const hashTag = findTag(tags, 798);
195
- const fileNameTag = findTag(tags, 769);
196
- let a4afSources = void 0;
197
- const a4afSourcesTag = findTag(tags, 802);
198
- if (a4afSourcesTag) {
199
- a4afSources = [];
200
- a4afSourcesTag.nestedTags = a4afSourcesTag.nestedTags || [];
201
- for (const sourceTag of a4afSourcesTag.nestedTags) if (sourceTag.name === 15) a4afSources.push(sourceTag.getValue());
202
- }
203
- const file = {
204
- fileHashHexString: hashTag ? hashTag.getValue().toString("hex") : void 0,
205
- fileName: fileNameTag ? fileNameTag.getValue() : void 0,
206
- filePath: findTag(tags, 1032)?.getValue(),
207
- sizeFull: toOptionalNumber(findNumericTag(tags, 771)?.getLong()),
208
- fileEd2kLink: findTag(tags, 782)?.getValue(),
209
- partMetID: findNumericTag(tags, 770)?.getShort(),
210
- sizeXfer: toOptionalNumber(findNumericTag(tags, 772)?.getLong()),
211
- sizeDone: toOptionalNumber(findNumericTag(tags, 774)?.getLong()),
212
- fileStatus: findNumericTag(tags, 776)?.getInt(),
213
- stopped: toOptionalBool(findNumericTag(tags, 791)?.getInt()),
214
- sourceCount: findNumericTag(tags, 778)?.getShort(),
215
- sourceNotCurrCount: findNumericTag(tags, 780)?.getShort(),
216
- sourceXferCount: findNumericTag(tags, 781)?.getShort(),
217
- sourceCountA4AF: findNumericTag(tags, 779)?.getShort(),
218
- speed: toOptionalNumber(findNumericTag(tags, 775)?.getLong()),
219
- downPrio: findNumericTag(tags, 777)?.getInt(),
220
- fileCat: toOptionalNumber(findNumericTag(tags, 783)?.getLong()),
221
- lastSeenComplete: toOptionalNumber(findNumericTag(tags, 785)?.getLong()),
222
- lastDateChanged: toOptionalNumber(findNumericTag(tags, 784)?.getLong()),
223
- downloadActiveTime: findNumericTag(tags, 792)?.getInt(),
224
- availablePartCount: findNumericTag(tags, 797)?.getShort(),
225
- a4AFAuto: toOptionalBool(findNumericTag(tags, 801)?.getInt()),
226
- hashingProgress: toOptionalBool(findNumericTag(tags, 800)?.getInt()),
227
- getLostDueToCorruption: toOptionalNumber(findNumericTag(tags, 793)?.getLong()),
228
- getGainDueToCompression: toOptionalNumber(findNumericTag(tags, 794)?.getLong()),
229
- totalPacketsSavedDueToICH: findNumericTag(tags, 795)?.getInt(),
230
- upPrio: findNumericTag(tags, 1035)?.getInt(),
231
- getRequests: findNumericTag(tags, 1027)?.getShort(),
232
- getAllRequests: findNumericTag(tags, 1028)?.getInt(),
233
- getAccepts: findNumericTag(tags, 1029)?.getShort(),
234
- getAllAccepts: findNumericTag(tags, 1030)?.getInt(),
235
- getXferred: toOptionalNumber(findNumericTag(tags, 1025)?.getLong()),
236
- getAllXferred: toOptionalNumber(findNumericTag(tags, 1026)?.getLong()),
237
- getCompleteSourcesLow: findNumericTag(tags, 1033)?.getShort(),
238
- getCompleteSourcesHigh: findNumericTag(tags, 1034)?.getShort(),
239
- getCompleteSources: findNumericTag(tags, 1037)?.getShort(),
240
- getOnQueue: findNumericTag(tags, 1036)?.getShort(),
241
- getComment: findTag(tags, 1038)?.getValue(),
242
- getRating: findNumericTag(tags, 1039)?.getInt(),
243
- a4afSources
244
- };
245
- if (file.fileHashHexString) {
246
- file.chunkInfo = chunkDetailsByHash[file.fileHashHexString];
247
- const sourceDetails = sourceDetailsByHash[file.fileHashHexString];
248
- if (sourceDetails) {
249
- file.sources = sourceDetails.sources;
250
- file.sourceNames = sourceDetails.sourceNames;
251
- }
252
- }
253
- files.push(file);
254
- }
255
- return { files };
256
- }
257
- };
258
- //#endregion
259
- export { DownloadQueueResponseParser };
260
-
261
- //# sourceMappingURL=DownloadQueueResponse-DyP1rLTV.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"DownloadQueueResponse-DyP1rLTV.mjs","names":[],"sources":["../src/response/DownloadDetailsResponse.ts","../src/response/DownloadQueueResponse.ts"],"sourcesContent":["import { ECTagName } from '../ec/Codes';\nimport { Packet } from '../ec/packet/Packet';\nimport { findNumericTag, findTag, type Tag } from '../ec/tag/Tag';\nimport { ChunkStatus, PARTSIZE, SourceInfo, type ChunkInfo, type ParsedSource, type SourceNameCount } from '../types/download-details';\nimport { formatIp } from './utils';\n\nfunction rleDecode(buf: Buffer): Buffer {\n\tconst output: number[] = [];\n\tlet index = 0;\n\n\twhile (index < buf.length) {\n\t\tif (index < buf.length - 2 && buf[index + 1] === buf[index]) {\n\t\t\tconst value = buf[index];\n\t\t\tconst count = buf[index + 2];\n\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t\tindex += 3;\n\t\t} else {\n\t\t\toutput.push(buf[index]);\n\t\t\tindex += 1;\n\t\t}\n\t}\n\n\treturn Buffer.from(output);\n}\n\nfunction decodePartStatus(buf: Buffer): number[] {\n\tconst decoded = rleDecode(buf);\n\tconst result = new Array<number>(decoded.length);\n\tfor (let i = 0; i < decoded.length; i++) {\n\t\tresult[i] = decoded[i];\n\t}\n\treturn result;\n}\n\nfunction decodeUint64Array(buf: Buffer): number[] {\n\tconst decoded = rleDecode(buf);\n\tif (decoded.length === 0 || decoded.length % 8 !== 0) {\n\t\treturn [];\n\t}\n\n\tconst valueCount = decoded.length / 8;\n\tconst values = new Array<number>(valueCount);\n\tfor (let i = 0; i < valueCount; i++) {\n\t\tlet value = 0;\n\t\tfor (let byte = 7; byte >= 0; byte--) {\n\t\t\tvalue = value * 256 + decoded[i + byte * valueCount];\n\t\t}\n\t\tvalues[i] = value;\n\t}\n\treturn values;\n}\n\nfunction stringValue(tag: Tag<any> | undefined): string {\n\tif (!tag) {\n\t\treturn '';\n\t}\n\tconst value = tag.getValue();\n\treturn typeof value === 'string' ? value : '';\n}\n\nfunction bufferValue(tag: Tag<any> | undefined): Buffer | undefined {\n\tif (!tag) {\n\t\treturn undefined;\n\t}\n\tconst value = tag.getValue();\n\treturn Buffer.isBuffer(value) ? value : undefined;\n}\n\nfunction nestedTag(parent: Tag<any>, tagName: ECTagName): Tag<any> | undefined {\n\treturn parent.nestedTags ? findTag(parent.nestedTags, tagName) : undefined;\n}\n\nfunction nestedNumeric(parent: Tag<any>, tagName: ECTagName): number {\n\tif (!parent.nestedTags) {\n\t\treturn 0;\n\t}\n\tconst numeric = findNumericTag(parent.nestedTags, tagName);\n\tif (numeric) {\n\t\treturn Number(numeric.getValue());\n\t}\n\tconst tag = findTag(parent.nestedTags, tagName);\n\tif (!tag) return 0;\n\n\tconst value = tag.getValue();\n\tif (typeof value === 'number') return value;\n\tif (typeof value === 'bigint') return Number(value);\n\n\treturn 0;\n}\n\nfunction nestedString(parent: Tag<any>, tagName: ECTagName): string {\n\tif (!parent.nestedTags) {\n\t\treturn '';\n\t}\n\treturn stringValue(findTag(parent.nestedTags, tagName));\n}\n\nfunction nestedIp(parent: Tag<any>, tagName: ECTagName): string {\n\tconst ipAsNumber = nestedNumeric(parent, tagName);\n\tif (ipAsNumber === 0) {\n\t\treturn '';\n\t}\n\treturn formatIp(ipAsNumber);\n}\n\nexport class DownloadChunkDetailsResponseParser {\n\tstatic fromPacket(packet: Packet): Record<string, ChunkInfo> {\n\t\tconst result: Record<string, ChunkInfo> = {};\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 hash = bufferValue(nestedTag(fileTag, ECTagName.EC_TAG_PARTFILE_HASH));\n\t\t\tif (!hash) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst fileHash = hash.toString('hex');\n\n\t\t\tconst sizeFull = nestedNumeric(fileTag, ECTagName.EC_TAG_PARTFILE_SIZE_FULL);\n\t\t\tconst partCount = sizeFull > 0 ? Math.ceil(sizeFull / PARTSIZE) : 0;\n\n\t\t\tconst partStatusBuf = bufferValue(nestedTag(fileTag, ECTagName.EC_TAG_PARTFILE_PART_STATUS));\n\t\t\tconst gapStatusBuf = bufferValue(nestedTag(fileTag, ECTagName.EC_TAG_PARTFILE_GAP_STATUS));\n\t\t\tconst reqStatusBuf = bufferValue(nestedTag(fileTag, ECTagName.EC_TAG_PARTFILE_REQ_STATUS));\n\n\t\t\tconst availability = new Array<number>(partCount).fill(0);\n\t\t\tif (partStatusBuf && partStatusBuf.length > 0) {\n\t\t\t\tconst decodedAvailability = decodePartStatus(partStatusBuf);\n\t\t\t\tfor (let i = 0; i < Math.min(decodedAvailability.length, partCount); i++) {\n\t\t\t\t\tavailability[i] = decodedAvailability[i];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst chunks = new Array<number>(partCount).fill(ChunkStatus.COMPLETE);\n\t\t\tif (partCount > 0 && gapStatusBuf && gapStatusBuf.length > 0) {\n\t\t\t\tconst gapValues = decodeUint64Array(gapStatusBuf);\n\t\t\t\tfor (let i = 0; i + 1 < gapValues.length; i += 2) {\n\t\t\t\t\tconst gapStart = gapValues[i];\n\t\t\t\t\tconst gapEnd = gapValues[i + 1];\n\t\t\t\t\tif (gapStart > sizeFull || gapEnd > sizeFull || gapStart >= gapEnd) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst startPart = Math.floor(gapStart / PARTSIZE);\n\t\t\t\t\tconst endPart = Math.min(Math.floor(gapEnd / PARTSIZE) + 1, partCount);\n\t\t\t\t\tfor (let part = startPart; part < endPart; part++) {\n\t\t\t\t\t\tconst chunkStart = part * PARTSIZE;\n\t\t\t\t\t\tconst chunkEnd = Math.min((part + 1) * PARTSIZE, sizeFull);\n\t\t\t\t\t\tif (gapStart < chunkEnd && gapEnd > chunkStart) {\n\t\t\t\t\t\t\tchunks[part] = availability[part] > 0 ? ChunkStatus.AVAILABLE : ChunkStatus.UNAVAILABLE;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (partCount > 0 && reqStatusBuf && reqStatusBuf.length > 0) {\n\t\t\t\tconst reqValues = decodeUint64Array(reqStatusBuf);\n\t\t\t\tfor (let i = 0; i + 1 < reqValues.length; i += 2) {\n\t\t\t\t\tconst reqStart = reqValues[i];\n\t\t\t\t\tconst reqEnd = reqValues[i + 1];\n\t\t\t\t\tif (reqStart > sizeFull || reqEnd > sizeFull || reqStart >= reqEnd) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst startPart = Math.floor(reqStart / PARTSIZE);\n\t\t\t\t\tconst endPart = Math.min(Math.floor(reqEnd / PARTSIZE) + 1, partCount);\n\t\t\t\t\tfor (let part = startPart; part < endPart; part++) {\n\t\t\t\t\t\tif (chunks[part] === ChunkStatus.COMPLETE) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst chunkStart = part * PARTSIZE;\n\t\t\t\t\t\tconst chunkEnd = Math.min((part + 1) * PARTSIZE, sizeFull);\n\t\t\t\t\t\tif (reqStart < chunkEnd && reqEnd > chunkStart) {\n\t\t\t\t\t\t\tchunks[part] = ChunkStatus.DOWNLOADING;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tresult[fileHash] = { chunks, availability, partCount, sizeFull };\n\t\t}\n\n\t\treturn result;\n\t}\n}\n\nexport class DownloadSourceDetailsResponseParser {\n\tstatic fromPacket(packet: Packet): Record<string, SourceInfo> {\n\t\tconst result: Record<string, SourceInfo> = {};\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 hash = bufferValue(nestedTag(fileTag, ECTagName.EC_TAG_PARTFILE_HASH));\n\t\t\tif (!hash) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst fileHash = hash.toString('hex');\n\t\t\tconst sourceNames: SourceNameCount[] = [];\n\t\t\tconst sources: ParsedSource[] = [];\n\n\t\t\tfor (const nested of fileTag.nestedTags || []) {\n\t\t\t\tif (nested.name !== ECTagName.EC_TAG_CLIENT) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tsources.push({\n\t\t\t\t\tclientName: nestedString(nested, ECTagName.EC_TAG_CLIENT_NAME) || 'Unknown',\n\t\t\t\t\tuserHash: bufferValue(nestedTag(nested, ECTagName.EC_TAG_CLIENT_HASH))?.toString('hex') || '',\n\t\t\t\t\tsoftware: nestedString(nested, ECTagName.EC_TAG_CLIENT_SOFTWARE),\n\t\t\t\t\tsoftwareVersion: nestedString(nested, ECTagName.EC_TAG_CLIENT_SOFT_VER_STR),\n\t\t\t\t\tscore: nestedNumeric(nested, ECTagName.EC_TAG_CLIENT_SCORE),\n\t\t\t\t\tuploadSpeed: nestedNumeric(nested, ECTagName.EC_TAG_CLIENT_UP_SPEED),\n\t\t\t\t\tdownloadSpeed: nestedNumeric(nested, ECTagName.EC_TAG_CLIENT_DOWN_SPEED),\n\t\t\t\t\tuploadState: nestedNumeric(nested, ECTagName.EC_TAG_CLIENT_UPLOAD_STATE),\n\t\t\t\t\tdownloadState: nestedNumeric(nested, ECTagName.EC_TAG_CLIENT_DOWNLOAD_STATE),\n\t\t\t\t\tip: nestedIp(nested, ECTagName.EC_TAG_CLIENT_USER_IP),\n\t\t\t\t\tport: nestedNumeric(nested, ECTagName.EC_TAG_CLIENT_USER_PORT),\n\t\t\t\t\tremoteQueueRank: nestedNumeric(nested, ECTagName.EC_TAG_CLIENT_REMOTE_QUEUE_RANK),\n\t\t\t\t\twaitingPosition: nestedNumeric(nested, ECTagName.EC_TAG_CLIENT_WAITING_POSITION),\n\t\t\t\t\tidentState: nestedNumeric(nested, ECTagName.EC_TAG_CLIENT_IDENT_STATE),\n\t\t\t\t\tobfuscationStatus: nestedNumeric(nested, ECTagName.EC_TAG_CLIENT_OBFUSCATION_STATUS),\n\t\t\t\t\tremoteFilename: nestedString(nested, ECTagName.EC_TAG_CLIENT_REMOTE_FILENAME),\n\t\t\t\t\tavailableParts: nestedNumeric(nested, ECTagName.EC_TAG_CLIENT_AVAILABLE_PARTS),\n\t\t\t\t\tsourceFrom: nestedNumeric(nested, ECTagName.EC_TAG_CLIENT_FROM),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst namesTag = nestedTag(fileTag, ECTagName.EC_TAG_PARTFILE_SOURCE_NAMES);\n\t\t\tconst countsTag = nestedTag(fileTag, ECTagName.EC_TAG_PARTFILE_SOURCE_NAMES_COUNTS);\n\t\t\tconst nameTags = namesTag?.nestedTags || [];\n\t\t\tconst countTags = countsTag?.nestedTags || [];\n\n\t\t\tfor (let i = 0; i < nameTags.length; i++) {\n\t\t\t\tconst name = stringValue(nameTags[i]);\n\t\t\t\tif (!name) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst countTag = countTags[i];\n\t\t\t\tconst rawCount = countTag?.getValue();\n\t\t\t\tconst count = typeof rawCount === 'number' ? rawCount : typeof rawCount === 'bigint' ? Number(rawCount) : 1;\n\t\t\t\tsourceNames.push({ name, count });\n\t\t\t}\n\n\t\t\tresult[fileHash] = { sources, sourceNames };\n\t\t}\n\n\t\treturn result;\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';\nimport { DownloadChunkDetailsResponseParser, DownloadSourceDetailsResponseParser } from './DownloadDetailsResponse';\nimport { toOptionalBool, toOptionalNumber } from './utils';\n\nexport interface DownloadQueueResponse {\n\tfiles: AmuleTransferringFile[];\n}\n\nexport class DownloadQueueResponseParser {\n\tstatic fromPacket(packet: Packet): DownloadQueueResponse {\n\t\tconst files: AmuleTransferringFile[] = [];\n\t\tconst chunkDetailsByHash = DownloadChunkDetailsResponseParser.fromPacket(packet);\n\t\tconst sourceDetailsByHash = DownloadSourceDetailsResponseParser.fromPacket(packet);\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\tlet a4afSources: number[] | undefined = undefined; // Will be filled if A4AF sources are present\n\t\t\tconst a4afSourcesTag = findTag(tags, ECTagName.EC_TAG_PARTFILE_A4AF_SOURCES);\n\t\t\tif (a4afSourcesTag) {\n\t\t\t\ta4afSources = [];\n\t\t\t\ta4afSourcesTag.nestedTags = a4afSourcesTag.nestedTags || [];\n\t\t\t\tfor (const sourceTag of a4afSourcesTag.nestedTags) {\n\t\t\t\t\tif (sourceTag.name === ECTagName.EC_TAG_ECID) {\n\t\t\t\t\t\ta4afSources.push(sourceTag.getValue());\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\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: toOptionalNumber(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: toOptionalNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SIZE_XFER)?.getLong()),\n\t\t\t\tsizeDone: toOptionalNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SIZE_DONE)?.getLong()),\n\t\t\t\tfileStatus: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_STATUS)?.getInt() as FileStatus | undefined,\n\t\t\t\tstopped: toOptionalBool(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_STOPPED)?.getInt()),\n\t\t\t\tsourceCount: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SOURCE_COUNT)?.getShort(),\n\t\t\t\tsourceNotCurrCount: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SOURCE_COUNT_NOT_CURRENT)?.getShort(),\n\t\t\t\tsourceXferCount: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SOURCE_COUNT_XFER)?.getShort(),\n\t\t\t\tsourceCountA4AF: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SOURCE_COUNT_A4AF)?.getShort(),\n\t\t\t\tspeed: toOptionalNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SPEED)?.getLong()),\n\t\t\t\tdownPrio: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_PRIO)?.getInt(),\n\t\t\t\tfileCat: toOptionalNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_CAT)?.getLong()),\n\t\t\t\tlastSeenComplete: toOptionalNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_LAST_SEEN_COMP)?.getLong()),\n\t\t\t\tlastDateChanged: toOptionalNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_LAST_RECV)?.getLong()),\n\t\t\t\tdownloadActiveTime: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_DOWNLOAD_ACTIVE)?.getInt(),\n\t\t\t\tavailablePartCount: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_AVAILABLE_PARTS)?.getShort(),\n\t\t\t\ta4AFAuto: toOptionalBool(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_A4AFAUTO)?.getInt()),\n\t\t\t\thashingProgress: toOptionalBool(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_HASHED_PART_COUNT)?.getInt()),\n\n\t\t\t\t// Statistics\n\t\t\t\tgetLostDueToCorruption: toOptionalNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_LOST_CORRUPTION)?.getLong()),\n\t\t\t\tgetGainDueToCompression: toOptionalNumber(findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_GAINED_COMPRESSION)?.getLong()),\n\t\t\t\ttotalPacketsSavedDueToICH: findNumericTag(tags, ECTagName.EC_TAG_PARTFILE_SAVED_ICH)?.getInt(),\n\n\t\t\t\t// Known file shared info\n\t\t\t\tupPrio: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_PRIO)?.getInt(),\n\t\t\t\tgetRequests: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_REQ_COUNT)?.getShort(),\n\t\t\t\tgetAllRequests: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_REQ_COUNT_ALL)?.getInt(),\n\t\t\t\tgetAccepts: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_ACCEPT_COUNT)?.getShort(),\n\t\t\t\tgetAllAccepts: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_ACCEPT_COUNT_ALL)?.getInt(),\n\t\t\t\tgetXferred: toOptionalNumber(findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_XFERRED)?.getLong()),\n\t\t\t\tgetAllXferred: toOptionalNumber(findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_XFERRED_ALL)?.getLong()),\n\t\t\t\tgetCompleteSourcesLow: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMPLETE_SOURCES_LOW)?.getShort(),\n\t\t\t\tgetCompleteSourcesHigh: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMPLETE_SOURCES_HIGH)?.getShort(),\n\t\t\t\tgetCompleteSources: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMPLETE_SOURCES)?.getShort(),\n\t\t\t\tgetOnQueue: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_ON_QUEUE)?.getShort(),\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\ta4afSources,\n\t\t\t};\n\n\t\t\tif (file.fileHashHexString) {\n\t\t\t\tfile.chunkInfo = chunkDetailsByHash[file.fileHashHexString];\n\t\t\t\tconst sourceDetails = sourceDetailsByHash[file.fileHashHexString];\n\t\t\t\tif (sourceDetails) {\n\t\t\t\t\tfile.sources = sourceDetails.sources;\n\t\t\t\t\tfile.sourceNames = sourceDetails.sourceNames;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfiles.push(file);\n\t\t}\n\n\t\treturn { files };\n\t}\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"GetPreferencesRequest-C94Su9IH.mjs","names":[],"sources":["../src/request/GetPreferencesRequest.ts"],"sourcesContent":["/**\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"],"mappings":";;;;;;;AAQA,IAAa,wBAAb,cAA2C,QAAQ;CAClD,YAAY,MAAe;EAC1B,MAAA,EAAoC;EACpC,KAAK,OAAO,IAAI,SAAA,GAAA,CAAoE,CAAC;EACrF,KAAK,OAAO,IAAI,QAAA,MAAuC,IAAI,CAAC;CAC7D;AACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PreferencesDetailsResponse-BjMxbvVY.mjs","names":[],"sources":["../src/response/PreferencesDetailsResponse.ts"],"sourcesContent":["import { EcPrefs, ECTagName } from '../ec/Codes';\nimport { Packet } from '../ec/packet/Packet';\nimport { findNumericTag, findTag, type Tag } from '../ec/tag/Tag';\nimport type { AmulePreferences, AmulePrefsConnection, AmulePrefsGeneral, AmulePrefsSecurity, AmulePrefsServers } from '../types/preferences';\n\nexport class PreferencesDetailsResponse {\n\tconstructor(public readonly preferences: AmulePreferences) {}\n}\n\nfunction getNestedTag(parent: Tag<any> | undefined, name: ECTagName): Tag<any> | undefined {\n\tif (!parent?.nestedTags) {\n\t\treturn undefined;\n\t}\n\treturn findTag(parent.nestedTags, name);\n}\n\nfunction getNestedNumber(parent: Tag<any> | undefined, name: ECTagName, fallback: number): number {\n\tif (!parent?.nestedTags) {\n\t\treturn fallback;\n\t}\n\n\tconst numeric = findNumericTag(parent.nestedTags, name);\n\tif (numeric) {\n\t\treturn Number(numeric.getValue());\n\t}\n\n\tconst tag = findTag(parent.nestedTags, name);\n\tif (!tag) {\n\t\treturn fallback;\n\t}\n\n\tconst value = tag.getValue();\n\tif (typeof value === 'number') {\n\t\treturn value;\n\t}\n\tif (typeof value === 'bigint') {\n\t\treturn Number(value);\n\t}\n\treturn fallback;\n}\n\nfunction getNestedBool(parent: Tag<any> | undefined, name: ECTagName, fallback: boolean): boolean {\n\tconst tag = getNestedTag(parent, name);\n\tif (!tag) {\n\t\treturn fallback;\n\t}\n\n\tconst value = tag.getValue();\n\tif (typeof value === 'boolean') {\n\t\treturn value;\n\t}\n\tif (typeof value === 'number') {\n\t\treturn value !== 0;\n\t}\n\tif (typeof value === 'bigint') {\n\t\treturn value !== 0n;\n\t}\n\tif (Buffer.isBuffer(value)) {\n\t\treturn value.length === 0 || value.some((byte) => byte !== 0);\n\t}\n\n\t// For empty/presence tags in EC protocol, presence means true.\n\treturn true;\n}\n\nfunction getNestedString(parent: Tag<any> | undefined, name: ECTagName, fallback: string): string {\n\tconst tag = getNestedTag(parent, name);\n\tif (!tag) {\n\t\treturn fallback;\n\t}\n\n\tconst value = tag.getValue();\n\treturn typeof value === 'string' ? value : fallback;\n}\n\nexport class PreferencesDetailsResponseParser {\n\tstatic fromPacket(packet: Packet): PreferencesDetailsResponse {\n\t\tconst generalTag = findTag(packet.tags, ECTagName.EC_TAG_PREFS_GENERAL);\n\t\tconst connectionTag = findTag(packet.tags, ECTagName.EC_TAG_PREFS_CONNECTIONS);\n\t\tconst serversTag = findTag(packet.tags, ECTagName.EC_TAG_PREFS_SERVERS);\n\t\tconst securityTag = findTag(packet.tags, ECTagName.EC_TAG_PREFS_SECURITY);\n\n\t\tconst general: AmulePrefsGeneral = {\n\t\t\tuserNick: getNestedString(generalTag, ECTagName.EC_TAG_USER_NICK, ''),\n\t\t\tcheckNewVersion: getNestedBool(generalTag, ECTagName.EC_TAG_GENERAL_CHECK_NEW_VERSION, false),\n\t\t};\n\n\t\tconst connection: AmulePrefsConnection = {\n\t\t\tuploadCapacity: getNestedNumber(connectionTag, ECTagName.EC_TAG_CONN_UL_CAP, 0),\n\t\t\tdownloadCapacity: getNestedNumber(connectionTag, ECTagName.EC_TAG_CONN_DL_CAP, 0),\n\t\t\tmaxUploadSpeed: getNestedNumber(connectionTag, ECTagName.EC_TAG_CONN_MAX_UL, 0),\n\t\t\tmaxDownloadSpeed: getNestedNumber(connectionTag, ECTagName.EC_TAG_CONN_MAX_DL, 0),\n\t\t\tslotAllocation: getNestedNumber(connectionTag, ECTagName.EC_TAG_CONN_SLOT_ALLOCATION, 2),\n\t\t\ttcpPort: getNestedNumber(connectionTag, ECTagName.EC_TAG_CONN_TCP_PORT, 4662),\n\t\t\tudpPort: getNestedNumber(connectionTag, ECTagName.EC_TAG_CONN_UDP_PORT, 4672),\n\t\t\tmaxFileSources: getNestedNumber(connectionTag, ECTagName.EC_TAG_CONN_MAX_FILE_SOURCES, 300),\n\t\t\tmaxConnections: getNestedNumber(connectionTag, ECTagName.EC_TAG_CONN_MAX_CONN, 500),\n\t\t\tautoconnect: getNestedBool(connectionTag, ECTagName.EC_TAG_CONN_AUTOCONNECT, false),\n\t\t\treconnect: getNestedBool(connectionTag, ECTagName.EC_TAG_CONN_RECONNECT, false),\n\t\t\tnetworkED2K: getNestedBool(connectionTag, ECTagName.EC_TAG_NETWORK_ED2K, true),\n\t\t\tnetworkKademlia: getNestedBool(connectionTag, ECTagName.EC_TAG_NETWORK_KADEMLIA, false),\n\t\t};\n\n\t\tconst servers: AmulePrefsServers = {\n\t\t\tremoveDead: getNestedBool(serversTag, ECTagName.EC_TAG_SERVERS_REMOVE_DEAD, true),\n\t\t\tdeadRetries: getNestedNumber(serversTag, ECTagName.EC_TAG_SERVERS_DEAD_SERVER_RETRIES, 3),\n\t\t\tuseScoreSystem: getNestedBool(serversTag, ECTagName.EC_TAG_SERVERS_USE_SCORE_SYSTEM, true),\n\t\t\tsmartIdCheck: getNestedBool(serversTag, ECTagName.EC_TAG_SERVERS_SMART_ID_CHECK, true),\n\t\t\tupdateUrl: getNestedString(serversTag, ECTagName.EC_TAG_SERVERS_UPDATE_URL, ''),\n\t\t};\n\n\t\tconst security: AmulePrefsSecurity = {\n\t\t\tcanSeeShares: getNestedNumber(securityTag, ECTagName.EC_TAG_SECURITY_CAN_SEE_SHARES, 2),\n\t\t\tipFilterClients: getNestedBool(securityTag, ECTagName.EC_TAG_IPFILTER_CLIENTS, true),\n\t\t\tipFilterServers: getNestedBool(securityTag, ECTagName.EC_TAG_IPFILTER_SERVERS, true),\n\t\t\tipFilterAutoUpdate: getNestedBool(securityTag, ECTagName.EC_TAG_IPFILTER_AUTO_UPDATE, false),\n\t\t\tipFilterUpdateUrl: getNestedString(securityTag, ECTagName.EC_TAG_IPFILTER_UPDATE_URL, ''),\n\t\t\tipFilterLevel: getNestedNumber(securityTag, ECTagName.EC_TAG_IPFILTER_LEVEL, 127),\n\t\t\tfilterLan: getNestedBool(securityTag, ECTagName.EC_TAG_IPFILTER_FILTER_LAN, true),\n\t\t\tuseSecIdent: getNestedBool(securityTag, ECTagName.EC_TAG_SECURITY_USE_SECIDENT, true),\n\t\t\tobfuscationSupported: getNestedBool(securityTag, ECTagName.EC_TAG_SECURITY_OBFUSCATION_SUPPORTED, true),\n\t\t\tobfuscationRequested: getNestedBool(securityTag, ECTagName.EC_TAG_SECURITY_OBFUSCATION_REQUESTED, false),\n\t\t\tobfuscationRequired: getNestedBool(securityTag, ECTagName.EC_TAG_SECURITY_OBFUSCATION_REQUIRED, false),\n\t\t};\n\n\t\treturn new PreferencesDetailsResponse({ general, connection, servers, security });\n\t}\n\n\tstatic preferenceMaskForAllSections(): EcPrefs {\n\t\treturn EcPrefs.EC_PREFS_GENERAL | EcPrefs.EC_PREFS_CONNECTIONS | EcPrefs.EC_PREFS_SERVERS | EcPrefs.EC_PREFS_SECURITY;\n\t}\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PreferencesResponse-Dth-n2sA.mjs","names":[],"sources":["../src/response/PreferencesResponse.ts"],"sourcesContent":["/**\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"],"mappings":";;;AASA,IAAa,sBAAb,MAAiC;CACJ;CAA5B,YAAY,YAA6C;EAA7B,KAAA,aAAA;CAA8B;AAC3D;AAEA,IAAa,4BAAb,MAAuC;CACtC,OAAO,WAAW,QAAqC;EACtD,MAAM,aAA8B,CAAC;EAErC,MAAM,qBAAqB,QAAQ,OAAO,MAAA,IAAuC;EAEjF,IAAI,sBAAsB,mBAAmB;QACvC,MAAM,eAAe,mBAAmB,YAC5C,IAAI,YAAY,SAAA,MAAoC;IACnD,MAAM,aAAa,YAAY,cAAc,CAAC;IAE9C,MAAM,QAAQ;IACd,MAAM,UAAU,QAAQ,YAAA,IAA2C;IACnE,MAAM,UAAU,QAAQ,YAAA,IAA0C;IAClE,MAAM,aAAa,QAAQ,YAAA,IAA6C;IACxE,MAAM,WAAW,eAAe,YAAA,IAA2C;IAC3E,MAAM,cAAc,eAAe,YAAA,IAA0C;IAE7E,IAAI,SACH,WAAW,KAAK;KACf,IAAI,QAAQ,OAAQ,MAAgC,OAAO,CAAC,IAAI;KAChE,MAAM,QAAQ,SAAS,KAAK;KAC5B,MAAM,UAAU,QAAQ,SAAS,IAAI;KACrC,SAAS,aAAa,WAAW,SAAS,IAAI;KAC9C,OAAO,WAAW,OAAQ,SAAmC,OAAO,CAAC,IAAI;KACzE,UAAU,cAAc,OAAQ,YAAsC,OAAO,CAAC,IAAI;IACnF,CAAC;GAEH;;EAIF,OAAO,IAAI,oBAAoB,UAAU;CAC1C;AACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ReloadSharedFilesRequest-CPwAEJYG.mjs","names":[],"sources":["../src/request/ReloadSharedFilesRequest.ts"],"sourcesContent":["/**\n * Reload Shared Files Request - Reload shared files list\n */\n\nimport { Request } from './Request';\nimport { ECOpCode } from '../ec/Codes';\n\nexport class ReloadSharedFilesRequest extends Request {\n\tconstructor() {\n\t\tsuper(ECOpCode.EC_OP_SHAREDFILES_RELOAD);\n\t}\n}\n"],"mappings":";;;;;;AAOA,IAAa,2BAAb,cAA8C,QAAQ;CACrD,cAAc;EACb,MAAA,EAAuC;CACxC;AACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Request-C0UUuQIX.mjs","names":[],"sources":["../src/ec/packet/Flags.ts","../src/ec/packet/Packet.ts","../src/request/Request.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","/**\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"],"mappings":";;;;AAIA,IAAa,QAAb,MAAa,MAAM;CAClB,OAAwB,eAAe;CACvC,OAAwB,YAAY;CACpC,OAAwB,oBAAoB;CAC5C,OAAwB,kBAAkB;CAE1C;CAEA,YAAY,OAAgB;EAC3B,KAAK,QAAQ,SAAS;CACvB;;;;CAKA,OAAO,WAAW,QAAgB,SAAiB,GAAU;EAE5D,OAAO,IAAI,MADG,OAAO,aAAa,MACb,CAAC;CACvB;;;;CAKA,cAAc,QAAgB,SAAiB,GAAS;EACvD,OAAO,cAAc,KAAK,OAAO,MAAM;CACxC;;;;CAKA,wBAAiC;EAChC,QAAQ,KAAK,QAAQ,MAAM,gBAAgB,MAAM,KAAK,QAAQ,MAAM,qBAAqB;CAC1F;;;;CAKA,iBAA0B;EACzB,QAAQ,KAAK,QAAQ,MAAM,gBAAgB,MAAM,KAAK,QAAQ,MAAM,aAAa;CAClF;;;;CAKA,gBAAyB;EACxB,QAAQ,KAAK,QAAQ,MAAM,qBAAqB;CACjD;;;;CAKA,SAAkB;EACjB,QAAQ,KAAK,QAAQ,MAAM,aAAa;CACzC;;;;CAKA,OAAO,SAAgB;EACtB,OAAO,IAAI,MAAM,MAAM,eAAe,MAAM,oBAAoB,MAAM,YAAY,MAAM,eAAe;CACxG;;;;CAKA,OAAO,iBAAwB;EAC9B,OAAO,IAAI,MAAM,MAAM,oBAAoB,MAAM,eAAe;CACjE;;;;CAKA,OAAO,SAAgB;EACtB,OAAO,IAAI,MAAM,MAAM,eAAe;CACvC;;;;CAKA,OAAO,UAAiB;EACvB,OAAO,IAAI,MAAM,MAAM,YAAY,MAAM,eAAe;CACzD;;;;CAKA,WAAmB;EAClB,OAAO,KAAK;CACb;AACD;;;ACrFA,IAAa,SAAb,MAAa,OAAO;CAIF;CACA;CACA;CALjB,OAAwB,8BAA8B;CAEtD,YACC,QACA,QAA+B,IAAI,MAAM,GACzC,OAAmC,CAAC,GACnC;EAHe,KAAA,SAAA;EACA,KAAA,QAAA;EACA,KAAA,OAAA;CACd;;;;CAKH,OAAO,KAAqB;EAC3B,KAAK,KAAK,KAAK,GAAG;EAClB,OAAO;CACR;;;;CAKA,QAAQ,MAAwB;EAC/B,KAAK,KAAK,KAAK,GAAG,IAAI;EACtB,OAAO;CACR;;;;CAKA,OAAO,qBAA6B;EACnC,OAAO,OAAO;CACf;;;;CAKA,QAAQ,SAAuC;EAC9C,OAAO,KAAK,KAAK,MAAM,QAAQ,IAAI,SAAS,OAAO;CACpD;;;;CAKA,YAAY,SAA6B;EACxC,OAAO,KAAK,KAAK,QAAQ,QAAQ,IAAI,SAAS,OAAO;CACtD;;;;CAKA,OAAO,SAA0B;EAChC,OAAO,KAAK,QAAQ,OAAO,MAAM,KAAA;CAClC;AACD;;;;;;ACnDA,IAAsB,UAAtB,MAA8B;CAC7B;CACA,OAAsC,CAAC;CAEvC,YAAY,QAAkB;EAC7B,KAAK,SAAS;CACf;;;;CAKA,OAAiB,KAAqB;EACrC,KAAK,KAAK,KAAK,GAAG;CACnB;;;;CAKA,cAAsB;EACrB,MAAM,QAAQ,MAAM,eAAe;EACnC,OAAO,IAAI,OAAO,KAAK,QAAQ,OAAO,KAAK,IAAI;CAChD;AACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchProgressResponse-Bputc9Ww.mjs","names":[],"sources":["../src/response/SearchProgressResponse.ts"],"sourcesContent":["/**\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"],"mappings":";;;AAQA,IAAa,yBAAb,MAAa,uBAAuB;CACP;CAA5B,YAAY,UAAkC;EAAlB,KAAA,WAAA;CAAmB;CAE/C,OAAO,WAAW,QAAwC;EACzD,MAAM,cAAc,eAAe,OAAO,MAAA,IAAoC;EAG9E,OAAO,IAAI,uBAFM,cAAc,OAAO,YAAY,SAAS,CAAC,IAAI,MAAQ,CAE9B;CAC3C;AACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchRequest-CNqz-K1Z.mjs","names":[],"sources":["../src/request/SearchRequest.ts"],"sourcesContent":["/**\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"],"mappings":";;;;;;;;;;;;;AAiBA,IAAa,gBAAb,cAAmC,QAAQ;CAC1C;CACA;CACA;CAEA,YAAY,OAAe,aAAA,GAA2C,SAAyB;EAC9F,MAAA,EAAiC;EACjC,KAAK,QAAQ;EACb,KAAK,aAAa;EAClB,KAAK,UAAU;CAChB;;;;CAKA,cAAsB;EACrB,MAAM,QAAQ,MAAM,OAAO;EAC3B,MAAM,OAAO,KAAK,UAAU;EAC5B,OAAO,IAAI,OAAO,KAAK,QAAQ,OAAO,IAAI;CAC3C;CAEA,YAA2B;EAC1B,MAAM,OAAc,CAAC;EAKrB,MAAM,gBAAgB,IAAI,SAAA,MAFL,KAAK,kBAAkB,KAAK,UAEgB,GAAc,CAAC,IADtD,UAAA,MAAwC,KAAK,KACS,CAAa,CAAC;EAC9F,KAAK,KAAK,aAAa;EAGvB,IAAI,KAAK,SAAS;GACjB,IAAI,KAAK,QAAQ,YAAY,KAAA,GAC5B,KAAK,KAAK,IAAI,SAAA,MAA2C,OAAO,KAAK,QAAQ,OAAO,CAAC,CAAC;GAEvF,IAAI,KAAK,QAAQ,YAAY,KAAA,GAC5B,KAAK,KAAK,IAAI,SAAA,MAA2C,OAAO,KAAK,QAAQ,OAAO,CAAC,CAAC;GAEvF,IAAI,KAAK,QAAQ,aAAa,KAAA,GAC7B,KAAK,KAAK,IAAI,UAAA,MAA6C,KAAK,QAAQ,QAAQ,CAAC;GAElF,IAAI,KAAK,QAAQ,cAAc,KAAA,GAC9B,KAAK,KAAK,IAAI,UAAA,MAA6C,KAAK,QAAQ,SAAS,CAAC;GAEnF,IAAI,KAAK,QAAQ,iBAAiB,KAAA,GACjC,KAAK,KAAK,IAAI,QAAA,MAA8C,KAAK,QAAQ,YAAY,CAAC;EAExF;EAEA,OAAO;CACR;CAEA,kBAA0B,YAAsC;EAC/D,QAAQ,YAAR;GACC,KAAA,GACC,OAAA;GACD,KAAA,GACC,OAAA;GACD,KAAA,GACC,OAAA;GACD,KAAA,GACC,OAAA;EACF;CACD;AACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchResultsRequest-DKG508KF.mjs","names":[],"sources":["../src/request/SearchResultsRequest.ts"],"sourcesContent":["/**\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"],"mappings":";;;;;;AAOA,IAAa,uBAAb,cAA0C,QAAQ;CACjD,cAAc;EACb,MAAA,EAAmC;CACpC;AACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchResultsResponse-ChNrKJ6_.mjs","names":[],"sources":["../src/response/SearchResultsResponse.ts"],"sourcesContent":["/**\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 sourceCountTag = findNumericTag(nestedTags, ECTagName.EC_TAG_PARTFILE_SOURCE_COUNT);\n\t\t\tconst completeSourcesTag = findNumericTag(nestedTags, ECTagName.EC_TAG_PARTFILE_SOURCE_COUNT_XFER);\n\t\t\tconst downloadStatusTag = findNumericTag(nestedTags, ECTagName.EC_TAG_PARTFILE_STATUS);\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"],"mappings":";;;AASA,IAAa,8BAAb,MAAyC;CACxC,OAAO,WAAW,QAAuC;EACxD,MAAM,QAAwC,CAAC;EAG/C,MAAM,iBAAiB,OAAO,KAAK,QAAQ,QAAQ,IAAI,SAAA,IAAoC;EAE3F,KAAK,MAAM,WAAW,gBAAgB;GACrC,MAAM,aAAa,QAAQ,cAAc,CAAC;GAG1C,MAAM,cAAc,QAAQ,YAAA,GAA0C;GACtE,MAAM,UAAU,QAAQ,YAAA,GAA0C;GAClE,MAAM,UAAU,eAAe,YAAA,GAA+C;GAC9E,MAAM,iBAAiB,eAAe,YAAA,GAAkD;GACxF,MAAM,qBAAqB,eAAe,YAAA,GAAuD;GACjG,MAAM,oBAAoB,eAAe,YAAA,GAA4C;GAErF,IAAI,eAAe,SAClB,MAAM,KAAK;IACV,UAAU,YAAY,SAAS;IAC/B,MAAM,QAAQ,SAAS;IACvB,UAAU,UAAU,OAAO,QAAQ,QAAQ,CAAC,IAAI;IAChD,gBAAgB,oBAAoB,kBAAkB,OAAO,IAAI;IACjE,qBAAqB,qBAAqB,mBAAmB,OAAO,IAAI;IACxE,aAAa,iBAAiB,eAAe,OAAO,IAAI;GACzD,CAAC;EAEH;EAEA,OAAO,EAAE,MAAM;CAChB;AACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchStatusRequest-Bv6iaC9Y.mjs","names":[],"sources":["../src/request/SearchStatusRequest.ts"],"sourcesContent":["/**\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"],"mappings":";;;;;;AAOA,IAAa,sBAAb,cAAyC,QAAQ;CAChD,cAAc;EACb,MAAA,EAAoC;CACrC;AACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SearchStopRequest-rET-2Nsz.mjs","names":[],"sources":["../src/request/SearchStopRequest.ts"],"sourcesContent":["/**\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"],"mappings":";;;;;;AAOA,IAAa,oBAAb,cAAuC,QAAQ;CAC9C,cAAc;EACb,MAAA,EAAgC;CACjC;AACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ServerConnectRequest-CcO2-Eqd.mjs","names":[],"sources":["../src/request/ServerConnectRequest.ts"],"sourcesContent":["/**\n * Server Connect Request - Connect to a specific server\n */\n\nimport { Request } from './Request';\nimport { ECOpCode, ECTagName } from '../ec/Codes';\nimport { Ipv4Tag } 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\tif (ip && port) {\n\t\t\tthis.addTag(new Ipv4Tag(ECTagName.EC_TAG_SERVER, { address: ip, port }));\n\t\t}\n\t}\n}\n"],"mappings":";;;;;;;AAQA,IAAa,uBAAb,cAA0C,QAAQ;CACjD,YAAY,IAAa,MAAe;EACvC,MAAA,EAAmC;EAEnC,IAAI,MAAM,MACT,KAAK,OAAO,IAAI,QAAA,MAAiC;GAAE,SAAS;GAAI;EAAK,CAAC,CAAC;CAEzE;AACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ServerDisconnectRequest-DEORM3SF.mjs","names":[],"sources":["../src/request/ServerDisconnectRequest.ts"],"sourcesContent":["/**\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"],"mappings":";;;;;;AAOA,IAAa,0BAAb,cAA6C,QAAQ;CACpD,cAAc;EACb,MAAA,EAAsC;CACvC;AACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ServerListRequest-FwFQBp12.mjs","names":[],"sources":["../src/request/ServerListRequest.ts"],"sourcesContent":["/**\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"],"mappings":";;;;;;AAOA,IAAa,oBAAb,cAAuC,QAAQ;CAC9C,cAAc;EACb,MAAA,EAAoC;CACrC;AACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ServerListResponse-ZAKSSCPZ.mjs","names":[],"sources":["../src/response/ServerListResponse.ts"],"sourcesContent":["/**\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 { formatIp, toOptionalBool } from './utils';\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\treturn this.fromTags(packet.tags);\n\t}\n\n\tstatic fromTags(allTags: any[]): ServerListResponse {\n\t\tconst servers: AmuleServer[] = [];\n\n\t\t// Find all server tags\n\t\tconst serverTags = allTags.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: string | undefined = undefined;\n\t\t\tlet port: number | undefined = undefined;\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(allTags, ECTagName.EC_TAG_SERVER_IP)?.getInt();\n\n\t\t\t\tport = findNumericTag(nested, ECTagName.EC_TAG_SERVER_PORT)?.getInt() || findNumericTag(allTags, ECTagName.EC_TAG_SERVER_PORT)?.getInt();\n\n\t\t\t\tip = ipNum !== undefined ? formatIp(ipNum) : undefined;\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 === undefined || port === 0) {\n\t\t\t\tconst extraPort = findNumericTag(nested, ECTagName.EC_TAG_SERVER_PORT)?.getInt();\n\t\t\t\tif (extraPort !== undefined) port = extraPort;\n\t\t\t}\n\n\t\t\tservers.push({\n\t\t\t\tname: findTag(nested, ECTagName.EC_TAG_SERVER_NAME)?.getValue(),\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(),\n\t\t\t\tversion: findTag(nested, ECTagName.EC_TAG_SERVER_VERSION)?.getValue(),\n\t\t\t\tisStatic: toOptionalBool(findNumericTag(nested, ECTagName.EC_TAG_SERVER_STATIC)?.getInt()),\n\t\t\t\tfailedCount: findNumericTag(nested, ECTagName.EC_TAG_SERVER_FAILED)?.getInt(),\n\t\t\t});\n\t\t}\n\n\t\treturn { servers };\n\t}\n}\n"],"mappings":";;;;AAcA,IAAa,2BAAb,MAAsC;CACrC,OAAO,WAAW,QAAoC;EACrD,OAAO,KAAK,SAAS,OAAO,IAAI;CACjC;CAEA,OAAO,SAAS,SAAoC;EACnD,MAAM,UAAyB,CAAC;EAGhC,MAAM,aAAa,QAAQ,QAAQ,QAAQ,IAAI,SAAA,IAAgC;EAE/E,KAAK,MAAM,aAAa,YAAY;GACnC,MAAM,SAAS,UAAU,cAAc,CAAC;GAKxC,MAAM,UACL,QAAQ,QAAA,IAAkC,KAC1C,QAAQ,QAAA,IAAuC,MAC9C,UAAU,YAAY,KAAK,SAAS,MAAM,IAAI,YAAY;GAE5D,IAAI,KAAyB,KAAA;GAC7B,IAAI,OAA2B,KAAA;GAE/B,IAAI,WAAW,QAAQ,SAAS,KAAK,OAAO,QAAQ,SAAS,MAAM,YAAY,aAAc,QAAQ,SAAS,GAAW;IACxH,MAAM,MAAM,QAAQ,SAAS;IAC7B,KAAK,IAAI;IACT,OAAO,IAAI;GACZ,OAAO;IAEN,MAAM,QAAQ,eAAe,QAAA,IAAkC,CAAC,EAAE,OAAO,KAAK,eAAe,SAAA,IAAmC,CAAC,EAAE,OAAO;IAE1I,OAAO,eAAe,QAAA,IAAoC,CAAC,EAAE,OAAO,KAAK,eAAe,SAAA,IAAqC,CAAC,EAAE,OAAO;IAEvI,KAAK,UAAU,KAAA,IAAY,SAAS,KAAK,IAAI,KAAA;GAC9C;GAGA,IAAI,SAAS,KAAA,KAAa,SAAS,GAAG;IACrC,MAAM,YAAY,eAAe,QAAA,IAAoC,CAAC,EAAE,OAAO;IAC/E,IAAI,cAAc,KAAA,GAAW,OAAO;GACrC;GAEA,QAAQ,KAAK;IACZ,MAAM,QAAQ,QAAA,IAAoC,CAAC,EAAE,SAAS;IAC9D,aAAa,QAAQ,QAAA,IAAoC,CAAC,EAAE,SAAS;IACrE,SAAS,QAAQ,QAAA,IAAuC,CAAC,EAAE,SAAS;IAChE;IACE;IACN,MAAM,eAAe,QAAA,IAAoC,CAAC,EAAE,OAAO;IACnE,OAAO,eAAe,QAAA,IAAqC,CAAC,EAAE,OAAO;IACrE,UAAU,eAAe,QAAA,IAAyC,CAAC,EAAE,OAAO;IAC5E,OAAO,eAAe,QAAA,IAAqC,CAAC,EAAE,OAAO;IACrE,UAAU,eAAe,QAAA,IAAoC,CAAC,EAAE,OAAO;IACvE,SAAS,QAAQ,QAAA,IAAuC,CAAC,EAAE,SAAS;IACpE,UAAU,eAAe,eAAe,QAAA,IAAsC,CAAC,EAAE,OAAO,CAAC;IACzF,aAAa,eAAe,QAAA,IAAsC,CAAC,EAAE,OAAO;GAC7E,CAAC;EACF;EAEA,OAAO,EAAE,QAAQ;CAClB;AACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ServerUpdateFromUrlRequest-D4xBqJDJ.mjs","names":[],"sources":["../src/request/ServerUpdateFromUrlRequest.ts"],"sourcesContent":["import { ECOpCode, ECTagName } from '../ec/Codes';\nimport { StringTag } from '../ec/tag/Tag';\nimport { Request } from './Request';\n\nexport class ServerUpdateFromUrlRequest extends Request {\n\tconstructor(url: string) {\n\t\tsuper(ECOpCode.EC_OP_SERVER_UPDATE_FROM_URL);\n\t\tthis.addTag(new StringTag(ECTagName.EC_TAG_SERVERS_UPDATE_URL, url));\n\t}\n}\n"],"mappings":";;;;AAIA,IAAa,6BAAb,cAAgD,QAAQ;CACvD,YAAY,KAAa;EACxB,MAAA,EAA2C;EAC3C,KAAK,OAAO,IAAI,UAAA,MAA+C,GAAG,CAAC;CACpE;AACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SetFileCategoryRequest-BwEPJVeR.mjs","names":[],"sources":["../src/request/SetFileCategoryRequest.ts"],"sourcesContent":["/**\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"],"mappings":";;;;;;;AAQA,IAAa,yBAAb,cAA4C,QAAQ;CACnD,YAAY,MAAc,YAAoB;EAC7C,MAAA,EAAqC;EAGrC,KAAK,OAAO,IAAI,UAAA,KAAqC,MAAM,CAAC,IAAI,SAAA,KAAwC,UAAU,CAAC,CAAC,CAAC;CACtH;AACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SetPreferencesRequest-D2fVIH3P.mjs","names":[],"sources":["../src/request/SetPreferencesRequest.ts"],"sourcesContent":["import { ECOpCode, ECTagName } from '../ec/Codes';\nimport { StringTag, UByteTag, UShortTag, UIntTag, type Tag } from '../ec/tag/Tag';\nimport type { AmulePreferences } from '../types/preferences';\nimport { Request } from './Request';\n\nexport class SetPreferencesRequest extends Request {\n\tconstructor(prefs: Partial<AmulePreferences>) {\n\t\tsuper(ECOpCode.EC_OP_SET_PREFERENCES);\n\t\tthis.tags.push(...SetPreferencesRequest.buildTopLevelTags(prefs));\n\t}\n\n\tprivate static buildTopLevelTags(prefs: Partial<AmulePreferences>): Tag<any>[] {\n\t\tconst topTags: Tag<any>[] = [];\n\n\t\tif (prefs.general) {\n\t\t\tconst g = prefs.general;\n\t\t\ttopTags.push(\n\t\t\t\tnew UByteTag(ECTagName.EC_TAG_PREFS_GENERAL, 0, [\n\t\t\t\t\tnew StringTag(ECTagName.EC_TAG_USER_NICK, g.userNick),\n\t\t\t\t\tnew UByteTag(ECTagName.EC_TAG_GENERAL_CHECK_NEW_VERSION, g.checkNewVersion ? 1 : 0),\n\t\t\t\t])\n\t\t\t);\n\t\t}\n\n\t\tif (prefs.connection) {\n\t\t\tconst c = prefs.connection;\n\t\t\ttopTags.push(\n\t\t\t\tnew UByteTag(ECTagName.EC_TAG_PREFS_CONNECTIONS, 0, [\n\t\t\t\t\tnew UIntTag(ECTagName.EC_TAG_CONN_UL_CAP, c.uploadCapacity),\n\t\t\t\t\tnew UIntTag(ECTagName.EC_TAG_CONN_DL_CAP, c.downloadCapacity),\n\t\t\t\t\tnew UIntTag(ECTagName.EC_TAG_CONN_MAX_UL, c.maxUploadSpeed),\n\t\t\t\t\tnew UIntTag(ECTagName.EC_TAG_CONN_MAX_DL, c.maxDownloadSpeed),\n\t\t\t\t\tnew UIntTag(ECTagName.EC_TAG_CONN_SLOT_ALLOCATION, c.slotAllocation),\n\t\t\t\t\tnew UShortTag(ECTagName.EC_TAG_CONN_TCP_PORT, c.tcpPort),\n\t\t\t\t\tnew UShortTag(ECTagName.EC_TAG_CONN_UDP_PORT, c.udpPort),\n\t\t\t\t\tnew UIntTag(ECTagName.EC_TAG_CONN_MAX_FILE_SOURCES, c.maxFileSources),\n\t\t\t\t\tnew UIntTag(ECTagName.EC_TAG_CONN_MAX_CONN, c.maxConnections),\n\t\t\t\t\tnew UByteTag(ECTagName.EC_TAG_CONN_AUTOCONNECT, c.autoconnect ? 1 : 0),\n\t\t\t\t\tnew UByteTag(ECTagName.EC_TAG_CONN_RECONNECT, c.reconnect ? 1 : 0),\n\t\t\t\t\tnew UByteTag(ECTagName.EC_TAG_NETWORK_ED2K, c.networkED2K ? 1 : 0),\n\t\t\t\t\tnew UByteTag(ECTagName.EC_TAG_NETWORK_KADEMLIA, c.networkKademlia ? 1 : 0),\n\t\t\t\t])\n\t\t\t);\n\t\t}\n\n\t\tif (prefs.servers) {\n\t\t\tconst s = prefs.servers;\n\t\t\ttopTags.push(\n\t\t\t\tnew UByteTag(ECTagName.EC_TAG_PREFS_SERVERS, 0, [\n\t\t\t\t\tnew UByteTag(ECTagName.EC_TAG_SERVERS_REMOVE_DEAD, s.removeDead ? 1 : 0),\n\t\t\t\t\tnew UShortTag(ECTagName.EC_TAG_SERVERS_DEAD_SERVER_RETRIES, s.deadRetries),\n\t\t\t\t\tnew UByteTag(ECTagName.EC_TAG_SERVERS_USE_SCORE_SYSTEM, s.useScoreSystem ? 1 : 0),\n\t\t\t\t\tnew UByteTag(ECTagName.EC_TAG_SERVERS_SMART_ID_CHECK, s.smartIdCheck ? 1 : 0),\n\t\t\t\t\tnew StringTag(ECTagName.EC_TAG_SERVERS_UPDATE_URL, s.updateUrl),\n\t\t\t\t])\n\t\t\t);\n\t\t}\n\n\t\tif (prefs.security) {\n\t\t\tconst sec = prefs.security;\n\t\t\ttopTags.push(\n\t\t\t\tnew UByteTag(ECTagName.EC_TAG_PREFS_SECURITY, 0, [\n\t\t\t\t\tnew UByteTag(ECTagName.EC_TAG_SECURITY_CAN_SEE_SHARES, sec.canSeeShares),\n\t\t\t\t\tnew UByteTag(ECTagName.EC_TAG_IPFILTER_CLIENTS, sec.ipFilterClients ? 1 : 0),\n\t\t\t\t\tnew UByteTag(ECTagName.EC_TAG_IPFILTER_SERVERS, sec.ipFilterServers ? 1 : 0),\n\t\t\t\t\tnew UByteTag(ECTagName.EC_TAG_IPFILTER_AUTO_UPDATE, sec.ipFilterAutoUpdate ? 1 : 0),\n\t\t\t\t\tnew StringTag(ECTagName.EC_TAG_IPFILTER_UPDATE_URL, sec.ipFilterUpdateUrl),\n\t\t\t\t\tnew UByteTag(ECTagName.EC_TAG_IPFILTER_LEVEL, sec.ipFilterLevel),\n\t\t\t\t\tnew UByteTag(ECTagName.EC_TAG_IPFILTER_FILTER_LAN, sec.filterLan ? 1 : 0),\n\t\t\t\t\tnew UByteTag(ECTagName.EC_TAG_SECURITY_USE_SECIDENT, sec.useSecIdent ? 1 : 0),\n\t\t\t\t\tnew UByteTag(ECTagName.EC_TAG_SECURITY_OBFUSCATION_SUPPORTED, sec.obfuscationSupported ? 1 : 0),\n\t\t\t\t\tnew UByteTag(ECTagName.EC_TAG_SECURITY_OBFUSCATION_REQUESTED, sec.obfuscationRequested ? 1 : 0),\n\t\t\t\t\tnew UByteTag(ECTagName.EC_TAG_SECURITY_OBFUSCATION_REQUIRED, sec.obfuscationRequired ? 1 : 0),\n\t\t\t\t])\n\t\t\t);\n\t\t}\n\n\t\treturn topTags;\n\t}\n}\n"],"mappings":";;;;AAKA,IAAa,wBAAb,MAAa,8BAA8B,QAAQ;CAClD,YAAY,OAAkC;EAC7C,MAAA,EAAoC;EACpC,KAAK,KAAK,KAAK,GAAG,sBAAsB,kBAAkB,KAAK,CAAC;CACjE;CAEA,OAAe,kBAAkB,OAA8C;EAC9E,MAAM,UAAsB,CAAC;EAE7B,IAAI,MAAM,SAAS;GAClB,MAAM,IAAI,MAAM;GAChB,QAAQ,KACP,IAAI,SAAA,MAAyC,GAAG,CAC/C,IAAI,UAAA,MAAsC,EAAE,QAAQ,GACpD,IAAI,SAAA,MAAqD,EAAE,kBAAkB,IAAI,CAAC,CACnF,CAAC,CACF;EACD;EAEA,IAAI,MAAM,YAAY;GACrB,MAAM,IAAI,MAAM;GAChB,QAAQ,KACP,IAAI,SAAA,MAA6C,GAAG;IACnD,IAAI,QAAA,MAAsC,EAAE,cAAc;IAC1D,IAAI,QAAA,MAAsC,EAAE,gBAAgB;IAC5D,IAAI,QAAA,MAAsC,EAAE,cAAc;IAC1D,IAAI,QAAA,MAAsC,EAAE,gBAAgB;IAC5D,IAAI,QAAA,MAA+C,EAAE,cAAc;IACnE,IAAI,UAAA,MAA0C,EAAE,OAAO;IACvD,IAAI,UAAA,MAA0C,EAAE,OAAO;IACvD,IAAI,QAAA,MAAgD,EAAE,cAAc;IACpE,IAAI,QAAA,MAAwC,EAAE,cAAc;IAC5D,IAAI,SAAA,MAA4C,EAAE,cAAc,IAAI,CAAC;IACrE,IAAI,SAAA,MAA0C,EAAE,YAAY,IAAI,CAAC;IACjE,IAAI,SAAA,MAAwC,EAAE,cAAc,IAAI,CAAC;IACjE,IAAI,SAAA,MAA4C,EAAE,kBAAkB,IAAI,CAAC;GAC1E,CAAC,CACF;EACD;EAEA,IAAI,MAAM,SAAS;GAClB,MAAM,IAAI,MAAM;GAChB,QAAQ,KACP,IAAI,SAAA,MAAyC,GAAG;IAC/C,IAAI,SAAA,MAA+C,EAAE,aAAa,IAAI,CAAC;IACvE,IAAI,UAAA,MAAwD,EAAE,WAAW;IACzE,IAAI,SAAA,MAAoD,EAAE,iBAAiB,IAAI,CAAC;IAChF,IAAI,SAAA,MAAkD,EAAE,eAAe,IAAI,CAAC;IAC5E,IAAI,UAAA,MAA+C,EAAE,SAAS;GAC/D,CAAC,CACF;EACD;EAEA,IAAI,MAAM,UAAU;GACnB,MAAM,MAAM,MAAM;GAClB,QAAQ,KACP,IAAI,SAAA,MAA0C,GAAG;IAChD,IAAI,SAAA,MAAmD,IAAI,YAAY;IACvE,IAAI,SAAA,MAA4C,IAAI,kBAAkB,IAAI,CAAC;IAC3E,IAAI,SAAA,MAA4C,IAAI,kBAAkB,IAAI,CAAC;IAC3E,IAAI,SAAA,MAAgD,IAAI,qBAAqB,IAAI,CAAC;IAClF,IAAI,UAAA,MAAgD,IAAI,iBAAiB;IACzE,IAAI,SAAA,MAA0C,IAAI,aAAa;IAC/D,IAAI,SAAA,MAA+C,IAAI,YAAY,IAAI,CAAC;IACxE,IAAI,SAAA,MAAiD,IAAI,cAAc,IAAI,CAAC;IAC5E,IAAI,SAAA,MAA0D,IAAI,uBAAuB,IAAI,CAAC;IAC9F,IAAI,SAAA,MAA0D,IAAI,uBAAuB,IAAI,CAAC;IAC9F,IAAI,SAAA,MAAyD,IAAI,sBAAsB,IAAI,CAAC;GAC7F,CAAC,CACF;EACD;EAEA,OAAO;CACR;AACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SharedFilePriorityRequest-j6ImgagV.mjs","names":[],"sources":["../src/request/SharedFilePriorityRequest.ts"],"sourcesContent":["import { ECOpCode, ECTagName } from '../ec/Codes';\nimport { Hash16Tag, UIntTag } from '../ec/tag/Tag';\nimport { Request } from './Request';\n\nexport class SharedFilePriorityRequest extends Request {\n\tconstructor(hash: Buffer, priority: number) {\n\t\tsuper(ECOpCode.EC_OP_SHARED_SET_PRIO);\n\t\tthis.addTag(new Hash16Tag(ECTagName.EC_TAG_PARTFILE_HASH, hash));\n\t\tthis.addTag(new UIntTag(ECTagName.EC_TAG_KNOWNFILE_PRIO, priority));\n\t}\n}\n"],"mappings":";;;;AAIA,IAAa,4BAAb,cAA+C,QAAQ;CACtD,YAAY,MAAc,UAAkB;EAC3C,MAAA,EAAoC;EACpC,KAAK,OAAO,IAAI,UAAA,KAA0C,IAAI,CAAC;EAC/D,KAAK,OAAO,IAAI,QAAA,MAAyC,QAAQ,CAAC;CACnE;AACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SharedFilesRequest-D2M3K0eB.mjs","names":[],"sources":["../src/request/SharedFilesRequest.ts"],"sourcesContent":["/**\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"],"mappings":";;;;;;;AAQA,IAAa,qBAAb,cAAwC,QAAQ;CAC/C,YAAY,cAAA,GAA2D;EACtE,MAAA,EAAqC;EAErC,KAAK,OAAO,IAAI,SAAA,GAAwC,WAAW,CAAC;CACrE;AACD"}
@@ -1,41 +0,0 @@
1
- import "./Codes-CjiW7Pdl.mjs";
2
- import { f as findNumericTag, p as findTag } from "./Tag-CZF6BRMY.mjs";
3
- import { i as toOptionalNumber } from "./utils-DBnUQnZ-.mjs";
4
- //#region src/response/SharedFilesResponse.ts
5
- var SharedFilesResponseParser = class {
6
- static fromPacket(packet) {
7
- const files = [];
8
- const knownfileTags = packet.tags.filter((tag) => tag.name === 1024);
9
- for (const fileTag of knownfileTags) {
10
- const tags = fileTag.nestedTags || [];
11
- const hashTag = findTag(tags, 798);
12
- const fileNameTag = findTag(tags, 769);
13
- const file = {
14
- fileHashHexString: hashTag ? hashTag.getValue().toString("hex") : void 0,
15
- fileName: fileNameTag ? fileNameTag.getValue() : void 0,
16
- filePath: findTag(tags, 1032)?.getValue(),
17
- sizeFull: toOptionalNumber(findNumericTag(tags, 771)?.getLong()),
18
- fileEd2kLink: findTag(tags, 782)?.getValue(),
19
- upPrio: findNumericTag(tags, 1035)?.getInt(),
20
- getRequests: findNumericTag(tags, 1027)?.getShort(),
21
- getAllRequests: findNumericTag(tags, 1028)?.getInt(),
22
- getAccepts: findNumericTag(tags, 1029)?.getShort(),
23
- getAllAccepts: findNumericTag(tags, 1030)?.getInt(),
24
- getXferred: toOptionalNumber(findNumericTag(tags, 1025)?.getLong()),
25
- getAllXferred: toOptionalNumber(findNumericTag(tags, 1026)?.getLong()),
26
- getCompleteSourcesLow: findNumericTag(tags, 1033)?.getShort(),
27
- getCompleteSourcesHigh: findNumericTag(tags, 1034)?.getShort(),
28
- getCompleteSources: findNumericTag(tags, 1037)?.getShort(),
29
- getOnQueue: findNumericTag(tags, 1036)?.getShort(),
30
- getComment: findTag(tags, 1038)?.getValue(),
31
- getRating: findNumericTag(tags, 1039)?.getInt()
32
- };
33
- files.push(file);
34
- }
35
- return { files };
36
- }
37
- };
38
- //#endregion
39
- export { SharedFilesResponseParser };
40
-
41
- //# sourceMappingURL=SharedFilesResponse-BiXT_oCx.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SharedFilesResponse-BiXT_oCx.mjs","names":[],"sources":["../src/response/SharedFilesResponse.ts"],"sourcesContent":["/**\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';\nimport { toOptionalNumber } from './utils';\n\nexport interface SharedFilesResponse {\n\tfiles: AmuleFile[];\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: toOptionalNumber(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(),\n\t\t\t\tgetRequests: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_REQ_COUNT)?.getShort(),\n\t\t\t\tgetAllRequests: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_REQ_COUNT_ALL)?.getInt(),\n\t\t\t\tgetAccepts: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_ACCEPT_COUNT)?.getShort(),\n\t\t\t\tgetAllAccepts: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_ACCEPT_COUNT_ALL)?.getInt(),\n\t\t\t\tgetXferred: toOptionalNumber(findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_XFERRED)?.getLong()),\n\t\t\t\tgetAllXferred: toOptionalNumber(findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_XFERRED_ALL)?.getLong()),\n\t\t\t\tgetCompleteSourcesLow: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMPLETE_SOURCES_LOW)?.getShort(),\n\t\t\t\tgetCompleteSourcesHigh: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMPLETE_SOURCES_HIGH)?.getShort(),\n\t\t\t\tgetCompleteSources: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_COMPLETE_SOURCES)?.getShort(),\n\t\t\t\tgetOnQueue: findNumericTag(tags, ECTagName.EC_TAG_KNOWNFILE_ON_QUEUE)?.getShort(),\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"],"mappings":";;;;AAcA,IAAa,4BAAb,MAAuC;CACtC,OAAO,WAAW,QAAqC;EACtD,MAAM,QAAqB,CAAC;EAG5B,MAAM,gBAAgB,OAAO,KAAK,QAAQ,QAAQ,IAAI,SAAA,IAAmC;EAEzF,KAAK,MAAM,WAAW,eAAe;GACpC,MAAM,OAAO,QAAQ,cAAc,CAAC;GAEpC,MAAM,UAAU,QAAQ,MAAA,GAAoC;GAC5D,MAAM,cAAc,QAAQ,MAAA,GAAoC;GAEhE,MAAM,OAAkB;IACvB,mBAAmB,UAAU,QAAQ,SAAS,CAAC,CAAC,SAAS,KAAK,IAAI,KAAA;IAClE,UAAU,cAAc,YAAY,SAAS,IAAI,KAAA;IACjD,UAAU,QAAQ,MAAA,IAAyC,CAAC,EAAE,SAAS;IACvE,UAAU,iBAAiB,eAAe,MAAA,GAAyC,CAAC,EAAE,QAAQ,CAAC;IAC/F,cAAc,QAAQ,MAAA,GAAyC,CAAC,EAAE,SAAS;IAE3E,QAAQ,eAAe,MAAA,IAAqC,CAAC,EAAE,OAAO;IACtE,aAAa,eAAe,MAAA,IAA0C,CAAC,EAAE,SAAS;IAClF,gBAAgB,eAAe,MAAA,IAA8C,CAAC,EAAE,OAAO;IACvF,YAAY,eAAe,MAAA,IAA6C,CAAC,EAAE,SAAS;IACpF,eAAe,eAAe,MAAA,IAAiD,CAAC,EAAE,OAAO;IACzF,YAAY,iBAAiB,eAAe,MAAA,IAAwC,CAAC,EAAE,QAAQ,CAAC;IAChG,eAAe,iBAAiB,eAAe,MAAA,IAA4C,CAAC,EAAE,QAAQ,CAAC;IACvG,uBAAuB,eAAe,MAAA,IAAqD,CAAC,EAAE,SAAS;IACvG,wBAAwB,eAAe,MAAA,IAAsD,CAAC,EAAE,SAAS;IACzG,oBAAoB,eAAe,MAAA,IAAiD,CAAC,EAAE,SAAS;IAChG,YAAY,eAAe,MAAA,IAAyC,CAAC,EAAE,SAAS;IAChF,YAAY,QAAQ,MAAA,IAAwC,CAAC,EAAE,SAAS;IACxE,WAAW,eAAe,MAAA,IAAuC,CAAC,EAAE,OAAO;GAC5E;GAEA,MAAM,KAAK,IAAI;EAChB;EAEA,OAAO,EAAE,MAAM;CAChB;AACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"StatsRequest-B8v9LLHG.mjs","names":[],"sources":["../src/request/StatsRequest.ts"],"sourcesContent":["/**\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"],"mappings":";;;;;;;AAQA,IAAa,eAAb,cAAkC,QAAQ;CACzC,YAAY,cAAA,GAA2D;EACtE,MAAA,EAA6B;EAE7B,KAAK,OAAO,IAAI,SAAA,GAAwC,WAAW,CAAC;CACrE;AACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"StatsResponse-BVUxNPbz.mjs","names":[],"sources":["../src/response/StatsResponse.ts"],"sourcesContent":["/**\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"],"mappings":"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"}