@traceryn/tiktok-sdk 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 (109) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +276 -0
  3. package/engineRequirements.js +7 -0
  4. package/lib/ProxiflyProvider.d.ts +24 -0
  5. package/lib/ProxiflyProvider.d.ts.map +1 -0
  6. package/lib/ProxiflyProvider.js +112 -0
  7. package/lib/ProxiflyProvider.js.map +1 -0
  8. package/lib/client.d.ts +42 -0
  9. package/lib/client.d.ts.map +1 -0
  10. package/lib/client.js +377 -0
  11. package/lib/client.js.map +1 -0
  12. package/lib/core/CacheManager.d.ts +13 -0
  13. package/lib/core/CacheManager.d.ts.map +1 -0
  14. package/lib/core/CacheManager.js +49 -0
  15. package/lib/core/CacheManager.js.map +1 -0
  16. package/lib/core/CircuitBreaker.d.ts +21 -0
  17. package/lib/core/CircuitBreaker.d.ts.map +1 -0
  18. package/lib/core/CircuitBreaker.js +64 -0
  19. package/lib/core/CircuitBreaker.js.map +1 -0
  20. package/lib/core/Proxymanager.d.ts +32 -0
  21. package/lib/core/Proxymanager.d.ts.map +1 -0
  22. package/lib/core/Proxymanager.js +129 -0
  23. package/lib/core/Proxymanager.js.map +1 -0
  24. package/lib/core/RateLimiter.d.ts +17 -0
  25. package/lib/core/RateLimiter.d.ts.map +1 -0
  26. package/lib/core/RateLimiter.js +53 -0
  27. package/lib/core/RateLimiter.js.map +1 -0
  28. package/lib/core/RequestQueue.d.ts +17 -0
  29. package/lib/core/RequestQueue.d.ts.map +1 -0
  30. package/lib/core/RequestQueue.js +51 -0
  31. package/lib/core/RequestQueue.js.map +1 -0
  32. package/lib/core/RetryHandler.d.ts +13 -0
  33. package/lib/core/RetryHandler.d.ts.map +1 -0
  34. package/lib/core/RetryHandler.js +37 -0
  35. package/lib/core/RetryHandler.js.map +1 -0
  36. package/lib/core/SessionManager.d.ts +17 -0
  37. package/lib/core/SessionManager.d.ts.map +1 -0
  38. package/lib/core/SessionManager.js +57 -0
  39. package/lib/core/SessionManager.js.map +1 -0
  40. package/lib/core/Signer.d.ts +3 -0
  41. package/lib/core/Signer.d.ts.map +1 -0
  42. package/lib/core/Signer.js +26 -0
  43. package/lib/core/Signer.js.map +1 -0
  44. package/lib/index.d.ts +22 -0
  45. package/lib/index.d.ts.map +1 -0
  46. package/lib/index.js +21 -0
  47. package/lib/index.js.map +1 -0
  48. package/lib/playwright.d.ts +46 -0
  49. package/lib/playwright.d.ts.map +1 -0
  50. package/lib/playwright.js +330 -0
  51. package/lib/playwright.js.map +1 -0
  52. package/lib/scrapers/CommentScraper.d.ts +6 -0
  53. package/lib/scrapers/CommentScraper.d.ts.map +1 -0
  54. package/lib/scrapers/CommentScraper.js +107 -0
  55. package/lib/scrapers/CommentScraper.js.map +1 -0
  56. package/lib/scrapers/ExtraScraper.d.ts +15 -0
  57. package/lib/scrapers/ExtraScraper.d.ts.map +1 -0
  58. package/lib/scrapers/ExtraScraper.js +244 -0
  59. package/lib/scrapers/ExtraScraper.js.map +1 -0
  60. package/lib/scrapers/FormatExtractor.d.ts +14 -0
  61. package/lib/scrapers/FormatExtractor.d.ts.map +1 -0
  62. package/lib/scrapers/FormatExtractor.js +110 -0
  63. package/lib/scrapers/FormatExtractor.js.map +1 -0
  64. package/lib/scrapers/ParserEngine.d.ts +17 -0
  65. package/lib/scrapers/ParserEngine.d.ts.map +1 -0
  66. package/lib/scrapers/ParserEngine.js +201 -0
  67. package/lib/scrapers/ParserEngine.js.map +1 -0
  68. package/lib/scrapers/SearchScraper.d.ts +5 -0
  69. package/lib/scrapers/SearchScraper.d.ts.map +1 -0
  70. package/lib/scrapers/SearchScraper.js +149 -0
  71. package/lib/scrapers/SearchScraper.js.map +1 -0
  72. package/lib/scrapers/UrlExtractor.d.ts +9 -0
  73. package/lib/scrapers/UrlExtractor.d.ts.map +1 -0
  74. package/lib/scrapers/UrlExtractor.js +34 -0
  75. package/lib/scrapers/UrlExtractor.js.map +1 -0
  76. package/lib/scrapers/UserScraper.d.ts +3 -0
  77. package/lib/scrapers/UserScraper.d.ts.map +1 -0
  78. package/lib/scrapers/UserScraper.js +137 -0
  79. package/lib/scrapers/UserScraper.js.map +1 -0
  80. package/lib/scrapers/VideoScraper.d.ts +3 -0
  81. package/lib/scrapers/VideoScraper.d.ts.map +1 -0
  82. package/lib/scrapers/VideoScraper.js +65 -0
  83. package/lib/scrapers/VideoScraper.js.map +1 -0
  84. package/lib/types.d.ts +483 -0
  85. package/lib/types.d.ts.map +1 -0
  86. package/lib/types.js +2 -0
  87. package/lib/types.js.map +1 -0
  88. package/lib/utils/CookieJar.d.ts +8 -0
  89. package/lib/utils/CookieJar.d.ts.map +1 -0
  90. package/lib/utils/CookieJar.js +51 -0
  91. package/lib/utils/CookieJar.js.map +1 -0
  92. package/lib/utils/HttpClient.d.ts +12 -0
  93. package/lib/utils/HttpClient.d.ts.map +1 -0
  94. package/lib/utils/HttpClient.js +39 -0
  95. package/lib/utils/HttpClient.js.map +1 -0
  96. package/lib/utils/constants.d.ts +41 -0
  97. package/lib/utils/constants.d.ts.map +1 -0
  98. package/lib/utils/constants.js +48 -0
  99. package/lib/utils/constants.js.map +1 -0
  100. package/lib/utils/errors.d.ts +31 -0
  101. package/lib/utils/errors.d.ts.map +1 -0
  102. package/lib/utils/errors.js +63 -0
  103. package/lib/utils/errors.js.map +1 -0
  104. package/lib/utils/helpers.d.ts +9 -0
  105. package/lib/utils/helpers.d.ts.map +1 -0
  106. package/lib/utils/helpers.js +41 -0
  107. package/lib/utils/helpers.js.map +1 -0
  108. package/lib/utils/xbogus.cjs +565 -0
  109. package/package.json +88 -0
@@ -0,0 +1,129 @@
1
+ import { PROXY_HEALTH_INTERVAL } from '../utils/constants.js';
2
+ export class Proxymanager {
3
+ proxies = [];
4
+ index = 0;
5
+ rotation;
6
+ healthTimer = null;
7
+ constructor(proxies, rotation = 'round-robin') {
8
+ this.rotation = rotation;
9
+ if (proxies?.length) {
10
+ this.addProxies(proxies);
11
+ }
12
+ this.startHealthCheck();
13
+ }
14
+ addProxies(urls) {
15
+ for (const url of urls) {
16
+ if (!this.proxies.some((p) => p.url === url)) {
17
+ this.proxies.push({
18
+ url,
19
+ failures: 0,
20
+ successes: 0,
21
+ lastUsed: 0,
22
+ avgResponseTime: 0,
23
+ score: 1,
24
+ enabled: true,
25
+ });
26
+ }
27
+ }
28
+ }
29
+ removeProxy(url) {
30
+ this.proxies = this.proxies.filter((p) => p.url !== url);
31
+ }
32
+ getProxy() {
33
+ const enabled = this.proxies.filter((p) => p.enabled);
34
+ if (!enabled.length)
35
+ return null;
36
+ let entry;
37
+ switch (this.rotation) {
38
+ case 'round-robin': {
39
+ this.index = (this.index + 1) % enabled.length;
40
+ entry = enabled[this.index];
41
+ break;
42
+ }
43
+ case 'random': {
44
+ entry = enabled[Math.floor(Math.random() * enabled.length)];
45
+ break;
46
+ }
47
+ case 'lowest-failures': {
48
+ entry = enabled.reduce((a, b) => a.failures < b.failures ? a : b);
49
+ break;
50
+ }
51
+ }
52
+ entry.lastUsed = Date.now();
53
+ return entry;
54
+ }
55
+ reportSuccess(url, responseTime) {
56
+ const entry = this.proxies.find((p) => p.url === url);
57
+ if (!entry)
58
+ return;
59
+ entry.successes++;
60
+ entry.failures = Math.max(0, entry.failures - 1);
61
+ if (responseTime) {
62
+ entry.avgResponseTime =
63
+ entry.avgResponseTime > 0
64
+ ? (entry.avgResponseTime + responseTime) / 2
65
+ : responseTime;
66
+ }
67
+ entry.score = this.calculateScore(entry);
68
+ }
69
+ reportFailure(url) {
70
+ const entry = this.proxies.find((p) => p.url === url);
71
+ if (!entry)
72
+ return;
73
+ entry.failures++;
74
+ entry.score = this.calculateScore(entry);
75
+ if (entry.failures >= 10) {
76
+ entry.enabled = false;
77
+ }
78
+ }
79
+ calculateScore(entry) {
80
+ const successRate = entry.successes + entry.failures > 0
81
+ ? entry.successes / (entry.successes + entry.failures)
82
+ : 1;
83
+ const responseWeight = entry.avgResponseTime > 0
84
+ ? Math.max(0, 1 - entry.avgResponseTime / 10000)
85
+ : 1;
86
+ return successRate * 0.6 + responseWeight * 0.4;
87
+ }
88
+ getStats() {
89
+ const enabled = this.proxies.filter((p) => p.enabled);
90
+ return {
91
+ total: this.proxies.length,
92
+ enabled: enabled.length,
93
+ avgScore: enabled.length > 0
94
+ ? enabled.reduce((s, p) => s + p.score, 0) / enabled.length
95
+ : 0,
96
+ };
97
+ }
98
+ async healthCheck() {
99
+ for (const entry of this.proxies) {
100
+ if (entry.enabled && entry.failures > 0 && entry.failures % 3 === 0) {
101
+ try {
102
+ const controller = new AbortController();
103
+ const timer = setTimeout(() => controller.abort(), 5000);
104
+ await fetch(entry.url, {
105
+ method: 'CONNECT',
106
+ signal: controller.signal,
107
+ });
108
+ clearTimeout(timer);
109
+ entry.enabled = true;
110
+ }
111
+ catch {
112
+ entry.failures++;
113
+ if (entry.failures >= 10)
114
+ entry.enabled = false;
115
+ }
116
+ }
117
+ }
118
+ }
119
+ startHealthCheck() {
120
+ this.healthTimer = setInterval(() => {
121
+ this.healthCheck().catch(() => { });
122
+ }, PROXY_HEALTH_INTERVAL);
123
+ }
124
+ destroy() {
125
+ if (this.healthTimer)
126
+ clearInterval(this.healthTimer);
127
+ }
128
+ }
129
+ //# sourceMappingURL=Proxymanager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Proxymanager.js","sourceRoot":"","sources":["../../src/core/Proxymanager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAc9D,MAAM,OAAO,YAAY;IACf,OAAO,GAAiB,EAAE,CAAC;IAC3B,KAAK,GAAG,CAAC,CAAC;IACV,QAAQ,CAAgB;IACxB,WAAW,GAA0C,IAAI,CAAC;IAElE,YAAY,OAAkB,EAAE,WAA0B,aAAa;QACrE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAED,UAAU,CAAC,IAAc;QACvB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;gBAC7C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;oBAChB,GAAG;oBACH,QAAQ,EAAE,CAAC;oBACX,SAAS,EAAE,CAAC;oBACZ,QAAQ,EAAE,CAAC;oBACX,eAAe,EAAE,CAAC;oBAClB,KAAK,EAAE,CAAC;oBACR,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,WAAW,CAAC,GAAW;QACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IAC3D,CAAC;IAED,QAAQ;QACN,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEjC,IAAI,KAAiB,CAAC;QAEtB,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;gBAC/C,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAE,CAAC;gBAC7B,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAE,CAAC;gBAC7D,MAAM;YACR,CAAC;YACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC9B,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAChC,CAAC;gBACF,MAAM;YACR,CAAC;QACH,CAAC;QAED,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,aAAa,CAAC,GAAW,EAAE,YAAqB;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,KAAK,CAAC,SAAS,EAAE,CAAC;QAClB,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QACjD,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,CAAC,eAAe;gBACnB,KAAK,CAAC,eAAe,GAAG,CAAC;oBACvB,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,GAAG,YAAY,CAAC,GAAG,CAAC;oBAC5C,CAAC,CAAC,YAAY,CAAC;QACrB,CAAC;QACD,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAED,aAAa,CAAC,GAAW;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YACzB,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,KAAiB;QACtC,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,QAAQ,GAAG,CAAC;YACtD,CAAC,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC;YACtD,CAAC,CAAC,CAAC,CAAC;QACN,MAAM,cAAc,GAAG,KAAK,CAAC,eAAe,GAAG,CAAC;YAC9C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC;YAChD,CAAC,CAAC,CAAC,CAAC;QACN,OAAO,WAAW,GAAG,GAAG,GAAG,cAAc,GAAG,GAAG,CAAC;IAClD,CAAC;IAED,QAAQ;QACN,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACtD,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;YAC1B,OAAO,EAAE,OAAO,CAAC,MAAM;YACvB,QAAQ,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;gBAC1B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM;gBAC3D,CAAC,CAAC,CAAC;SACN,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW;QACf,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpE,IAAI,CAAC;oBACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;oBACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;oBACzD,MAAM,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE;wBACrB,MAAM,EAAE,SAAS;wBACjB,MAAM,EAAE,UAAU,CAAC,MAAM;qBAC1B,CAAC,CAAC;oBACH,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;gBACvB,CAAC;gBAAC,MAAM,CAAC;oBACP,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACjB,IAAI,KAAK,CAAC,QAAQ,IAAI,EAAE;wBAAE,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC;gBAClD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;YAClC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrC,CAAC,EAAE,qBAAqB,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,WAAW;YAAE,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxD,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ export interface RateLimiterConfig {
2
+ tokensPerSecond: number;
3
+ maxBurst: number;
4
+ }
5
+ export declare class RateLimiter {
6
+ private tokensPerSecond;
7
+ private maxBurst;
8
+ private tokens;
9
+ private lastRefill;
10
+ private waitQueue;
11
+ constructor(config: RateLimiterConfig);
12
+ acquire(count?: number, timeout?: number): Promise<void>;
13
+ private refill;
14
+ private processQueue;
15
+ getTokensRemaining(): number;
16
+ }
17
+ //# sourceMappingURL=RateLimiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RateLimiter.d.ts","sourceRoot":"","sources":["../../src/core/RateLimiter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAIT;gBAEI,MAAM,EAAE,iBAAiB;IAO/B,OAAO,CAAC,KAAK,SAAI,EAAE,OAAO,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBzD,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,YAAY;IAgBpB,kBAAkB,IAAI,MAAM;CAI7B"}
@@ -0,0 +1,53 @@
1
+ export class RateLimiter {
2
+ tokensPerSecond;
3
+ maxBurst;
4
+ tokens;
5
+ lastRefill;
6
+ waitQueue = [];
7
+ constructor(config) {
8
+ this.tokensPerSecond = config.tokensPerSecond;
9
+ this.maxBurst = config.maxBurst;
10
+ this.tokens = config.maxBurst;
11
+ this.lastRefill = Date.now();
12
+ }
13
+ async acquire(count = 1, timeout = 10_000) {
14
+ this.refill();
15
+ if (this.tokens >= count) {
16
+ this.tokens -= count;
17
+ return;
18
+ }
19
+ return new Promise((resolve, reject) => {
20
+ this.waitQueue.push({
21
+ resolve,
22
+ reject,
23
+ deadline: Date.now() + timeout,
24
+ });
25
+ this.processQueue();
26
+ });
27
+ }
28
+ refill() {
29
+ const now = Date.now();
30
+ const elapsed = (now - this.lastRefill) / 1000;
31
+ this.tokens = Math.min(this.maxBurst, this.tokens + elapsed * this.tokensPerSecond);
32
+ this.lastRefill = now;
33
+ }
34
+ processQueue() {
35
+ this.refill();
36
+ while (this.waitQueue.length > 0 && this.tokens > 0) {
37
+ const item = this.waitQueue[0];
38
+ if (Date.now() > item.deadline) {
39
+ this.waitQueue.shift();
40
+ item.reject(new Error('Rate limit acquire timeout'));
41
+ continue;
42
+ }
43
+ this.tokens -= 1;
44
+ this.waitQueue.shift();
45
+ item.resolve();
46
+ }
47
+ }
48
+ getTokensRemaining() {
49
+ this.refill();
50
+ return this.tokens;
51
+ }
52
+ }
53
+ //# sourceMappingURL=RateLimiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RateLimiter.js","sourceRoot":"","sources":["../../src/core/RateLimiter.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,WAAW;IACd,eAAe,CAAS;IACxB,QAAQ,CAAS;IACjB,MAAM,CAAS;IACf,UAAU,CAAS;IACnB,SAAS,GAIZ,EAAE,CAAC;IAER,YAAY,MAAyB;QACnC,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,OAAO,GAAG,MAAM;QACvC,IAAI,CAAC,MAAM,EAAE,CAAC;QAEd,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;YACrB,OAAO;QACT,CAAC;QAED,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAClB,OAAO;gBACP,MAAM;gBACN,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO;aAC/B,CAAC,CAAC;YACH,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,MAAM;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;QAC/C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC;QACpF,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;IACxB,CAAC;IAEO,YAAY;QAClB,IAAI,CAAC,MAAM,EAAE,CAAC;QAEd,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC;YAChC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;gBACvB,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;gBACrD,SAAS;YACX,CAAC;YACD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;YACjB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED,kBAAkB;QAChB,IAAI,CAAC,MAAM,EAAE,CAAC;QACd,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ type Task<T> = () => Promise<T>;
2
+ export declare class RequestQueue {
3
+ private queue;
4
+ private activeCount;
5
+ private maxConcurrency;
6
+ private paused;
7
+ constructor(maxConcurrency?: number);
8
+ enqueue<T>(task: Task<T>, priority?: number): Promise<T>;
9
+ private processNext;
10
+ pause(): void;
11
+ resume(): void;
12
+ getActiveCount(): number;
13
+ getPendingCount(): number;
14
+ clear(): void;
15
+ }
16
+ export {};
17
+ //# sourceMappingURL=RequestQueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RequestQueue.d.ts","sourceRoot":"","sources":["../../src/core/RequestQueue.ts"],"names":[],"mappings":"AAAA,KAAK,IAAI,CAAC,CAAC,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;AAShC,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,MAAM,CAAS;gBAEX,cAAc,SAAI;IAI9B,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,SAAI,GAAG,OAAO,CAAC,CAAC,CAAC;IAQnD,OAAO,CAAC,WAAW;IAkBnB,KAAK,IAAI,IAAI;IAIb,MAAM,IAAI,IAAI;IAKd,cAAc,IAAI,MAAM;IAIxB,eAAe,IAAI,MAAM;IAIzB,KAAK,IAAI,IAAI;CAMd"}
@@ -0,0 +1,51 @@
1
+ export class RequestQueue {
2
+ queue = [];
3
+ activeCount = 0;
4
+ maxConcurrency;
5
+ paused = false;
6
+ constructor(maxConcurrency = 3) {
7
+ this.maxConcurrency = maxConcurrency;
8
+ }
9
+ enqueue(task, priority = 0) {
10
+ return new Promise((resolve, reject) => {
11
+ this.queue.push({ task, priority, resolve, reject });
12
+ this.queue.sort((a, b) => b.priority - a.priority);
13
+ this.processNext();
14
+ });
15
+ }
16
+ processNext() {
17
+ if (this.paused || this.activeCount >= this.maxConcurrency || this.queue.length === 0) {
18
+ return;
19
+ }
20
+ this.activeCount++;
21
+ const item = this.queue.shift();
22
+ item
23
+ .task()
24
+ .then((result) => item.resolve(result))
25
+ .catch((error) => item.reject(error))
26
+ .finally(() => {
27
+ this.activeCount--;
28
+ this.processNext();
29
+ });
30
+ }
31
+ pause() {
32
+ this.paused = true;
33
+ }
34
+ resume() {
35
+ this.paused = false;
36
+ this.processNext();
37
+ }
38
+ getActiveCount() {
39
+ return this.activeCount;
40
+ }
41
+ getPendingCount() {
42
+ return this.queue.length;
43
+ }
44
+ clear() {
45
+ for (const item of this.queue) {
46
+ item.reject(new Error('Queue cleared'));
47
+ }
48
+ this.queue = [];
49
+ }
50
+ }
51
+ //# sourceMappingURL=RequestQueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RequestQueue.js","sourceRoot":"","sources":["../../src/core/RequestQueue.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,YAAY;IACf,KAAK,GAA8B,EAAE,CAAC;IACtC,WAAW,GAAG,CAAC,CAAC;IAChB,cAAc,CAAS;IACvB,MAAM,GAAG,KAAK,CAAC;IAEvB,YAAY,cAAc,GAAG,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED,OAAO,CAAI,IAAa,EAAE,QAAQ,GAAG,CAAC;QACpC,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAwB,CAAC,CAAC;YAC3E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;YACnD,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,WAAW;QACjB,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtF,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC;QAEjC,IAAI;aACD,IAAI,EAAE;aACN,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;aACtC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aACpC,OAAO,CAAC,GAAG,EAAE;YACZ,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAED,KAAK;QACH,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;IAClB,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ export interface RetryConfig {
2
+ maxRetries: number;
3
+ baseDelay: number;
4
+ maxDelay: number;
5
+ jitterFactor: number;
6
+ }
7
+ export declare class RetryHandler {
8
+ private config;
9
+ constructor(config?: Partial<RetryConfig>);
10
+ shouldRetry(error: unknown, attempt: number): boolean;
11
+ delay(attempt: number): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=RetryHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RetryHandler.d.ts","sourceRoot":"","sources":["../../src/core/RetryHandler.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC;IASzC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAgB/C,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAO5C"}
@@ -0,0 +1,37 @@
1
+ export class RetryHandler {
2
+ config;
3
+ constructor(config) {
4
+ this.config = {
5
+ maxRetries: config?.maxRetries ?? 3,
6
+ baseDelay: config?.baseDelay ?? 1000,
7
+ maxDelay: config?.maxDelay ?? 30_000,
8
+ jitterFactor: config?.jitterFactor ?? 0.5,
9
+ };
10
+ }
11
+ shouldRetry(error, attempt) {
12
+ if (attempt >= this.config.maxRetries)
13
+ return false;
14
+ if (error && typeof error === 'object') {
15
+ const err = error;
16
+ if (err.name === 'TikTokParseError')
17
+ return false;
18
+ if (err.name === 'TikTokCircuitOpenError')
19
+ return false;
20
+ // WAF block usually means the proxy got burned, so try again
21
+ if (err.name === 'TikTokWafError')
22
+ return true;
23
+ const status = err.statusCode ?? err.status;
24
+ if (status && typeof status === 'number' && status < 500 && status !== 429)
25
+ return false;
26
+ }
27
+ return true;
28
+ }
29
+ async delay(attempt) {
30
+ const exp = Math.pow(2, attempt);
31
+ const base = Math.min(this.config.baseDelay * exp, this.config.maxDelay);
32
+ const jitter = base * this.config.jitterFactor * Math.random();
33
+ const total = base + jitter;
34
+ return new Promise((r) => setTimeout(r, total));
35
+ }
36
+ }
37
+ //# sourceMappingURL=RetryHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RetryHandler.js","sourceRoot":"","sources":["../../src/core/RetryHandler.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,YAAY;IACf,MAAM,CAAc;IAE5B,YAAY,MAA6B;QACvC,IAAI,CAAC,MAAM,GAAG;YACZ,UAAU,EAAE,MAAM,EAAE,UAAU,IAAI,CAAC;YACnC,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,IAAI;YACpC,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,MAAM;YACpC,YAAY,EAAE,MAAM,EAAE,YAAY,IAAI,GAAG;SAC1C,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,KAAc,EAAE,OAAe;QACzC,IAAI,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAEpD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,KAAgC,CAAC;YAC7C,IAAI,GAAG,CAAC,IAAI,KAAK,kBAAkB;gBAAE,OAAO,KAAK,CAAC;YAClD,IAAI,GAAG,CAAC,IAAI,KAAK,wBAAwB;gBAAE,OAAO,KAAK,CAAC;YACxD,6DAA6D;YAC7D,IAAI,GAAG,CAAC,IAAI,KAAK,gBAAgB;gBAAE,OAAO,IAAI,CAAC;YAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,MAAM,CAAC;YAC5C,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,KAAK,GAAG;gBAAE,OAAO,KAAK,CAAC;QAC3F,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAe;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,IAAI,GAAG,MAAM,CAAC;QAC5B,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAClD,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ export interface SessionData {
2
+ cookies: Record<string, string>;
3
+ params: Record<string, string>;
4
+ createdAt: number;
5
+ lastUsed: number;
6
+ }
7
+ export declare class SessionManager {
8
+ private sessions;
9
+ private defaultExpiry;
10
+ constructor(defaultExpiry?: number);
11
+ getSession(key: string): SessionData | undefined;
12
+ setCookies(key: string, cookies: Record<string, string>): void;
13
+ setParam(key: string, paramKey: string, value: string): void;
14
+ resetSession(key: string): void;
15
+ clearExpired(): void;
16
+ }
17
+ //# sourceMappingURL=SessionManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../src/core/SessionManager.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,aAAa,CAAS;gBAElB,aAAa,SAAU;IAInC,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAWhD,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAe9D,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAc5D,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI/B,YAAY,IAAI,IAAI;CAQrB"}
@@ -0,0 +1,57 @@
1
+ export class SessionManager {
2
+ sessions = new Map();
3
+ defaultExpiry;
4
+ constructor(defaultExpiry = 300_000) {
5
+ this.defaultExpiry = defaultExpiry;
6
+ }
7
+ getSession(key) {
8
+ const session = this.sessions.get(key);
9
+ if (!session)
10
+ return undefined;
11
+ if (Date.now() - session.createdAt > this.defaultExpiry) {
12
+ this.sessions.delete(key);
13
+ return undefined;
14
+ }
15
+ session.lastUsed = Date.now();
16
+ return session;
17
+ }
18
+ setCookies(key, cookies) {
19
+ let session = this.sessions.get(key);
20
+ if (!session) {
21
+ session = {
22
+ cookies: {},
23
+ params: {},
24
+ createdAt: Date.now(),
25
+ lastUsed: Date.now(),
26
+ };
27
+ this.sessions.set(key, session);
28
+ }
29
+ Object.assign(session.cookies, cookies);
30
+ session.lastUsed = Date.now();
31
+ }
32
+ setParam(key, paramKey, value) {
33
+ let session = this.sessions.get(key);
34
+ if (!session) {
35
+ session = {
36
+ cookies: {},
37
+ params: {},
38
+ createdAt: Date.now(),
39
+ lastUsed: Date.now(),
40
+ };
41
+ this.sessions.set(key, session);
42
+ }
43
+ session.params[paramKey] = value;
44
+ }
45
+ resetSession(key) {
46
+ this.sessions.delete(key);
47
+ }
48
+ clearExpired() {
49
+ const now = Date.now();
50
+ for (const [key, session] of this.sessions) {
51
+ if (now - session.createdAt > this.defaultExpiry) {
52
+ this.sessions.delete(key);
53
+ }
54
+ }
55
+ }
56
+ }
57
+ //# sourceMappingURL=SessionManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../../src/core/SessionManager.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,cAAc;IACjB,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC1C,aAAa,CAAS;IAE9B,YAAY,aAAa,GAAG,OAAO;QACjC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,UAAU,CAAC,GAAW;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAC/B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACxD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,UAAU,CAAC,GAAW,EAAE,OAA+B;QACrD,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG;gBACR,OAAO,EAAE,EAAE;gBACX,MAAM,EAAE,EAAE;gBACV,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;aACrB,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAChC,CAAC;IAED,QAAQ,CAAC,GAAW,EAAE,QAAgB,EAAE,KAAa;QACnD,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG;gBACR,OAAO,EAAE,EAAE;gBACX,MAAM,EAAE,EAAE;gBACV,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;aACrB,CAAC;YACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;IACnC,CAAC;IAED,YAAY,CAAC,GAAW;QACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,YAAY;QACV,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3C,IAAI,GAAG,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export declare function sign(query: string, userAgent: string): string;
2
+ export declare function signUrl(url: string, userAgent: string): string;
3
+ //# sourceMappingURL=Signer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Signer.d.ts","sourceRoot":"","sources":["../../src/core/Signer.ts"],"names":[],"mappings":"AAiBA,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG7D;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAM9D"}
@@ -0,0 +1,26 @@
1
+ import { createRequire } from 'module';
2
+ import { fileURLToPath } from 'url';
3
+ import { dirname, resolve } from 'path';
4
+ const _filename = fileURLToPath(import.meta.url);
5
+ const _dirname = dirname(_filename);
6
+ let signFn = null;
7
+ function loadSigner() {
8
+ if (signFn)
9
+ return;
10
+ const xbogusPath = resolve(_dirname, '..', 'utils', 'xbogus.cjs');
11
+ const require = createRequire(_filename);
12
+ const mod = require(xbogusPath);
13
+ signFn = mod.sign;
14
+ }
15
+ export function sign(query, userAgent) {
16
+ loadSigner();
17
+ return signFn(query, userAgent);
18
+ }
19
+ export function signUrl(url, userAgent) {
20
+ const qIndex = url.indexOf('?');
21
+ const query = qIndex >= 0 ? url.slice(qIndex + 1) : '';
22
+ const bogus = sign(query, userAgent);
23
+ const sep = qIndex >= 0 ? '&' : '?';
24
+ return `${url}${sep}X-Bogus=${bogus}`;
25
+ }
26
+ //# sourceMappingURL=Signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Signer.js","sourceRoot":"","sources":["../../src/core/Signer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAExC,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AAEpC,IAAI,MAAM,GAA0D,IAAI,CAAC;AAEzE,SAAS,UAAU;IACjB,IAAI,MAAM;QAAE,OAAO;IACnB,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,KAAa,EAAE,SAAiB;IACnD,UAAU,EAAE,CAAC;IACb,OAAO,MAAO,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,SAAiB;IACpD,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACpC,OAAO,GAAG,GAAG,GAAG,GAAG,WAAW,KAAK,EAAE,CAAC;AACxC,CAAC"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ export { TikTokClient } from './client.js';
2
+ export { ProxiflyProvider } from './ProxiflyProvider.js';
3
+ export { PlaywrightSession } from './playwright.js';
4
+ export { TikTokError, TikTokParseError, TikTokFetchError, TikTokRateLimitError, TikTokProxyError, TikTokCircuitOpenError, TikTokCacheError, TikTokWafError } from './utils/errors.js';
5
+ export { DESKTOP_UA, HEADERS, UA_ROTATION } from './utils/constants.js';
6
+ export { CookieJar, fetchTikTokCookies } from './utils/CookieJar.js';
7
+ export { formatDuration, formatISODate, formatUploadDate, parseCookieString, parseUsername, randomUserAgent } from './utils/helpers.js';
8
+ export { Proxymanager } from './core/Proxymanager.js';
9
+ export { RateLimiter } from './core/RateLimiter.js';
10
+ export { RetryHandler } from './core/RetryHandler.js';
11
+ export { CircuitBreaker } from './core/CircuitBreaker.js';
12
+ export { CacheManager } from './core/CacheManager.js';
13
+ export { SessionManager } from './core/SessionManager.js';
14
+ export { RequestQueue } from './core/RequestQueue.js';
15
+ export { ParserEngine, extractUserPageData } from './scrapers/ParserEngine.js';
16
+ export { fetchComments } from './scrapers/CommentScraper.js';
17
+ export { fetchHashtag, fetchSound, fetchSoundVideos, fetchTrending, fetchUserLikedVideos, fetchUserPlaylists, fetchPlaylist, fetchPlaylistVideos, } from './scrapers/ExtraScraper.js';
18
+ export { extractFormats, extractSubtitles, findBestQuality } from './scrapers/FormatExtractor.js';
19
+ export { extractVideoId, normalizePhotoUrl, buildVideoUrl, buildUserUrl, isValidTikTokUrl, isPhotoUrl } from './scrapers/UrlExtractor.js';
20
+ export { sign, signUrl } from './core/Signer.js';
21
+ export type { TikTokVideo, TikTokUser, TikTokUserVideo, TikTokCommentList, TikTokComment, CommentUser, CommentImage, CommentLabel, HashtagInfo, SoundInfo, SoundItemList, TrendingVideos, LikedVideos, PlaylistInfo, PlaylistItemList, ClientOptions, ProxiflyOptions, ScrapeResult, ItemStruct, Session, ImagePost, FormatEntry, VideoStats, AuthorData, MusicData, ChallengeData, VideoData, PlayAddrStruct, SubtitleInfo, BitrateEntry, ImageInfo, AvatarInfo, TikTokUserSearchResults, SearchUserResult, } from './types.js';
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACtL,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAExI,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EACL,YAAY,EACZ,UAAU,EAAE,gBAAgB,EAC5B,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,GACvD,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAClG,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE1I,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEjD,YAAY,EACV,WAAW,EAAE,UAAU,EAAE,eAAe,EACxC,iBAAiB,EAAE,aAAa,EAChC,WAAW,EAAE,YAAY,EAAE,YAAY,EACvC,WAAW,EAAE,SAAS,EAAE,aAAa,EACrC,cAAc,EAAE,WAAW,EAC3B,YAAY,EAAE,gBAAgB,EAC9B,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EACjE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EACzD,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EACtD,YAAY,EAAE,SAAS,EAAE,UAAU,EACnC,uBAAuB,EAAE,gBAAgB,GAC1C,MAAM,YAAY,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,21 @@
1
+ export { TikTokClient } from './client.js';
2
+ export { ProxiflyProvider } from './ProxiflyProvider.js';
3
+ export { PlaywrightSession } from './playwright.js';
4
+ export { TikTokError, TikTokParseError, TikTokFetchError, TikTokRateLimitError, TikTokProxyError, TikTokCircuitOpenError, TikTokCacheError, TikTokWafError } from './utils/errors.js';
5
+ export { DESKTOP_UA, HEADERS, UA_ROTATION } from './utils/constants.js';
6
+ export { CookieJar, fetchTikTokCookies } from './utils/CookieJar.js';
7
+ export { formatDuration, formatISODate, formatUploadDate, parseCookieString, parseUsername, randomUserAgent } from './utils/helpers.js';
8
+ export { Proxymanager } from './core/Proxymanager.js';
9
+ export { RateLimiter } from './core/RateLimiter.js';
10
+ export { RetryHandler } from './core/RetryHandler.js';
11
+ export { CircuitBreaker } from './core/CircuitBreaker.js';
12
+ export { CacheManager } from './core/CacheManager.js';
13
+ export { SessionManager } from './core/SessionManager.js';
14
+ export { RequestQueue } from './core/RequestQueue.js';
15
+ export { ParserEngine, extractUserPageData } from './scrapers/ParserEngine.js';
16
+ export { fetchComments } from './scrapers/CommentScraper.js';
17
+ export { fetchHashtag, fetchSound, fetchSoundVideos, fetchTrending, fetchUserLikedVideos, fetchUserPlaylists, fetchPlaylist, fetchPlaylistVideos, } from './scrapers/ExtraScraper.js';
18
+ export { extractFormats, extractSubtitles, findBestQuality } from './scrapers/FormatExtractor.js';
19
+ export { extractVideoId, normalizePhotoUrl, buildVideoUrl, buildUserUrl, isValidTikTokUrl, isPhotoUrl } from './scrapers/UrlExtractor.js';
20
+ export { sign, signUrl } from './core/Signer.js';
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACtL,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAExI,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EACL,YAAY,EACZ,UAAU,EAAE,gBAAgB,EAC5B,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EAAE,aAAa,EAAE,mBAAmB,GACvD,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAClG,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE1I,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,46 @@
1
+ export interface NavigatorOverrides {
2
+ platform?: string;
3
+ vendor?: string;
4
+ userAgent?: string;
5
+ hardwareConcurrency?: number;
6
+ language?: string;
7
+ languages?: string[];
8
+ deviceMemory?: number;
9
+ appVersion?: string;
10
+ appName?: string;
11
+ appCodeName?: string;
12
+ product?: string;
13
+ productSub?: string;
14
+ oscpu?: string;
15
+ maxTouchPoints?: number;
16
+ }
17
+ export declare function buildStealthScript(overrides?: NavigatorOverrides): string;
18
+ export interface PlaywrightSessionOptions {
19
+ headless?: boolean;
20
+ proxy?: string;
21
+ numSessions?: number;
22
+ navigatorOverrides?: NavigatorOverrides;
23
+ }
24
+ export declare class PlaywrightSession {
25
+ private state;
26
+ private _browser;
27
+ private _playwrightMod;
28
+ private options;
29
+ constructor(options?: PlaywrightSessionOptions);
30
+ get msToken(): string;
31
+ get params(): Record<string, string>;
32
+ get isReady(): boolean;
33
+ private ensurePage;
34
+ init(videoUrl?: string): Promise<void>;
35
+ /**
36
+ * Wait for window.byted_acrawler to show up.
37
+ * TikTok can be slow here, so give it a few shots.
38
+ */
39
+ private ensureAcrawler;
40
+ sign(url: string): Promise<string>;
41
+ request<T>(path: string, extraParams?: Record<string, string>): Promise<T>;
42
+ render(url: string): Promise<string>;
43
+ close(): Promise<void>;
44
+ get browser(): any;
45
+ }
46
+ //# sourceMappingURL=playwright.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AA2FD,wBAAgB,kBAAkB,CAAC,SAAS,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAIzE;AAID,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;CACzC;AA6BD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,OAAO,CAA2B;gBAE9B,OAAO,GAAE,wBAA6B;IAQlD,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAEnC;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;YAEa,UAAU;IAmDlB,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgD5C;;;OAGG;YACW,cAAc;IAkBtB,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA+BlC,OAAO,CAAC,CAAC,EACb,IAAI,EAAE,MAAM,EACZ,WAAW,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACvC,OAAO,CAAC,CAAC,CAAC;IAiCP,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,IAAI,OAAO,IAAI,GAAG,CAEjB;CACF"}