cross-seed 7.0.0-1 → 7.0.0-3

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 (282) hide show
  1. package/dist/Result.d.ts +27 -0
  2. package/dist/Result.js +64 -0
  3. package/dist/Result.js.map +1 -0
  4. package/dist/action.d.ts +34 -0
  5. package/dist/action.js +694 -0
  6. package/dist/action.js.map +1 -0
  7. package/dist/arr.d.ts +31 -0
  8. package/dist/arr.js +267 -0
  9. package/dist/arr.js.map +1 -0
  10. package/dist/auth.d.ts +3 -0
  11. package/dist/auth.js +28 -0
  12. package/dist/auth.js.map +1 -0
  13. package/dist/clients/Deluge.d.ts +153 -0
  14. package/dist/clients/Deluge.js +698 -0
  15. package/dist/clients/Deluge.js.map +1 -0
  16. package/dist/clients/QBittorrent.d.ts +218 -0
  17. package/dist/clients/QBittorrent.js +785 -0
  18. package/dist/clients/QBittorrent.js.map +1 -0
  19. package/dist/clients/RTorrent.d.ts +43 -0
  20. package/dist/clients/RTorrent.js +657 -0
  21. package/dist/clients/RTorrent.js.map +1 -0
  22. package/dist/clients/TorrentClient.d.ts +108 -0
  23. package/dist/clients/TorrentClient.js +341 -0
  24. package/dist/clients/TorrentClient.js.map +1 -0
  25. package/dist/clients/Transmission.d.ts +43 -0
  26. package/dist/clients/Transmission.js +404 -0
  27. package/dist/clients/Transmission.js.map +1 -0
  28. package/dist/cmd.d.ts +2 -0
  29. package/dist/cmd.js +128 -0
  30. package/dist/cmd.js.map +1 -0
  31. package/dist/configSchema.d.ts +1 -0
  32. package/dist/configSchema.js +2 -0
  33. package/dist/configSchema.js.map +1 -0
  34. package/dist/configuration.d.ts +63 -0
  35. package/dist/configuration.js +321 -0
  36. package/dist/configuration.js.map +1 -0
  37. package/dist/constants.d.ts +108 -0
  38. package/dist/constants.js +251 -0
  39. package/dist/constants.js.map +1 -0
  40. package/dist/dataFiles.d.ts +8 -0
  41. package/dist/dataFiles.js +223 -0
  42. package/dist/dataFiles.js.map +1 -0
  43. package/dist/db.d.ts +3 -0
  44. package/dist/db.js +216 -0
  45. package/dist/db.js.map +1 -0
  46. package/dist/dbConfig.d.ts +4 -0
  47. package/dist/dbConfig.js +67 -0
  48. package/dist/dbConfig.js.map +1 -0
  49. package/dist/decide.d.ts +25 -0
  50. package/dist/decide.js +553 -0
  51. package/dist/decide.js.map +1 -0
  52. package/dist/diff.d.ts +1 -0
  53. package/dist/diff.js +24 -0
  54. package/dist/diff.js.map +1 -0
  55. package/dist/errors.d.ts +3 -0
  56. package/dist/errors.js +7 -0
  57. package/dist/errors.js.map +1 -0
  58. package/dist/indexers.d.ts +105 -0
  59. package/dist/indexers.js +248 -0
  60. package/dist/indexers.js.map +1 -0
  61. package/dist/inject.d.ts +2 -0
  62. package/dist/inject.js +594 -0
  63. package/dist/inject.js.map +1 -0
  64. package/dist/jobs.d.ts +29 -0
  65. package/dist/jobs.js +151 -0
  66. package/dist/jobs.js.map +1 -0
  67. package/dist/logger.d.ts +29 -0
  68. package/dist/logger.js +157 -0
  69. package/dist/logger.js.map +1 -0
  70. package/dist/migrations/00-initialSchema.d.ts +9 -0
  71. package/dist/migrations/00-initialSchema.js +30 -0
  72. package/dist/migrations/00-initialSchema.js.map +1 -0
  73. package/dist/migrations/01-jobs.d.ts +9 -0
  74. package/dist/migrations/01-jobs.js +12 -0
  75. package/dist/migrations/01-jobs.js.map +1 -0
  76. package/dist/migrations/02-timestamps.d.ts +9 -0
  77. package/dist/migrations/02-timestamps.js +21 -0
  78. package/dist/migrations/02-timestamps.js.map +1 -0
  79. package/dist/migrations/03-rateLimits.d.ts +9 -0
  80. package/dist/migrations/03-rateLimits.js +14 -0
  81. package/dist/migrations/03-rateLimits.js.map +1 -0
  82. package/dist/migrations/04-auth.d.ts +9 -0
  83. package/dist/migrations/04-auth.js +13 -0
  84. package/dist/migrations/04-auth.js.map +1 -0
  85. package/dist/migrations/05-caps.d.ts +9 -0
  86. package/dist/migrations/05-caps.js +16 -0
  87. package/dist/migrations/05-caps.js.map +1 -0
  88. package/dist/migrations/06-uniqueDecisions.d.ts +9 -0
  89. package/dist/migrations/06-uniqueDecisions.js +29 -0
  90. package/dist/migrations/06-uniqueDecisions.js.map +1 -0
  91. package/dist/migrations/07-limits.d.ts +9 -0
  92. package/dist/migrations/07-limits.js +12 -0
  93. package/dist/migrations/07-limits.js.map +1 -0
  94. package/dist/migrations/08-rss.d.ts +9 -0
  95. package/dist/migrations/08-rss.js +15 -0
  96. package/dist/migrations/08-rss.js.map +1 -0
  97. package/dist/migrations/09-clientAndDataSearchees.d.ts +9 -0
  98. package/dist/migrations/09-clientAndDataSearchees.js +34 -0
  99. package/dist/migrations/09-clientAndDataSearchees.js.map +1 -0
  100. package/dist/migrations/10-indexerNameAudioBookCaps.d.ts +9 -0
  101. package/dist/migrations/10-indexerNameAudioBookCaps.js +18 -0
  102. package/dist/migrations/10-indexerNameAudioBookCaps.js.map +1 -0
  103. package/dist/migrations/11-trackers.d.ts +9 -0
  104. package/dist/migrations/11-trackers.js +38 -0
  105. package/dist/migrations/11-trackers.js.map +1 -0
  106. package/dist/migrations/12-user-auth.d.ts +9 -0
  107. package/dist/migrations/12-user-auth.js +22 -0
  108. package/dist/migrations/12-user-auth.js.map +1 -0
  109. package/dist/migrations/13-settings.d.ts +9 -0
  110. package/dist/migrations/13-settings.js +23 -0
  111. package/dist/migrations/13-settings.js.map +1 -0
  112. package/dist/migrations/14-indexer-enabled-flag.d.ts +9 -0
  113. package/dist/migrations/14-indexer-enabled-flag.js +12 -0
  114. package/dist/migrations/14-indexer-enabled-flag.js.map +1 -0
  115. package/dist/migrations/15-remove-url-unique-constraint.d.ts +9 -0
  116. package/dist/migrations/15-remove-url-unique-constraint.js +14 -0
  117. package/dist/migrations/15-remove-url-unique-constraint.js.map +1 -0
  118. package/dist/migrations/16-prune-inactive-indexers.d.ts +9 -0
  119. package/dist/migrations/16-prune-inactive-indexers.js +17 -0
  120. package/dist/migrations/16-prune-inactive-indexers.js.map +1 -0
  121. package/dist/migrations/migrations.d.ts +13 -0
  122. package/dist/migrations/migrations.js +41 -0
  123. package/dist/migrations/migrations.js.map +1 -0
  124. package/dist/parseTorrent.d.ts +53 -0
  125. package/dist/parseTorrent.js +128 -0
  126. package/dist/parseTorrent.js.map +1 -0
  127. package/dist/pipeline.d.ts +41 -0
  128. package/dist/pipeline.js +574 -0
  129. package/dist/pipeline.js.map +1 -0
  130. package/dist/preFilter.d.ts +25 -0
  131. package/dist/preFilter.js +250 -0
  132. package/dist/preFilter.js.map +1 -0
  133. package/dist/problems/linking.d.ts +2 -0
  134. package/dist/problems/linking.js +80 -0
  135. package/dist/problems/linking.js.map +1 -0
  136. package/dist/problems/path.d.ts +22 -0
  137. package/dist/problems/path.js +96 -0
  138. package/dist/problems/path.js.map +1 -0
  139. package/dist/problems.d.ts +13 -0
  140. package/dist/problems.js +48 -0
  141. package/dist/problems.js.map +1 -0
  142. package/dist/pushNotifier.d.ts +19 -0
  143. package/dist/pushNotifier.js +137 -0
  144. package/dist/pushNotifier.js.map +1 -0
  145. package/dist/routes/baseApi.d.ts +2 -0
  146. package/dist/routes/baseApi.js +354 -0
  147. package/dist/routes/baseApi.js.map +1 -0
  148. package/dist/routes/indexerApi.d.ts +6 -0
  149. package/dist/routes/indexerApi.js +165 -0
  150. package/dist/routes/indexerApi.js.map +1 -0
  151. package/dist/routes/staticFrontendPlugin.d.ts +4 -0
  152. package/dist/routes/staticFrontendPlugin.js +63 -0
  153. package/dist/routes/staticFrontendPlugin.js.map +1 -0
  154. package/dist/runtimeConfig.d.ts +6 -0
  155. package/dist/runtimeConfig.js +27 -0
  156. package/dist/runtimeConfig.js.map +1 -0
  157. package/dist/searchee.d.ts +108 -0
  158. package/dist/searchee.js +689 -0
  159. package/dist/searchee.js.map +1 -0
  160. package/dist/server.d.ts +4 -0
  161. package/dist/server.js +65 -0
  162. package/dist/server.js.map +1 -0
  163. package/dist/services/indexerService.d.ts +96 -0
  164. package/dist/services/indexerService.js +287 -0
  165. package/dist/services/indexerService.js.map +1 -0
  166. package/dist/sessionCookies.d.ts +5 -0
  167. package/dist/sessionCookies.js +27 -0
  168. package/dist/sessionCookies.js.map +1 -0
  169. package/dist/startup.d.ts +25 -0
  170. package/dist/startup.js +157 -0
  171. package/dist/startup.js.map +1 -0
  172. package/dist/torrent.d.ts +69 -0
  173. package/dist/torrent.js +641 -0
  174. package/dist/torrent.js.map +1 -0
  175. package/dist/torznab.d.ts +60 -0
  176. package/dist/torznab.js +711 -0
  177. package/dist/torznab.js.map +1 -0
  178. package/dist/trpc/fastifyAdapter.d.ts +2 -0
  179. package/dist/trpc/fastifyAdapter.js +9 -0
  180. package/dist/trpc/fastifyAdapter.js.map +1 -0
  181. package/dist/trpc/index.d.ts +49 -0
  182. package/dist/trpc/index.js +53 -0
  183. package/dist/trpc/index.js.map +1 -0
  184. package/dist/trpc/routers/auth.d.ts +43 -0
  185. package/dist/trpc/routers/auth.js +116 -0
  186. package/dist/trpc/routers/auth.js.map +1 -0
  187. package/dist/trpc/routers/clients.d.ts +21 -0
  188. package/dist/trpc/routers/clients.js +65 -0
  189. package/dist/trpc/routers/clients.js.map +1 -0
  190. package/dist/trpc/routers/health.d.ts +14 -0
  191. package/dist/trpc/routers/health.js +20 -0
  192. package/dist/trpc/routers/health.js.map +1 -0
  193. package/dist/trpc/routers/index.d.ts +391 -0
  194. package/dist/trpc/routers/index.js +23 -0
  195. package/dist/trpc/routers/index.js.map +1 -0
  196. package/dist/trpc/routers/indexers.d.ts +75 -0
  197. package/dist/trpc/routers/indexers.js +79 -0
  198. package/dist/trpc/routers/indexers.js.map +1 -0
  199. package/dist/trpc/routers/jobs.d.ts +33 -0
  200. package/dist/trpc/routers/jobs.js +84 -0
  201. package/dist/trpc/routers/jobs.js.map +1 -0
  202. package/dist/trpc/routers/logs.d.ts +27 -0
  203. package/dist/trpc/routers/logs.js +91 -0
  204. package/dist/trpc/routers/logs.js.map +1 -0
  205. package/dist/trpc/routers/searchees.d.ts +51 -0
  206. package/dist/trpc/routers/searchees.js +156 -0
  207. package/dist/trpc/routers/searchees.js.map +1 -0
  208. package/dist/trpc/routers/settings.d.ts +83 -0
  209. package/dist/trpc/routers/settings.js +92 -0
  210. package/dist/trpc/routers/settings.js.map +1 -0
  211. package/dist/trpc/routers/stats.d.ts +42 -0
  212. package/dist/trpc/routers/stats.js +102 -0
  213. package/dist/trpc/routers/stats.js.map +1 -0
  214. package/dist/userAuth.d.ts +21 -0
  215. package/dist/userAuth.js +86 -0
  216. package/dist/userAuth.js.map +1 -0
  217. package/dist/utils/authUtils.d.ts +10 -0
  218. package/dist/utils/authUtils.js +24 -0
  219. package/dist/utils/authUtils.js.map +1 -0
  220. package/dist/utils/logWatcher.d.ts +28 -0
  221. package/dist/utils/logWatcher.js +218 -0
  222. package/dist/utils/logWatcher.js.map +1 -0
  223. package/dist/utils/object.d.ts +1 -0
  224. package/dist/utils/object.js +4 -0
  225. package/dist/utils/object.js.map +1 -0
  226. package/dist/utils.d.ts +175 -0
  227. package/dist/utils.js +660 -0
  228. package/dist/utils.js.map +1 -0
  229. package/package.json +17 -58
  230. package/LICENSE +0 -201
  231. package/README.md +0 -33
  232. package/dist/webui/assets/FieldInfo-Bxj_j8SJ.js +0 -1
  233. package/dist/webui/assets/Page-C3rteCZt.js +0 -1
  234. package/dist/webui/assets/array-field-DVSC6nHP.js +0 -1
  235. package/dist/webui/assets/badge-DTZMtS0e.js +0 -1
  236. package/dist/webui/assets/check-Bu3ldi63.js +0 -1
  237. package/dist/webui/assets/chevron-down-CRy8M0kJ.js +0 -1
  238. package/dist/webui/assets/clients-CW8oEZoQ.js +0 -1
  239. package/dist/webui/assets/connect-YBNsnjWT.js +0 -1
  240. package/dist/webui/assets/debug-mz8-WYZj.js +0 -1
  241. package/dist/webui/assets/directories-BSK28RgR.js +0 -1
  242. package/dist/webui/assets/duration-field-C6xoSlJg.js +0 -1
  243. package/dist/webui/assets/general-lJJxZhH7.js +0 -1
  244. package/dist/webui/assets/health-CXbsVrie.js +0 -1
  245. package/dist/webui/assets/index-Bi48hI2z.js +0 -54
  246. package/dist/webui/assets/index-C-Ul7GNg.css +0 -1
  247. package/dist/webui/assets/index-C2cH1Gst.js +0 -1
  248. package/dist/webui/assets/index-Cc5bDmJr.js +0 -1
  249. package/dist/webui/assets/jobs-CxmNab9w.js +0 -1
  250. package/dist/webui/assets/library-vaj2W8sE.js +0 -1
  251. package/dist/webui/assets/loader-circle-M0gu1gZ-.js +0 -1
  252. package/dist/webui/assets/logs-Cu9RyKS0.js +0 -1
  253. package/dist/webui/assets/search-2R5sIdT8.js +0 -1
  254. package/dist/webui/assets/select-field-BCqNLDrJ.js +0 -1
  255. package/dist/webui/assets/select-zHgqMzLj.js +0 -1
  256. package/dist/webui/assets/settings-CMYjpTbZ.js +0 -1
  257. package/dist/webui/assets/submit-button-BtcnyggQ.js +0 -1
  258. package/dist/webui/assets/switch-G0W3uJVN.js +0 -1
  259. package/dist/webui/assets/switch-field-IBd9ORNq.js +0 -1
  260. package/dist/webui/assets/table-DvgJU7Gh.js +0 -1
  261. package/dist/webui/assets/test-tube-BIwmoM45.js +0 -1
  262. package/dist/webui/assets/text-field-DruSbGhy.js +0 -1
  263. package/dist/webui/assets/time-BSMZjmyW.js +0 -1
  264. package/dist/webui/assets/trackers-D-OpAe63.js +0 -7
  265. package/dist/webui/assets/use-form-validation-context-BkAfWAh0.js +0 -1
  266. package/dist/webui/assets/use-settings-form-submit-CDRh-E9U.js +0 -2
  267. package/dist/webui/assets/useQuery-A4Hv_4uX.js +0 -1
  268. package/dist/webui/index.html +0 -13
  269. package/node_modules/@cross-seed/shared/dist/configSchema.d.ts +0 -261
  270. package/node_modules/@cross-seed/shared/dist/configSchema.d.ts.map +0 -1
  271. package/node_modules/@cross-seed/shared/dist/configSchema.js +0 -53
  272. package/node_modules/@cross-seed/shared/dist/configSchema.js.map +0 -1
  273. package/node_modules/@cross-seed/shared/dist/constants.d.ts +0 -122
  274. package/node_modules/@cross-seed/shared/dist/constants.d.ts.map +0 -1
  275. package/node_modules/@cross-seed/shared/dist/constants.js +0 -127
  276. package/node_modules/@cross-seed/shared/dist/constants.js.map +0 -1
  277. package/node_modules/@cross-seed/shared/dist/tsconfig.tsbuildinfo +0 -1
  278. package/node_modules/@cross-seed/shared/dist/utils.d.ts +0 -6
  279. package/node_modules/@cross-seed/shared/dist/utils.d.ts.map +0 -1
  280. package/node_modules/@cross-seed/shared/dist/utils.js +0 -9
  281. package/node_modules/@cross-seed/shared/dist/utils.js.map +0 -1
  282. package/node_modules/@cross-seed/shared/package.json +0 -22
package/dist/decide.js ADDED
@@ -0,0 +1,553 @@
1
+ import bencode from "bencode";
2
+ import { readFile, stat, unlink, utimes, writeFile } from "fs/promises";
3
+ import ms from "ms";
4
+ import path from "path";
5
+ import { appDir } from "./configuration.js";
6
+ import { ANIME_GROUP_REGEX, Decision, isAnyMatchedDecision, MatchMode, parseSource, REPACK_PROPER_REGEX, RES_STRICT_REGEX, SEASON_REGEX, TORRENT_CACHE_FOLDER, } from "./constants.js";
7
+ import { db } from "./db.js";
8
+ import { Label, logger } from "./logger.js";
9
+ import { Metafile } from "./parseTorrent.js";
10
+ import { findBlockedStringInReleaseMaybe, isSingleEpisode, } from "./preFilter.js";
11
+ import { getRuntimeConfig } from "./runtimeConfig.js";
12
+ import { getFuzzySizeFactor, getMediaType, getMinSizeRatio, getReleaseGroup, } from "./searchee.js";
13
+ import { findAllTorrentFilesInDir, parseTorrentFromPath, snatch, SnatchError, } from "./torrent.js";
14
+ import { exists, extractInt, getLogString, Mutex, sanitizeInfoHash, stripExtension, withMutex, } from "./utils.js";
15
+ function logDecision(searchee, candidate, decision, metafile, tracker, options) {
16
+ const { blockList, matchMode } = getRuntimeConfig(options?.configOverride);
17
+ let reason;
18
+ let match = "no match";
19
+ switch (decision) {
20
+ case Decision.RELEASE_GROUP_MISMATCH:
21
+ reason = `it has a different release group: ${getReleaseGroup(stripExtension(searchee.title))} -> ${getReleaseGroup(stripExtension(candidate.name))}`;
22
+ break;
23
+ case Decision.RESOLUTION_MISMATCH:
24
+ reason = `its resolution does not match: ${searchee.title.match(RES_STRICT_REGEX)?.groups?.res} -> ${candidate.name.match(RES_STRICT_REGEX)?.groups?.res}`;
25
+ break;
26
+ case Decision.SOURCE_MISMATCH:
27
+ reason = `it has a different source: ${parseSource(searchee.title)} -> ${parseSource(candidate.name)}`;
28
+ break;
29
+ case Decision.PROPER_REPACK_MISMATCH:
30
+ reason = `one is a different subsequent release: ${searchee.title.match(REPACK_PROPER_REGEX)?.groups?.type ??
31
+ "INITIAL"} -> ${candidate.name.match(REPACK_PROPER_REGEX)?.groups?.type ?? "INITIAL"}`;
32
+ break;
33
+ case Decision.FUZZY_SIZE_MISMATCH:
34
+ reason = `the total sizes are outside of the fuzzySizeThreshold range: ${Math.abs((candidate.size - searchee.length) / searchee.length).toFixed(3)} > ${getFuzzySizeFactor(searchee)}`;
35
+ break;
36
+ case Decision.MATCH:
37
+ match = decision;
38
+ reason =
39
+ "all file sizes and file names match: torrent progress will be 100%";
40
+ break;
41
+ case Decision.MATCH_SIZE_ONLY:
42
+ match = decision;
43
+ reason = "all file sizes match: torrent progress will be 100%";
44
+ break;
45
+ case Decision.MATCH_PARTIAL:
46
+ match = decision;
47
+ reason = `most file sizes match: torrent progress will be ~${(getPartialSizeRatio(metafile, searchee) * 100).toFixed(3)}%`;
48
+ break;
49
+ case Decision.PARTIAL_SIZE_MISMATCH:
50
+ reason = `too many files are missing or have different sizes: torrent progress would be ${(getPartialSizeRatio(metafile, searchee) * 100).toFixed(3)}%`;
51
+ break;
52
+ case Decision.SIZE_MISMATCH:
53
+ reason = `some files are missing or have different sizes${compareFileTreesPartial(metafile, searchee) ? ` (will match in partial match mode)` : ""}`;
54
+ break;
55
+ case Decision.SAME_INFO_HASH:
56
+ reason = "the infoHash is the same";
57
+ break;
58
+ case Decision.INFO_HASH_ALREADY_EXISTS:
59
+ reason = "the infoHash matches a torrent you already have";
60
+ break;
61
+ case Decision.FILE_TREE_MISMATCH:
62
+ reason = `it has a different file tree${matchMode === MatchMode.STRICT ? " (will match in flexible or partial matchMode)" : ""}`;
63
+ break;
64
+ case Decision.MAGNET_LINK:
65
+ reason = "the torrent is a magnet link";
66
+ break;
67
+ case Decision.RATE_LIMITED:
68
+ reason = "cross-seed has reached this tracker's rate limit";
69
+ break;
70
+ case Decision.DOWNLOAD_FAILED:
71
+ reason = "the torrent file failed to download";
72
+ break;
73
+ case Decision.NO_DOWNLOAD_LINK:
74
+ reason = "it doesn't have a download link";
75
+ break;
76
+ case Decision.BLOCKED_RELEASE:
77
+ reason = `it matches the blocklist: ${findBlockedStringInReleaseMaybe(searchee, blockList) ??
78
+ findBlockedStringInReleaseMaybe(metafile, blockList)}`;
79
+ break;
80
+ default:
81
+ reason = decision;
82
+ break;
83
+ }
84
+ logger.verbose({
85
+ label: `${searchee.label}/${Label.DECIDE}`,
86
+ message: `${getLogString(searchee)} - ${match} for ${tracker} torrent ${candidate.name}${metafile ? ` [${sanitizeInfoHash(metafile.infoHash)}]` : ""} - ${reason}`,
87
+ });
88
+ }
89
+ export function compareFileTrees(candidate, searchee) {
90
+ let cmp;
91
+ if (!searchee.infoHash && !searchee.path) {
92
+ // Absolute path so need name
93
+ cmp = (elOfA, elOfB) => {
94
+ const lengthsAreEqual = elOfB.length === elOfA.length;
95
+ const namesAreEqual = elOfB.name === elOfA.name;
96
+ return lengthsAreEqual && namesAreEqual;
97
+ };
98
+ }
99
+ else {
100
+ cmp = (elOfA, elOfB) => {
101
+ const lengthsAreEqual = elOfB.length === elOfA.length;
102
+ const pathsAreEqual = elOfB.path === elOfA.path;
103
+ return lengthsAreEqual && pathsAreEqual;
104
+ };
105
+ }
106
+ return candidate.files.every((elOfA) => searchee.files.some((elOfB) => cmp(elOfA, elOfB)));
107
+ }
108
+ export function compareFileTreesIgnoringNames(candidate, searchee) {
109
+ const availableFiles = searchee.files.slice();
110
+ for (const candidateFile of candidate.files) {
111
+ let matchedSearcheeFiles = availableFiles.filter((searcheeFile) => searcheeFile.length === candidateFile.length);
112
+ if (matchedSearcheeFiles.length > 1) {
113
+ matchedSearcheeFiles = matchedSearcheeFiles.filter((searcheeFile) => searcheeFile.name === candidateFile.name);
114
+ }
115
+ if (matchedSearcheeFiles.length === 0) {
116
+ return false;
117
+ }
118
+ const index = availableFiles.indexOf(matchedSearcheeFiles[0]);
119
+ availableFiles.splice(index, 1);
120
+ }
121
+ return true;
122
+ }
123
+ export function getPartialSizeRatio(candidate, searchee) {
124
+ let matchedSizes = 0;
125
+ for (const candidateFile of candidate.files) {
126
+ const searcheeHasFileSize = searchee.files.some((searcheeFile) => searcheeFile.length === candidateFile.length);
127
+ if (searcheeHasFileSize) {
128
+ matchedSizes += candidateFile.length;
129
+ }
130
+ }
131
+ return matchedSizes / candidate.length;
132
+ }
133
+ export function compareFileTreesPartial(candidate, searchee) {
134
+ let matchedSizes = 0;
135
+ const availableFiles = searchee.files.slice();
136
+ for (const candidateFile of candidate.files) {
137
+ let matchedSearcheeFiles = availableFiles.filter((searcheeFile) => searcheeFile.length === candidateFile.length);
138
+ if (matchedSearcheeFiles.length > 1) {
139
+ matchedSearcheeFiles = matchedSearcheeFiles.filter((searcheeFile) => searcheeFile.name === candidateFile.name);
140
+ }
141
+ if (matchedSearcheeFiles.length) {
142
+ matchedSizes += candidateFile.length;
143
+ const index = availableFiles.indexOf(matchedSearcheeFiles[0]);
144
+ availableFiles.splice(index, 1);
145
+ }
146
+ }
147
+ const totalPieces = Math.ceil(candidate.length / candidate.pieceLength);
148
+ const availablePieces = Math.floor(matchedSizes / candidate.pieceLength);
149
+ return availablePieces / totalPieces >= getMinSizeRatio(searchee);
150
+ }
151
+ function fuzzySizeDoesMatch(resultSize, searchee) {
152
+ const fuzzySizeFactor = getFuzzySizeFactor(searchee);
153
+ const { length } = searchee;
154
+ const lowerBound = length - fuzzySizeFactor * length;
155
+ const upperBound = length + fuzzySizeFactor * length;
156
+ return resultSize >= lowerBound && resultSize <= upperBound;
157
+ }
158
+ function resolutionDoesMatch(searcheeTitle, candidateName) {
159
+ const searcheeRes = searcheeTitle
160
+ .match(RES_STRICT_REGEX)
161
+ ?.groups?.res?.trim()
162
+ ?.toLowerCase();
163
+ const candidateRes = candidateName
164
+ .match(RES_STRICT_REGEX)
165
+ ?.groups?.res?.trim()
166
+ ?.toLowerCase();
167
+ if (!searcheeRes || !candidateRes)
168
+ return true;
169
+ return extractInt(searcheeRes) === extractInt(candidateRes);
170
+ }
171
+ function releaseGroupDoesMatch(searcheeTitle, candidateName) {
172
+ const searcheeReleaseGroup = getReleaseGroup(stripExtension(searcheeTitle))?.toLowerCase();
173
+ const candidateReleaseGroup = getReleaseGroup(stripExtension(candidateName))?.toLowerCase();
174
+ if (!searcheeReleaseGroup || !candidateReleaseGroup) {
175
+ return true; // Pass if missing -GRP
176
+ }
177
+ if (searcheeReleaseGroup.startsWith(candidateReleaseGroup) ||
178
+ candidateReleaseGroup.startsWith(searcheeReleaseGroup)) {
179
+ return true; // -GRP matches
180
+ }
181
+ // Anime naming can cause weird things to match as release groups
182
+ const searcheeAnimeGroup = searcheeTitle
183
+ .match(ANIME_GROUP_REGEX)
184
+ ?.groups?.group?.trim()
185
+ ?.toLowerCase();
186
+ const candidateAnimeGroup = candidateName
187
+ .match(ANIME_GROUP_REGEX)
188
+ ?.groups?.group?.trim()
189
+ ?.toLowerCase();
190
+ if (!searcheeAnimeGroup && !candidateAnimeGroup) {
191
+ return false;
192
+ }
193
+ // Most checks will never get here, below are rare edge cases
194
+ if (searcheeAnimeGroup === candidateAnimeGroup) {
195
+ return true;
196
+ }
197
+ if (searcheeAnimeGroup && searcheeAnimeGroup === candidateReleaseGroup) {
198
+ return true;
199
+ }
200
+ if (candidateAnimeGroup && searcheeReleaseGroup === candidateAnimeGroup) {
201
+ return true;
202
+ }
203
+ return false;
204
+ }
205
+ function sourceDoesMatch(searcheeTitle, candidateName) {
206
+ const searcheeSource = parseSource(searcheeTitle);
207
+ const candidateSource = parseSource(candidateName);
208
+ if (!searcheeSource || !candidateSource)
209
+ return true;
210
+ return searcheeSource === candidateSource;
211
+ }
212
+ function releaseVersionDoesMatch(searcheeName, candidateName) {
213
+ return (REPACK_PROPER_REGEX.test(searcheeName) ===
214
+ REPACK_PROPER_REGEX.test(candidateName));
215
+ }
216
+ export async function assessCandidate(metaOrCandidate, searchee, infoHashesToExclude, blockList, options) {
217
+ const { includeSingleEpisodes, matchMode } = getRuntimeConfig(options?.configOverride);
218
+ // When metaOrCandidate is a Metafile, skip straight to the
219
+ // main matching algorithms as we don't need pre-download filtering.
220
+ const isCandidate = !(metaOrCandidate instanceof Metafile);
221
+ if (isCandidate) {
222
+ const name = metaOrCandidate.name;
223
+ if (!releaseGroupDoesMatch(searchee.title, name)) {
224
+ return { decision: Decision.RELEASE_GROUP_MISMATCH };
225
+ }
226
+ if (!resolutionDoesMatch(searchee.title, name)) {
227
+ return { decision: Decision.RESOLUTION_MISMATCH };
228
+ }
229
+ if (!sourceDoesMatch(searchee.title, name)) {
230
+ return { decision: Decision.SOURCE_MISMATCH };
231
+ }
232
+ if (!releaseVersionDoesMatch(searchee.title, name)) {
233
+ return { decision: Decision.PROPER_REPACK_MISMATCH };
234
+ }
235
+ const size = metaOrCandidate.size;
236
+ if (size && !fuzzySizeDoesMatch(size, searchee)) {
237
+ return { decision: Decision.FUZZY_SIZE_MISMATCH };
238
+ }
239
+ if (!metaOrCandidate.link) {
240
+ return { decision: Decision.NO_DOWNLOAD_LINK };
241
+ }
242
+ }
243
+ let metaCached = !isCandidate;
244
+ if (findBlockedStringInReleaseMaybe(searchee, blockList)) {
245
+ return {
246
+ decision: Decision.BLOCKED_RELEASE,
247
+ metafile: !isCandidate ? metaOrCandidate : undefined,
248
+ metaCached,
249
+ };
250
+ }
251
+ let metafile;
252
+ if (isCandidate) {
253
+ const res = await snatch(metaOrCandidate, searchee.label, {
254
+ retries: 4,
255
+ delayMs: searchee.label === Label.ANNOUNCE
256
+ ? ms("5 minutes")
257
+ : ms("1 minute"),
258
+ });
259
+ if (res.isErr()) {
260
+ const err = res.unwrapErr();
261
+ return err === SnatchError.MAGNET_LINK
262
+ ? { decision: Decision.MAGNET_LINK }
263
+ : err === SnatchError.RATE_LIMITED
264
+ ? { decision: Decision.RATE_LIMITED }
265
+ : { decision: Decision.DOWNLOAD_FAILED };
266
+ }
267
+ metafile = res.unwrap();
268
+ metaCached = await cacheTorrentFile(metafile, metaOrCandidate, searchee.label);
269
+ metaOrCandidate.size = metafile.length; // Trackers can be wrong
270
+ }
271
+ else {
272
+ metafile = metaOrCandidate;
273
+ }
274
+ if (searchee.infoHash === metafile.infoHash) {
275
+ return { decision: Decision.SAME_INFO_HASH, metafile, metaCached };
276
+ }
277
+ if (infoHashesToExclude.has(metafile.infoHash)) {
278
+ return {
279
+ decision: Decision.INFO_HASH_ALREADY_EXISTS,
280
+ metafile,
281
+ metaCached,
282
+ };
283
+ }
284
+ if (findBlockedStringInReleaseMaybe(metafile, blockList)) {
285
+ return { decision: Decision.BLOCKED_RELEASE, metafile, metaCached };
286
+ }
287
+ // Prevent candidate episodes from matching searchee season packs
288
+ if (!includeSingleEpisodes &&
289
+ SEASON_REGEX.test(searchee.title) &&
290
+ isSingleEpisode(metafile, getMediaType(metafile))) {
291
+ return { decision: Decision.FILE_TREE_MISMATCH, metafile, metaCached };
292
+ }
293
+ const perfectMatch = compareFileTrees(metafile, searchee);
294
+ if (perfectMatch) {
295
+ return { decision: Decision.MATCH, metafile, metaCached };
296
+ }
297
+ const sizeMatch = compareFileTreesIgnoringNames(metafile, searchee);
298
+ if (sizeMatch && matchMode !== MatchMode.STRICT) {
299
+ return { decision: Decision.MATCH_SIZE_ONLY, metafile, metaCached };
300
+ }
301
+ if (matchMode === MatchMode.PARTIAL) {
302
+ const partialSizeMatch = getPartialSizeRatio(metafile, searchee) >=
303
+ getMinSizeRatio(searchee);
304
+ if (!partialSizeMatch) {
305
+ return {
306
+ decision: Decision.PARTIAL_SIZE_MISMATCH,
307
+ metafile,
308
+ metaCached,
309
+ };
310
+ }
311
+ const partialMatch = compareFileTreesPartial(metafile, searchee);
312
+ if (partialMatch) {
313
+ return { decision: Decision.MATCH_PARTIAL, metafile, metaCached };
314
+ }
315
+ }
316
+ else if (!sizeMatch) {
317
+ return { decision: Decision.SIZE_MISMATCH, metafile, metaCached };
318
+ }
319
+ return { decision: Decision.FILE_TREE_MISMATCH, metafile, metaCached };
320
+ }
321
+ export function getCachedTorrentName(infoHash) {
322
+ return `${infoHash}.cached.torrent`;
323
+ }
324
+ async function existsInTorrentCache(infoHash) {
325
+ const torrentPath = path.join(appDir(), TORRENT_CACHE_FOLDER, getCachedTorrentName(infoHash));
326
+ if (await exists(torrentPath))
327
+ return torrentPath;
328
+ return null;
329
+ }
330
+ async function getCachedTorrent(infoHash, searcheeLabel) {
331
+ if (!infoHash)
332
+ return null;
333
+ const torrentPath = await existsInTorrentCache(infoHash);
334
+ if (!torrentPath)
335
+ return null;
336
+ let meta;
337
+ try {
338
+ meta = await parseTorrentFromPath(torrentPath);
339
+ }
340
+ catch (e) {
341
+ logger.error({
342
+ label: `${searcheeLabel}/${Label.DECIDE}`,
343
+ message: `Failed to parse cached torrent ${torrentPath.replace(infoHash, sanitizeInfoHash(infoHash))} - deleting: ${e.message}`,
344
+ });
345
+ logger.debug(e);
346
+ try {
347
+ await unlink(torrentPath); // cleanup job handles db entries
348
+ }
349
+ catch (e) {
350
+ if (await exists(torrentPath)) {
351
+ logger.error({
352
+ label: `${searcheeLabel}/${Label.DECIDE}`,
353
+ message: `Failed to delete corrupted cached torrent ${torrentPath.replace(infoHash, sanitizeInfoHash(infoHash))}: ${e.message}`,
354
+ });
355
+ logger.debug(e);
356
+ }
357
+ }
358
+ return null;
359
+ }
360
+ await utimes(torrentPath, new Date(), (await stat(torrentPath)).mtime);
361
+ return { meta, torrentPath };
362
+ }
363
+ async function cacheTorrentFile(meta, candidate, searcheeLabel) {
364
+ let cached = false;
365
+ try {
366
+ const torrentPath = path.join(appDir(), TORRENT_CACHE_FOLDER, getCachedTorrentName(meta.infoHash));
367
+ await writeFile(torrentPath, new Uint8Array(meta.encode()));
368
+ cached = true;
369
+ if (candidate.indexerId && meta.trackers.length) {
370
+ const dbIndexer = await db("indexer")
371
+ .where({ id: candidate.indexerId })
372
+ .first();
373
+ const dbTrackers = dbIndexer?.trackers
374
+ ? JSON.parse(dbIndexer.trackers)
375
+ : [];
376
+ let added = false;
377
+ for (const tracker of meta.trackers) {
378
+ if (dbTrackers.includes(tracker))
379
+ continue;
380
+ dbTrackers.push(tracker);
381
+ added = true;
382
+ }
383
+ if (added) {
384
+ await db("indexer")
385
+ .where({ id: candidate.indexerId })
386
+ .update({ trackers: JSON.stringify(dbTrackers) });
387
+ }
388
+ }
389
+ return cached;
390
+ }
391
+ catch (e) {
392
+ logger.error({
393
+ label: `${searcheeLabel}/${Label.DECIDE}`,
394
+ message: `Error while caching torrent ${getLogString(meta)}: ${e.message}`,
395
+ });
396
+ logger.debug(e);
397
+ return cached;
398
+ }
399
+ }
400
+ export async function updateTorrentCache(oldStr, newStr) {
401
+ const torrentCacheDir = path.join(appDir(), TORRENT_CACHE_FOLDER);
402
+ const torrentPaths = await findAllTorrentFilesInDir(torrentCacheDir);
403
+ console.log(`Found ${torrentPaths.length} files in cache, processing...`);
404
+ let count = 0;
405
+ for (const torrentPath of torrentPaths) {
406
+ try {
407
+ const torrent = bencode.decode(await readFile(torrentPath));
408
+ const announce = torrent.announce?.toString();
409
+ const announceList = torrent["announce-list"]?.map((tier) => tier.map((url) => url.toString()));
410
+ if (!announce?.includes(oldStr) &&
411
+ !announceList?.some((t) => t.some((url) => url.includes(oldStr)))) {
412
+ continue;
413
+ }
414
+ count++;
415
+ console.log(`#${count}: ${torrentPath}`);
416
+ let updated = false;
417
+ if (announce) {
418
+ const newAnnounce = announce.replace(oldStr, newStr);
419
+ if (announce !== newAnnounce) {
420
+ updated = true;
421
+ console.log(`--- ${announce} -> ${newAnnounce}`);
422
+ torrent.announce = Buffer.from(newAnnounce);
423
+ }
424
+ }
425
+ if (announceList) {
426
+ torrent["announce-list"] = announceList.map((tier) => tier.map((url) => {
427
+ const newAnnounce = url.replace(oldStr, newStr);
428
+ if (url === newAnnounce)
429
+ return Buffer.from(url);
430
+ updated = true;
431
+ console.log(`--- ${url} -> ${newAnnounce}`);
432
+ return Buffer.from(newAnnounce);
433
+ }));
434
+ }
435
+ if (updated) {
436
+ await writeFile(torrentPath, new Uint8Array(bencode.encode(torrent)));
437
+ }
438
+ }
439
+ catch (e) {
440
+ console.error(`Error reading ${torrentPath}: ${e}`);
441
+ }
442
+ }
443
+ }
444
+ async function assessAndSaveResults(metaOrCandidate, searchee, guid, infoHashesToExclude, firstSeen, guidInfoHashMap, options) {
445
+ const { blockList } = getRuntimeConfig(options?.configOverride);
446
+ const assessment = await assessCandidate(metaOrCandidate, searchee, infoHashesToExclude, blockList, options);
447
+ if (assessment.metaCached && assessment.metafile) {
448
+ await withMutex(Mutex.GUID_INFO_HASH_MAP, { useQueue: true }, async () => {
449
+ guidInfoHashMap.set(guid, assessment.metafile.infoHash);
450
+ await db.transaction(async (trx) => {
451
+ const { id } = (await trx("searchee")
452
+ .select("id")
453
+ .where({ name: searchee.title })
454
+ .first());
455
+ await trx("decision")
456
+ .insert({
457
+ searchee_id: id,
458
+ guid: guid,
459
+ info_hash: assessment.metafile.infoHash,
460
+ decision: assessment.decision,
461
+ first_seen: firstSeen,
462
+ last_seen: Date.now(),
463
+ fuzzy_size_factor: getFuzzySizeFactor(searchee),
464
+ })
465
+ .onConflict(["searchee_id", "guid"])
466
+ .merge();
467
+ });
468
+ });
469
+ }
470
+ return assessment;
471
+ }
472
+ export const rawGuidInfoHashMap = new Map();
473
+ export async function rebuildGuidInfoHashMap() {
474
+ return withMutex(Mutex.GUID_INFO_HASH_MAP, { useQueue: true }, async () => {
475
+ const res = await db("decision")
476
+ .select("guid", "info_hash")
477
+ .whereNotNull("info_hash");
478
+ rawGuidInfoHashMap.clear(); // Needs to be async atomic for clearing and setting
479
+ for (const { guid, info_hash } of res) {
480
+ rawGuidInfoHashMap.set(guid, info_hash);
481
+ }
482
+ });
483
+ }
484
+ export async function getGuidInfoHashMap() {
485
+ if (!rawGuidInfoHashMap.size)
486
+ await rebuildGuidInfoHashMap();
487
+ return rawGuidInfoHashMap;
488
+ }
489
+ /**
490
+ * Some trackers have alt titles which get their own guid but resolve to same torrent
491
+ * @param guid The guid of the candidate
492
+ * @param link The link of the candidate
493
+ * @param guidInfoHashMap The map of guids to infoHashes. Necessary for optimal fuzzy lookups.
494
+ * @returns The infoHash of the torrent if found
495
+ */
496
+ function guidLookup(guid, link, guidInfoHashMap) {
497
+ const infoHash = guidInfoHashMap.get(guid) ?? guidInfoHashMap.get(link);
498
+ if (infoHash)
499
+ return infoHash;
500
+ const torrentIdRegex = /\.tv\/torrent\/(\d+)\/group/;
501
+ for (const guidOrLink of [guid, link]) {
502
+ const torrentIdStr = guidOrLink.match(torrentIdRegex)?.[1];
503
+ if (!torrentIdStr)
504
+ continue;
505
+ for (const [key, value] of guidInfoHashMap) {
506
+ if (key.match(torrentIdRegex)?.[1] === torrentIdStr)
507
+ return value;
508
+ }
509
+ }
510
+ }
511
+ export async function assessCandidateCaching(candidate, searchee, infoHashesToExclude, guidInfoHashMap, options) {
512
+ const { name, guid, link, tracker } = candidate;
513
+ const cacheEntry = await db("decision")
514
+ .select({
515
+ id: "decision.id",
516
+ infoHash: "decision.info_hash",
517
+ decision: "decision.decision",
518
+ firstSeen: "decision.first_seen",
519
+ fuzzySizeFactor: "decision.fuzzy_size_factor",
520
+ })
521
+ .join("searchee", "decision.searchee_id", "searchee.id")
522
+ .where({ name: searchee.title, guid })
523
+ .first();
524
+ const infoHash = guidLookup(guid, link, guidInfoHashMap);
525
+ const res = await getCachedTorrent(infoHash, searchee.label);
526
+ const metaOrCandidate = res?.meta ?? candidate;
527
+ if (metaOrCandidate instanceof Metafile) {
528
+ logger.verbose({
529
+ label: `${searchee.label}/${Label.DECIDE}`,
530
+ message: `Using cached torrent for ${tracker} assessment ${name}: ${getLogString(metaOrCandidate)}`,
531
+ });
532
+ candidate.size = metaOrCandidate.length; // Trackers can be wrong
533
+ }
534
+ let assessment;
535
+ if (cacheEntry && infoHashesToExclude.has(cacheEntry.infoHash)) {
536
+ // Already injected fast path, preserve match decision
537
+ assessment = { decision: Decision.INFO_HASH_ALREADY_EXISTS };
538
+ await db("decision")
539
+ .where({ id: cacheEntry.id })
540
+ .update({
541
+ last_seen: Date.now(),
542
+ decision: isAnyMatchedDecision(cacheEntry.decision)
543
+ ? cacheEntry.decision
544
+ : Decision.INFO_HASH_ALREADY_EXISTS,
545
+ });
546
+ }
547
+ else {
548
+ assessment = await assessAndSaveResults(metaOrCandidate, searchee, guid, infoHashesToExclude, cacheEntry?.firstSeen ?? Date.now(), guidInfoHashMap, options);
549
+ }
550
+ logDecision(searchee, candidate, assessment.decision, assessment.metafile, tracker, options);
551
+ return assessment;
552
+ }
553
+ //# sourceMappingURL=decide.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decide.js","sourceRoot":"","sources":["../src/decide.ts"],"names":[],"mappings":"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"}
package/dist/diff.d.ts ADDED
@@ -0,0 +1 @@
1
+ export declare function diffCmd(first: string, second: string): Promise<void>;
package/dist/diff.js ADDED
@@ -0,0 +1,24 @@
1
+ import { deepStrictEqual } from "assert";
2
+ import { parseTorrentFromPath } from "./torrent.js";
3
+ function diff(thing1, thing2) {
4
+ console.log("Use `cross-seed tree` on each .torrent file to display their full structure");
5
+ try {
6
+ deepStrictEqual(thing1, thing2);
7
+ console.log(thing1);
8
+ console.log("Torrents are equal");
9
+ }
10
+ catch (e) {
11
+ console.log(e);
12
+ }
13
+ }
14
+ export async function diffCmd(first, second) {
15
+ const f1 = (await parseTorrentFromPath(first)).files;
16
+ const f2 = (await parseTorrentFromPath(second)).files;
17
+ const sortBy = f1.length === 1
18
+ ? (a, b) => b.length - a.length
19
+ : f2.length === 1
20
+ ? (a, b) => a.length - b.length
21
+ : (a, b) => a.path.localeCompare(b.path);
22
+ return diff(f1.sort(sortBy), f2.sort(sortBy));
23
+ }
24
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,SAAS,IAAI,CAAC,MAAM,EAAE,MAAM;IAC3B,OAAO,CAAC,GAAG,CACV,6EAA6E,CAC7E,CAAC;IACF,IAAI,CAAC;QACJ,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAa,EAAE,MAAc;IAC1D,MAAM,EAAE,GAAG,CAAC,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IACrD,MAAM,EAAE,GAAG,CAAC,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;IACtD,MAAM,MAAM,GACX,EAAE,CAAC,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;QAC/B,CAAC,CAAC,EAAE,CAAC,MAAM,KAAK,CAAC;YAChB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM;YAC/B,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5C,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare class CrossSeedError extends Error {
2
+ constructor(message?: string, options?: ErrorOptions);
3
+ }
package/dist/errors.js ADDED
@@ -0,0 +1,7 @@
1
+ export class CrossSeedError extends Error {
2
+ constructor(message, options) {
3
+ super(message, options);
4
+ delete this.stack;
5
+ }
6
+ }
7
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAe,SAAQ,KAAK;IACxC,YAAY,OAAgB,EAAE,OAAsB;QACnD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;CACD"}