xtrawl 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/bootstrap.d.ts +1 -1
- package/dist/auth/bootstrap.d.ts.map +1 -1
- package/dist/auth/bootstrap.js +27 -14
- package/dist/auth/bootstrap.js.map +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +13 -12
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/parser.d.ts +2 -14
- package/dist/cli/parser.d.ts.map +1 -1
- package/dist/cli/parser.js +26 -30
- package/dist/cli/parser.js.map +1 -1
- package/dist/cli/types.d.ts +17 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/client/accounts.d.ts.map +1 -1
- package/dist/client/accounts.js +13 -6
- package/dist/client/accounts.js.map +1 -1
- package/dist/client/client.d.ts +13 -1
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +93 -38
- package/dist/client/client.js.map +1 -1
- package/dist/client/collectors.d.ts +2 -10
- package/dist/client/collectors.d.ts.map +1 -1
- package/dist/client/collectors.js +122 -57
- package/dist/client/collectors.js.map +1 -1
- package/dist/client/database.d.ts +6 -18
- package/dist/client/database.d.ts.map +1 -1
- package/dist/client/database.js +4 -21
- package/dist/client/database.js.map +1 -1
- package/dist/client/page-commit.d.ts +15 -0
- package/dist/client/page-commit.d.ts.map +1 -0
- package/dist/client/page-commit.js +19 -0
- package/dist/client/page-commit.js.map +1 -0
- package/dist/client/profiles.d.ts +1 -1
- package/dist/client/profiles.d.ts.map +1 -1
- package/dist/client/profiles.js +10 -3
- package/dist/client/profiles.js.map +1 -1
- package/dist/client/search.d.ts +2 -15
- package/dist/client/search.d.ts.map +1 -1
- package/dist/client/search.js +64 -25
- package/dist/client/search.js.map +1 -1
- package/dist/client/types.d.ts +40 -2
- package/dist/client/types.d.ts.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +5 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/types.d.ts +5 -2
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/validation.d.ts +1 -1
- package/dist/config/validation.d.ts.map +1 -1
- package/dist/config/validation.js +27 -11
- package/dist/config/validation.js.map +1 -1
- package/dist/constants/accounts.d.ts +16 -0
- package/dist/constants/accounts.d.ts.map +1 -0
- package/dist/constants/accounts.js +16 -0
- package/dist/constants/accounts.js.map +1 -0
- package/dist/constants/cli.d.ts +10 -0
- package/dist/constants/cli.d.ts.map +1 -0
- package/dist/constants/cli.js +10 -0
- package/dist/constants/cli.js.map +1 -0
- package/dist/constants/collection.d.ts +9 -0
- package/dist/constants/collection.d.ts.map +1 -0
- package/dist/constants/collection.js +9 -0
- package/dist/constants/collection.js.map +1 -0
- package/dist/constants/config.d.ts +6 -0
- package/dist/constants/config.d.ts.map +1 -0
- package/dist/constants/config.js +6 -0
- package/dist/constants/config.js.map +1 -0
- package/dist/constants/errors.d.ts +9 -0
- package/dist/constants/errors.d.ts.map +1 -0
- package/dist/constants/errors.js +9 -0
- package/dist/constants/errors.js.map +1 -0
- package/dist/constants/output.d.ts +7 -0
- package/dist/constants/output.d.ts.map +1 -0
- package/dist/constants/output.js +7 -0
- package/dist/constants/output.js.map +1 -0
- package/dist/constants/pages.d.ts +5 -0
- package/dist/constants/pages.d.ts.map +1 -0
- package/dist/constants/pages.js +5 -0
- package/dist/constants/pages.js.map +1 -0
- package/dist/constants/requests.d.ts +18 -0
- package/dist/constants/requests.d.ts.map +1 -0
- package/dist/constants/requests.js +18 -0
- package/dist/constants/requests.js.map +1 -0
- package/dist/constants/runner.d.ts +8 -0
- package/dist/constants/runner.d.ts.map +1 -0
- package/dist/constants/runner.js +8 -0
- package/dist/constants/runner.js.map +1 -0
- package/dist/constants/runs.d.ts +8 -0
- package/dist/constants/runs.d.ts.map +1 -0
- package/dist/constants/runs.js +8 -0
- package/dist/constants/runs.js.map +1 -0
- package/dist/domain/accounts.d.ts +4 -2
- package/dist/domain/accounts.d.ts.map +1 -1
- package/dist/domain/collection.d.ts +27 -0
- package/dist/domain/collection.d.ts.map +1 -0
- package/dist/domain/collection.js +2 -0
- package/dist/domain/collection.js.map +1 -0
- package/dist/domain/diagnostics.d.ts +11 -0
- package/dist/domain/diagnostics.d.ts.map +1 -0
- package/dist/domain/diagnostics.js +2 -0
- package/dist/domain/diagnostics.js.map +1 -0
- package/dist/domain/errors.d.ts +2 -1
- package/dist/domain/errors.d.ts.map +1 -1
- package/dist/domain/errors.js +10 -9
- package/dist/domain/errors.js.map +1 -1
- package/dist/domain/http.d.ts +7 -1
- package/dist/domain/http.d.ts.map +1 -1
- package/dist/domain/manifest.d.ts +8 -0
- package/dist/domain/manifest.d.ts.map +1 -1
- package/dist/domain/output.d.ts +3 -0
- package/dist/domain/output.d.ts.map +1 -0
- package/dist/domain/output.js +2 -0
- package/dist/domain/output.js.map +1 -0
- package/dist/domain/pages.d.ts +20 -0
- package/dist/domain/pages.d.ts.map +1 -0
- package/dist/domain/pages.js +2 -0
- package/dist/domain/pages.js.map +1 -0
- package/dist/domain/pool.d.ts +22 -0
- package/dist/domain/pool.d.ts.map +1 -0
- package/dist/domain/pool.js +2 -0
- package/dist/domain/pool.js.map +1 -0
- package/dist/domain/records.d.ts +2 -1
- package/dist/domain/records.d.ts.map +1 -1
- package/dist/domain/requests.d.ts +15 -10
- package/dist/domain/requests.d.ts.map +1 -1
- package/dist/domain/runner.d.ts +30 -0
- package/dist/domain/runner.d.ts.map +1 -0
- package/dist/domain/runner.js +2 -0
- package/dist/domain/runner.js.map +1 -0
- package/dist/domain/runs.d.ts +12 -0
- package/dist/domain/runs.d.ts.map +1 -0
- package/dist/domain/runs.js +2 -0
- package/dist/domain/runs.js.map +1 -0
- package/dist/engine/api-engine.d.ts +7 -7
- package/dist/engine/api-engine.d.ts.map +1 -1
- package/dist/engine/api-engine.js +42 -19
- package/dist/engine/api-engine.js.map +1 -1
- package/dist/engine/extractors.d.ts +2 -8
- package/dist/engine/extractors.d.ts.map +1 -1
- package/dist/engine/extractors.js +30 -11
- package/dist/engine/extractors.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/manifest/destinations.d.ts +4 -0
- package/dist/manifest/destinations.d.ts.map +1 -0
- package/dist/manifest/destinations.js +47 -0
- package/dist/manifest/destinations.js.map +1 -0
- package/dist/manifest/model.d.ts +3 -2
- package/dist/manifest/model.d.ts.map +1 -1
- package/dist/manifest/model.js +6 -1
- package/dist/manifest/model.js.map +1 -1
- package/dist/manifest/provider.d.ts +10 -3
- package/dist/manifest/provider.d.ts.map +1 -1
- package/dist/manifest/provider.js +86 -34
- package/dist/manifest/provider.js.map +1 -1
- package/dist/manifest/scraper.d.ts +2 -6
- package/dist/manifest/scraper.d.ts.map +1 -1
- package/dist/manifest/scraper.js +46 -15
- package/dist/manifest/scraper.js.map +1 -1
- package/dist/output/csv-writer.d.ts.map +1 -1
- package/dist/output/csv-writer.js +32 -10
- package/dist/output/csv-writer.js.map +1 -1
- package/dist/output/json-writer.d.ts +1 -0
- package/dist/output/json-writer.d.ts.map +1 -1
- package/dist/output/json-writer.js +36 -11
- package/dist/output/json-writer.js.map +1 -1
- package/dist/output/lock.d.ts +2 -0
- package/dist/output/lock.d.ts.map +1 -0
- package/dist/output/lock.js +18 -0
- package/dist/output/lock.js.map +1 -0
- package/dist/output/writer.d.ts +2 -1
- package/dist/output/writer.d.ts.map +1 -1
- package/dist/output/writer.js +6 -3
- package/dist/output/writer.js.map +1 -1
- package/dist/pool/account-pool.d.ts +3 -12
- package/dist/pool/account-pool.d.ts.map +1 -1
- package/dist/pool/account-pool.js +54 -16
- package/dist/pool/account-pool.js.map +1 -1
- package/dist/pool/cooldown.d.ts +3 -7
- package/dist/pool/cooldown.d.ts.map +1 -1
- package/dist/pool/cooldown.js +10 -7
- package/dist/pool/cooldown.js.map +1 -1
- package/dist/pool/limiter.d.ts +3 -3
- package/dist/pool/limiter.d.ts.map +1 -1
- package/dist/pool/limiter.js +5 -6
- package/dist/pool/limiter.js.map +1 -1
- package/dist/query/builder.d.ts +1 -1
- package/dist/query/builder.d.ts.map +1 -1
- package/dist/query/builder.js +10 -4
- package/dist/query/builder.js.map +1 -1
- package/dist/query/collection-id.d.ts +3 -0
- package/dist/query/collection-id.d.ts.map +1 -0
- package/dist/query/collection-id.js +21 -0
- package/dist/query/collection-id.js.map +1 -0
- package/dist/query/normalize.d.ts +3 -32
- package/dist/query/normalize.d.ts.map +1 -1
- package/dist/query/normalize.js +10 -16
- package/dist/query/normalize.js.map +1 -1
- package/dist/query/targets.d.ts +2 -7
- package/dist/query/targets.d.ts.map +1 -1
- package/dist/query/targets.js.map +1 -1
- package/dist/query/types.d.ts +40 -0
- package/dist/query/types.d.ts.map +1 -0
- package/dist/query/types.js +2 -0
- package/dist/query/types.js.map +1 -0
- package/dist/runner/index.d.ts +3 -0
- package/dist/runner/index.d.ts.map +1 -1
- package/dist/runner/index.js.map +1 -1
- package/dist/runner/retry.d.ts +3 -6
- package/dist/runner/retry.d.ts.map +1 -1
- package/dist/runner/retry.js +5 -3
- package/dist/runner/retry.js.map +1 -1
- package/dist/runner/runner.d.ts +2 -14
- package/dist/runner/runner.d.ts.map +1 -1
- package/dist/runner/runner.js +11 -7
- package/dist/runner/runner.js.map +1 -1
- package/dist/runner/task-queue.d.ts +9 -11
- package/dist/runner/task-queue.d.ts.map +1 -1
- package/dist/runner/task-queue.js +79 -32
- package/dist/runner/task-queue.js.map +1 -1
- package/dist/storage/account-repository.d.ts +2 -15
- package/dist/storage/account-repository.d.ts.map +1 -1
- package/dist/storage/account-repository.js +65 -35
- package/dist/storage/account-repository.js.map +1 -1
- package/dist/storage/database.d.ts +3 -1
- package/dist/storage/database.d.ts.map +1 -1
- package/dist/storage/database.js +10 -4
- package/dist/storage/database.js.map +1 -1
- package/dist/storage/index.d.ts +3 -1
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +2 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/progress-repository.d.ts +12 -0
- package/dist/storage/progress-repository.d.ts.map +1 -0
- package/dist/storage/progress-repository.js +76 -0
- package/dist/storage/progress-repository.js.map +1 -0
- package/dist/storage/run-repository.d.ts +4 -10
- package/dist/storage/run-repository.d.ts.map +1 -1
- package/dist/storage/run-repository.js +4 -2
- package/dist/storage/run-repository.js.map +1 -1
- package/dist/storage/schema.d.ts.map +1 -1
- package/dist/storage/schema.js +19 -0
- package/dist/storage/schema.js.map +1 -1
- package/dist/storage/types.d.ts +15 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +2 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/transport/body.d.ts +15 -0
- package/dist/transport/body.d.ts.map +1 -0
- package/dist/transport/body.js +61 -0
- package/dist/transport/body.js.map +1 -0
- package/dist/transport/dispatcher-pool.d.ts +13 -0
- package/dist/transport/dispatcher-pool.d.ts.map +1 -0
- package/dist/transport/dispatcher-pool.js +47 -0
- package/dist/transport/dispatcher-pool.js.map +1 -0
- package/dist/transport/graphql.d.ts +1 -1
- package/dist/transport/graphql.d.ts.map +1 -1
- package/dist/transport/graphql.js +36 -19
- package/dist/transport/graphql.js.map +1 -1
- package/dist/transport/session.d.ts +8 -11
- package/dist/transport/session.d.ts.map +1 -1
- package/dist/transport/session.js +71 -26
- package/dist/transport/session.js.map +1 -1
- package/dist/transport/transaction-id.d.ts +2 -7
- package/dist/transport/transaction-id.d.ts.map +1 -1
- package/dist/transport/transaction-id.js +20 -16
- package/dist/transport/transaction-id.js.map +1 -1
- package/dist/transport/types.d.ts +28 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/types.js +2 -0
- package/dist/transport/types.js.map +1 -0
- package/dist/utils/abort.d.ts +6 -0
- package/dist/utils/abort.d.ts.map +1 -0
- package/dist/utils/abort.js +45 -0
- package/dist/utils/abort.js.map +1 -0
- package/dist/utils/redact.d.ts +5 -0
- package/dist/utils/redact.d.ts.map +1 -0
- package/dist/utils/redact.js +42 -0
- package/dist/utils/redact.js.map +1 -0
- package/docs/architecture/overview.md +6 -4
- package/docs/product/specification.md +10 -9
- package/docs/security/data-boundary.md +3 -0
- package/package.json +5 -4
|
@@ -2,11 +2,16 @@ import { fetch as undiciFetch } from "undici";
|
|
|
2
2
|
import { AccountSessionRuntimeError } from "../domain/errors.js";
|
|
3
3
|
import { ProxyError } from "../domain/errors.js";
|
|
4
4
|
import { prepareAuthMaterial } from "../auth/material.js";
|
|
5
|
-
import {
|
|
5
|
+
import { combineSignals, isAbortError } from "../utils/abort.js";
|
|
6
|
+
import { cancelBody, DEFAULT_MAX_RESPONSE_BYTES, readResponseText } from "./body.js";
|
|
7
|
+
import { DispatcherPool } from "./dispatcher-pool.js";
|
|
8
|
+
import { proxyToUrl } from "./proxy.js";
|
|
6
9
|
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
10
|
export class SessionBuilder {
|
|
8
11
|
options;
|
|
9
12
|
healthyProxies = new Map();
|
|
13
|
+
preflights = new Map();
|
|
14
|
+
dispatchers = new DispatcherPool();
|
|
10
15
|
constructor(options) {
|
|
11
16
|
this.options = options;
|
|
12
17
|
}
|
|
@@ -24,7 +29,7 @@ export class SessionBuilder {
|
|
|
24
29
|
...(this.options.impersonate ? { impersonate: this.options.impersonate } : {}),
|
|
25
30
|
...(this.options.httpMode ? { httpMode: this.options.httpMode } : {}),
|
|
26
31
|
});
|
|
27
|
-
return new FetchSession(material, proxy, this.options.fetcher ?? undiciFetch, this.options.userAgent ?? DEFAULT_USER_AGENT);
|
|
32
|
+
return new FetchSession(material, this.dispatchers.acquire(proxy), this.options.fetcher ?? undiciFetch, this.options.userAgent ?? DEFAULT_USER_AGENT);
|
|
28
33
|
}
|
|
29
34
|
async assertProxyHealthy(account, options) {
|
|
30
35
|
const proxyUrl = proxyToUrl(account.proxy ?? this.options.defaultProxy);
|
|
@@ -32,9 +37,28 @@ export class SessionBuilder {
|
|
|
32
37
|
return;
|
|
33
38
|
if ((this.healthyProxies.get(proxyUrl) ?? 0) > Date.now() - 60_000)
|
|
34
39
|
return;
|
|
35
|
-
const
|
|
36
|
-
if (
|
|
40
|
+
const pending = this.preflights.get(proxyUrl);
|
|
41
|
+
if (pending)
|
|
42
|
+
return pending;
|
|
43
|
+
const work = this.runProxyPreflight(account, proxyUrl, options).finally(() => {
|
|
44
|
+
this.preflights.delete(proxyUrl);
|
|
45
|
+
});
|
|
46
|
+
this.preflights.set(proxyUrl, work);
|
|
47
|
+
return work;
|
|
48
|
+
}
|
|
49
|
+
async close() {
|
|
50
|
+
await this.dispatchers.close();
|
|
51
|
+
}
|
|
52
|
+
dispatcherCount() {
|
|
53
|
+
return this.dispatchers.size();
|
|
54
|
+
}
|
|
55
|
+
async runProxyPreflight(account, proxyUrl, options) {
|
|
56
|
+
const acquired = this.dispatchers.acquire(account.proxy ?? this.options.defaultProxy);
|
|
57
|
+
const dispatcher = acquired.dispatcher;
|
|
58
|
+
if (!dispatcher) {
|
|
59
|
+
acquired.release();
|
|
37
60
|
return;
|
|
61
|
+
}
|
|
38
62
|
const controller = new AbortController();
|
|
39
63
|
const timeout = setTimeout(() => controller.abort(), options.timeoutMs);
|
|
40
64
|
try {
|
|
@@ -45,10 +69,14 @@ export class SessionBuilder {
|
|
|
45
69
|
signal: controller.signal,
|
|
46
70
|
dispatcher,
|
|
47
71
|
});
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
72
|
+
try {
|
|
73
|
+
if (response.status === 407)
|
|
74
|
+
throw new ProxyError("Proxy authentication was rejected.", { statusCode: 407 });
|
|
75
|
+
this.healthyProxies.set(proxyUrl, Date.now());
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
await cancelBody(response);
|
|
79
|
+
}
|
|
52
80
|
}
|
|
53
81
|
catch (error) {
|
|
54
82
|
if (error instanceof ProxyError)
|
|
@@ -57,7 +85,7 @@ export class SessionBuilder {
|
|
|
57
85
|
}
|
|
58
86
|
finally {
|
|
59
87
|
clearTimeout(timeout);
|
|
60
|
-
|
|
88
|
+
acquired.release();
|
|
61
89
|
}
|
|
62
90
|
}
|
|
63
91
|
}
|
|
@@ -67,12 +95,14 @@ class FetchSession {
|
|
|
67
95
|
userAgent;
|
|
68
96
|
cookies;
|
|
69
97
|
dispatcher;
|
|
70
|
-
|
|
98
|
+
releaseDispatcher;
|
|
99
|
+
constructor(material, acquired, fetcher, userAgent) {
|
|
71
100
|
this.material = material;
|
|
72
101
|
this.fetcher = fetcher;
|
|
73
102
|
this.userAgent = userAgent;
|
|
74
103
|
this.cookies = material.cookies;
|
|
75
|
-
this.dispatcher =
|
|
104
|
+
this.dispatcher = acquired.dispatcher;
|
|
105
|
+
this.releaseDispatcher = () => acquired.release();
|
|
76
106
|
}
|
|
77
107
|
async get(url, options = {}) {
|
|
78
108
|
return this.request("GET", url, options);
|
|
@@ -84,8 +114,9 @@ class FetchSession {
|
|
|
84
114
|
const target = new URL(url);
|
|
85
115
|
for (const [key, value] of Object.entries(options.query ?? {}))
|
|
86
116
|
target.searchParams.set(key, value);
|
|
87
|
-
const
|
|
88
|
-
const
|
|
117
|
+
const timeout = new AbortController();
|
|
118
|
+
const timer = options.timeoutMs ? setTimeout(() => timeout.abort(), options.timeoutMs) : undefined;
|
|
119
|
+
const signal = combineSignals(options.signal, options.timeoutMs ? timeout.signal : undefined);
|
|
89
120
|
try {
|
|
90
121
|
const headers = {
|
|
91
122
|
Authorization: `Bearer ${this.material.bearerToken}`,
|
|
@@ -103,31 +134,45 @@ class FetchSession {
|
|
|
103
134
|
method,
|
|
104
135
|
headers,
|
|
105
136
|
...(method === "POST" && options.body !== undefined ? { body: JSON.stringify(options.body) } : {}),
|
|
106
|
-
redirect: options.redirect ?? "
|
|
107
|
-
signal:
|
|
137
|
+
redirect: options.redirect ?? "manual",
|
|
138
|
+
...(signal ? { signal } : {}),
|
|
108
139
|
...(this.dispatcher ? { dispatcher: this.dispatcher } : {}),
|
|
109
140
|
};
|
|
110
141
|
const response = await this.fetcher(target, init);
|
|
111
142
|
const headersMap = Object.fromEntries(response.headers.entries());
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
143
|
+
if (response.status >= 300 && response.status < 400) {
|
|
144
|
+
await cancelBody(response);
|
|
145
|
+
throw new AccountSessionRuntimeError(method === "GET" ? "http_get_failed" : "http_post_failed", "Authenticated redirects are not followed.");
|
|
146
|
+
}
|
|
147
|
+
try {
|
|
148
|
+
const text = await readResponseText(response, {
|
|
149
|
+
...(signal ? { signal } : {}),
|
|
150
|
+
maxBytes: options.maxBytes ?? DEFAULT_MAX_RESPONSE_BYTES,
|
|
151
|
+
});
|
|
152
|
+
return {
|
|
153
|
+
status: response.status,
|
|
154
|
+
headers: headersMap,
|
|
155
|
+
text: async () => text,
|
|
156
|
+
json: async () => (text ? JSON.parse(text) : null),
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
await cancelBody(response);
|
|
161
|
+
throw error;
|
|
162
|
+
}
|
|
118
163
|
}
|
|
119
164
|
catch (error) {
|
|
165
|
+
if (isAbortError(error) || error instanceof AccountSessionRuntimeError)
|
|
166
|
+
throw error;
|
|
120
167
|
throw new AccountSessionRuntimeError(method === "GET" ? "http_get_failed" : "http_post_failed", error instanceof Error ? error.message : String(error));
|
|
121
168
|
}
|
|
122
169
|
finally {
|
|
123
|
-
if (
|
|
124
|
-
clearTimeout(
|
|
170
|
+
if (timer)
|
|
171
|
+
clearTimeout(timer);
|
|
125
172
|
}
|
|
126
173
|
}
|
|
127
174
|
async close() {
|
|
128
|
-
|
|
129
|
-
if (typeof close === "function")
|
|
130
|
-
await close.call(this.dispatcher);
|
|
175
|
+
this.releaseDispatcher();
|
|
131
176
|
}
|
|
132
177
|
}
|
|
133
178
|
export function cookieHeader(cookies) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/transport/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,WAAW,EAAmB,MAAM,QAAQ,CAAC;AAG/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/transport/session.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
}
|
|
4
|
-
export interface TransactionIdOptions {
|
|
5
|
-
readonly enabled?: boolean;
|
|
6
|
-
readonly ttlMs?: number;
|
|
7
|
-
}
|
|
1
|
+
import type { TransactionIdOptions, TransactionIdSource } from "./types.js";
|
|
2
|
+
export type { TransactionIdOptions, TransactionIdSource } from "./types.js";
|
|
8
3
|
export declare class TransactionIdProvider {
|
|
9
4
|
private readonly source?;
|
|
10
5
|
private readonly options;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-id.d.ts","sourceRoot":"","sources":["../../src/transport/transaction-id.ts"],"names":[],"mappings":"AAEA,
|
|
1
|
+
{"version":3,"file":"transaction-id.d.ts","sourceRoot":"","sources":["../../src/transport/transaction-id.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE5E,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE5E,qBAAa,qBAAqB;IAO9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAP1B,OAAO,CAAC,MAAM,CAAC,CAAoB;IACnC,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,YAAY,CAAC,CAAyC;gBAG3C,MAAM,CAAC,EAAE,mBAAmB,YAAA,EAC5B,OAAO,GAAE,oBAAyB;IAGxC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;YAe5D,aAAa;YAYb,UAAU;CA8BzB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { delay } from "../utils/abort.js";
|
|
1
2
|
export class TransactionIdProvider {
|
|
2
3
|
source;
|
|
3
4
|
options;
|
|
@@ -45,7 +46,25 @@ export class TransactionIdProvider {
|
|
|
45
46
|
async initialize() {
|
|
46
47
|
try {
|
|
47
48
|
const { ClientTransaction, fetchXDocument } = await import("x-client-transaction-id");
|
|
48
|
-
|
|
49
|
+
// fetchXDocument cannot be cancelled. One bootstrap stays in-flight; a timeout
|
|
50
|
+
// abandons the wait and keeps the result if it later succeeds.
|
|
51
|
+
const work = fetchXDocument().then((document) => ClientTransaction.create(document));
|
|
52
|
+
const result = await Promise.race([
|
|
53
|
+
work.then((client) => ({ ok: true, client })),
|
|
54
|
+
delay(10_000).then(() => ({ ok: false })),
|
|
55
|
+
]);
|
|
56
|
+
if (!result.ok) {
|
|
57
|
+
void work
|
|
58
|
+
.then((client) => {
|
|
59
|
+
this.client = client;
|
|
60
|
+
this.readyAt = Date.now();
|
|
61
|
+
this.retryAt = 0;
|
|
62
|
+
})
|
|
63
|
+
.catch(() => undefined);
|
|
64
|
+
this.retryAt = Date.now() + 5 * 60_000;
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
this.client = result.client;
|
|
49
68
|
this.readyAt = Date.now();
|
|
50
69
|
this.retryAt = 0;
|
|
51
70
|
return this.client;
|
|
@@ -56,19 +75,4 @@ export class TransactionIdProvider {
|
|
|
56
75
|
}
|
|
57
76
|
}
|
|
58
77
|
}
|
|
59
|
-
async function withTimeout(value, timeoutMs) {
|
|
60
|
-
let timer;
|
|
61
|
-
try {
|
|
62
|
-
return await Promise.race([
|
|
63
|
-
value,
|
|
64
|
-
new Promise((_resolve, reject) => {
|
|
65
|
-
timer = setTimeout(() => reject(new Error("Transaction bootstrap timed out.")), timeoutMs);
|
|
66
|
-
}),
|
|
67
|
-
]);
|
|
68
|
-
}
|
|
69
|
-
finally {
|
|
70
|
-
if (timer)
|
|
71
|
-
clearTimeout(timer);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
78
|
//# sourceMappingURL=transaction-id.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction-id.js","sourceRoot":"","sources":["../../src/transport/transaction-id.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transaction-id.js","sourceRoot":"","sources":["../../src/transport/transaction-id.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { fetch as UndiciFetch } from "undici";
|
|
2
|
+
import type { ProxySettings } from "../domain/accounts.js";
|
|
3
|
+
import type { ApiHttpMode } from "../config/types.js";
|
|
4
|
+
import type { SessionFactory } from "../domain/http.js";
|
|
5
|
+
export interface SessionBuilderOptions {
|
|
6
|
+
readonly bearerToken: string;
|
|
7
|
+
readonly defaultProxy?: string | ProxySettings;
|
|
8
|
+
readonly userAgent?: string;
|
|
9
|
+
readonly httpMode?: ApiHttpMode;
|
|
10
|
+
readonly impersonate?: string;
|
|
11
|
+
readonly fetcher?: typeof UndiciFetch;
|
|
12
|
+
readonly factory?: SessionFactory;
|
|
13
|
+
}
|
|
14
|
+
export interface ReadableHttpResponse {
|
|
15
|
+
readonly body?: {
|
|
16
|
+
getReader(): ReadableStreamDefaultReader<Uint8Array>;
|
|
17
|
+
cancel?(reason?: unknown): Promise<void>;
|
|
18
|
+
} | null;
|
|
19
|
+
text(): Promise<string>;
|
|
20
|
+
}
|
|
21
|
+
export interface TransactionIdSource {
|
|
22
|
+
readonly create?: (method: string, url: string) => Promise<string | undefined>;
|
|
23
|
+
}
|
|
24
|
+
export interface TransactionIdOptions {
|
|
25
|
+
readonly enabled?: boolean;
|
|
26
|
+
readonly ttlMs?: number;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/transport/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,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,WAAW,CAAC;IAChC,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,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE;QACd,SAAS,IAAI,2BAA2B,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KAC1C,GAAG,IAAI,CAAC;IACT,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CAChF;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/transport/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function isAbortError(error: unknown): boolean;
|
|
2
|
+
export declare function abortError(message?: string): Error;
|
|
3
|
+
export declare function throwIfAborted(signal?: AbortSignal): void;
|
|
4
|
+
export declare function combineSignals(...signals: Array<AbortSignal | undefined>): AbortSignal | undefined;
|
|
5
|
+
export declare function delay(ms: number, signal?: AbortSignal): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=abort.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abort.d.ts","sourceRoot":"","sources":["../../src/utils/abort.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEpD;AAED,wBAAgB,UAAU,CAAC,OAAO,SAA+B,GAAG,KAAK,CAIxE;AAED,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAEzD;AAED,wBAAgB,cAAc,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC,GAAG,WAAW,GAAG,SAAS,CAMlG;AAED,wBAAsB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB3E"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export function isAbortError(error) {
|
|
2
|
+
return error instanceof Error && error.name === "AbortError";
|
|
3
|
+
}
|
|
4
|
+
export function abortError(message = "The operation was aborted.") {
|
|
5
|
+
const error = new Error(message);
|
|
6
|
+
error.name = "AbortError";
|
|
7
|
+
return error;
|
|
8
|
+
}
|
|
9
|
+
export function throwIfAborted(signal) {
|
|
10
|
+
if (signal?.aborted)
|
|
11
|
+
throw abortError();
|
|
12
|
+
}
|
|
13
|
+
export function combineSignals(...signals) {
|
|
14
|
+
const active = signals.filter((signal) => Boolean(signal));
|
|
15
|
+
const first = active[0];
|
|
16
|
+
if (!first)
|
|
17
|
+
return undefined;
|
|
18
|
+
if (active.length === 1)
|
|
19
|
+
return first;
|
|
20
|
+
return AbortSignal.any(active);
|
|
21
|
+
}
|
|
22
|
+
export async function delay(ms, signal) {
|
|
23
|
+
throwIfAborted(signal);
|
|
24
|
+
if (ms <= 0)
|
|
25
|
+
return;
|
|
26
|
+
await new Promise((resolve, reject) => {
|
|
27
|
+
const timer = setTimeout(() => {
|
|
28
|
+
signal?.removeEventListener("abort", onAbort);
|
|
29
|
+
resolve();
|
|
30
|
+
}, ms);
|
|
31
|
+
const onAbort = () => {
|
|
32
|
+
clearTimeout(timer);
|
|
33
|
+
reject(abortError());
|
|
34
|
+
};
|
|
35
|
+
if (!signal)
|
|
36
|
+
return;
|
|
37
|
+
if (signal.aborted) {
|
|
38
|
+
clearTimeout(timer);
|
|
39
|
+
reject(abortError());
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=abort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abort.js","sourceRoot":"","sources":["../../src/utils/abort.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAO,GAAG,4BAA4B;IAC/D,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC;IAC1B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,IAAI,MAAM,EAAE,OAAO;QAAE,MAAM,UAAU,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAG,OAAuC;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAyB,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAClF,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,EAAU,EAAE,MAAoB;IAC1D,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO;IACpB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QACvB,CAAC,CAAC;QACF,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ProxySettings } from "../domain/accounts.js";
|
|
2
|
+
export declare function redactProxy(proxy: string | ProxySettings): string | ProxySettings;
|
|
3
|
+
export declare function redactText(value: string): string;
|
|
4
|
+
export declare function redactUnknown(value: unknown): unknown;
|
|
5
|
+
//# sourceMappingURL=redact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.d.ts","sourceRoot":"","sources":["../../src/utils/redact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAI3D,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,MAAM,GAAG,aAAa,CAejF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUhD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAUrD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
const REDACTED = "[redacted]";
|
|
2
|
+
export function redactProxy(proxy) {
|
|
3
|
+
if (typeof proxy !== "string")
|
|
4
|
+
return {
|
|
5
|
+
...proxy,
|
|
6
|
+
...(proxy.username ? { username: REDACTED } : {}),
|
|
7
|
+
...(proxy.password ? { password: REDACTED } : {}),
|
|
8
|
+
};
|
|
9
|
+
try {
|
|
10
|
+
const value = new URL(proxy.includes("://") ? proxy : `http://${proxy}`);
|
|
11
|
+
if (value.username)
|
|
12
|
+
value.username = REDACTED;
|
|
13
|
+
if (value.password)
|
|
14
|
+
value.password = REDACTED;
|
|
15
|
+
return value.toString();
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return REDACTED;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export function redactText(value) {
|
|
22
|
+
return value
|
|
23
|
+
.replace(/auth_token=[^;\s&]+/giu, `auth_token=${REDACTED}`)
|
|
24
|
+
.replace(/\bct0=[^;\s&]+/giu, `ct0=${REDACTED}`)
|
|
25
|
+
.replace(/Bearer\s+[A-Za-z0-9._%~+-]+/giu, `Bearer ${REDACTED}`)
|
|
26
|
+
.replace(/Cookie:\s*[^\n]+/giu, `Cookie: ${REDACTED}`)
|
|
27
|
+
.replace(/(?:password|passwd|secret|csrf|ct0|auth_token)\s*[:=]\s*([^\s,;]+)/giu, (match, secret) => match.replace(secret, REDACTED));
|
|
28
|
+
}
|
|
29
|
+
export function redactUnknown(value) {
|
|
30
|
+
if (typeof value === "string")
|
|
31
|
+
return redactText(value);
|
|
32
|
+
if (Array.isArray(value))
|
|
33
|
+
return value.map(redactUnknown);
|
|
34
|
+
if (!value || typeof value !== "object")
|
|
35
|
+
return value;
|
|
36
|
+
return Object.fromEntries(Object.entries(value).map(([key, child]) => {
|
|
37
|
+
if (/password|token|cookie|secret|authorization|csrf|proxy/iu.test(key))
|
|
38
|
+
return [key, REDACTED];
|
|
39
|
+
return [key, redactUnknown(child)];
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=redact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/utils/redact.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAG,YAAY,CAAC;AAE9B,MAAM,UAAU,WAAW,CAAC,KAA6B;IACvD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAC3B,OAAO;YACL,GAAG,KAAK;YACR,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClD,CAAC;IACJ,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC,CAAC;QACzE,IAAI,KAAK,CAAC,QAAQ;YAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC9C,IAAI,KAAK,CAAC,QAAQ;YAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC9C,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,OAAO,KAAK;SACT,OAAO,CAAC,wBAAwB,EAAE,cAAc,QAAQ,EAAE,CAAC;SAC3D,OAAO,CAAC,mBAAmB,EAAE,OAAO,QAAQ,EAAE,CAAC;SAC/C,OAAO,CAAC,gCAAgC,EAAE,UAAU,QAAQ,EAAE,CAAC;SAC/D,OAAO,CAAC,qBAAqB,EAAE,WAAW,QAAQ,EAAE,CAAC;SACrD,OAAO,CACN,uEAAuE,EACvE,CAAC,KAAK,EAAE,MAAc,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAC3D,CAAC;AACN,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QACzC,IAAI,yDAAyD,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAChG,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -34,13 +34,14 @@ CLI / library facade
|
|
|
34
34
|
- `runner` coordinates bounded concurrent targets and search intervals through interfaces.
|
|
35
35
|
- `client` composes concrete adapters and exposes the stable public API. Its low-level search-page
|
|
36
36
|
primitive performs one pooled page request; high-level search adds scheduling, deduplication,
|
|
37
|
-
|
|
37
|
+
durable page progress, output, and run statistics around that same primitive. Public methods
|
|
38
|
+
accept an AbortSignal and `shutdown()` drains in-flight work.
|
|
38
39
|
- `cli` parses arguments and renders results; it never implements scraping logic.
|
|
39
40
|
|
|
40
41
|
## Persistence topology
|
|
41
42
|
|
|
42
|
-
One configured SQLite database always contains run records, resume checkpoints,
|
|
43
|
-
payloads. By default it also contains accounts and leases. A caller may replace the account-state
|
|
43
|
+
One configured SQLite database always contains run records, resume checkpoints, accepted collection
|
|
44
|
+
records, and cached manifest payloads. By default it also contains accounts and leases. A caller may replace the account-state
|
|
44
45
|
boundary with an `AccountStateStore`; the pool awaits either synchronous or asynchronous adapters and
|
|
45
46
|
requires atomic acquire, renew, completion, and replacement semantics. SQL remains local to storage.
|
|
46
47
|
Raw secrets are stored only when the caller explicitly provisions or restores them; logs and normal
|
|
@@ -53,7 +54,8 @@ projections use redaction or a token fingerprint.
|
|
|
53
54
|
3. Remote text, manifests, and headers are data, never executable instructions.
|
|
54
55
|
4. Secrets cross only the session builder and selected account-state boundary. Public inspection and
|
|
55
56
|
normal maintenance projections redact them. Explicit account-state export is the sole raw-secret
|
|
56
|
-
projection and requires caller acknowledgement.
|
|
57
|
+
projection and requires caller acknowledgement. Remote manifests cannot attach credentials to
|
|
58
|
+
unapproved origins. Authenticated requests do not follow redirects.
|
|
57
59
|
|
|
58
60
|
## Verification architecture
|
|
59
61
|
|
|
@@ -12,11 +12,11 @@ persisting progress locally, and exposing predictable typed results.
|
|
|
12
12
|
|
|
13
13
|
## Users and outcomes
|
|
14
14
|
|
|
15
|
-
| User
|
|
16
|
-
|
|
|
17
|
-
| TypeScript developer | Existing clients are difficult to type, test, and extend
|
|
18
|
-
| Data operator
|
|
19
|
-
| Maintainer
|
|
15
|
+
| User | Problem | Successful outcome |
|
|
16
|
+
| -------------------- | ----------------------------------------------------------- | --------------------------------------------------------- |
|
|
17
|
+
| TypeScript developer | Existing clients are difficult to type, test, and extend | Import a small typed API and receive stable records |
|
|
18
|
+
| Data operator | Long reads fail when a session is cooled or a process stops | Pool accounts, retry safely, and resume from checkpoints |
|
|
19
|
+
| Maintainer | Transport, persistence, and domain behavior become coupled | Each boundary is replaceable and covered by focused tests |
|
|
20
20
|
|
|
21
21
|
## Principal journeys
|
|
22
22
|
|
|
@@ -85,9 +85,9 @@ persisting progress locally, and exposing predictable typed results.
|
|
|
85
85
|
- [x] Harness structural validation and context-budget evaluation pass.
|
|
86
86
|
- [x] A fresh agent can identify the current work and next action from `.harness/state/` without chat history.
|
|
87
87
|
- [x] A caller-owned asynchronous account store can provision, lease, complete, export, and restore
|
|
88
|
-
|
|
88
|
+
account state through the public API, with deterministic contract tests.
|
|
89
89
|
- [x] A caller can pass a search cursor, receive the next cursor, and paginate without creating run
|
|
90
|
-
|
|
90
|
+
records or reading and writing the internal checkpoint store.
|
|
91
91
|
|
|
92
92
|
## Open decisions
|
|
93
93
|
|
|
@@ -100,5 +100,6 @@ persisting progress locally, and exposing predictable typed results.
|
|
|
100
100
|
|
|
101
101
|
## Immediate next action
|
|
102
102
|
|
|
103
|
-
Add the read-only MCP server for agent-harness operation
|
|
104
|
-
results and
|
|
103
|
+
Add the read-only MCP server for agent-harness operation after the recovery, cancellation, and
|
|
104
|
+
credential-destination bounds. Keep credentials out of tool results and preserve account-pool
|
|
105
|
+
limits. MCP remains a follow-on product task.
|
|
@@ -17,6 +17,9 @@
|
|
|
17
17
|
- HTTP, HTTPS, and SOCKS5 proxies are normalized and passed to the HTTP adapter. Health checks carry
|
|
18
18
|
no session cookies, and proxy credentials are redacted from inspection and diagnostics.
|
|
19
19
|
- External payloads are parsed as `unknown` and narrowed before use.
|
|
20
|
+
- Remote manifests are untrusted. GraphQL endpoints must be HTTPS on an allowed X origin and a
|
|
21
|
+
read-only GraphQL path before session cookies, CSRF, or bearer tokens are attached. Authenticated
|
|
22
|
+
requests do not follow redirects. Tests may add synthetic origins through `allowedManifestOrigins`.
|
|
20
23
|
|
|
21
24
|
## Local state
|
|
22
25
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xtrawl",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Scrape public X posts, profiles, followers, and following",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -62,6 +62,7 @@
|
|
|
62
62
|
"package:check": "node scripts/package-check.mjs",
|
|
63
63
|
"harness:validate": "python3 scripts/harness/validate.py",
|
|
64
64
|
"harness:budget": "python3 scripts/harness/budget.py",
|
|
65
|
+
"bench": "npm run build && node scripts/bench.mjs",
|
|
65
66
|
"prepack": "npm run build",
|
|
66
67
|
"prepublishOnly": "npm run verify",
|
|
67
68
|
"prepare": "husky"
|
|
@@ -76,13 +77,13 @@
|
|
|
76
77
|
},
|
|
77
78
|
"devDependencies": {
|
|
78
79
|
"@eslint/js": "^10.0.1",
|
|
79
|
-
"@types/jest": "^
|
|
80
|
-
"@types/node": "^
|
|
80
|
+
"@types/jest": "^30.0.0",
|
|
81
|
+
"@types/node": "^26.4.0",
|
|
81
82
|
"@typescript-eslint/eslint-plugin": "^8.62.1",
|
|
82
83
|
"@typescript-eslint/parser": "^8.62.1",
|
|
83
84
|
"eslint": "^10.6.0",
|
|
84
85
|
"husky": "^9.1.7",
|
|
85
|
-
"jest": "^
|
|
86
|
+
"jest": "^30.5.0",
|
|
86
87
|
"prettier": "^3.9.4",
|
|
87
88
|
"ts-jest": "^29.3.4",
|
|
88
89
|
"typescript": "^5.9.3"
|