xtrawl 0.1.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 (249) hide show
  1. package/DOCUMENTATION.md +774 -0
  2. package/README.md +232 -0
  3. package/dist/auth/bootstrap.d.ts +4 -0
  4. package/dist/auth/bootstrap.d.ts.map +1 -0
  5. package/dist/auth/bootstrap.js +29 -0
  6. package/dist/auth/bootstrap.js.map +1 -0
  7. package/dist/auth/cookies.d.ts +7 -0
  8. package/dist/auth/cookies.d.ts.map +1 -0
  9. package/dist/auth/cookies.js +83 -0
  10. package/dist/auth/cookies.js.map +1 -0
  11. package/dist/auth/loaders.d.ts +6 -0
  12. package/dist/auth/loaders.d.ts.map +1 -0
  13. package/dist/auth/loaders.js +69 -0
  14. package/dist/auth/loaders.js.map +1 -0
  15. package/dist/auth/material.d.ts +3 -0
  16. package/dist/auth/material.d.ts.map +1 -0
  17. package/dist/auth/material.js +20 -0
  18. package/dist/auth/material.js.map +1 -0
  19. package/dist/auth/records.d.ts +4 -0
  20. package/dist/auth/records.d.ts.map +1 -0
  21. package/dist/auth/records.js +38 -0
  22. package/dist/auth/records.js.map +1 -0
  23. package/dist/cli/help.d.ts +2 -0
  24. package/dist/cli/help.d.ts.map +1 -0
  25. package/dist/cli/help.js +30 -0
  26. package/dist/cli/help.js.map +1 -0
  27. package/dist/cli/main.d.ts +3 -0
  28. package/dist/cli/main.d.ts.map +1 -0
  29. package/dist/cli/main.js +85 -0
  30. package/dist/cli/main.js.map +1 -0
  31. package/dist/cli/parser.d.ts +22 -0
  32. package/dist/cli/parser.d.ts.map +1 -0
  33. package/dist/cli/parser.js +275 -0
  34. package/dist/cli/parser.js.map +1 -0
  35. package/dist/client/client.d.ts +29 -0
  36. package/dist/client/client.d.ts.map +1 -0
  37. package/dist/client/client.js +192 -0
  38. package/dist/client/client.js.map +1 -0
  39. package/dist/client/collectors.d.ts +15 -0
  40. package/dist/client/collectors.d.ts.map +1 -0
  41. package/dist/client/collectors.js +185 -0
  42. package/dist/client/collectors.js.map +1 -0
  43. package/dist/client/database.d.ts +56 -0
  44. package/dist/client/database.d.ts.map +1 -0
  45. package/dist/client/database.js +146 -0
  46. package/dist/client/database.js.map +1 -0
  47. package/dist/client/profiles.d.ts +5 -0
  48. package/dist/client/profiles.d.ts.map +1 -0
  49. package/dist/client/profiles.js +36 -0
  50. package/dist/client/profiles.js.map +1 -0
  51. package/dist/client/search.d.ts +21 -0
  52. package/dist/client/search.d.ts.map +1 -0
  53. package/dist/client/search.js +139 -0
  54. package/dist/client/search.js.map +1 -0
  55. package/dist/client/types.d.ts +21 -0
  56. package/dist/client/types.d.ts.map +1 -0
  57. package/dist/client/types.js +2 -0
  58. package/dist/client/types.js.map +1 -0
  59. package/dist/config/defaults.d.ts +3 -0
  60. package/dist/config/defaults.d.ts.map +1 -0
  61. package/dist/config/defaults.js +38 -0
  62. package/dist/config/defaults.js.map +1 -0
  63. package/dist/config/environment.d.ts +5 -0
  64. package/dist/config/environment.d.ts.map +1 -0
  65. package/dist/config/environment.js +62 -0
  66. package/dist/config/environment.js.map +1 -0
  67. package/dist/config/types.d.ts +47 -0
  68. package/dist/config/types.d.ts.map +1 -0
  69. package/dist/config/types.js +2 -0
  70. package/dist/config/types.js.map +1 -0
  71. package/dist/config/validation.d.ts +6 -0
  72. package/dist/config/validation.d.ts.map +1 -0
  73. package/dist/config/validation.js +147 -0
  74. package/dist/config/validation.js.map +1 -0
  75. package/dist/domain/accounts.d.ts +64 -0
  76. package/dist/domain/accounts.d.ts.map +1 -0
  77. package/dist/domain/accounts.js +2 -0
  78. package/dist/domain/accounts.js.map +1 -0
  79. package/dist/domain/errors.d.ts +61 -0
  80. package/dist/domain/errors.d.ts.map +1 -0
  81. package/dist/domain/errors.js +89 -0
  82. package/dist/domain/errors.js.map +1 -0
  83. package/dist/domain/http.d.ts +36 -0
  84. package/dist/domain/http.d.ts.map +1 -0
  85. package/dist/domain/http.js +2 -0
  86. package/dist/domain/http.js.map +1 -0
  87. package/dist/domain/manifest.d.ts +23 -0
  88. package/dist/domain/manifest.d.ts.map +1 -0
  89. package/dist/domain/manifest.js +2 -0
  90. package/dist/domain/manifest.js.map +1 -0
  91. package/dist/domain/records.d.ts +67 -0
  92. package/dist/domain/records.d.ts.map +1 -0
  93. package/dist/domain/records.js +2 -0
  94. package/dist/domain/records.js.map +1 -0
  95. package/dist/domain/requests.d.ts +87 -0
  96. package/dist/domain/requests.d.ts.map +1 -0
  97. package/dist/domain/requests.js +2 -0
  98. package/dist/domain/requests.js.map +1 -0
  99. package/dist/engine/api-engine.d.ts +25 -0
  100. package/dist/engine/api-engine.d.ts.map +1 -0
  101. package/dist/engine/api-engine.js +98 -0
  102. package/dist/engine/api-engine.js.map +1 -0
  103. package/dist/engine/extractors.d.ts +27 -0
  104. package/dist/engine/extractors.d.ts.map +1 -0
  105. package/dist/engine/extractors.js +248 -0
  106. package/dist/engine/extractors.js.map +1 -0
  107. package/dist/index.d.ts +21 -0
  108. package/dist/index.d.ts.map +1 -0
  109. package/dist/index.js +15 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/manifest/default-manifest.d.ts +3 -0
  112. package/dist/manifest/default-manifest.d.ts.map +1 -0
  113. package/dist/manifest/default-manifest.js +46 -0
  114. package/dist/manifest/default-manifest.js.map +1 -0
  115. package/dist/manifest/model.d.ts +3 -0
  116. package/dist/manifest/model.d.ts.map +1 -0
  117. package/dist/manifest/model.js +48 -0
  118. package/dist/manifest/model.js.map +1 -0
  119. package/dist/manifest/provider.d.ts +19 -0
  120. package/dist/manifest/provider.d.ts.map +1 -0
  121. package/dist/manifest/provider.js +94 -0
  122. package/dist/manifest/provider.js.map +1 -0
  123. package/dist/manifest/scraper.d.ts +11 -0
  124. package/dist/manifest/scraper.d.ts.map +1 -0
  125. package/dist/manifest/scraper.js +130 -0
  126. package/dist/manifest/scraper.js.map +1 -0
  127. package/dist/output/csv-writer.d.ts +2 -0
  128. package/dist/output/csv-writer.d.ts.map +1 -0
  129. package/dist/output/csv-writer.js +94 -0
  130. package/dist/output/csv-writer.js.map +1 -0
  131. package/dist/output/json-writer.d.ts +2 -0
  132. package/dist/output/json-writer.d.ts.map +1 -0
  133. package/dist/output/json-writer.js +29 -0
  134. package/dist/output/json-writer.js.map +1 -0
  135. package/dist/output/names.d.ts +4 -0
  136. package/dist/output/names.d.ts.map +1 -0
  137. package/dist/output/names.js +22 -0
  138. package/dist/output/names.js.map +1 -0
  139. package/dist/output/writer.d.ts +7 -0
  140. package/dist/output/writer.d.ts.map +1 -0
  141. package/dist/output/writer.js +33 -0
  142. package/dist/output/writer.js.map +1 -0
  143. package/dist/pool/account-pool.d.ts +29 -0
  144. package/dist/pool/account-pool.d.ts.map +1 -0
  145. package/dist/pool/account-pool.js +145 -0
  146. package/dist/pool/account-pool.js.map +1 -0
  147. package/dist/pool/cooldown.d.ts +18 -0
  148. package/dist/pool/cooldown.d.ts.map +1 -0
  149. package/dist/pool/cooldown.js +38 -0
  150. package/dist/pool/cooldown.js.map +1 -0
  151. package/dist/pool/limiter.d.ts +11 -0
  152. package/dist/pool/limiter.d.ts.map +1 -0
  153. package/dist/pool/limiter.js +27 -0
  154. package/dist/pool/limiter.js.map +1 -0
  155. package/dist/query/builder.d.ts +19 -0
  156. package/dist/query/builder.d.ts.map +1 -0
  157. package/dist/query/builder.js +110 -0
  158. package/dist/query/builder.js.map +1 -0
  159. package/dist/query/hash.d.ts +2 -0
  160. package/dist/query/hash.d.ts.map +1 -0
  161. package/dist/query/hash.js +6 -0
  162. package/dist/query/hash.js.map +1 -0
  163. package/dist/query/normalize.d.ts +39 -0
  164. package/dist/query/normalize.d.ts.map +1 -0
  165. package/dist/query/normalize.js +176 -0
  166. package/dist/query/normalize.js.map +1 -0
  167. package/dist/query/targets.d.ts +11 -0
  168. package/dist/query/targets.d.ts.map +1 -0
  169. package/dist/query/targets.js +96 -0
  170. package/dist/query/targets.js.map +1 -0
  171. package/dist/runner/index.d.ts +4 -0
  172. package/dist/runner/index.d.ts.map +1 -0
  173. package/dist/runner/index.js +4 -0
  174. package/dist/runner/index.js.map +1 -0
  175. package/dist/runner/retry.d.ts +7 -0
  176. package/dist/runner/retry.d.ts.map +1 -0
  177. package/dist/runner/retry.js +26 -0
  178. package/dist/runner/retry.js.map +1 -0
  179. package/dist/runner/runner.d.ts +20 -0
  180. package/dist/runner/runner.d.ts.map +1 -0
  181. package/dist/runner/runner.js +37 -0
  182. package/dist/runner/runner.js.map +1 -0
  183. package/dist/runner/task-queue.d.ts +19 -0
  184. package/dist/runner/task-queue.d.ts.map +1 -0
  185. package/dist/runner/task-queue.js +58 -0
  186. package/dist/runner/task-queue.js.map +1 -0
  187. package/dist/storage/account-repository.d.ts +50 -0
  188. package/dist/storage/account-repository.d.ts.map +1 -0
  189. package/dist/storage/account-repository.js +171 -0
  190. package/dist/storage/account-repository.js.map +1 -0
  191. package/dist/storage/account-row.d.ts +4 -0
  192. package/dist/storage/account-row.d.ts.map +1 -0
  193. package/dist/storage/account-row.js +46 -0
  194. package/dist/storage/account-row.js.map +1 -0
  195. package/dist/storage/checkpoint-repository.d.ts +10 -0
  196. package/dist/storage/checkpoint-repository.d.ts.map +1 -0
  197. package/dist/storage/checkpoint-repository.js +30 -0
  198. package/dist/storage/checkpoint-repository.js.map +1 -0
  199. package/dist/storage/database.d.ts +18 -0
  200. package/dist/storage/database.d.ts.map +1 -0
  201. package/dist/storage/database.js +42 -0
  202. package/dist/storage/database.js.map +1 -0
  203. package/dist/storage/index.d.ts +15 -0
  204. package/dist/storage/index.d.ts.map +1 -0
  205. package/dist/storage/index.js +18 -0
  206. package/dist/storage/index.js.map +1 -0
  207. package/dist/storage/manifest-repository.d.ts +9 -0
  208. package/dist/storage/manifest-repository.d.ts.map +1 -0
  209. package/dist/storage/manifest-repository.js +22 -0
  210. package/dist/storage/manifest-repository.js.map +1 -0
  211. package/dist/storage/run-repository.d.ts +24 -0
  212. package/dist/storage/run-repository.d.ts.map +1 -0
  213. package/dist/storage/run-repository.js +51 -0
  214. package/dist/storage/run-repository.js.map +1 -0
  215. package/dist/storage/schema.d.ts +3 -0
  216. package/dist/storage/schema.d.ts.map +1 -0
  217. package/dist/storage/schema.js +53 -0
  218. package/dist/storage/schema.js.map +1 -0
  219. package/dist/transport/graphql.d.ts +8 -0
  220. package/dist/transport/graphql.d.ts.map +1 -0
  221. package/dist/transport/graphql.js +104 -0
  222. package/dist/transport/graphql.js.map +1 -0
  223. package/dist/transport/proxy.d.ts +5 -0
  224. package/dist/transport/proxy.d.ts.map +1 -0
  225. package/dist/transport/proxy.js +36 -0
  226. package/dist/transport/proxy.js.map +1 -0
  227. package/dist/transport/session.d.ts +25 -0
  228. package/dist/transport/session.d.ts.map +1 -0
  229. package/dist/transport/session.js +138 -0
  230. package/dist/transport/session.js.map +1 -0
  231. package/dist/transport/transaction-id.d.ts +20 -0
  232. package/dist/transport/transaction-id.d.ts.map +1 -0
  233. package/dist/transport/transaction-id.js +74 -0
  234. package/dist/transport/transaction-id.js.map +1 -0
  235. package/dist/utils/fingerprint.d.ts +3 -0
  236. package/dist/utils/fingerprint.d.ts.map +1 -0
  237. package/dist/utils/fingerprint.js +20 -0
  238. package/dist/utils/fingerprint.js.map +1 -0
  239. package/dist/utils/guards.d.ts +8 -0
  240. package/dist/utils/guards.d.ts.map +1 -0
  241. package/dist/utils/guards.js +38 -0
  242. package/dist/utils/guards.js.map +1 -0
  243. package/docs/architecture/overview.md +59 -0
  244. package/docs/decisions/0001-runtime-and-state.md +21 -0
  245. package/docs/decisions/0002-modular-boundaries.md +16 -0
  246. package/docs/plans/initial-build.md +18 -0
  247. package/docs/product/specification.md +87 -0
  248. package/docs/security/data-boundary.md +27 -0
  249. package/package.json +89 -0
@@ -0,0 +1,42 @@
1
+ import { DatabaseSync } from "node:sqlite";
2
+ export class StateDatabase {
3
+ path;
4
+ database;
5
+ constructor(path) {
6
+ this.path = path;
7
+ this.database = new DatabaseSync(path);
8
+ this.database.exec("PRAGMA foreign_keys = ON; PRAGMA busy_timeout = 5000;");
9
+ }
10
+ exec(sql) {
11
+ this.database.exec(sql);
12
+ }
13
+ prepare(sql) {
14
+ return this.database.prepare(sql);
15
+ }
16
+ run(sql, ...params) {
17
+ const result = this.database.prepare(sql).run(...params);
18
+ return { changes: Number(result.changes), lastInsertRowid: result.lastInsertRowid };
19
+ }
20
+ get(sql, ...params) {
21
+ return this.database.prepare(sql).get(...params);
22
+ }
23
+ all(sql, ...params) {
24
+ return this.database.prepare(sql).all(...params);
25
+ }
26
+ transaction(callback) {
27
+ this.database.exec("BEGIN IMMEDIATE;");
28
+ try {
29
+ const result = callback();
30
+ this.database.exec("COMMIT;");
31
+ return result;
32
+ }
33
+ catch (error) {
34
+ this.database.exec("ROLLBACK;");
35
+ throw error;
36
+ }
37
+ }
38
+ close() {
39
+ this.database.close();
40
+ }
41
+ }
42
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/storage/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA0C,MAAM,aAAa,CAAC;AAInF,MAAM,OAAO,aAAa;IACR,IAAI,CAAS;IACZ,QAAQ,CAAe;IAExC,YAAmB,IAAY;QAC7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IAC9E,CAAC;IAEM,IAAI,CAAC,GAAW;QACrB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;IAEM,OAAO,CAAC,GAAW;QACxB,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAEM,GAAG,CACR,GAAW,EACX,GAAG,MAAuB;QAE1B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QACzD,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC;IACtF,CAAC;IAEM,GAAG,CAAC,GAAW,EAAE,GAAG,MAAuB;QAChD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAuB,CAAC;IACzE,CAAC;IAEM,GAAG,CAAC,GAAW,EAAE,GAAG,MAAuB;QAChD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAa,CAAC;IAC/D,CAAC;IAEM,WAAW,CAAI,QAAiB;QACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;YAC1B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9B,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAChC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import { StateDatabase } from "./database.js";
2
+ import { AccountRepository } from "./account-repository.js";
3
+ import { CheckpointRepository } from "./checkpoint-repository.js";
4
+ import { ManifestRepository } from "./manifest-repository.js";
5
+ import { RunRepository } from "./run-repository.js";
6
+ import type { AccountRepositoryOptions } from "./account-repository.js";
7
+ export interface StorageBundle {
8
+ readonly database: StateDatabase;
9
+ readonly accounts: AccountRepository;
10
+ readonly checkpoints: CheckpointRepository;
11
+ readonly manifests: ManifestRepository;
12
+ readonly runs: RunRepository;
13
+ }
14
+ export declare function openStorage(path: string, options?: AccountRepositoryOptions): StorageBundle;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAExE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;CAC9B;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,wBAA6B,GAAG,aAAa,CAU/F"}
@@ -0,0 +1,18 @@
1
+ import { initializeSchema } from "./schema.js";
2
+ import { StateDatabase } from "./database.js";
3
+ import { AccountRepository } from "./account-repository.js";
4
+ import { CheckpointRepository } from "./checkpoint-repository.js";
5
+ import { ManifestRepository } from "./manifest-repository.js";
6
+ import { RunRepository } from "./run-repository.js";
7
+ export function openStorage(path, options = {}) {
8
+ const database = new StateDatabase(path);
9
+ initializeSchema(database);
10
+ return {
11
+ database,
12
+ accounts: new AccountRepository(database, options),
13
+ checkpoints: new CheckpointRepository(database),
14
+ manifests: new ManifestRepository(database),
15
+ runs: new RunRepository(database),
16
+ };
17
+ }
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAWpD,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,UAAoC,EAAE;IAC9E,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;IACzC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC3B,OAAO;QACL,QAAQ;QACR,QAAQ,EAAE,IAAI,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC;QAClD,WAAW,EAAE,IAAI,oBAAoB,CAAC,QAAQ,CAAC;QAC/C,SAAS,EAAE,IAAI,kBAAkB,CAAC,QAAQ,CAAC;QAC3C,IAAI,EAAE,IAAI,aAAa,CAAC,QAAQ,CAAC;KAClC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ManifestPayload } from "../domain/manifest.js";
2
+ import type { StateDatabase } from "./database.js";
3
+ export declare class ManifestRepository {
4
+ private readonly database;
5
+ constructor(database: StateDatabase);
6
+ set(key: string, manifest: ManifestPayload, ttlMs: number): void;
7
+ get(key: string, allowExpired?: boolean): ManifestPayload | undefined;
8
+ }
9
+ //# sourceMappingURL=manifest-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-repository.d.ts","sourceRoot":"","sources":["../../src/storage/manifest-repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,qBAAa,kBAAkB;IACV,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,aAAa;IAEpD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAWhE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,eAAe,GAAG,SAAS;CAY3E"}
@@ -0,0 +1,22 @@
1
+ export class ManifestRepository {
2
+ database;
3
+ constructor(database) {
4
+ this.database = database;
5
+ }
6
+ set(key, manifest, ttlMs) {
7
+ const now = Date.now();
8
+ this.database.run("INSERT INTO manifest_cache(cache_key,manifest_json,fetched_at,expires_at) VALUES(?,?,?,?) ON CONFLICT(cache_key) DO UPDATE SET manifest_json=excluded.manifest_json, fetched_at=excluded.fetched_at, expires_at=excluded.expires_at", key, JSON.stringify(manifest), now, now + ttlMs);
9
+ }
10
+ get(key, allowExpired = false) {
11
+ const row = this.database.get("SELECT manifest_json,expires_at FROM manifest_cache WHERE cache_key=?", key);
12
+ if (!row || (!allowExpired && Number(row.expires_at) < Date.now()))
13
+ return undefined;
14
+ try {
15
+ return JSON.parse(String(row.manifest_json));
16
+ }
17
+ catch {
18
+ return undefined;
19
+ }
20
+ }
21
+ }
22
+ //# sourceMappingURL=manifest-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-repository.js","sourceRoot":"","sources":["../../src/storage/manifest-repository.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,kBAAkB;IACO;IAApC,YAAoC,QAAuB;QAAvB,aAAQ,GAAR,QAAQ,CAAe;IAAG,CAAC;IAExD,GAAG,CAAC,GAAW,EAAE,QAAyB,EAAE,KAAa;QAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CACf,qOAAqO,EACrO,GAAG,EACH,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EACxB,GAAG,EACH,GAAG,GAAG,KAAK,CACZ,CAAC;IACJ,CAAC;IAEM,GAAG,CAAC,GAAW,EAAE,YAAY,GAAG,KAAK;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAC3B,uEAAuE,EACvE,GAAG,CACJ,CAAC;QACF,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,YAAY,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAAE,OAAO,SAAS,CAAC;QACrF,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAoB,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ import type { StateDatabase } from "./database.js";
2
+ export interface RunRecord {
3
+ readonly id: string;
4
+ readonly operation: string;
5
+ readonly queryHash?: string;
6
+ readonly startedAt: string;
7
+ readonly finishedAt?: string;
8
+ readonly status: "running" | "complete" | "failed";
9
+ readonly error?: unknown;
10
+ }
11
+ export declare class RunRepository {
12
+ private readonly database;
13
+ constructor(database: StateDatabase);
14
+ create(operation: string, queryHash?: string): RunRecord;
15
+ finalize(id: string, status: "complete" | "failed", error?: unknown): boolean;
16
+ list(limit?: number): RunRecord[];
17
+ last(): RunRecord | undefined;
18
+ summary(limit?: number): {
19
+ readonly totalRuns: number;
20
+ readonly byStatus: Readonly<Record<string, number>>;
21
+ readonly lastRun?: RunRecord;
22
+ };
23
+ }
24
+ //# sourceMappingURL=run-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-repository.d.ts","sourceRoot":"","sources":["../../src/storage/run-repository.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IACnD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,qBAAa,aAAa;IACL,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,aAAa;IAEpD,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS;IAmBxD,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,QAAQ,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO;IAY7E,IAAI,CAAC,KAAK,SAAK,GAAG,SAAS,EAAE;IAY7B,IAAI,IAAI,SAAS,GAAG,SAAS;IAI7B,OAAO,CAAC,KAAK,SAAM,GAAG;QAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACpD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;KAC9B;CAMF"}
@@ -0,0 +1,51 @@
1
+ import { randomUUID } from "node:crypto";
2
+ export class RunRepository {
3
+ database;
4
+ constructor(database) {
5
+ this.database = database;
6
+ }
7
+ create(operation, queryHash) {
8
+ const record = {
9
+ id: randomUUID(),
10
+ operation,
11
+ ...(queryHash ? { queryHash } : {}),
12
+ startedAt: new Date().toISOString(),
13
+ status: "running",
14
+ };
15
+ this.database.run("INSERT INTO runs(id,operation,query_hash,started_at,status) VALUES(?,?,?,?,?)", record.id, record.operation, record.queryHash ?? null, record.startedAt, record.status);
16
+ return record;
17
+ }
18
+ finalize(id, status, error) {
19
+ return (this.database.run("UPDATE runs SET finished_at=?, status=?, error_json=? WHERE id=?", new Date().toISOString(), status, error ? JSON.stringify(error) : null, id).changes === 1);
20
+ }
21
+ list(limit = 50) {
22
+ return this.database.all("SELECT * FROM runs ORDER BY started_at DESC LIMIT ?", limit).map((row) => ({
23
+ id: String(row.id),
24
+ operation: String(row.operation),
25
+ ...(row.query_hash ? { queryHash: String(row.query_hash) } : {}),
26
+ startedAt: String(row.started_at),
27
+ ...(row.finished_at ? { finishedAt: String(row.finished_at) } : {}),
28
+ status: row.status,
29
+ ...(row.error_json ? { error: parseJson(row.error_json) } : {}),
30
+ }));
31
+ }
32
+ last() {
33
+ return this.list(1)[0];
34
+ }
35
+ summary(limit = 500) {
36
+ const runs = this.list(limit);
37
+ const byStatus = {};
38
+ for (const run of runs)
39
+ byStatus[run.status] = (byStatus[run.status] ?? 0) + 1;
40
+ return { totalRuns: runs.length, byStatus, ...(runs[0] ? { lastRun: runs[0] } : {}) };
41
+ }
42
+ }
43
+ function parseJson(value) {
44
+ try {
45
+ return JSON.parse(String(value));
46
+ }
47
+ catch {
48
+ return value;
49
+ }
50
+ }
51
+ //# sourceMappingURL=run-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-repository.js","sourceRoot":"","sources":["../../src/storage/run-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { StateDatabase } from "./database.js";
2
+ export declare function initializeSchema(database: StateDatabase): void;
3
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/storage/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAmD9D"}
@@ -0,0 +1,53 @@
1
+ export function initializeSchema(database) {
2
+ database.exec(`
3
+ CREATE TABLE IF NOT EXISTS accounts (
4
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
5
+ username TEXT NOT NULL UNIQUE,
6
+ password TEXT,
7
+ email TEXT,
8
+ email_password TEXT,
9
+ two_factor_secret TEXT,
10
+ auth_token TEXT,
11
+ csrf_token TEXT,
12
+ cookies_json TEXT NOT NULL DEFAULT '{}',
13
+ bearer_token TEXT,
14
+ proxy_json TEXT,
15
+ status INTEGER NOT NULL DEFAULT 1,
16
+ available_until REAL NOT NULL DEFAULT 0,
17
+ daily_requests INTEGER NOT NULL DEFAULT 0,
18
+ daily_tweets INTEGER NOT NULL DEFAULT 0,
19
+ total_tweets INTEGER NOT NULL DEFAULT 0,
20
+ last_reset_date TEXT,
21
+ lease_id TEXT,
22
+ lease_expires_at REAL,
23
+ last_used REAL NOT NULL DEFAULT 0,
24
+ last_error_code INTEGER,
25
+ cooldown_reason TEXT
26
+ );
27
+ CREATE INDEX IF NOT EXISTS idx_accounts_eligibility
28
+ ON accounts(status, available_until, lease_expires_at, last_used);
29
+ CREATE INDEX IF NOT EXISTS idx_accounts_auth_token
30
+ ON accounts(auth_token);
31
+ CREATE TABLE IF NOT EXISTS runs (
32
+ id TEXT PRIMARY KEY,
33
+ operation TEXT NOT NULL,
34
+ query_hash TEXT,
35
+ started_at TEXT NOT NULL,
36
+ finished_at TEXT,
37
+ status TEXT NOT NULL,
38
+ error_json TEXT
39
+ );
40
+ CREATE TABLE IF NOT EXISTS checkpoints (
41
+ query_hash TEXT PRIMARY KEY,
42
+ cursor_json TEXT NOT NULL,
43
+ updated_at TEXT NOT NULL
44
+ );
45
+ CREATE TABLE IF NOT EXISTS manifest_cache (
46
+ cache_key TEXT PRIMARY KEY,
47
+ manifest_json TEXT NOT NULL,
48
+ fetched_at REAL NOT NULL,
49
+ expires_at REAL NOT NULL
50
+ );
51
+ `);
52
+ }
53
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/storage/schema.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,QAAuB;IACtD,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDb,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { GraphqlResponse, HttpSession } from "../domain/http.js";
2
+ import type { TransactionIdProvider } from "./transaction-id.js";
3
+ export declare class GraphqlTransport {
4
+ private readonly transactions;
5
+ constructor(transactions: TransactionIdProvider);
6
+ get(session: HttpSession, url: string, params: Readonly<Record<string, string>>, timeoutMs: number): Promise<GraphqlResponse>;
7
+ }
8
+ //# sourceMappingURL=graphql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../../src/transport/graphql.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAGjE,qBAAa,gBAAgB;IACR,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,qBAAqB;IAE1D,GAAG,CACd,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACxC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC;CAwD5B"}
@@ -0,0 +1,104 @@
1
+ import { AuthError, NetworkError, RateLimitError } from "../domain/errors.js";
2
+ import { isRecord } from "../utils/guards.js";
3
+ import { effectiveStatus, parseRateLimitReset } from "../pool/cooldown.js";
4
+ export class GraphqlTransport {
5
+ transactions;
6
+ constructor(transactions) {
7
+ this.transactions = transactions;
8
+ }
9
+ async get(session, url, params, timeoutMs) {
10
+ try {
11
+ const method = session.post ? "POST" : "GET";
12
+ const transactionId = await this.transactions.get(method, url);
13
+ const response = await (session.post
14
+ ? session.post(url, {
15
+ body: graphqlBody(params),
16
+ timeoutMs,
17
+ ...(transactionId ? { headers: { "X-Client-Transaction-Id": transactionId } } : {}),
18
+ })
19
+ : session.get(url, {
20
+ query: params,
21
+ timeoutMs,
22
+ ...(transactionId ? { headers: { "X-Client-Transaction-Id": transactionId } } : {}),
23
+ }));
24
+ const body = await response.text();
25
+ const responseStatus = effectiveStatus(response.status, response.headers);
26
+ const snippet = body.slice(0, 240);
27
+ let data = null;
28
+ if (response.status === 200) {
29
+ try {
30
+ data = JSON.parse(body);
31
+ }
32
+ catch {
33
+ data = null;
34
+ }
35
+ }
36
+ if (responseStatus === 401 || responseStatus === 403) {
37
+ throw new AuthError("Remote session was rejected.", { statusCode: responseStatus, endpoint: url });
38
+ }
39
+ if (responseStatus === 429) {
40
+ throw new RateLimitError("Remote rate limit was returned.", {
41
+ statusCode: responseStatus,
42
+ endpoint: url,
43
+ resetAt: parseRateLimitReset(response.headers),
44
+ });
45
+ }
46
+ if (responseStatus >= 400) {
47
+ throw new NetworkError(`GraphQL request failed with status ${responseStatus}.`, {
48
+ statusCode: responseStatus,
49
+ endpoint: url,
50
+ });
51
+ }
52
+ const mapped = mapGraphqlErrors(data);
53
+ if (mapped === 401 || mapped === 403)
54
+ throw new AuthError("Remote session was rejected.", { statusCode: mapped, endpoint: url });
55
+ if (mapped === 429)
56
+ throw new RateLimitError("Remote rate limit was returned.", { statusCode: mapped, endpoint: url });
57
+ return { data, status: mapped ?? responseStatus, headers: response.headers, snippet };
58
+ }
59
+ catch (error) {
60
+ if (error instanceof AuthError || error instanceof RateLimitError)
61
+ throw error;
62
+ if (error instanceof Error && error.name === "AbortError")
63
+ throw new NetworkError("GraphQL request timed out.", { endpoint: url });
64
+ if (error instanceof NetworkError)
65
+ throw error;
66
+ throw new NetworkError(error instanceof Error ? error.message : String(error), { endpoint: url });
67
+ }
68
+ }
69
+ }
70
+ function graphqlBody(params) {
71
+ return Object.fromEntries(Object.entries(params).map(([key, value]) => {
72
+ try {
73
+ return [key, JSON.parse(value)];
74
+ }
75
+ catch {
76
+ return [key, value];
77
+ }
78
+ }));
79
+ }
80
+ function mapGraphqlErrors(value) {
81
+ if (!isRecord(value) || !Array.isArray(value.errors))
82
+ return undefined;
83
+ for (const item of value.errors) {
84
+ if (!isRecord(item))
85
+ continue;
86
+ const message = String(item.message ?? "").toLowerCase();
87
+ const extensions = isRecord(item.extensions) ? item.extensions : {};
88
+ const code = String(extensions.code ?? extensions.errorType ?? "").toUpperCase();
89
+ if (message.includes("rate limit") ||
90
+ message.includes("too many requests") ||
91
+ code === "RATE_LIMITED" ||
92
+ code === "RATE_LIMIT")
93
+ return 429;
94
+ if (message.includes("unauthorized") ||
95
+ message.includes("authorization") ||
96
+ code === "UNAUTHORIZED" ||
97
+ code === "AUTHENTICATION_ERROR")
98
+ return 401;
99
+ if (message.includes("forbidden") || code === "FORBIDDEN")
100
+ return 403;
101
+ }
102
+ return undefined;
103
+ }
104
+ //# sourceMappingURL=graphql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphql.js","sourceRoot":"","sources":["../../src/transport/graphql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type Dispatcher } from "undici";
2
+ import type { ProxySettings } from "../domain/accounts.js";
3
+ export declare function proxyToUrl(proxy: string | ProxySettings | undefined): string | undefined;
4
+ export declare function proxyDispatcher(proxy: string | ProxySettings | undefined): Dispatcher | undefined;
5
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/transport/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAErD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAG3D,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAUxF;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAejG"}
@@ -0,0 +1,36 @@
1
+ import { ProxyAgent } from "undici";
2
+ import { socksDispatcher } from "fetch-socks";
3
+ import { ProxyError } from "../domain/errors.js";
4
+ export function proxyToUrl(proxy) {
5
+ if (!proxy)
6
+ return undefined;
7
+ if (typeof proxy === "string")
8
+ return proxy.includes("://") ? proxy : `http://${proxy}`;
9
+ if (proxy.http || proxy.https)
10
+ return proxy.https ?? proxy.http;
11
+ if (!proxy.host || !proxy.port)
12
+ throw new ProxyError("Proxy host and port are required.");
13
+ const scheme = proxy.scheme ?? "http";
14
+ const credentials = proxy.username
15
+ ? `${encodeURIComponent(proxy.username)}:${encodeURIComponent(proxy.password ?? "")}@`
16
+ : "";
17
+ return `${scheme}://${credentials}${proxy.host}:${proxy.port}`;
18
+ }
19
+ export function proxyDispatcher(proxy) {
20
+ const value = proxyToUrl(proxy);
21
+ if (!value)
22
+ return undefined;
23
+ const url = new URL(value);
24
+ if (url.protocol === "socks5:" || url.protocol === "socks5h:")
25
+ return socksDispatcher({
26
+ type: 5,
27
+ host: url.hostname,
28
+ port: Number(url.port || 1080),
29
+ ...(url.username ? { userId: decodeURIComponent(url.username) } : {}),
30
+ ...(url.password ? { password: decodeURIComponent(url.password) } : {}),
31
+ });
32
+ if (url.protocol !== "http:" && url.protocol !== "https:")
33
+ throw new ProxyError(`Unsupported proxy protocol: ${url.protocol}`);
34
+ return new ProxyAgent(value);
35
+ }
36
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/transport/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAmB,MAAM,QAAQ,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,UAAU,UAAU,CAAC,KAAyC;IAClE,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC;IACxF,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC;IAChE,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI;QAAE,MAAM,IAAI,UAAU,CAAC,mCAAmC,CAAC,CAAC;IAC1F,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC;IACtC,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ;QAChC,CAAC,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,kBAAkB,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,GAAG;QACtF,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,GAAG,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAyC;IACvE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,KAAK,UAAU;QAC3D,OAAO,eAAe,CAAC;YACrB,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,GAAG,CAAC,QAAQ;YAClB,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;YAC9B,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxE,CAAC,CAAC;IACL,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;QACvD,MAAM,IAAI,UAAU,CAAC,+BAA+B,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtE,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { fetch as undiciFetch } from "undici";
2
+ import type { AccountRecord, AuthMaterial, CookieMap, ProxySettings } from "../domain/accounts.js";
3
+ import type { HttpSession, SessionFactory } from "../domain/http.js";
4
+ export interface SessionBuilderOptions {
5
+ readonly bearerToken: string;
6
+ readonly defaultProxy?: string | ProxySettings;
7
+ readonly userAgent?: string;
8
+ readonly httpMode?: "auto" | "async" | "sync";
9
+ readonly impersonate?: string;
10
+ readonly fetcher?: typeof undiciFetch;
11
+ readonly factory?: SessionFactory;
12
+ }
13
+ export declare class SessionBuilder {
14
+ private readonly options;
15
+ private readonly healthyProxies;
16
+ constructor(options: SessionBuilderOptions);
17
+ forAccount(account: AccountRecord): HttpSession;
18
+ fromMaterial(material: AuthMaterial, proxy?: string | ProxySettings): HttpSession;
19
+ assertProxyHealthy(account: AccountRecord, options: {
20
+ readonly url: string;
21
+ readonly timeoutMs: number;
22
+ }): Promise<void>;
23
+ }
24
+ export declare function cookieHeader(cookies: CookieMap): string;
25
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/transport/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,WAAW,EAAmB,MAAM,QAAQ,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACnG,OAAO,KAAK,EAAoC,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AASvG,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;IAC/C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAC9C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,WAAW,CAAC;IACtC,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC;CACnC;AAED,qBAAa,cAAc;IAGN,OAAO,CAAC,QAAQ,CAAC,OAAO;IAF3C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;gBAExB,OAAO,EAAE,qBAAqB;IAE3D,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,WAAW;IAK/C,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,WAAW;IAkB3E,kBAAkB,CAC7B,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAC5D,OAAO,CAAC,IAAI,CAAC;CA4BjB;AA8ED,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,GAAG,MAAM,CAIvD"}
@@ -0,0 +1,138 @@
1
+ import { fetch as undiciFetch } from "undici";
2
+ import { AccountSessionRuntimeError } from "../domain/errors.js";
3
+ import { ProxyError } from "../domain/errors.js";
4
+ import { prepareAuthMaterial } from "../auth/material.js";
5
+ import { proxyDispatcher, proxyToUrl } from "./proxy.js";
6
+ const DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/122.0.0.0 Safari/537.36";
7
+ export class SessionBuilder {
8
+ options;
9
+ healthyProxies = new Map();
10
+ constructor(options) {
11
+ this.options = options;
12
+ }
13
+ forAccount(account) {
14
+ const material = prepareAuthMaterial(account, this.options.bearerToken);
15
+ return this.fromMaterial(material, account.proxy ?? this.options.defaultProxy);
16
+ }
17
+ fromMaterial(material, proxy) {
18
+ if (this.options.factory)
19
+ return this.options.factory({
20
+ cookies: material.cookies,
21
+ proxy,
22
+ bearerToken: material.bearerToken,
23
+ ...(this.options.userAgent ? { userAgent: this.options.userAgent } : {}),
24
+ ...(this.options.impersonate ? { impersonate: this.options.impersonate } : {}),
25
+ ...(this.options.httpMode ? { httpMode: this.options.httpMode } : {}),
26
+ });
27
+ return new FetchSession(material, proxy, this.options.fetcher ?? undiciFetch, this.options.userAgent ?? DEFAULT_USER_AGENT);
28
+ }
29
+ async assertProxyHealthy(account, options) {
30
+ const proxyUrl = proxyToUrl(account.proxy ?? this.options.defaultProxy);
31
+ if (!proxyUrl)
32
+ return;
33
+ if ((this.healthyProxies.get(proxyUrl) ?? 0) > Date.now() - 60_000)
34
+ return;
35
+ const dispatcher = proxyDispatcher(proxyUrl);
36
+ if (!dispatcher)
37
+ return;
38
+ const controller = new AbortController();
39
+ const timeout = setTimeout(() => controller.abort(), options.timeoutMs);
40
+ try {
41
+ const response = await (this.options.fetcher ?? undiciFetch)(options.url, {
42
+ method: "GET",
43
+ headers: { "User-Agent": this.options.userAgent ?? DEFAULT_USER_AGENT },
44
+ redirect: "follow",
45
+ signal: controller.signal,
46
+ dispatcher,
47
+ });
48
+ if (response.status === 407)
49
+ throw new ProxyError("Proxy authentication was rejected.", { statusCode: 407 });
50
+ this.healthyProxies.set(proxyUrl, Date.now());
51
+ await response.body?.cancel();
52
+ }
53
+ catch (error) {
54
+ if (error instanceof ProxyError)
55
+ throw error;
56
+ throw new ProxyError(error instanceof Error ? error.message : String(error), { statusCode: 599 });
57
+ }
58
+ finally {
59
+ clearTimeout(timeout);
60
+ await dispatcher.close();
61
+ }
62
+ }
63
+ }
64
+ class FetchSession {
65
+ material;
66
+ fetcher;
67
+ userAgent;
68
+ cookies;
69
+ dispatcher;
70
+ constructor(material, proxy, fetcher, userAgent) {
71
+ this.material = material;
72
+ this.fetcher = fetcher;
73
+ this.userAgent = userAgent;
74
+ this.cookies = material.cookies;
75
+ this.dispatcher = proxyDispatcher(proxy);
76
+ }
77
+ async get(url, options = {}) {
78
+ return this.request("GET", url, options);
79
+ }
80
+ async post(url, options = {}) {
81
+ return this.request("POST", url, options);
82
+ }
83
+ async request(method, url, options) {
84
+ const target = new URL(url);
85
+ for (const [key, value] of Object.entries(options.query ?? {}))
86
+ target.searchParams.set(key, value);
87
+ const controller = new AbortController();
88
+ const timeout = options.timeoutMs ? setTimeout(() => controller.abort(), options.timeoutMs) : undefined;
89
+ try {
90
+ const headers = {
91
+ Authorization: `Bearer ${this.material.bearerToken}`,
92
+ "X-Csrf-Token": this.material.csrfToken,
93
+ "X-Twitter-Auth-Type": "OAuth2Session",
94
+ "X-Twitter-Active-User": "yes",
95
+ "X-Twitter-Client-Language": "en",
96
+ Referer: "https://x.com/",
97
+ "User-Agent": this.userAgent,
98
+ Cookie: cookieHeader(this.cookies),
99
+ ...(method === "POST" ? { "Content-Type": "application/json" } : {}),
100
+ ...(options.headers ?? {}),
101
+ };
102
+ const init = {
103
+ method,
104
+ headers,
105
+ ...(method === "POST" && options.body !== undefined ? { body: JSON.stringify(options.body) } : {}),
106
+ redirect: options.redirect ?? "follow",
107
+ signal: controller.signal,
108
+ ...(this.dispatcher ? { dispatcher: this.dispatcher } : {}),
109
+ };
110
+ const response = await this.fetcher(target, init);
111
+ const headersMap = Object.fromEntries(response.headers.entries());
112
+ return {
113
+ status: response.status,
114
+ headers: headersMap,
115
+ text: () => response.text(),
116
+ json: () => response.json(),
117
+ };
118
+ }
119
+ catch (error) {
120
+ throw new AccountSessionRuntimeError(method === "GET" ? "http_get_failed" : "http_post_failed", error instanceof Error ? error.message : String(error));
121
+ }
122
+ finally {
123
+ if (timeout)
124
+ clearTimeout(timeout);
125
+ }
126
+ }
127
+ async close() {
128
+ const close = this.dispatcher && "close" in this.dispatcher ? this.dispatcher.close : undefined;
129
+ if (typeof close === "function")
130
+ await close.call(this.dispatcher);
131
+ }
132
+ }
133
+ export function cookieHeader(cookies) {
134
+ return Object.entries(cookies)
135
+ .map(([name, value]) => `${name}=${value}`)
136
+ .join("; ");
137
+ }
138
+ //# sourceMappingURL=session.js.map