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.
- package/DOCUMENTATION.md +774 -0
- package/README.md +232 -0
- package/dist/auth/bootstrap.d.ts +4 -0
- package/dist/auth/bootstrap.d.ts.map +1 -0
- package/dist/auth/bootstrap.js +29 -0
- package/dist/auth/bootstrap.js.map +1 -0
- package/dist/auth/cookies.d.ts +7 -0
- package/dist/auth/cookies.d.ts.map +1 -0
- package/dist/auth/cookies.js +83 -0
- package/dist/auth/cookies.js.map +1 -0
- package/dist/auth/loaders.d.ts +6 -0
- package/dist/auth/loaders.d.ts.map +1 -0
- package/dist/auth/loaders.js +69 -0
- package/dist/auth/loaders.js.map +1 -0
- package/dist/auth/material.d.ts +3 -0
- package/dist/auth/material.d.ts.map +1 -0
- package/dist/auth/material.js +20 -0
- package/dist/auth/material.js.map +1 -0
- package/dist/auth/records.d.ts +4 -0
- package/dist/auth/records.d.ts.map +1 -0
- package/dist/auth/records.js +38 -0
- package/dist/auth/records.js.map +1 -0
- package/dist/cli/help.d.ts +2 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +30 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +85 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/parser.d.ts +22 -0
- package/dist/cli/parser.d.ts.map +1 -0
- package/dist/cli/parser.js +275 -0
- package/dist/cli/parser.js.map +1 -0
- package/dist/client/client.d.ts +29 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +192 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/collectors.d.ts +15 -0
- package/dist/client/collectors.d.ts.map +1 -0
- package/dist/client/collectors.js +185 -0
- package/dist/client/collectors.js.map +1 -0
- package/dist/client/database.d.ts +56 -0
- package/dist/client/database.d.ts.map +1 -0
- package/dist/client/database.js +146 -0
- package/dist/client/database.js.map +1 -0
- package/dist/client/profiles.d.ts +5 -0
- package/dist/client/profiles.d.ts.map +1 -0
- package/dist/client/profiles.js +36 -0
- package/dist/client/profiles.js.map +1 -0
- package/dist/client/search.d.ts +21 -0
- package/dist/client/search.d.ts.map +1 -0
- package/dist/client/search.js +139 -0
- package/dist/client/search.js.map +1 -0
- package/dist/client/types.d.ts +21 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/config/defaults.d.ts +3 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +38 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/environment.d.ts +5 -0
- package/dist/config/environment.d.ts.map +1 -0
- package/dist/config/environment.js +62 -0
- package/dist/config/environment.js.map +1 -0
- package/dist/config/types.d.ts +47 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validation.d.ts +6 -0
- package/dist/config/validation.d.ts.map +1 -0
- package/dist/config/validation.js +147 -0
- package/dist/config/validation.js.map +1 -0
- package/dist/domain/accounts.d.ts +64 -0
- package/dist/domain/accounts.d.ts.map +1 -0
- package/dist/domain/accounts.js +2 -0
- package/dist/domain/accounts.js.map +1 -0
- package/dist/domain/errors.d.ts +61 -0
- package/dist/domain/errors.d.ts.map +1 -0
- package/dist/domain/errors.js +89 -0
- package/dist/domain/errors.js.map +1 -0
- package/dist/domain/http.d.ts +36 -0
- package/dist/domain/http.d.ts.map +1 -0
- package/dist/domain/http.js +2 -0
- package/dist/domain/http.js.map +1 -0
- package/dist/domain/manifest.d.ts +23 -0
- package/dist/domain/manifest.d.ts.map +1 -0
- package/dist/domain/manifest.js +2 -0
- package/dist/domain/manifest.js.map +1 -0
- package/dist/domain/records.d.ts +67 -0
- package/dist/domain/records.d.ts.map +1 -0
- package/dist/domain/records.js +2 -0
- package/dist/domain/records.js.map +1 -0
- package/dist/domain/requests.d.ts +87 -0
- package/dist/domain/requests.d.ts.map +1 -0
- package/dist/domain/requests.js +2 -0
- package/dist/domain/requests.js.map +1 -0
- package/dist/engine/api-engine.d.ts +25 -0
- package/dist/engine/api-engine.d.ts.map +1 -0
- package/dist/engine/api-engine.js +98 -0
- package/dist/engine/api-engine.js.map +1 -0
- package/dist/engine/extractors.d.ts +27 -0
- package/dist/engine/extractors.d.ts.map +1 -0
- package/dist/engine/extractors.js +248 -0
- package/dist/engine/extractors.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest/default-manifest.d.ts +3 -0
- package/dist/manifest/default-manifest.d.ts.map +1 -0
- package/dist/manifest/default-manifest.js +46 -0
- package/dist/manifest/default-manifest.js.map +1 -0
- package/dist/manifest/model.d.ts +3 -0
- package/dist/manifest/model.d.ts.map +1 -0
- package/dist/manifest/model.js +48 -0
- package/dist/manifest/model.js.map +1 -0
- package/dist/manifest/provider.d.ts +19 -0
- package/dist/manifest/provider.d.ts.map +1 -0
- package/dist/manifest/provider.js +94 -0
- package/dist/manifest/provider.js.map +1 -0
- package/dist/manifest/scraper.d.ts +11 -0
- package/dist/manifest/scraper.d.ts.map +1 -0
- package/dist/manifest/scraper.js +130 -0
- package/dist/manifest/scraper.js.map +1 -0
- package/dist/output/csv-writer.d.ts +2 -0
- package/dist/output/csv-writer.d.ts.map +1 -0
- package/dist/output/csv-writer.js +94 -0
- package/dist/output/csv-writer.js.map +1 -0
- package/dist/output/json-writer.d.ts +2 -0
- package/dist/output/json-writer.d.ts.map +1 -0
- package/dist/output/json-writer.js +29 -0
- package/dist/output/json-writer.js.map +1 -0
- package/dist/output/names.d.ts +4 -0
- package/dist/output/names.d.ts.map +1 -0
- package/dist/output/names.js +22 -0
- package/dist/output/names.js.map +1 -0
- package/dist/output/writer.d.ts +7 -0
- package/dist/output/writer.d.ts.map +1 -0
- package/dist/output/writer.js +33 -0
- package/dist/output/writer.js.map +1 -0
- package/dist/pool/account-pool.d.ts +29 -0
- package/dist/pool/account-pool.d.ts.map +1 -0
- package/dist/pool/account-pool.js +145 -0
- package/dist/pool/account-pool.js.map +1 -0
- package/dist/pool/cooldown.d.ts +18 -0
- package/dist/pool/cooldown.d.ts.map +1 -0
- package/dist/pool/cooldown.js +38 -0
- package/dist/pool/cooldown.js.map +1 -0
- package/dist/pool/limiter.d.ts +11 -0
- package/dist/pool/limiter.d.ts.map +1 -0
- package/dist/pool/limiter.js +27 -0
- package/dist/pool/limiter.js.map +1 -0
- package/dist/query/builder.d.ts +19 -0
- package/dist/query/builder.d.ts.map +1 -0
- package/dist/query/builder.js +110 -0
- package/dist/query/builder.js.map +1 -0
- package/dist/query/hash.d.ts +2 -0
- package/dist/query/hash.d.ts.map +1 -0
- package/dist/query/hash.js +6 -0
- package/dist/query/hash.js.map +1 -0
- package/dist/query/normalize.d.ts +39 -0
- package/dist/query/normalize.d.ts.map +1 -0
- package/dist/query/normalize.js +176 -0
- package/dist/query/normalize.js.map +1 -0
- package/dist/query/targets.d.ts +11 -0
- package/dist/query/targets.d.ts.map +1 -0
- package/dist/query/targets.js +96 -0
- package/dist/query/targets.js.map +1 -0
- package/dist/runner/index.d.ts +4 -0
- package/dist/runner/index.d.ts.map +1 -0
- package/dist/runner/index.js +4 -0
- package/dist/runner/index.js.map +1 -0
- package/dist/runner/retry.d.ts +7 -0
- package/dist/runner/retry.d.ts.map +1 -0
- package/dist/runner/retry.js +26 -0
- package/dist/runner/retry.js.map +1 -0
- package/dist/runner/runner.d.ts +20 -0
- package/dist/runner/runner.d.ts.map +1 -0
- package/dist/runner/runner.js +37 -0
- package/dist/runner/runner.js.map +1 -0
- package/dist/runner/task-queue.d.ts +19 -0
- package/dist/runner/task-queue.d.ts.map +1 -0
- package/dist/runner/task-queue.js +58 -0
- package/dist/runner/task-queue.js.map +1 -0
- package/dist/storage/account-repository.d.ts +50 -0
- package/dist/storage/account-repository.d.ts.map +1 -0
- package/dist/storage/account-repository.js +171 -0
- package/dist/storage/account-repository.js.map +1 -0
- package/dist/storage/account-row.d.ts +4 -0
- package/dist/storage/account-row.d.ts.map +1 -0
- package/dist/storage/account-row.js +46 -0
- package/dist/storage/account-row.js.map +1 -0
- package/dist/storage/checkpoint-repository.d.ts +10 -0
- package/dist/storage/checkpoint-repository.d.ts.map +1 -0
- package/dist/storage/checkpoint-repository.js +30 -0
- package/dist/storage/checkpoint-repository.js.map +1 -0
- package/dist/storage/database.d.ts +18 -0
- package/dist/storage/database.d.ts.map +1 -0
- package/dist/storage/database.js +42 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/storage/index.d.ts +15 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +18 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/manifest-repository.d.ts +9 -0
- package/dist/storage/manifest-repository.d.ts.map +1 -0
- package/dist/storage/manifest-repository.js +22 -0
- package/dist/storage/manifest-repository.js.map +1 -0
- package/dist/storage/run-repository.d.ts +24 -0
- package/dist/storage/run-repository.d.ts.map +1 -0
- package/dist/storage/run-repository.js +51 -0
- package/dist/storage/run-repository.js.map +1 -0
- package/dist/storage/schema.d.ts +3 -0
- package/dist/storage/schema.d.ts.map +1 -0
- package/dist/storage/schema.js +53 -0
- package/dist/storage/schema.js.map +1 -0
- package/dist/transport/graphql.d.ts +8 -0
- package/dist/transport/graphql.d.ts.map +1 -0
- package/dist/transport/graphql.js +104 -0
- package/dist/transport/graphql.js.map +1 -0
- package/dist/transport/proxy.d.ts +5 -0
- package/dist/transport/proxy.d.ts.map +1 -0
- package/dist/transport/proxy.js +36 -0
- package/dist/transport/proxy.js.map +1 -0
- package/dist/transport/session.d.ts +25 -0
- package/dist/transport/session.d.ts.map +1 -0
- package/dist/transport/session.js +138 -0
- package/dist/transport/session.js.map +1 -0
- package/dist/transport/transaction-id.d.ts +20 -0
- package/dist/transport/transaction-id.d.ts.map +1 -0
- package/dist/transport/transaction-id.js +74 -0
- package/dist/transport/transaction-id.js.map +1 -0
- package/dist/utils/fingerprint.d.ts +3 -0
- package/dist/utils/fingerprint.d.ts.map +1 -0
- package/dist/utils/fingerprint.js +20 -0
- package/dist/utils/fingerprint.js.map +1 -0
- package/dist/utils/guards.d.ts +8 -0
- package/dist/utils/guards.d.ts.map +1 -0
- package/dist/utils/guards.js +38 -0
- package/dist/utils/guards.js.map +1 -0
- package/docs/architecture/overview.md +59 -0
- package/docs/decisions/0001-runtime-and-state.md +21 -0
- package/docs/decisions/0002-modular-boundaries.md +16 -0
- package/docs/plans/initial-build.md +18 -0
- package/docs/product/specification.md +87 -0
- package/docs/security/data-boundary.md +27 -0
- package/package.json +89 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export type ErrorCategory = "auth" | "rate_limit" | "network" | "proxy" | "transient" | "runtime";
|
|
2
|
+
export interface ErrorDiagnostics {
|
|
3
|
+
readonly statusCode?: number;
|
|
4
|
+
readonly category?: ErrorCategory;
|
|
5
|
+
readonly account?: string;
|
|
6
|
+
readonly endpoint?: string;
|
|
7
|
+
readonly [key: string]: unknown;
|
|
8
|
+
}
|
|
9
|
+
export declare class XTrawlError extends Error {
|
|
10
|
+
readonly code: string;
|
|
11
|
+
readonly diagnostics: Readonly<ErrorDiagnostics>;
|
|
12
|
+
constructor(code: string, message: string, diagnostics?: ErrorDiagnostics);
|
|
13
|
+
}
|
|
14
|
+
export declare class ConfigError extends XTrawlError {
|
|
15
|
+
constructor(message: string);
|
|
16
|
+
}
|
|
17
|
+
export declare class ManifestError extends XTrawlError {
|
|
18
|
+
constructor(message: string);
|
|
19
|
+
}
|
|
20
|
+
export declare class AccountPoolExhausted extends XTrawlError {
|
|
21
|
+
constructor(message?: string, diagnostics?: ErrorDiagnostics);
|
|
22
|
+
}
|
|
23
|
+
export declare class EngineError extends XTrawlError {
|
|
24
|
+
constructor(message: string, diagnostics?: ErrorDiagnostics);
|
|
25
|
+
}
|
|
26
|
+
export declare class RunFailed extends EngineError {
|
|
27
|
+
constructor(message: string, diagnostics?: ErrorDiagnostics);
|
|
28
|
+
}
|
|
29
|
+
export declare class NetworkError extends RunFailed {
|
|
30
|
+
constructor(message: string, diagnostics?: ErrorDiagnostics);
|
|
31
|
+
}
|
|
32
|
+
export declare class ProxyError extends RunFailed {
|
|
33
|
+
constructor(message: string, diagnostics?: ErrorDiagnostics);
|
|
34
|
+
}
|
|
35
|
+
export declare class RateLimitError extends RunFailed {
|
|
36
|
+
constructor(message: string, diagnostics?: ErrorDiagnostics);
|
|
37
|
+
}
|
|
38
|
+
export declare class AuthError extends RunFailed {
|
|
39
|
+
constructor(message: string, diagnostics?: ErrorDiagnostics);
|
|
40
|
+
}
|
|
41
|
+
export declare class ResumeError extends XTrawlError {
|
|
42
|
+
constructor(message: string);
|
|
43
|
+
}
|
|
44
|
+
export declare class AccountSessionBuildError extends XTrawlError {
|
|
45
|
+
readonly statusCode: number;
|
|
46
|
+
readonly category: ErrorCategory;
|
|
47
|
+
constructor(code: string, reason: string, options?: {
|
|
48
|
+
readonly statusCode?: number;
|
|
49
|
+
readonly category?: ErrorCategory;
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
export declare class AccountSessionAuthError extends AccountSessionBuildError {
|
|
53
|
+
constructor(code: string, reason: string);
|
|
54
|
+
}
|
|
55
|
+
export declare class AccountSessionRuntimeError extends AccountSessionBuildError {
|
|
56
|
+
constructor(code: string, reason: string);
|
|
57
|
+
}
|
|
58
|
+
export declare class AccountSessionTransientError extends AccountSessionBuildError {
|
|
59
|
+
constructor(code: string, reason: string);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/domain/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,YAAY,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;AAElG,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED,qBAAa,WAAY,SAAQ,KAAK;IACpC,SAAgB,IAAI,EAAE,MAAM,CAAC;IAC7B,SAAgB,WAAW,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;gBAErC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAE,gBAAqB;CAMrF;AAED,qBAAa,WAAY,SAAQ,WAAW;gBACvB,OAAO,EAAE,MAAM;CAGnC;AAED,qBAAa,aAAc,SAAQ,WAAW;gBACzB,OAAO,EAAE,MAAM;CAGnC;AAED,qBAAa,oBAAqB,SAAQ,WAAW;gBAChC,OAAO,SAAsC,EAAE,WAAW,GAAE,gBAAqB;CAGrG;AAED,qBAAa,WAAY,SAAQ,WAAW;gBACvB,OAAO,EAAE,MAAM,EAAE,WAAW,GAAE,gBAAqB;CAGvE;AAED,qBAAa,SAAU,SAAQ,WAAW;gBACrB,OAAO,EAAE,MAAM,EAAE,WAAW,GAAE,gBAAqB;CAIvE;AAED,qBAAa,YAAa,SAAQ,SAAS;gBACtB,OAAO,EAAE,MAAM,EAAE,WAAW,GAAE,gBAAqB;CAGvE;AAED,qBAAa,UAAW,SAAQ,SAAS;gBACpB,OAAO,EAAE,MAAM,EAAE,WAAW,GAAE,gBAAqB;CAGvE;AAED,qBAAa,cAAe,SAAQ,SAAS;gBACxB,OAAO,EAAE,MAAM,EAAE,WAAW,GAAE,gBAAqB;CAGvE;AAED,qBAAa,SAAU,SAAQ,SAAS;gBACnB,OAAO,EAAE,MAAM,EAAE,WAAW,GAAE,gBAAqB;CAGvE;AAED,qBAAa,WAAY,SAAQ,WAAW;gBACvB,OAAO,EAAE,MAAM;CAGnC;AAED,qBAAa,wBAAyB,SAAQ,WAAW;IACvD,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,QAAQ,EAAE,aAAa,CAAC;gBAGtC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;QAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAA;KAAO;CASpF;AAED,qBAAa,uBAAwB,SAAQ,wBAAwB;gBAChD,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAGhD;AAED,qBAAa,0BAA2B,SAAQ,wBAAwB;gBACnD,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAGhD;AAED,qBAAa,4BAA6B,SAAQ,wBAAwB;gBACrD,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAGhD"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export class XTrawlError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
diagnostics;
|
|
4
|
+
constructor(code, message, diagnostics = {}) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = new.target.name;
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.diagnostics = diagnostics;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class ConfigError extends XTrawlError {
|
|
12
|
+
constructor(message) {
|
|
13
|
+
super("config_error", message);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export class ManifestError extends XTrawlError {
|
|
17
|
+
constructor(message) {
|
|
18
|
+
super("manifest_error", message);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export class AccountPoolExhausted extends XTrawlError {
|
|
22
|
+
constructor(message = "No eligible account is available.", diagnostics = {}) {
|
|
23
|
+
super("account_pool_exhausted", message, diagnostics);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export class EngineError extends XTrawlError {
|
|
27
|
+
constructor(message, diagnostics = {}) {
|
|
28
|
+
super("engine_error", message, diagnostics);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class RunFailed extends EngineError {
|
|
32
|
+
constructor(message, diagnostics = {}) {
|
|
33
|
+
super(message, diagnostics);
|
|
34
|
+
this.name = new.target.name;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export class NetworkError extends RunFailed {
|
|
38
|
+
constructor(message, diagnostics = {}) {
|
|
39
|
+
super(message, { ...diagnostics, category: "network" });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export class ProxyError extends RunFailed {
|
|
43
|
+
constructor(message, diagnostics = {}) {
|
|
44
|
+
super(message, { ...diagnostics, category: "proxy" });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export class RateLimitError extends RunFailed {
|
|
48
|
+
constructor(message, diagnostics = {}) {
|
|
49
|
+
super(message, { ...diagnostics, category: "rate_limit" });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export class AuthError extends RunFailed {
|
|
53
|
+
constructor(message, diagnostics = {}) {
|
|
54
|
+
super(message, { ...diagnostics, category: "auth" });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
export class ResumeError extends XTrawlError {
|
|
58
|
+
constructor(message) {
|
|
59
|
+
super("resume_error", message);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export class AccountSessionBuildError extends XTrawlError {
|
|
63
|
+
statusCode;
|
|
64
|
+
category;
|
|
65
|
+
constructor(code, reason, options = {}) {
|
|
66
|
+
super(code, `${code}:${reason}`, {
|
|
67
|
+
statusCode: options.statusCode ?? 599,
|
|
68
|
+
category: options.category ?? "transient",
|
|
69
|
+
});
|
|
70
|
+
this.statusCode = options.statusCode ?? 599;
|
|
71
|
+
this.category = options.category ?? "transient";
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export class AccountSessionAuthError extends AccountSessionBuildError {
|
|
75
|
+
constructor(code, reason) {
|
|
76
|
+
super(code, reason, { statusCode: 401, category: "auth" });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
export class AccountSessionRuntimeError extends AccountSessionBuildError {
|
|
80
|
+
constructor(code, reason) {
|
|
81
|
+
super(code, reason, { statusCode: 500, category: "runtime" });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
export class AccountSessionTransientError extends AccountSessionBuildError {
|
|
85
|
+
constructor(code, reason) {
|
|
86
|
+
super(code, reason, { statusCode: 599, category: "transient" });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/domain/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { CookieMap, ProxySettings } from "./accounts.js";
|
|
2
|
+
export interface HttpResponse {
|
|
3
|
+
readonly status: number;
|
|
4
|
+
readonly headers: Readonly<Record<string, string>>;
|
|
5
|
+
text(): Promise<string>;
|
|
6
|
+
json(): Promise<unknown>;
|
|
7
|
+
}
|
|
8
|
+
export interface HttpSession {
|
|
9
|
+
readonly cookies: CookieMap;
|
|
10
|
+
get(url: string, options?: HttpRequestOptions): Promise<HttpResponse>;
|
|
11
|
+
post?(url: string, options?: HttpRequestOptions): Promise<HttpResponse>;
|
|
12
|
+
close(): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
export interface HttpRequestOptions {
|
|
15
|
+
readonly query?: Readonly<Record<string, string>>;
|
|
16
|
+
readonly headers?: Readonly<Record<string, string>>;
|
|
17
|
+
readonly body?: unknown;
|
|
18
|
+
readonly timeoutMs?: number;
|
|
19
|
+
readonly redirect?: "follow" | "error" | "manual";
|
|
20
|
+
}
|
|
21
|
+
export interface SessionFactoryOptions {
|
|
22
|
+
readonly cookies: CookieMap;
|
|
23
|
+
readonly proxy?: string | ProxySettings;
|
|
24
|
+
readonly bearerToken?: string;
|
|
25
|
+
readonly userAgent?: string;
|
|
26
|
+
readonly impersonate?: string;
|
|
27
|
+
readonly httpMode?: "auto" | "async" | "sync";
|
|
28
|
+
}
|
|
29
|
+
export type SessionFactory = (options: SessionFactoryOptions) => HttpSession;
|
|
30
|
+
export interface GraphqlResponse {
|
|
31
|
+
readonly data: unknown | null;
|
|
32
|
+
readonly status: number;
|
|
33
|
+
readonly headers: Readonly<Record<string, string>>;
|
|
34
|
+
readonly snippet: string;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/domain/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACtE,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACxE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;CACnD;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;IACxC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;CAC/C;AAED,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,qBAAqB,KAAK,WAAW,CAAC;AAE7E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/domain/http.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type FeatureFlags = Readonly<Record<string, boolean>>;
|
|
2
|
+
export type FieldToggles = Readonly<Record<string, boolean>>;
|
|
3
|
+
export interface ManifestPayload {
|
|
4
|
+
readonly version: string;
|
|
5
|
+
readonly queryIds: Readonly<Record<string, string>>;
|
|
6
|
+
readonly endpoints: Readonly<Record<string, string>>;
|
|
7
|
+
readonly features?: FeatureFlags;
|
|
8
|
+
readonly operationFeatures?: Readonly<Record<string, FeatureFlags>>;
|
|
9
|
+
readonly operationFieldToggles?: Readonly<Record<string, FieldToggles>>;
|
|
10
|
+
readonly timeoutSeconds?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface Manifest {
|
|
13
|
+
readonly version: string;
|
|
14
|
+
readonly queryIds: Readonly<Record<string, string>>;
|
|
15
|
+
readonly endpoints: Readonly<Record<string, string>>;
|
|
16
|
+
readonly features: FeatureFlags;
|
|
17
|
+
readonly operationFeatures: Readonly<Record<string, FeatureFlags>>;
|
|
18
|
+
readonly operationFieldToggles: Readonly<Record<string, FieldToggles>>;
|
|
19
|
+
readonly timeoutSeconds: number;
|
|
20
|
+
featuresFor(operation: string): FeatureFlags;
|
|
21
|
+
fieldTogglesFor(operation: string): FieldToggles;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/domain/manifest.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAC7D,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE7D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,QAAQ,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IACpE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IACxE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IACnE,QAAQ,CAAC,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IACvE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAAC;IAC7C,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAAC;CAClD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/domain/manifest.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export interface TweetUser {
|
|
2
|
+
readonly screenName?: string;
|
|
3
|
+
readonly name?: string;
|
|
4
|
+
}
|
|
5
|
+
export interface TweetMedia {
|
|
6
|
+
readonly imageLinks: readonly string[];
|
|
7
|
+
}
|
|
8
|
+
export interface TweetRecord {
|
|
9
|
+
readonly tweetId: string;
|
|
10
|
+
readonly user: TweetUser;
|
|
11
|
+
readonly timestamp?: string;
|
|
12
|
+
readonly text?: string;
|
|
13
|
+
readonly embeddedText?: string;
|
|
14
|
+
readonly comments: number;
|
|
15
|
+
readonly likes: number;
|
|
16
|
+
readonly retweets: number;
|
|
17
|
+
readonly media: TweetMedia;
|
|
18
|
+
readonly tweetUrl?: string;
|
|
19
|
+
readonly raw?: Readonly<Record<string, unknown>>;
|
|
20
|
+
}
|
|
21
|
+
export interface RunStats {
|
|
22
|
+
readonly tweetsCount: number;
|
|
23
|
+
readonly tasksTotal: number;
|
|
24
|
+
readonly tasksDone: number;
|
|
25
|
+
readonly tasksFailed: number;
|
|
26
|
+
readonly retries: number;
|
|
27
|
+
}
|
|
28
|
+
export interface SearchResult {
|
|
29
|
+
readonly tweets: readonly TweetRecord[];
|
|
30
|
+
readonly stats: RunStats;
|
|
31
|
+
}
|
|
32
|
+
export interface ProfileRecord {
|
|
33
|
+
readonly input: {
|
|
34
|
+
readonly raw?: string;
|
|
35
|
+
readonly source?: string;
|
|
36
|
+
};
|
|
37
|
+
readonly userId?: string;
|
|
38
|
+
readonly username?: string;
|
|
39
|
+
readonly name?: string;
|
|
40
|
+
readonly description?: string;
|
|
41
|
+
readonly location?: string;
|
|
42
|
+
readonly createdAt?: string;
|
|
43
|
+
readonly followersCount: number;
|
|
44
|
+
readonly followingCount: number;
|
|
45
|
+
readonly statusesCount: number;
|
|
46
|
+
readonly favouritesCount: number;
|
|
47
|
+
readonly mediaCount: number;
|
|
48
|
+
readonly listedCount: number;
|
|
49
|
+
readonly verified: boolean;
|
|
50
|
+
readonly blueVerified: boolean;
|
|
51
|
+
readonly protected: boolean;
|
|
52
|
+
readonly profileImageUrl?: string;
|
|
53
|
+
readonly profileBannerUrl?: string;
|
|
54
|
+
readonly url?: string;
|
|
55
|
+
readonly raw?: Readonly<Record<string, unknown>>;
|
|
56
|
+
}
|
|
57
|
+
export interface FollowRecord extends Omit<ProfileRecord, "input"> {
|
|
58
|
+
readonly type: "followers" | "following" | "verified_followers";
|
|
59
|
+
readonly target: {
|
|
60
|
+
readonly raw?: string;
|
|
61
|
+
readonly source?: string;
|
|
62
|
+
readonly userId?: string;
|
|
63
|
+
readonly username?: string;
|
|
64
|
+
readonly profileUrl?: string;
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=records.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/domain/records.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"records.js","sourceRoot":"","sources":["../../src/domain/records.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
export type TweetType = "all" | "originals_only" | "replies_only" | "retweets_only" | "exclude_replies" | "exclude_retweets";
|
|
2
|
+
export type FollowType = "followers" | "following" | "verified_followers";
|
|
3
|
+
export interface SearchRequest {
|
|
4
|
+
readonly since?: string;
|
|
5
|
+
readonly until?: string;
|
|
6
|
+
readonly searchQuery?: string;
|
|
7
|
+
readonly allWords?: readonly string[];
|
|
8
|
+
readonly anyWords?: readonly string[];
|
|
9
|
+
readonly exactPhrases?: readonly string[];
|
|
10
|
+
readonly excludeWords?: readonly string[];
|
|
11
|
+
readonly hashtagsAny?: readonly string[];
|
|
12
|
+
readonly hashtagsExclude?: readonly string[];
|
|
13
|
+
readonly fromUsers?: readonly string[];
|
|
14
|
+
readonly toUsers?: readonly string[];
|
|
15
|
+
readonly mentioningUsers?: readonly string[];
|
|
16
|
+
readonly tweetType?: TweetType;
|
|
17
|
+
readonly verifiedOnly?: boolean;
|
|
18
|
+
readonly blueVerifiedOnly?: boolean;
|
|
19
|
+
readonly hasImages?: boolean;
|
|
20
|
+
readonly hasVideos?: boolean;
|
|
21
|
+
readonly hasLinks?: boolean;
|
|
22
|
+
readonly hasMentions?: boolean;
|
|
23
|
+
readonly hasHashtags?: boolean;
|
|
24
|
+
readonly minLikes?: number;
|
|
25
|
+
readonly minReplies?: number;
|
|
26
|
+
readonly minRetweets?: number;
|
|
27
|
+
readonly place?: string;
|
|
28
|
+
readonly geocode?: string;
|
|
29
|
+
readonly near?: string;
|
|
30
|
+
readonly within?: string;
|
|
31
|
+
readonly lang?: string;
|
|
32
|
+
readonly limit?: number;
|
|
33
|
+
readonly displayType?: "Top" | "Latest";
|
|
34
|
+
readonly resume?: boolean;
|
|
35
|
+
readonly save?: boolean;
|
|
36
|
+
readonly saveFormat?: "csv" | "json" | "both";
|
|
37
|
+
readonly saveDir?: string;
|
|
38
|
+
readonly saveName?: string;
|
|
39
|
+
readonly maxEmptyPages?: number;
|
|
40
|
+
}
|
|
41
|
+
export interface TargetInput {
|
|
42
|
+
readonly raw?: string;
|
|
43
|
+
readonly username?: string;
|
|
44
|
+
readonly profileUrl?: string;
|
|
45
|
+
readonly userId?: string;
|
|
46
|
+
readonly source?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface UserInfoRequest {
|
|
49
|
+
readonly save?: boolean;
|
|
50
|
+
readonly saveFormat?: "csv" | "json" | "both";
|
|
51
|
+
readonly saveDir?: string;
|
|
52
|
+
readonly saveName?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface ProfileTimelineRequest {
|
|
55
|
+
readonly targets: readonly TargetInput[];
|
|
56
|
+
readonly limit?: number;
|
|
57
|
+
readonly perProfileLimit?: number;
|
|
58
|
+
readonly maxPagesPerProfile?: number;
|
|
59
|
+
readonly resume?: boolean;
|
|
60
|
+
readonly initialCursors?: Readonly<Record<string, string>>;
|
|
61
|
+
readonly cursorHandoff?: boolean;
|
|
62
|
+
readonly maxAccountSwitches?: number;
|
|
63
|
+
readonly allowAnonymous?: boolean;
|
|
64
|
+
readonly maxEmptyPages?: number;
|
|
65
|
+
readonly save?: boolean;
|
|
66
|
+
readonly saveFormat?: "csv" | "json" | "both";
|
|
67
|
+
readonly saveDir?: string;
|
|
68
|
+
readonly saveName?: string;
|
|
69
|
+
}
|
|
70
|
+
export interface FollowsRequest {
|
|
71
|
+
readonly targets: readonly TargetInput[];
|
|
72
|
+
readonly followType: FollowType;
|
|
73
|
+
readonly limit?: number;
|
|
74
|
+
readonly perProfileLimit?: number;
|
|
75
|
+
readonly maxPagesPerProfile?: number;
|
|
76
|
+
readonly resume?: boolean;
|
|
77
|
+
readonly initialCursors?: Readonly<Record<string, string>>;
|
|
78
|
+
readonly cursorHandoff?: boolean;
|
|
79
|
+
readonly maxAccountSwitches?: number;
|
|
80
|
+
readonly maxEmptyPages?: number;
|
|
81
|
+
readonly rawJson?: boolean;
|
|
82
|
+
readonly save?: boolean;
|
|
83
|
+
readonly saveFormat?: "csv" | "json" | "both";
|
|
84
|
+
readonly saveDir?: string;
|
|
85
|
+
readonly saveName?: string;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=requests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requests.d.ts","sourceRoot":"","sources":["../../src/domain/requests.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GACnB,KAAK,GAAG,gBAAgB,GAAG,cAAc,GAAG,eAAe,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;AACvG,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,WAAW,GAAG,oBAAoB,CAAC;AAE1E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;IAC9C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requests.js","sourceRoot":"","sources":["../../src/domain/requests.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ClientConfig } from "../config/types.js";
|
|
2
|
+
import type { HttpSession } from "../domain/http.js";
|
|
3
|
+
import type { FollowType, ProfileTimelineRequest, SearchRequest, TargetInput } from "../domain/requests.js";
|
|
4
|
+
import type { TweetRecord } from "../domain/records.js";
|
|
5
|
+
import type { FollowPage, TweetPage } from "./extractors.js";
|
|
6
|
+
import type { ManifestProvider } from "../manifest/provider.js";
|
|
7
|
+
import type { GraphqlTransport } from "../transport/graphql.js";
|
|
8
|
+
export declare class ApiEngine {
|
|
9
|
+
private readonly config;
|
|
10
|
+
private readonly manifests;
|
|
11
|
+
private readonly transport;
|
|
12
|
+
constructor(config: ClientConfig, manifests: ManifestProvider, transport: GraphqlTransport);
|
|
13
|
+
search(session: HttpSession, request: SearchRequest, cursor?: string): Promise<TweetPage>;
|
|
14
|
+
lookupUser(session: HttpSession, username: string): Promise<Record<string, unknown>>;
|
|
15
|
+
profilePage(session: HttpSession, userId: string, request: ProfileTimelineRequest, cursor?: string): Promise<TweetPage>;
|
|
16
|
+
followsPage(session: HttpSession, userId: string, type: FollowType, cursor?: string): Promise<FollowPage>;
|
|
17
|
+
tweetResult(session: HttpSession, tweetId: string): Promise<TweetRecord | undefined>;
|
|
18
|
+
private graphql;
|
|
19
|
+
resolveTarget(session: HttpSession, target: TargetInput): Promise<{
|
|
20
|
+
readonly username: string;
|
|
21
|
+
readonly userId: string;
|
|
22
|
+
readonly raw: Record<string, unknown>;
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=api-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-engine.d.ts","sourceRoot":"","sources":["../../src/engine/api-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAmB,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC5G,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQ7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAYhE,qBAAa,SAAS;IAElB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAFT,MAAM,EAAE,YAAY,EACpB,SAAS,EAAE,gBAAgB,EAC3B,SAAS,EAAE,gBAAgB;IAGjC,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAWzF,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAapF,WAAW,CACtB,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,sBAAsB,EAC/B,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,SAAS,CAAC;IAWR,WAAW,CACtB,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,UAAU,EAChB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,CAAC;IAiBT,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;YAWnF,OAAO;IA2BR,aAAa,CACxB,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CAW1G"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { extractFollows, extractProfileTweets, extractSearchTweets, extractTweetResult, extractUserResult, } from "./extractors.js";
|
|
2
|
+
import { buildFollowsParams, buildProfileTimelineParams, buildSearchParams, buildTweetResultParams, buildUserLookupParams, endpointFor, OPERATION, } from "../query/builder.js";
|
|
3
|
+
import { NetworkError } from "../domain/errors.js";
|
|
4
|
+
export class ApiEngine {
|
|
5
|
+
config;
|
|
6
|
+
manifests;
|
|
7
|
+
transport;
|
|
8
|
+
constructor(config, manifests, transport) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
this.manifests = manifests;
|
|
11
|
+
this.transport = transport;
|
|
12
|
+
}
|
|
13
|
+
async search(session, request, cursor) {
|
|
14
|
+
const response = await this.graphql(session, OPERATION.search, (manifest) => buildSearchParams(request, manifest, cursor, this.config.apiPageSize));
|
|
15
|
+
if (response.status !== 200 || !response.data)
|
|
16
|
+
throw new NetworkError(`Search request returned status ${response.status}.`, {
|
|
17
|
+
statusCode: response.status,
|
|
18
|
+
});
|
|
19
|
+
return extractSearchTweets(response.data);
|
|
20
|
+
}
|
|
21
|
+
async lookupUser(session, username) {
|
|
22
|
+
const response = await this.graphql(session, OPERATION.userLookup, (manifest) => buildUserLookupParams(username, manifest));
|
|
23
|
+
if (response.status !== 200 || !response.data)
|
|
24
|
+
throw new NetworkError(`User lookup returned status ${response.status}.`, {
|
|
25
|
+
statusCode: response.status,
|
|
26
|
+
});
|
|
27
|
+
const user = extractUserResult(response.data);
|
|
28
|
+
if (!user)
|
|
29
|
+
throw new NetworkError(`User ${username} was not found.`, { statusCode: 404 });
|
|
30
|
+
return user;
|
|
31
|
+
}
|
|
32
|
+
async profilePage(session, userId, request, cursor) {
|
|
33
|
+
const response = await this.graphql(session, OPERATION.profileTimeline, (manifest) => buildProfileTimelineParams(userId, request, manifest, cursor, this.config.apiPageSize));
|
|
34
|
+
if (response.status !== 200 || !response.data)
|
|
35
|
+
throw new NetworkError(`Profile timeline returned status ${response.status}.`, {
|
|
36
|
+
statusCode: response.status,
|
|
37
|
+
});
|
|
38
|
+
return extractProfileTweets(response.data);
|
|
39
|
+
}
|
|
40
|
+
async followsPage(session, userId, type, cursor) {
|
|
41
|
+
const operation = type === "followers"
|
|
42
|
+
? OPERATION.followers
|
|
43
|
+
: type === "verified_followers"
|
|
44
|
+
? OPERATION.verifiedFollowers
|
|
45
|
+
: OPERATION.following;
|
|
46
|
+
const response = await this.graphql(session, operation, (manifest) => buildFollowsParams(userId, operation, manifest, cursor, this.config.apiPageSize));
|
|
47
|
+
if (response.status !== 200 || !response.data)
|
|
48
|
+
throw new NetworkError(`Relationship request returned status ${response.status}.`, {
|
|
49
|
+
statusCode: response.status,
|
|
50
|
+
});
|
|
51
|
+
return extractFollows(response.data);
|
|
52
|
+
}
|
|
53
|
+
async tweetResult(session, tweetId) {
|
|
54
|
+
const response = await this.graphql(session, OPERATION.tweetResult, (manifest) => buildTweetResultParams(tweetId, manifest));
|
|
55
|
+
if (response.status !== 200 || !response.data)
|
|
56
|
+
throw new NetworkError(`Tweet lookup returned status ${response.status}.`, {
|
|
57
|
+
statusCode: response.status,
|
|
58
|
+
});
|
|
59
|
+
return extractTweetResult(response.data);
|
|
60
|
+
}
|
|
61
|
+
async graphql(session, operation, buildParams) {
|
|
62
|
+
const send = (manifest) => this.transport.get(session, endpointFor(manifest, operation), buildParams(manifest), manifest.timeoutSeconds * 1_000);
|
|
63
|
+
const manifest = await this.manifests.getManifest();
|
|
64
|
+
try {
|
|
65
|
+
return await send(manifest);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (!isOperationMismatch(error))
|
|
69
|
+
throw error;
|
|
70
|
+
let refreshed;
|
|
71
|
+
try {
|
|
72
|
+
refreshed = await this.manifests.refreshLive(session.cookies.auth_token);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
return send(refreshed);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async resolveTarget(session, target) {
|
|
81
|
+
const username = target.username?.replace(/^@/u, "") ?? target.profileUrl?.split("/").filter(Boolean).pop();
|
|
82
|
+
if (target.userId && !username)
|
|
83
|
+
return { username: target.userId, userId: target.userId, raw: {} };
|
|
84
|
+
if (!username)
|
|
85
|
+
throw new NetworkError("Target has no resolvable username or user ID.", { statusCode: 400 });
|
|
86
|
+
const raw = target.userId ? {} : await this.lookupUser(session, username);
|
|
87
|
+
const userId = target.userId ?? String(raw.rest_id ?? raw.id ?? "");
|
|
88
|
+
if (!userId)
|
|
89
|
+
throw new NetworkError(`Target ${username} has no user id.`, { statusCode: 404 });
|
|
90
|
+
return { username, userId, raw };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function isOperationMismatch(error) {
|
|
94
|
+
if (!(error instanceof NetworkError))
|
|
95
|
+
return false;
|
|
96
|
+
return error.diagnostics.statusCode === 404 || error.diagnostics.statusCode === 422;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=api-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-engine.js","sourceRoot":"","sources":["../../src/engine/api-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { FollowRecord, ProfileRecord, TweetRecord } from "../domain/records.js";
|
|
2
|
+
export interface TweetPage {
|
|
3
|
+
readonly tweets: readonly TweetRecord[];
|
|
4
|
+
readonly cursor?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface FollowPage {
|
|
7
|
+
readonly users: readonly Record<string, unknown>[];
|
|
8
|
+
readonly cursor?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function extractUserResult(payload: unknown): Record<string, unknown> | undefined;
|
|
11
|
+
export declare function mapProfile(user: Record<string, unknown>, target: {
|
|
12
|
+
readonly raw?: string;
|
|
13
|
+
readonly source?: string;
|
|
14
|
+
}, fallbackUsername?: string): ProfileRecord;
|
|
15
|
+
export declare function mapFollow(user: Record<string, unknown>, target: {
|
|
16
|
+
readonly raw?: string;
|
|
17
|
+
readonly source?: string;
|
|
18
|
+
readonly userId?: string;
|
|
19
|
+
readonly username?: string;
|
|
20
|
+
readonly profileUrl?: string;
|
|
21
|
+
}, type: FollowRecord["type"], includeRaw?: boolean): FollowRecord;
|
|
22
|
+
export declare function extractSearchTweets(payload: unknown): TweetPage;
|
|
23
|
+
export declare function extractProfileTweets(payload: unknown): TweetPage;
|
|
24
|
+
export declare function extractTweetResult(payload: unknown): TweetRecord | undefined;
|
|
25
|
+
export declare function extractFollows(payload: unknown): FollowPage;
|
|
26
|
+
export declare function normalizeUser(user: Record<string, unknown>, fallbackUsername?: string): Omit<ProfileRecord, "input" | "raw">;
|
|
27
|
+
//# sourceMappingURL=extractors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extractors.d.ts","sourceRoot":"","sources":["../../src/engine/extractors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGrF,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IACnD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAKvF;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE;IAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EAC3D,gBAAgB,CAAC,EAAE,MAAM,GACxB,aAAa,CAUf;AAED,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE;IACN,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B,EACD,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,EAC1B,UAAU,UAAQ,GACjB,YAAY,CAad;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAO/D;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAQhE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAM5E;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAmB3D;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,gBAAgB,CAAC,EAAE,MAAM,GACxB,IAAI,CAAC,aAAa,EAAE,OAAO,GAAG,KAAK,CAAC,CAkDtC"}
|