@moontaiworks/fanbox-dl 1.0.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 (273) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +148 -0
  3. package/dist/bundle/index.cjs +2 -0
  4. package/dist/bundle/index.cjs.map +1 -0
  5. package/dist/bundle/index.d.cts +296 -0
  6. package/dist/bundle/index.d.ts +296 -0
  7. package/dist/bundle/index.js +2 -0
  8. package/dist/bundle/index.js.map +1 -0
  9. package/dist/cjs/client-options.d.ts +8 -0
  10. package/dist/cjs/client-options.d.ts.map +1 -0
  11. package/dist/cjs/client-options.js +3 -0
  12. package/dist/cjs/client-options.js.map +1 -0
  13. package/dist/cjs/client.d.ts +31 -0
  14. package/dist/cjs/client.d.ts.map +1 -0
  15. package/dist/cjs/client.js +107 -0
  16. package/dist/cjs/client.js.map +1 -0
  17. package/dist/cjs/downloader/asset.d.ts +30 -0
  18. package/dist/cjs/downloader/asset.d.ts.map +1 -0
  19. package/dist/cjs/downloader/asset.js +99 -0
  20. package/dist/cjs/downloader/asset.js.map +1 -0
  21. package/dist/cjs/downloader/cli.d.ts +8 -0
  22. package/dist/cjs/downloader/cli.d.ts.map +1 -0
  23. package/dist/cjs/downloader/cli.js +168 -0
  24. package/dist/cjs/downloader/cli.js.map +1 -0
  25. package/dist/cjs/downloader/discovery.d.ts +12 -0
  26. package/dist/cjs/downloader/discovery.d.ts.map +1 -0
  27. package/dist/cjs/downloader/discovery.js +87 -0
  28. package/dist/cjs/downloader/discovery.js.map +1 -0
  29. package/dist/cjs/downloader/errors.d.ts +5 -0
  30. package/dist/cjs/downloader/errors.d.ts.map +1 -0
  31. package/dist/cjs/downloader/errors.js +40 -0
  32. package/dist/cjs/downloader/errors.js.map +1 -0
  33. package/dist/cjs/downloader/index.d.ts +3 -0
  34. package/dist/cjs/downloader/index.d.ts.map +1 -0
  35. package/dist/cjs/downloader/index.js +8 -0
  36. package/dist/cjs/downloader/index.js.map +1 -0
  37. package/dist/cjs/downloader/logger.d.ts +16 -0
  38. package/dist/cjs/downloader/logger.d.ts.map +1 -0
  39. package/dist/cjs/downloader/logger.js +51 -0
  40. package/dist/cjs/downloader/logger.js.map +1 -0
  41. package/dist/cjs/downloader/manifest.d.ts +31 -0
  42. package/dist/cjs/downloader/manifest.d.ts.map +1 -0
  43. package/dist/cjs/downloader/manifest.js +53 -0
  44. package/dist/cjs/downloader/manifest.js.map +1 -0
  45. package/dist/cjs/downloader/markdown.d.ts +4 -0
  46. package/dist/cjs/downloader/markdown.d.ts.map +1 -0
  47. package/dist/cjs/downloader/markdown.js +62 -0
  48. package/dist/cjs/downloader/markdown.js.map +1 -0
  49. package/dist/cjs/downloader/options.d.ts +24 -0
  50. package/dist/cjs/downloader/options.d.ts.map +1 -0
  51. package/dist/cjs/downloader/options.js +135 -0
  52. package/dist/cjs/downloader/options.js.map +1 -0
  53. package/dist/cjs/downloader/path.d.ts +15 -0
  54. package/dist/cjs/downloader/path.d.ts.map +1 -0
  55. package/dist/cjs/downloader/path.js +79 -0
  56. package/dist/cjs/downloader/path.js.map +1 -0
  57. package/dist/cjs/downloader/resolver.d.ts +16 -0
  58. package/dist/cjs/downloader/resolver.d.ts.map +1 -0
  59. package/dist/cjs/downloader/resolver.js +21 -0
  60. package/dist/cjs/downloader/resolver.js.map +1 -0
  61. package/dist/cjs/downloader/scheduler.d.ts +19 -0
  62. package/dist/cjs/downloader/scheduler.d.ts.map +1 -0
  63. package/dist/cjs/downloader/scheduler.js +124 -0
  64. package/dist/cjs/downloader/scheduler.js.map +1 -0
  65. package/dist/cjs/downloader/sync.d.ts +21 -0
  66. package/dist/cjs/downloader/sync.d.ts.map +1 -0
  67. package/dist/cjs/downloader/sync.js +317 -0
  68. package/dist/cjs/downloader/sync.js.map +1 -0
  69. package/dist/cjs/endpoints/creator-get.d.ts +7 -0
  70. package/dist/cjs/endpoints/creator-get.d.ts.map +1 -0
  71. package/dist/cjs/endpoints/creator-get.js +5 -0
  72. package/dist/cjs/endpoints/creator-get.js.map +1 -0
  73. package/dist/cjs/endpoints/creator-list-following.d.ts +4 -0
  74. package/dist/cjs/endpoints/creator-list-following.d.ts.map +1 -0
  75. package/dist/cjs/endpoints/creator-list-following.js +5 -0
  76. package/dist/cjs/endpoints/creator-list-following.js.map +1 -0
  77. package/dist/cjs/endpoints/fanbox-envelope.d.ts +4 -0
  78. package/dist/cjs/endpoints/fanbox-envelope.d.ts.map +1 -0
  79. package/dist/cjs/endpoints/fanbox-envelope.js +3 -0
  80. package/dist/cjs/endpoints/fanbox-envelope.js.map +1 -0
  81. package/dist/cjs/endpoints/models/creator.d.ts +40 -0
  82. package/dist/cjs/endpoints/models/creator.d.ts.map +1 -0
  83. package/dist/cjs/endpoints/models/creator.js +3 -0
  84. package/dist/cjs/endpoints/models/creator.js.map +1 -0
  85. package/dist/cjs/endpoints/models/plan.d.ts +17 -0
  86. package/dist/cjs/endpoints/models/plan.d.ts.map +1 -0
  87. package/dist/cjs/endpoints/models/plan.js +3 -0
  88. package/dist/cjs/endpoints/models/plan.js.map +1 -0
  89. package/dist/cjs/endpoints/models/post.d.ts +134 -0
  90. package/dist/cjs/endpoints/models/post.d.ts.map +1 -0
  91. package/dist/cjs/endpoints/models/post.js +3 -0
  92. package/dist/cjs/endpoints/models/post.js.map +1 -0
  93. package/dist/cjs/endpoints/models/user.d.ts +6 -0
  94. package/dist/cjs/endpoints/models/user.d.ts.map +1 -0
  95. package/dist/cjs/endpoints/models/user.js +3 -0
  96. package/dist/cjs/endpoints/models/user.js.map +1 -0
  97. package/dist/cjs/endpoints/plan-list-creator.d.ts +7 -0
  98. package/dist/cjs/endpoints/plan-list-creator.d.ts.map +1 -0
  99. package/dist/cjs/endpoints/plan-list-creator.js +5 -0
  100. package/dist/cjs/endpoints/plan-list-creator.js.map +1 -0
  101. package/dist/cjs/endpoints/plan-list-supporting.d.ts +4 -0
  102. package/dist/cjs/endpoints/plan-list-supporting.d.ts.map +1 -0
  103. package/dist/cjs/endpoints/plan-list-supporting.js +5 -0
  104. package/dist/cjs/endpoints/plan-list-supporting.js.map +1 -0
  105. package/dist/cjs/endpoints/post-info.d.ts +7 -0
  106. package/dist/cjs/endpoints/post-info.d.ts.map +1 -0
  107. package/dist/cjs/endpoints/post-info.js +5 -0
  108. package/dist/cjs/endpoints/post-info.js.map +1 -0
  109. package/dist/cjs/endpoints/post-list-creator.d.ts +10 -0
  110. package/dist/cjs/endpoints/post-list-creator.d.ts.map +1 -0
  111. package/dist/cjs/endpoints/post-list-creator.js +5 -0
  112. package/dist/cjs/endpoints/post-list-creator.js.map +1 -0
  113. package/dist/cjs/endpoints/post-list-home.d.ts +5 -0
  114. package/dist/cjs/endpoints/post-list-home.d.ts.map +1 -0
  115. package/dist/cjs/endpoints/post-list-home.js +5 -0
  116. package/dist/cjs/endpoints/post-list-home.js.map +1 -0
  117. package/dist/cjs/endpoints/post-list-supporting.d.ts +5 -0
  118. package/dist/cjs/endpoints/post-list-supporting.d.ts.map +1 -0
  119. package/dist/cjs/endpoints/post-list-supporting.js +5 -0
  120. package/dist/cjs/endpoints/post-list-supporting.js.map +1 -0
  121. package/dist/cjs/endpoints/post-paginate-creator.d.ts +8 -0
  122. package/dist/cjs/endpoints/post-paginate-creator.d.ts.map +1 -0
  123. package/dist/cjs/endpoints/post-paginate-creator.js +5 -0
  124. package/dist/cjs/endpoints/post-paginate-creator.js.map +1 -0
  125. package/dist/cjs/fanbox-headers.d.ts +7 -0
  126. package/dist/cjs/fanbox-headers.d.ts.map +1 -0
  127. package/dist/cjs/fanbox-headers.js +23 -0
  128. package/dist/cjs/fanbox-headers.js.map +1 -0
  129. package/dist/cjs/http.d.ts +31 -0
  130. package/dist/cjs/http.d.ts.map +1 -0
  131. package/dist/cjs/http.js +200 -0
  132. package/dist/cjs/http.js.map +1 -0
  133. package/dist/cjs/index.d.ts +3 -0
  134. package/dist/cjs/index.d.ts.map +1 -0
  135. package/dist/cjs/index.js +7 -0
  136. package/dist/cjs/index.js.map +1 -0
  137. package/dist/cjs/types.d.ts +16 -0
  138. package/dist/cjs/types.d.ts.map +1 -0
  139. package/dist/cjs/types.js +3 -0
  140. package/dist/cjs/types.js.map +1 -0
  141. package/dist/esm/client-options.d.ts +8 -0
  142. package/dist/esm/client-options.d.ts.map +1 -0
  143. package/dist/esm/client-options.js +2 -0
  144. package/dist/esm/client-options.js.map +1 -0
  145. package/dist/esm/client.d.ts +31 -0
  146. package/dist/esm/client.d.ts.map +1 -0
  147. package/dist/esm/client.js +102 -0
  148. package/dist/esm/client.js.map +1 -0
  149. package/dist/esm/downloader/asset.d.ts +30 -0
  150. package/dist/esm/downloader/asset.d.ts.map +1 -0
  151. package/dist/esm/downloader/asset.js +91 -0
  152. package/dist/esm/downloader/asset.js.map +1 -0
  153. package/dist/esm/downloader/cli.d.ts +8 -0
  154. package/dist/esm/downloader/cli.d.ts.map +1 -0
  155. package/dist/esm/downloader/cli.js +164 -0
  156. package/dist/esm/downloader/cli.js.map +1 -0
  157. package/dist/esm/downloader/discovery.d.ts +12 -0
  158. package/dist/esm/downloader/discovery.d.ts.map +1 -0
  159. package/dist/esm/downloader/discovery.js +84 -0
  160. package/dist/esm/downloader/discovery.js.map +1 -0
  161. package/dist/esm/downloader/errors.d.ts +5 -0
  162. package/dist/esm/downloader/errors.d.ts.map +1 -0
  163. package/dist/esm/downloader/errors.js +36 -0
  164. package/dist/esm/downloader/errors.js.map +1 -0
  165. package/dist/esm/downloader/index.d.ts +3 -0
  166. package/dist/esm/downloader/index.d.ts.map +1 -0
  167. package/dist/esm/downloader/index.js +6 -0
  168. package/dist/esm/downloader/index.js.map +1 -0
  169. package/dist/esm/downloader/logger.d.ts +16 -0
  170. package/dist/esm/downloader/logger.d.ts.map +1 -0
  171. package/dist/esm/downloader/logger.js +47 -0
  172. package/dist/esm/downloader/logger.js.map +1 -0
  173. package/dist/esm/downloader/manifest.d.ts +31 -0
  174. package/dist/esm/downloader/manifest.d.ts.map +1 -0
  175. package/dist/esm/downloader/manifest.js +46 -0
  176. package/dist/esm/downloader/manifest.js.map +1 -0
  177. package/dist/esm/downloader/markdown.d.ts +4 -0
  178. package/dist/esm/downloader/markdown.d.ts.map +1 -0
  179. package/dist/esm/downloader/markdown.js +59 -0
  180. package/dist/esm/downloader/markdown.js.map +1 -0
  181. package/dist/esm/downloader/options.d.ts +24 -0
  182. package/dist/esm/downloader/options.d.ts.map +1 -0
  183. package/dist/esm/downloader/options.js +130 -0
  184. package/dist/esm/downloader/options.js.map +1 -0
  185. package/dist/esm/downloader/path.d.ts +15 -0
  186. package/dist/esm/downloader/path.d.ts.map +1 -0
  187. package/dist/esm/downloader/path.js +69 -0
  188. package/dist/esm/downloader/path.js.map +1 -0
  189. package/dist/esm/downloader/resolver.d.ts +16 -0
  190. package/dist/esm/downloader/resolver.d.ts.map +1 -0
  191. package/dist/esm/downloader/resolver.js +18 -0
  192. package/dist/esm/downloader/resolver.js.map +1 -0
  193. package/dist/esm/downloader/scheduler.d.ts +19 -0
  194. package/dist/esm/downloader/scheduler.d.ts.map +1 -0
  195. package/dist/esm/downloader/scheduler.js +120 -0
  196. package/dist/esm/downloader/scheduler.js.map +1 -0
  197. package/dist/esm/downloader/sync.d.ts +21 -0
  198. package/dist/esm/downloader/sync.d.ts.map +1 -0
  199. package/dist/esm/downloader/sync.js +311 -0
  200. package/dist/esm/downloader/sync.js.map +1 -0
  201. package/dist/esm/endpoints/creator-get.d.ts +7 -0
  202. package/dist/esm/endpoints/creator-get.d.ts.map +1 -0
  203. package/dist/esm/endpoints/creator-get.js +2 -0
  204. package/dist/esm/endpoints/creator-get.js.map +1 -0
  205. package/dist/esm/endpoints/creator-list-following.d.ts +4 -0
  206. package/dist/esm/endpoints/creator-list-following.d.ts.map +1 -0
  207. package/dist/esm/endpoints/creator-list-following.js +2 -0
  208. package/dist/esm/endpoints/creator-list-following.js.map +1 -0
  209. package/dist/esm/endpoints/fanbox-envelope.d.ts +4 -0
  210. package/dist/esm/endpoints/fanbox-envelope.d.ts.map +1 -0
  211. package/dist/esm/endpoints/fanbox-envelope.js +2 -0
  212. package/dist/esm/endpoints/fanbox-envelope.js.map +1 -0
  213. package/dist/esm/endpoints/models/creator.d.ts +40 -0
  214. package/dist/esm/endpoints/models/creator.d.ts.map +1 -0
  215. package/dist/esm/endpoints/models/creator.js +2 -0
  216. package/dist/esm/endpoints/models/creator.js.map +1 -0
  217. package/dist/esm/endpoints/models/plan.d.ts +17 -0
  218. package/dist/esm/endpoints/models/plan.d.ts.map +1 -0
  219. package/dist/esm/endpoints/models/plan.js +2 -0
  220. package/dist/esm/endpoints/models/plan.js.map +1 -0
  221. package/dist/esm/endpoints/models/post.d.ts +134 -0
  222. package/dist/esm/endpoints/models/post.d.ts.map +1 -0
  223. package/dist/esm/endpoints/models/post.js +2 -0
  224. package/dist/esm/endpoints/models/post.js.map +1 -0
  225. package/dist/esm/endpoints/models/user.d.ts +6 -0
  226. package/dist/esm/endpoints/models/user.d.ts.map +1 -0
  227. package/dist/esm/endpoints/models/user.js +2 -0
  228. package/dist/esm/endpoints/models/user.js.map +1 -0
  229. package/dist/esm/endpoints/plan-list-creator.d.ts +7 -0
  230. package/dist/esm/endpoints/plan-list-creator.d.ts.map +1 -0
  231. package/dist/esm/endpoints/plan-list-creator.js +2 -0
  232. package/dist/esm/endpoints/plan-list-creator.js.map +1 -0
  233. package/dist/esm/endpoints/plan-list-supporting.d.ts +4 -0
  234. package/dist/esm/endpoints/plan-list-supporting.d.ts.map +1 -0
  235. package/dist/esm/endpoints/plan-list-supporting.js +2 -0
  236. package/dist/esm/endpoints/plan-list-supporting.js.map +1 -0
  237. package/dist/esm/endpoints/post-info.d.ts +7 -0
  238. package/dist/esm/endpoints/post-info.d.ts.map +1 -0
  239. package/dist/esm/endpoints/post-info.js +2 -0
  240. package/dist/esm/endpoints/post-info.js.map +1 -0
  241. package/dist/esm/endpoints/post-list-creator.d.ts +10 -0
  242. package/dist/esm/endpoints/post-list-creator.d.ts.map +1 -0
  243. package/dist/esm/endpoints/post-list-creator.js +2 -0
  244. package/dist/esm/endpoints/post-list-creator.js.map +1 -0
  245. package/dist/esm/endpoints/post-list-home.d.ts +5 -0
  246. package/dist/esm/endpoints/post-list-home.d.ts.map +1 -0
  247. package/dist/esm/endpoints/post-list-home.js +2 -0
  248. package/dist/esm/endpoints/post-list-home.js.map +1 -0
  249. package/dist/esm/endpoints/post-list-supporting.d.ts +5 -0
  250. package/dist/esm/endpoints/post-list-supporting.d.ts.map +1 -0
  251. package/dist/esm/endpoints/post-list-supporting.js +2 -0
  252. package/dist/esm/endpoints/post-list-supporting.js.map +1 -0
  253. package/dist/esm/endpoints/post-paginate-creator.d.ts +8 -0
  254. package/dist/esm/endpoints/post-paginate-creator.d.ts.map +1 -0
  255. package/dist/esm/endpoints/post-paginate-creator.js +2 -0
  256. package/dist/esm/endpoints/post-paginate-creator.js.map +1 -0
  257. package/dist/esm/fanbox-headers.d.ts +7 -0
  258. package/dist/esm/fanbox-headers.d.ts.map +1 -0
  259. package/dist/esm/fanbox-headers.js +19 -0
  260. package/dist/esm/fanbox-headers.js.map +1 -0
  261. package/dist/esm/http.d.ts +31 -0
  262. package/dist/esm/http.d.ts.map +1 -0
  263. package/dist/esm/http.js +195 -0
  264. package/dist/esm/http.js.map +1 -0
  265. package/dist/esm/index.d.ts +3 -0
  266. package/dist/esm/index.d.ts.map +1 -0
  267. package/dist/esm/index.js +2 -0
  268. package/dist/esm/index.js.map +1 -0
  269. package/dist/esm/types.d.ts +16 -0
  270. package/dist/esm/types.d.ts.map +1 -0
  271. package/dist/esm/types.js +2 -0
  272. package/dist/esm/types.js.map +1 -0
  273. package/package.json +98 -0
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ var _ManifestStore_creatorDirectory, _ManifestStore_manifestPath;
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.ManifestStore = void 0;
19
+ const promises_1 = require("node:fs/promises");
20
+ const node_path_1 = __importDefault(require("node:path"));
21
+ const path_js_1 = require("./path.js");
22
+ class ManifestStore {
23
+ constructor(outputDirectory, creatorId) {
24
+ _ManifestStore_creatorDirectory.set(this, void 0);
25
+ _ManifestStore_manifestPath.set(this, void 0);
26
+ __classPrivateFieldSet(this, _ManifestStore_creatorDirectory, node_path_1.default.join(outputDirectory, (0, path_js_1.createCreatorDirectoryName)(creatorId, outputDirectory)), "f");
27
+ __classPrivateFieldSet(this, _ManifestStore_manifestPath, node_path_1.default.join(__classPrivateFieldGet(this, _ManifestStore_creatorDirectory, "f"), "manifest.json"), "f");
28
+ }
29
+ async load() {
30
+ try {
31
+ return JSON.parse(await (0, promises_1.readFile)(__classPrivateFieldGet(this, _ManifestStore_manifestPath, "f"), "utf8"));
32
+ }
33
+ catch (error) {
34
+ if (error.code !== "ENOENT") {
35
+ throw error;
36
+ }
37
+ return {
38
+ creatorId: node_path_1.default.basename(__classPrivateFieldGet(this, _ManifestStore_creatorDirectory, "f")),
39
+ posts: {},
40
+ schemaVersion: 1,
41
+ };
42
+ }
43
+ }
44
+ async save(manifest) {
45
+ await (0, promises_1.mkdir)(__classPrivateFieldGet(this, _ManifestStore_creatorDirectory, "f"), { recursive: true });
46
+ const temporaryPath = `${__classPrivateFieldGet(this, _ManifestStore_manifestPath, "f")}.tmp`;
47
+ await (0, promises_1.writeFile)(temporaryPath, `${JSON.stringify(manifest, null, 2)}\n`);
48
+ await (0, promises_1.rename)(temporaryPath, __classPrivateFieldGet(this, _ManifestStore_manifestPath, "f"));
49
+ }
50
+ }
51
+ exports.ManifestStore = ManifestStore;
52
+ _ManifestStore_creatorDirectory = new WeakMap(), _ManifestStore_manifestPath = new WeakMap();
53
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../src/downloader/manifest.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,+CAAsE;AACtE,0DAA6B;AAE7B,uCAAuD;AAmCvD,MAAa,aAAa;IAIxB,YAAmB,eAAuB,EAAE,SAAiB;QAHpD,kDAA0B;QAC1B,8CAAsB;QAG7B,uBAAA,IAAI,mCAAqB,mBAAI,CAAC,IAAI,CAChC,eAAe,EACf,IAAA,oCAA0B,EAAC,SAAS,EAAE,eAAe,CAAC,CACvD,MAAA,CAAC;QACF,uBAAA,IAAI,+BAAiB,mBAAI,CAAC,IAAI,CAAC,uBAAA,IAAI,uCAAkB,EAAE,eAAe,CAAC,MAAA,CAAC;IAC1E,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CACf,MAAM,IAAA,mBAAQ,EAAC,uBAAA,IAAI,mCAAc,EAAE,MAAM,CAAC,CACxB,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACvD,MAAM,KAAK,CAAC;YACd,CAAC;YAED,OAAO;gBACL,SAAS,EAAE,mBAAI,CAAC,QAAQ,CAAC,uBAAA,IAAI,uCAAkB,CAAC;gBAChD,KAAK,EAAE,EAAE;gBACT,aAAa,EAAE,CAAC;aACjB,CAAC;QACJ,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,QAAyB;QACzC,MAAM,IAAA,gBAAK,EAAC,uBAAA,IAAI,uCAAkB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,aAAa,GAAG,GAAG,uBAAA,IAAI,mCAAc,MAAM,CAAC;QAClD,MAAM,IAAA,oBAAS,EAAC,aAAa,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACzE,MAAM,IAAA,iBAAM,EAAC,aAAa,EAAE,uBAAA,IAAI,mCAAc,CAAC,CAAC;IAClD,CAAC;CACF;AApCD,sCAoCC"}
@@ -0,0 +1,4 @@
1
+ import type { Post } from "../types.js";
2
+ export type AssetPathMap = ReadonlyMap<string, string>;
3
+ export declare function renderPostMarkdown(post: Post, paths: AssetPathMap): string;
4
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../src/downloader/markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,IAAI,EAGL,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEvD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM,CAwC1E"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderPostMarkdown = renderPostMarkdown;
4
+ function renderPostMarkdown(post, paths) {
5
+ let content;
6
+ switch (post.type) {
7
+ case "article":
8
+ content = renderArticle(post, paths);
9
+ break;
10
+ case "file": {
11
+ const filePost = post;
12
+ content = [
13
+ filePost.body.text,
14
+ ...filePost.body.files.map((file) => `[${file.name}](${assetLink(paths, `file:${file.id}`)})`),
15
+ ].join("\n\n");
16
+ break;
17
+ }
18
+ case "image": {
19
+ const imagePost = post;
20
+ content = [
21
+ imagePost.body.text,
22
+ ...imagePost.body.images.map((image) => `![${image.id}](./${assetLink(paths, `image:${image.id}`)})`),
23
+ ].join("\n\n");
24
+ break;
25
+ }
26
+ case "text":
27
+ content = post.body.text;
28
+ break;
29
+ case "video": {
30
+ const videoPost = post;
31
+ content = `${videoPost.body.text}\n\n${videoPost.body.video.serviceProvider}: ${videoPost.body.video.videoId}`;
32
+ break;
33
+ }
34
+ default:
35
+ content = `[unsupported post type: ${post.type}]`;
36
+ }
37
+ return `# ${post.title}\n\n${content.trim()}\n`;
38
+ }
39
+ function assetLink(paths, key) {
40
+ return paths.get(key) ?? `[missing asset: ${key}]`;
41
+ }
42
+ function renderArticle(post, paths) {
43
+ return post.body.blocks
44
+ .map((block) => {
45
+ switch (block.type) {
46
+ case "file":
47
+ return `[${String(block.fileId)}](${assetLink(paths, `file:${String(block.fileId)}`)})`;
48
+ case "header":
49
+ return `# ${String(block.text)}`;
50
+ case "image":
51
+ return `![${String(block.imageId)}](${assetLink(paths, `image:${String(block.imageId)}`)})`;
52
+ case "p":
53
+ return String(block.text);
54
+ case "url_embed":
55
+ return String(post.body.urlEmbedMap[String(block.urlEmbedId)] ?? block.urlEmbedId);
56
+ default:
57
+ return `[unsupported block: ${block.type}]`;
58
+ }
59
+ })
60
+ .join("\n\n");
61
+ }
62
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/downloader/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { LogLevel } from "./logger.js";
2
+ export interface DownloadOptions {
3
+ concurrency: number;
4
+ cookie?: string;
5
+ creatorIds: string[];
6
+ dryRun: boolean;
7
+ flatPosts: boolean;
8
+ following: boolean;
9
+ ignoreCreatorIds: string[];
10
+ logFormat: "json" | "pretty";
11
+ logLevel: LogLevel;
12
+ maxRetries: number;
13
+ output: string;
14
+ rateLimitPauseMs: number;
15
+ requestIntervalMs: number;
16
+ supporting: boolean;
17
+ userAgent?: string;
18
+ verifyAssets: boolean;
19
+ }
20
+ export declare class CliUsageError extends Error {
21
+ constructor(message: string);
22
+ }
23
+ export declare function parseDownloadOptions(args: string[], env?: NodeJS.ProcessEnv): DownloadOptions;
24
+ //# sourceMappingURL=options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/downloader/options.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,qBAAa,aAAc,SAAQ,KAAK;gBACnB,OAAO,EAAE,MAAM;CAInC;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,eAAe,CA8CjB"}
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CliUsageError = void 0;
4
+ exports.parseDownloadOptions = parseDownloadOptions;
5
+ const node_fs_1 = require("node:fs");
6
+ const node_util_1 = require("node:util");
7
+ class CliUsageError extends Error {
8
+ constructor(message) {
9
+ super(message);
10
+ this.name = "CliUsageError";
11
+ }
12
+ }
13
+ exports.CliUsageError = CliUsageError;
14
+ function parseDownloadOptions(args, env = process.env) {
15
+ const { values } = parseDownloadArgs(args);
16
+ const creatorIds = values.creator ?? [];
17
+ if (creatorIds.length === 0 && !values.following && !values.supporting) {
18
+ throw new CliUsageError("at least one creator selector is required");
19
+ }
20
+ if (values["log-format"] !== "json" && values["log-format"] !== "pretty") {
21
+ throw new CliUsageError("log-format must be json or pretty");
22
+ }
23
+ if (!isLogLevel(values["log-level"])) {
24
+ throw new CliUsageError("log-level must be debug, info, warn, or error");
25
+ }
26
+ const cookieFile = values["cookie-file"];
27
+ const cookie = normalizeCookie(values.cookie ??
28
+ (cookieFile === undefined
29
+ ? undefined
30
+ : (0, node_fs_1.readFileSync)(cookieFile, "utf8")) ??
31
+ env.FANBOX_SESSION_ID);
32
+ return {
33
+ concurrency: parsePositiveInteger("concurrency", values.concurrency),
34
+ cookie,
35
+ creatorIds,
36
+ dryRun: values["dry-run"],
37
+ flatPosts: values["flat-posts"],
38
+ following: values.following,
39
+ ignoreCreatorIds: values["ignore-creator"] ?? [],
40
+ logFormat: values["log-format"],
41
+ logLevel: values["log-level"],
42
+ maxRetries: parseNonNegativeInteger("max-retries", values["max-retries"]),
43
+ output: values.output,
44
+ rateLimitPauseMs: parseNonNegativeInteger("rate-limit-pause-ms", values["rate-limit-pause-ms"]),
45
+ requestIntervalMs: parseNonNegativeInteger("request-interval-ms", values["request-interval-ms"]),
46
+ supporting: values.supporting,
47
+ userAgent: values["user-agent"],
48
+ verifyAssets: values["verify-assets"],
49
+ };
50
+ }
51
+ function isFanboxCookieDomain(domain) {
52
+ const normalized = domain.replace(/^\./, "").toLowerCase();
53
+ return normalized === "fanbox.cc" || normalized.endsWith(".fanbox.cc");
54
+ }
55
+ function isLogLevel(value) {
56
+ return (value === "debug" ||
57
+ value === "info" ||
58
+ value === "warn" ||
59
+ value === "error");
60
+ }
61
+ function normalizeCookie(cookie) {
62
+ const value = cookie?.trim();
63
+ if (!value) {
64
+ return undefined;
65
+ }
66
+ const cookies = parseNetscapeCookies(value);
67
+ if (cookies.length > 0) {
68
+ return cookies.map(({ name, value }) => `${name}=${value}`).join("; ");
69
+ }
70
+ return value.includes("=") ? value : `FANBOXSESSID=${value}`;
71
+ }
72
+ function parseDownloadArgs(args) {
73
+ try {
74
+ return (0, node_util_1.parseArgs)({
75
+ allowPositionals: false,
76
+ args: args.slice(1),
77
+ options: {
78
+ concurrency: { default: "3", type: "string" },
79
+ cookie: { type: "string" },
80
+ "cookie-file": { type: "string" },
81
+ creator: { multiple: true, type: "string" },
82
+ "dry-run": { default: false, type: "boolean" },
83
+ "flat-posts": { default: false, type: "boolean" },
84
+ following: { default: false, type: "boolean" },
85
+ "ignore-creator": { multiple: true, type: "string" },
86
+ "log-format": { default: "json", type: "string" },
87
+ "log-level": { default: "info", type: "string" },
88
+ "max-retries": { default: "5", type: "string" },
89
+ output: { default: "fanbox-downloads", type: "string" },
90
+ "rate-limit-pause-ms": { default: "60000", type: "string" },
91
+ "request-interval-ms": { default: "0", type: "string" },
92
+ supporting: { default: false, type: "boolean" },
93
+ "user-agent": { type: "string" },
94
+ "verify-assets": { default: false, type: "boolean" },
95
+ },
96
+ strict: true,
97
+ });
98
+ }
99
+ catch (error) {
100
+ throw new CliUsageError(error.message);
101
+ }
102
+ }
103
+ function parseNetscapeCookies(value) {
104
+ const cookies = [];
105
+ for (const line of value.split(/\r?\n/)) {
106
+ if (!line || line.startsWith("#")) {
107
+ continue;
108
+ }
109
+ const columns = line.split("\t");
110
+ if (columns.length < 7) {
111
+ continue;
112
+ }
113
+ const [domain, , , , , name, cookieValue] = columns;
114
+ if (!isFanboxCookieDomain(domain)) {
115
+ continue;
116
+ }
117
+ cookies.push({ name, value: cookieValue });
118
+ }
119
+ return cookies;
120
+ }
121
+ function parseNonNegativeInteger(name, value) {
122
+ const number = Number(value);
123
+ if (!Number.isSafeInteger(number) || number < 0) {
124
+ throw new CliUsageError(`${name} must be a non-negative integer`);
125
+ }
126
+ return number;
127
+ }
128
+ function parsePositiveInteger(name, value) {
129
+ const number = parseNonNegativeInteger(name, value);
130
+ if (number === 0) {
131
+ throw new CliUsageError(`${name} must be a positive integer`);
132
+ }
133
+ return number;
134
+ }
135
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/downloader/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface SanitizePathComponentOptions {
2
+ maxBytes?: number;
3
+ reserveBytes?: number;
4
+ suffix?: string;
5
+ }
6
+ export declare function assertPathBudget(absolutePath: string, maxBytes?: number): void;
7
+ export declare function createCreatorDirectoryName(creatorId: string, outputDirectory: string): string;
8
+ export declare function createPostDirectoryName(post: {
9
+ id: string;
10
+ publishedDatetime: string;
11
+ title: string;
12
+ }, parentDirectory?: string): string;
13
+ export declare function sanitizePathComponent(value: string, options?: SanitizePathComponentOptions): string;
14
+ export declare function sanitizePathComponentForDirectory(value: string, directory: string, options?: SanitizePathComponentOptions): string;
15
+ //# sourceMappingURL=path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/downloader/path.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,QAAQ,SAAqB,GAC5B,IAAI,CAMN;AAED,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GACtB,MAAM,CAIR;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE;IACJ,EAAE,EAAE,MAAM,CAAC;IACX,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;CACf,EACD,eAAe,CAAC,EAAE,MAAM,GACvB,MAAM,CAWR;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,4BAAiC,GACzC,MAAM,CAiBR;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,4BAAiC,GACzC,MAAM,CAiBR"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.assertPathBudget = assertPathBudget;
7
+ exports.createCreatorDirectoryName = createCreatorDirectoryName;
8
+ exports.createPostDirectoryName = createPostDirectoryName;
9
+ exports.sanitizePathComponent = sanitizePathComponent;
10
+ exports.sanitizePathComponentForDirectory = sanitizePathComponentForDirectory;
11
+ const node_path_1 = __importDefault(require("node:path"));
12
+ const DEFAULT_COMPONENT_BYTES = 120;
13
+ const DEFAULT_PATH_BYTES = 240;
14
+ const RESERVED_NAMES = /^(?:AUX|CON|NUL|PRN|COM[1-9]|LPT[1-9])(?:\..*)?$/i;
15
+ const RESERVED_PREFIX = /^(?:AUX|CON|NUL|PRN|COM[1-9]|LPT[1-9])(?=$|[. <>:"/\\|?*])/i;
16
+ const SEGMENTER = new Intl.Segmenter(undefined, { granularity: "grapheme" });
17
+ function assertPathBudget(absolutePath, maxBytes = DEFAULT_PATH_BYTES) {
18
+ if (Buffer.byteLength(node_path_1.default.resolve(absolutePath)) > maxBytes) {
19
+ throw new Error(`Path exceeds ${maxBytes} byte path budget: ${absolutePath}`);
20
+ }
21
+ }
22
+ function createCreatorDirectoryName(creatorId, outputDirectory) {
23
+ return sanitizePathComponentForDirectory(creatorId, outputDirectory, {
24
+ reserveBytes: Buffer.byteLength(`${node_path_1.default.sep}manifest.json`),
25
+ });
26
+ }
27
+ function createPostDirectoryName(post, parentDirectory) {
28
+ const date = post.publishedDatetime.slice(0, 10);
29
+ const prefix = `${date}_${post.id}_`;
30
+ const options = {
31
+ maxBytes: DEFAULT_COMPONENT_BYTES - Buffer.byteLength(prefix),
32
+ reserveBytes: Buffer.byteLength(`${prefix}${node_path_1.default.sep}metadata.json`),
33
+ };
34
+ const title = parentDirectory
35
+ ? sanitizePathComponentForDirectory(post.title, parentDirectory, options)
36
+ : sanitizePathComponent(post.title, options);
37
+ return `${prefix}${title}`;
38
+ }
39
+ function sanitizePathComponent(value, options = {}) {
40
+ const maxBytes = options.maxBytes ?? DEFAULT_COMPONENT_BYTES;
41
+ const suffix = options.suffix ?? "";
42
+ let sanitized = Array.from(SEGMENTER.segment(value), ({ segment }) => segment)
43
+ .map((character) => (character.charCodeAt(0) <= 31 ? "_" : character))
44
+ .join("")
45
+ .replaceAll(/[<>:"/\\|?*]/g, "_")
46
+ .replaceAll(/[. ]+$/g, "");
47
+ if (RESERVED_NAMES.test(sanitized) || RESERVED_PREFIX.test(value)) {
48
+ sanitized = `_${sanitized}`;
49
+ }
50
+ if (!sanitized) {
51
+ sanitized = "_";
52
+ }
53
+ const suffixBytes = Buffer.byteLength(suffix);
54
+ return `${truncateUtf8(sanitized, Math.max(0, maxBytes - suffixBytes))}${suffix}`;
55
+ }
56
+ function sanitizePathComponentForDirectory(value, directory, options = {}) {
57
+ const availableBytes = DEFAULT_PATH_BYTES -
58
+ Buffer.byteLength(node_path_1.default.resolve(directory)) -
59
+ Buffer.byteLength(node_path_1.default.sep) -
60
+ (options.reserveBytes ?? 0);
61
+ if (availableBytes <= Buffer.byteLength(options.suffix ?? "")) {
62
+ throw new Error(`Directory leaves no room in path budget: ${directory}`);
63
+ }
64
+ return sanitizePathComponent(value, {
65
+ ...options,
66
+ maxBytes: Math.min(options.maxBytes ?? DEFAULT_COMPONENT_BYTES, availableBytes),
67
+ });
68
+ }
69
+ function truncateUtf8(value, maxBytes) {
70
+ let result = "";
71
+ for (const { segment: character } of SEGMENTER.segment(value)) {
72
+ if (Buffer.byteLength(result + character) > maxBytes) {
73
+ break;
74
+ }
75
+ result += character;
76
+ }
77
+ return result;
78
+ }
79
+ //# sourceMappingURL=path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path.js","sourceRoot":"","sources":["../../../src/downloader/path.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface CreatorResolverClient {
2
+ listFollowingCreators(): Promise<{
3
+ creatorId: string;
4
+ }[]>;
5
+ listSupportingPlans(): Promise<{
6
+ creatorId: string;
7
+ }[]>;
8
+ }
9
+ export interface ResolveCreatorIdsOptions {
10
+ creatorIds: string[];
11
+ following: boolean;
12
+ ignoreCreatorIds: string[];
13
+ supporting: boolean;
14
+ }
15
+ export declare function resolveCreatorIds(client: CreatorResolverClient, options: ResolveCreatorIdsOptions): Promise<string[]>;
16
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/downloader/resolver.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,qBAAqB;IACpC,qBAAqB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;IAC1D,mBAAmB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,qBAAqB,EAC7B,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,MAAM,EAAE,CAAC,CAiBnB"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveCreatorIds = resolveCreatorIds;
4
+ async function resolveCreatorIds(client, options) {
5
+ const creatorIds = new Set(options.creatorIds);
6
+ if (options.following) {
7
+ for (const creator of await client.listFollowingCreators()) {
8
+ creatorIds.add(creator.creatorId);
9
+ }
10
+ }
11
+ if (options.supporting) {
12
+ for (const plan of await client.listSupportingPlans()) {
13
+ creatorIds.add(plan.creatorId);
14
+ }
15
+ }
16
+ for (const ignored of options.ignoreCreatorIds) {
17
+ creatorIds.delete(ignored);
18
+ }
19
+ return [...creatorIds];
20
+ }
21
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/downloader/resolver.ts"],"names":[],"mappings":";;AAYA,8CAoBC;AApBM,KAAK,UAAU,iBAAiB,CACrC,MAA6B,EAC7B,OAAiC;IAEjC,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,KAAK,MAAM,OAAO,IAAI,MAAM,MAAM,CAAC,qBAAqB,EAAE,EAAE,CAAC;YAC3D,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;YACtD,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC/C,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { HttpResponse } from "../http.js";
2
+ import type { Logger } from "./logger.js";
3
+ export interface RequestSchedulerOptions {
4
+ concurrency: number;
5
+ logger?: Logger;
6
+ maxRetries?: number;
7
+ now?: () => number;
8
+ rateLimitPauseMs?: number;
9
+ requestIntervalMs?: number;
10
+ sleep?: (milliseconds: number) => Promise<void>;
11
+ }
12
+ export declare class RequestScheduler {
13
+ #private;
14
+ constructor(options: RequestSchedulerOptions);
15
+ pause(milliseconds: number): void;
16
+ request(operation: () => Promise<HttpResponse>): Promise<HttpResponse>;
17
+ run<T>(operation: () => Promise<T>): Promise<T>;
18
+ }
19
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../../src/downloader/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,qBAAa,gBAAgB;;gBAaR,OAAO,EAAE,uBAAuB;IAa5C,KAAK,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAI3B,OAAO,CAClB,SAAS,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,GACrC,OAAO,CAAC,YAAY,CAAC;IAoCX,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAiC7D"}
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var _RequestScheduler_instances, _RequestScheduler_active, _RequestScheduler_concurrency, _RequestScheduler_logger, _RequestScheduler_maxRetries, _RequestScheduler_nextStartAt, _RequestScheduler_now, _RequestScheduler_pausedUntil, _RequestScheduler_rateLimitPauseMs, _RequestScheduler_requestIntervalMs, _RequestScheduler_sleep, _RequestScheduler_waiting, _RequestScheduler_acquire, _RequestScheduler_release, _RequestScheduler_waitToStart;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.RequestScheduler = void 0;
16
+ const errors_js_1 = require("./errors.js");
17
+ const logger_js_1 = require("./logger.js");
18
+ class RequestScheduler {
19
+ constructor(options) {
20
+ _RequestScheduler_instances.add(this);
21
+ _RequestScheduler_active.set(this, 0);
22
+ _RequestScheduler_concurrency.set(this, void 0);
23
+ _RequestScheduler_logger.set(this, void 0);
24
+ _RequestScheduler_maxRetries.set(this, void 0);
25
+ _RequestScheduler_nextStartAt.set(this, 0);
26
+ _RequestScheduler_now.set(this, void 0);
27
+ _RequestScheduler_pausedUntil.set(this, 0);
28
+ _RequestScheduler_rateLimitPauseMs.set(this, void 0);
29
+ _RequestScheduler_requestIntervalMs.set(this, void 0);
30
+ _RequestScheduler_sleep.set(this, void 0);
31
+ _RequestScheduler_waiting.set(this, []);
32
+ if (!Number.isSafeInteger(options.concurrency) || options.concurrency < 1) {
33
+ throw new Error("concurrency must be a positive integer");
34
+ }
35
+ __classPrivateFieldSet(this, _RequestScheduler_concurrency, options.concurrency, "f");
36
+ __classPrivateFieldSet(this, _RequestScheduler_logger, options.logger ?? logger_js_1.silentLogger, "f");
37
+ __classPrivateFieldSet(this, _RequestScheduler_maxRetries, options.maxRetries ?? 5, "f");
38
+ __classPrivateFieldSet(this, _RequestScheduler_now, options.now ?? Date.now, "f");
39
+ __classPrivateFieldSet(this, _RequestScheduler_rateLimitPauseMs, options.rateLimitPauseMs ?? 60000, "f");
40
+ __classPrivateFieldSet(this, _RequestScheduler_requestIntervalMs, options.requestIntervalMs ?? 0, "f");
41
+ __classPrivateFieldSet(this, _RequestScheduler_sleep, options.sleep ?? defaultSleep, "f");
42
+ }
43
+ pause(milliseconds) {
44
+ __classPrivateFieldSet(this, _RequestScheduler_pausedUntil, Math.max(__classPrivateFieldGet(this, _RequestScheduler_pausedUntil, "f"), __classPrivateFieldGet(this, _RequestScheduler_now, "f").call(this) + milliseconds), "f");
45
+ }
46
+ async request(operation) {
47
+ let attempt = 0;
48
+ for (;;) {
49
+ try {
50
+ const response = await this.run(operation);
51
+ if (!isRetryableStatus(response.status) ||
52
+ attempt >= __classPrivateFieldGet(this, _RequestScheduler_maxRetries, "f")) {
53
+ return response;
54
+ }
55
+ await (0, errors_js_1.logDebugResponse)(__classPrivateFieldGet(this, _RequestScheduler_logger, "f"), response, {
56
+ attempt: attempt + 1,
57
+ });
58
+ if (response.status === 429) {
59
+ const pauseMs = parseRetryAfter(response, __classPrivateFieldGet(this, _RequestScheduler_now, "f").call(this)) ?? __classPrivateFieldGet(this, _RequestScheduler_rateLimitPauseMs, "f");
60
+ this.pause(pauseMs);
61
+ __classPrivateFieldGet(this, _RequestScheduler_logger, "f").warn("request.rate-limit.pause", "Rate limit reached; pausing requests", { pauseMs });
62
+ }
63
+ }
64
+ catch (error) {
65
+ if (attempt >= __classPrivateFieldGet(this, _RequestScheduler_maxRetries, "f")) {
66
+ throw error;
67
+ }
68
+ }
69
+ __classPrivateFieldGet(this, _RequestScheduler_logger, "f").warn("request.retry", "Retrying request", {
70
+ attempt: attempt + 1,
71
+ });
72
+ attempt += 1;
73
+ }
74
+ }
75
+ async run(operation) {
76
+ await __classPrivateFieldGet(this, _RequestScheduler_instances, "m", _RequestScheduler_acquire).call(this);
77
+ try {
78
+ await __classPrivateFieldGet(this, _RequestScheduler_instances, "m", _RequestScheduler_waitToStart).call(this);
79
+ return await operation();
80
+ }
81
+ finally {
82
+ __classPrivateFieldGet(this, _RequestScheduler_instances, "m", _RequestScheduler_release).call(this);
83
+ }
84
+ }
85
+ }
86
+ exports.RequestScheduler = RequestScheduler;
87
+ _RequestScheduler_active = new WeakMap(), _RequestScheduler_concurrency = new WeakMap(), _RequestScheduler_logger = new WeakMap(), _RequestScheduler_maxRetries = new WeakMap(), _RequestScheduler_nextStartAt = new WeakMap(), _RequestScheduler_now = new WeakMap(), _RequestScheduler_pausedUntil = new WeakMap(), _RequestScheduler_rateLimitPauseMs = new WeakMap(), _RequestScheduler_requestIntervalMs = new WeakMap(), _RequestScheduler_sleep = new WeakMap(), _RequestScheduler_waiting = new WeakMap(), _RequestScheduler_instances = new WeakSet(), _RequestScheduler_acquire = async function _RequestScheduler_acquire() {
88
+ if (__classPrivateFieldGet(this, _RequestScheduler_active, "f") >= __classPrivateFieldGet(this, _RequestScheduler_concurrency, "f")) {
89
+ await new Promise((resolve) => __classPrivateFieldGet(this, _RequestScheduler_waiting, "f").push(resolve));
90
+ }
91
+ __classPrivateFieldSet(this, _RequestScheduler_active, __classPrivateFieldGet(this, _RequestScheduler_active, "f") + 1, "f");
92
+ }, _RequestScheduler_release = function _RequestScheduler_release() {
93
+ __classPrivateFieldSet(this, _RequestScheduler_active, __classPrivateFieldGet(this, _RequestScheduler_active, "f") - 1, "f");
94
+ __classPrivateFieldGet(this, _RequestScheduler_waiting, "f").shift()?.();
95
+ }, _RequestScheduler_waitToStart = async function _RequestScheduler_waitToStart() {
96
+ for (;;) {
97
+ const now = __classPrivateFieldGet(this, _RequestScheduler_now, "f").call(this);
98
+ const delay = Math.max(__classPrivateFieldGet(this, _RequestScheduler_pausedUntil, "f"), __classPrivateFieldGet(this, _RequestScheduler_nextStartAt, "f")) - now;
99
+ if (delay <= 0) {
100
+ __classPrivateFieldSet(this, _RequestScheduler_nextStartAt, now + __classPrivateFieldGet(this, _RequestScheduler_requestIntervalMs, "f"), "f");
101
+ return;
102
+ }
103
+ await __classPrivateFieldGet(this, _RequestScheduler_sleep, "f").call(this, delay);
104
+ }
105
+ };
106
+ function defaultSleep(milliseconds) {
107
+ return new Promise((resolve) => setTimeout(resolve, milliseconds));
108
+ }
109
+ function isRetryableStatus(status) {
110
+ return status === 408 || status === 429 || status >= 500;
111
+ }
112
+ function parseRetryAfter(response, now) {
113
+ const retryAfter = response.headers.get("Retry-After");
114
+ if (!retryAfter) {
115
+ return undefined;
116
+ }
117
+ const seconds = Number(retryAfter);
118
+ if (Number.isFinite(seconds)) {
119
+ return Math.max(0, seconds * 1000);
120
+ }
121
+ const date = Date.parse(retryAfter);
122
+ return Number.isNaN(date) ? undefined : Math.max(0, date - now);
123
+ }
124
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../../src/downloader/scheduler.ts"],"names":[],"mappings":"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"}