xtrawl 0.1.0 → 0.1.1

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 (46) hide show
  1. package/DOCUMENTATION.md +76 -4
  2. package/LICENSE +21 -0
  3. package/README.md +142 -19
  4. package/dist/auth/account-state.d.ts +3 -0
  5. package/dist/auth/account-state.d.ts.map +1 -0
  6. package/dist/auth/account-state.js +85 -0
  7. package/dist/auth/account-state.js.map +1 -0
  8. package/dist/client/accounts.d.ts +31 -0
  9. package/dist/client/accounts.d.ts.map +1 -0
  10. package/dist/client/accounts.js +163 -0
  11. package/dist/client/accounts.js.map +1 -0
  12. package/dist/client/client.d.ts +13 -3
  13. package/dist/client/client.d.ts.map +1 -1
  14. package/dist/client/client.js +54 -18
  15. package/dist/client/client.js.map +1 -1
  16. package/dist/client/database.d.ts +2 -1
  17. package/dist/client/database.d.ts.map +1 -1
  18. package/dist/client/database.js +1 -1
  19. package/dist/client/database.js.map +1 -1
  20. package/dist/client/types.d.ts +2 -0
  21. package/dist/client/types.d.ts.map +1 -1
  22. package/dist/domain/account-state.d.ts +68 -0
  23. package/dist/domain/account-state.d.ts.map +1 -0
  24. package/dist/domain/account-state.js +2 -0
  25. package/dist/domain/account-state.js.map +1 -0
  26. package/dist/domain/errors.d.ts +3 -0
  27. package/dist/domain/errors.d.ts.map +1 -1
  28. package/dist/domain/errors.js +5 -0
  29. package/dist/domain/errors.js.map +1 -1
  30. package/dist/index.d.ts +5 -2
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +3 -1
  33. package/dist/index.js.map +1 -1
  34. package/dist/pool/account-pool.d.ts +12 -5
  35. package/dist/pool/account-pool.d.ts.map +1 -1
  36. package/dist/pool/account-pool.js +102 -13
  37. package/dist/pool/account-pool.js.map +1 -1
  38. package/dist/storage/account-repository.d.ts +8 -1
  39. package/dist/storage/account-repository.d.ts.map +1 -1
  40. package/dist/storage/account-repository.js +63 -26
  41. package/dist/storage/account-repository.js.map +1 -1
  42. package/docs/architecture/overview.md +13 -10
  43. package/docs/decisions/0003-caller-owned-account-state.md +33 -0
  44. package/docs/product/specification.md +8 -0
  45. package/docs/security/data-boundary.md +9 -2
  46. package/package.json +4 -3
@@ -1,4 +1,5 @@
1
- import { AccountPoolExhausted, AccountSessionBuildError, AuthError, XTrawlError, NetworkError, RateLimitError, ProxyError, } from "../domain/errors.js";
1
+ import { randomUUID } from "node:crypto";
2
+ import { AccountPoolExhausted, AccountSessionBuildError, AccountStateError, AuthError, XTrawlError, NetworkError, RateLimitError, ProxyError, } from "../domain/errors.js";
2
3
  import { computeCooldown } from "./cooldown.js";
3
4
  import { isRecord } from "../utils/guards.js";
4
5
  import { TokenBucketLimiter, sleep } from "./limiter.js";
@@ -7,12 +8,18 @@ export class AccountPool {
7
8
  sessions;
8
9
  config;
9
10
  repairAccount;
11
+ storeLocation;
12
+ onAccountsChanged;
10
13
  limiters = new Map();
11
- constructor(repository, sessions, config, repairAccount) {
14
+ cachedSummary;
15
+ constructor(repository, sessions, config, repairAccount, initialAccounts = [], storeLocation = `external:${repository.kind ?? "custom"}`, onAccountsChanged) {
12
16
  this.repository = repository;
13
17
  this.sessions = sessions;
14
18
  this.config = config;
15
19
  this.repairAccount = repairAccount;
20
+ this.storeLocation = storeLocation;
21
+ this.onAccountsChanged = onAccountsChanged;
22
+ this.cachedSummary = summarizeAccounts(initialAccounts, this.config, this.storeLocation);
16
23
  }
17
24
  async execute(label, operation, options = {}) {
18
25
  const maxAttempts = this.config.maxTaskAttempts;
@@ -20,7 +27,16 @@ export class AccountPool {
20
27
  let lastError;
21
28
  let repairs = 0;
22
29
  for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
23
- const account = this.repository.lease({ requireAuthMaterial: true });
30
+ const now = Date.now();
31
+ const account = await this.repository.acquireLease({
32
+ now,
33
+ leaseId: randomUUID(),
34
+ leaseExpiresAt: now + this.config.leaseTtlMs,
35
+ utcDate: utcDate(now),
36
+ requireAuthMaterial: true,
37
+ dailyRequestsLimit: this.config.dailyRequestsLimit,
38
+ dailyTweetsLimit: this.config.dailyTweetsLimit,
39
+ });
24
40
  if (!account) {
25
41
  if (lastError)
26
42
  throw lastError;
@@ -30,13 +46,19 @@ export class AccountPool {
30
46
  seenAccounts.add(accountKey);
31
47
  const switchLimit = options.maxAccountSwitches ?? this.config.maxAccountSwitches;
32
48
  if (seenAccounts.size > switchLimit + 1) {
33
- this.repository.release(account.leaseId, { status: "healthy" });
49
+ await this.completeLease(account, {
50
+ status: "healthy",
51
+ availableUntil: 0,
52
+ pages: 0,
53
+ tweets: 0,
54
+ });
34
55
  if (lastError)
35
56
  throw lastError;
36
57
  throw new AccountPoolExhausted(`Account-switch limit reached for ${label}.`);
37
58
  }
38
59
  let session;
39
60
  let operationStarted = false;
61
+ let leaseCompleted = false;
40
62
  const heartbeat = this.startHeartbeat(account);
41
63
  try {
42
64
  if (this.config.proxyCheckOnLease)
@@ -48,15 +70,23 @@ export class AccountPool {
48
70
  await this.limiterFor(account).acquire();
49
71
  operationStarted = true;
50
72
  const value = await operation({ account, session });
51
- this.repository.recordUsage(account.leaseId, 1, Math.max(0, options.countTweets?.(value) ?? countTweets(value)));
52
- this.repository.release(account.leaseId, { status: "healthy" });
73
+ await this.completeLease(account, {
74
+ status: "healthy",
75
+ availableUntil: 0,
76
+ pages: 1,
77
+ tweets: Math.max(0, options.countTweets?.(value) ?? countTweets(value)),
78
+ });
79
+ leaseCompleted = true;
53
80
  return value;
54
81
  }
55
82
  catch (error) {
56
83
  lastError = error;
57
- if (operationStarted)
58
- this.repository.recordUsage(account.leaseId, 1, 0);
59
- this.releaseFailure(account, error);
84
+ if (!leaseCompleted)
85
+ await this.completeLease(account, {
86
+ ...this.failureCompletion(error),
87
+ pages: operationStarted ? 1 : 0,
88
+ tweets: 0,
89
+ });
60
90
  if (error instanceof AuthError && this.repairAccount && repairs < this.config.maxFallbackAttempts) {
61
91
  repairs += 1;
62
92
  await this.repairAccount(account).catch(() => false);
@@ -77,9 +107,17 @@ export class AccountPool {
77
107
  : new AccountPoolExhausted(`No eligible account for ${label}.`);
78
108
  }
79
109
  get summary() {
80
- return this.repository.summary();
110
+ if (!this.storeLocation.startsWith("external:")) {
111
+ const current = this.repository.list();
112
+ if (Array.isArray(current))
113
+ this.updateAccounts(current);
114
+ }
115
+ return this.cachedSummary;
81
116
  }
82
- releaseFailure(account, error) {
117
+ updateAccounts(accounts) {
118
+ this.cachedSummary = summarizeAccounts(accounts, this.config, this.storeLocation);
119
+ }
120
+ failureCompletion(error) {
83
121
  const status = error instanceof XTrawlError && typeof error.diagnostics.statusCode === "number"
84
122
  ? error.diagnostics.statusCode
85
123
  : error instanceof AccountSessionBuildError
@@ -105,12 +143,41 @@ export class AccountPool {
105
143
  : {}),
106
144
  jitterMs: this.config.cooldownJitterMs,
107
145
  });
108
- this.repository.release(account.leaseId, decision);
146
+ return {
147
+ status: decision.status,
148
+ availableUntil: decision.availableUntil,
149
+ ...(decision.lastErrorCode === undefined ? {} : { lastErrorCode: decision.lastErrorCode }),
150
+ ...(decision.reason === undefined ? {} : { cooldownReason: decision.reason }),
151
+ };
152
+ }
153
+ async completeLease(account, completion) {
154
+ const now = Date.now();
155
+ const completed = await this.repository.completeLease({
156
+ ...completion,
157
+ leaseId: account.leaseId,
158
+ now,
159
+ utcDate: utcDate(now),
160
+ });
161
+ if (!completed)
162
+ throw new AccountStateError("The account lease could not be completed.", {
163
+ account: account.username,
164
+ });
165
+ await this.refreshSummary().catch(() => undefined);
109
166
  }
110
167
  startHeartbeat(account) {
111
168
  if (this.config.leaseHeartbeatMs <= 0)
112
169
  return undefined;
113
- const timer = setInterval(() => this.repository.heartbeat(account.leaseId, this.config.leaseTtlMs), this.config.leaseHeartbeatMs);
170
+ let pending = false;
171
+ const timer = setInterval(() => {
172
+ if (pending)
173
+ return;
174
+ pending = true;
175
+ void Promise.resolve(this.repository.renewLease(account.leaseId, Date.now() + this.config.leaseTtlMs))
176
+ .catch(() => false)
177
+ .finally(() => {
178
+ pending = false;
179
+ });
180
+ }, this.config.leaseHeartbeatMs);
114
181
  timer.unref();
115
182
  return timer;
116
183
  }
@@ -123,6 +190,28 @@ export class AccountPool {
123
190
  this.limiters.set(key, limiter);
124
191
  return limiter;
125
192
  }
193
+ async refreshSummary() {
194
+ const accounts = await this.repository.list();
195
+ this.updateAccounts(accounts);
196
+ this.onAccountsChanged?.(accounts);
197
+ }
198
+ }
199
+ export function summarizeAccounts(accounts, config, location, now = Date.now()) {
200
+ return {
201
+ dbPath: location,
202
+ total: accounts.length,
203
+ eligible: accounts.filter((account) => account.status !== 0 &&
204
+ !(account.status === 2 && (account.availableUntil ?? 0) > now) &&
205
+ Boolean(account.authToken && account.csrfToken) &&
206
+ (account.dailyRequests ?? 0) < config.dailyRequestsLimit &&
207
+ (account.dailyTweets ?? 0) < config.dailyTweetsLimit).length,
208
+ unusable: accounts.filter((account) => account.status === 0).length,
209
+ coolingDown: accounts.filter((account) => account.status === 2 && (account.availableUntil ?? 0) > now)
210
+ .length,
211
+ };
212
+ }
213
+ function utcDate(now) {
214
+ return new Date(now).toISOString().slice(0, 10);
126
215
  }
127
216
  function countTweets(value) {
128
217
  if (Array.isArray(value))
@@ -1 +1 @@
1
- {"version":3,"file":"account-pool.js","sourceRoot":"","sources":["../../src/pool/account-pool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"account-pool.js","sourceRoot":"","sources":["../../src/pool/account-pool.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import type { AccountLease, AccountRecord, AccountSummary, ProxySettings } from "../domain/accounts.js";
2
2
  import type { AccountStatus } from "../domain/accounts.js";
3
+ import type { AccountLeaseCompletion, AccountLeaseRequest, AccountStateStore } from "../domain/account-state.js";
3
4
  import { StateDatabase } from "./database.js";
4
5
  export { rowToAccount } from "./account-row.js";
5
6
  export interface ReleaseOptions {
@@ -14,8 +15,9 @@ export interface AccountRepositoryOptions {
14
15
  readonly dailyTweetsLimit?: number;
15
16
  readonly leaseTtlMs?: number;
16
17
  }
17
- export declare class AccountRepository {
18
+ export declare class AccountRepository implements AccountStateStore {
18
19
  private readonly database;
20
+ readonly kind = "sqlite";
19
21
  private readonly dailyRequestsLimit;
20
22
  private readonly dailyTweetsLimit;
21
23
  private readonly leaseTtlMs;
@@ -25,6 +27,7 @@ export declare class AccountRepository {
25
27
  findByAuthToken(authToken: string): AccountRecord | undefined;
26
28
  list(): AccountRecord[];
27
29
  delete(username: string): boolean;
30
+ replaceAll(accounts: readonly AccountRecord[]): void;
28
31
  setProxy(username: string, proxy?: string | ProxySettings): boolean;
29
32
  summary(): AccountSummary;
30
33
  eligible(account: AccountRecord, now?: number): boolean;
@@ -32,9 +35,12 @@ export declare class AccountRepository {
32
35
  readonly requireAuthMaterial?: boolean;
33
36
  readonly now?: number;
34
37
  }): AccountLease | undefined;
38
+ acquireLease(request: AccountLeaseRequest): AccountLease | undefined;
35
39
  heartbeat(leaseId: string, extendByMs: number): boolean;
40
+ renewLease(leaseId: string, leaseExpiresAt: number): boolean;
36
41
  recordUsage(leaseId: string, pages?: number, tweets?: number): boolean;
37
42
  release(leaseId: string, options?: ReleaseOptions): boolean;
43
+ completeLease(completion: AccountLeaseCompletion): boolean;
38
44
  markUnusable(username: string, code: number, reason: string): boolean;
39
45
  resetCooldowns(usernames?: readonly string[], includeUnusable?: boolean): number;
40
46
  clearLeases(expiredOnly?: boolean): number;
@@ -43,6 +49,7 @@ export declare class AccountRepository {
43
49
  readonly removed: number;
44
50
  readonly merged: number;
45
51
  };
52
+ private insert;
46
53
  private resetExpiredCooldowns;
47
54
  private resetDailyCounters;
48
55
  private isEligible;
@@ -1 +1 @@
1
- {"version":3,"file":"account-repository.d.ts","sourceRoot":"","sources":["../../src/storage/account-repository.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,cAAc,EAEd,aAAa,EACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAMD,qBAAa,iBAAiB;IAM1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAL3B,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAGjB,QAAQ,EAAE,aAAa,EACxC,OAAO,GAAE,wBAA6B;IAOjC,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,aAAa;IAwD7C,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAK3D,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAK7D,IAAI,IAAI,aAAa,EAAE;IAIvB,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,OAAO;IAUnE,OAAO,IAAI,cAAc;IAYzB,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,SAAa,GAAG,OAAO;IAI3D,KAAK,CACV,OAAO,GAAE;QAAE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAO,GAC9E,YAAY,GAAG,SAAS;IAwBpB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAUvD,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,MAAM,SAAI,GAAG,OAAO;IAc5D,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO;IAe/D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAWrE,cAAc,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,eAAe,UAAQ,GAAG,MAAM;IAoB9E,WAAW,CAAC,WAAW,UAAO,GAAG,MAAM;IAYvC,eAAe,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM;IAiBtD,6BAA6B,IAAI;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAyB7F,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,UAAU;CAcnB"}
1
+ {"version":3,"file":"account-repository.d.ts","sourceRoot":"","sources":["../../src/storage/account-repository.ts"],"names":[],"mappings":"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"}
@@ -7,6 +7,7 @@ const DEFAULT_DAILY_TWEETS_LIMIT = 600;
7
7
  const DEFAULT_LEASE_TTL_MS = 120_000;
8
8
  export class AccountRepository {
9
9
  database;
10
+ kind = "sqlite";
10
11
  dailyRequestsLimit;
11
12
  dailyTweetsLimit;
12
13
  leaseTtlMs;
@@ -19,16 +20,13 @@ export class AccountRepository {
19
20
  upsert(account) {
20
21
  const existing = this.findByUsername(account.username) ??
21
22
  (account.authToken ? this.findByAuthToken(account.authToken) : undefined);
22
- if (!existing) {
23
- this.database.run(`INSERT INTO accounts (username,password,email,email_password,two_factor_secret,auth_token,csrf_token,cookies_json,bearer_token,proxy_json,status,available_until,daily_requests,daily_tweets,total_tweets,last_reset_date)
24
- VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`, account.username, account.password ?? null, account.email ?? null, account.emailPassword ?? null, account.twoFactorSecret ?? null, account.authToken ?? null, account.csrfToken ?? null, JSON.stringify(account.cookies), account.bearerToken ?? null, account.proxy ? JSON.stringify(account.proxy) : null, account.status ?? 1, account.availableUntil ?? 0, account.dailyRequests ?? 0, account.dailyTweets ?? 0, account.totalTweets ?? 0, account.lastResetDate ?? utcDate());
25
- return this.findByUsername(account.username);
26
- }
23
+ if (!existing)
24
+ return this.insert(account);
27
25
  const username = existing.username.startsWith("auth_") && account.username !== existing.username
28
26
  ? account.username
29
27
  : existing.username;
30
28
  const cookies = { ...existing.cookies, ...account.cookies };
31
- this.database.run(`UPDATE accounts SET username=?, password=?, email=?, email_password=?, two_factor_secret=?, auth_token=?, csrf_token=?, cookies_json=?, bearer_token=?, proxy_json=?, status=?, available_until=?, daily_requests=?, daily_tweets=?, total_tweets=?, last_reset_date=? WHERE id=?`, username, account.password ?? existing.password ?? null, account.email ?? existing.email ?? null, account.emailPassword ?? existing.emailPassword ?? null, account.twoFactorSecret ?? existing.twoFactorSecret ?? null, account.authToken ?? existing.authToken ?? null, account.csrfToken ?? existing.csrfToken ?? null, JSON.stringify(cookies), account.bearerToken ?? existing.bearerToken ?? null, account.proxy ? JSON.stringify(account.proxy) : existing.proxy ? JSON.stringify(existing.proxy) : null, account.status ?? existing.status ?? 1, account.availableUntil ?? existing.availableUntil ?? 0, account.dailyRequests ?? existing.dailyRequests ?? 0, account.dailyTweets ?? existing.dailyTweets ?? 0, account.totalTweets ?? existing.totalTweets ?? 0, account.lastResetDate ?? existing.lastResetDate ?? utcDate(), existing.id ?? null);
29
+ this.database.run(`UPDATE accounts SET username=?, password=?, email=?, email_password=?, two_factor_secret=?, auth_token=?, csrf_token=?, cookies_json=?, bearer_token=?, proxy_json=?, status=?, available_until=?, daily_requests=?, daily_tweets=?, total_tweets=?, last_reset_date=?, last_used=?, last_error_code=?, cooldown_reason=? WHERE id=?`, username, account.password ?? existing.password ?? null, account.email ?? existing.email ?? null, account.emailPassword ?? existing.emailPassword ?? null, account.twoFactorSecret ?? existing.twoFactorSecret ?? null, account.authToken ?? existing.authToken ?? null, account.csrfToken ?? existing.csrfToken ?? null, JSON.stringify(cookies), account.bearerToken ?? existing.bearerToken ?? null, account.proxy ? JSON.stringify(account.proxy) : existing.proxy ? JSON.stringify(existing.proxy) : null, account.status ?? existing.status ?? 1, account.availableUntil ?? existing.availableUntil ?? 0, account.dailyRequests ?? existing.dailyRequests ?? 0, account.dailyTweets ?? existing.dailyTweets ?? 0, account.totalTweets ?? existing.totalTweets ?? 0, account.lastResetDate ?? existing.lastResetDate ?? utcDate(), account.lastUsed ?? existing.lastUsed ?? 0, account.lastErrorCode ?? existing.lastErrorCode ?? null, account.cooldownReason ?? existing.cooldownReason ?? null, existing.id ?? null);
32
30
  return this.findByUsername(username);
33
31
  }
34
32
  findByUsername(username) {
@@ -45,6 +43,13 @@ export class AccountRepository {
45
43
  delete(username) {
46
44
  return this.database.run("DELETE FROM accounts WHERE username=?", username).changes === 1;
47
45
  }
46
+ replaceAll(accounts) {
47
+ this.database.transaction(() => {
48
+ this.database.run("DELETE FROM accounts");
49
+ for (const account of accounts)
50
+ this.insert(account);
51
+ });
52
+ }
48
53
  setProxy(username, proxy) {
49
54
  return (this.database.run("UPDATE accounts SET proxy_json=? WHERE username=?", proxy === undefined ? null : JSON.stringify(proxy), username).changes === 1);
50
55
  }
@@ -64,22 +69,39 @@ export class AccountRepository {
64
69
  }
65
70
  lease(options = {}) {
66
71
  const now = options.now ?? Date.now();
67
- this.resetExpiredCooldowns(now);
68
- this.resetDailyCounters();
69
- const candidates = this.list().filter((row) => this.isEligible(row, now, false, options.requireAuthMaterial ?? true));
70
- const selected = candidates.sort((a, b) => (a.lastUsed ?? 0) - (b.lastUsed ?? 0))[0];
71
- if (!selected?.id)
72
- return undefined;
73
- const leaseId = randomUUID();
74
- const expiresAt = now + this.leaseTtlMs;
75
- const changed = this.database.run("UPDATE accounts SET lease_id=?, lease_expires_at=?, last_used=? WHERE id=? AND (lease_id IS NULL OR lease_expires_at<?)", leaseId, expiresAt, now, selected.id, now).changes;
76
- if (changed !== 1)
77
- return undefined;
78
- const current = this.findByUsername(selected.username);
79
- return current ? { ...current, leaseId, leaseExpiresAt: expiresAt } : undefined;
72
+ return this.acquireLease({
73
+ now,
74
+ leaseId: randomUUID(),
75
+ leaseExpiresAt: now + this.leaseTtlMs,
76
+ utcDate: utcDate(now),
77
+ requireAuthMaterial: options.requireAuthMaterial ?? true,
78
+ dailyRequestsLimit: this.dailyRequestsLimit,
79
+ dailyTweetsLimit: this.dailyTweetsLimit,
80
+ });
81
+ }
82
+ acquireLease(request) {
83
+ return this.database.transaction(() => {
84
+ this.resetExpiredCooldowns(request.now);
85
+ this.resetDailyCounters(request.utcDate);
86
+ const candidates = this.list().filter((row) => this.isEligible(row, request.now, false, request.requireAuthMaterial, request.dailyRequestsLimit, request.dailyTweetsLimit));
87
+ const selected = candidates.sort((a, b) => (a.lastUsed ?? 0) - (b.lastUsed ?? 0))[0];
88
+ if (!selected?.id)
89
+ return undefined;
90
+ const changed = this.database.run("UPDATE accounts SET lease_id=?, lease_expires_at=?, last_used=? WHERE id=? AND (lease_id IS NULL OR lease_expires_at<?)", request.leaseId, request.leaseExpiresAt, request.now, selected.id, request.now).changes;
91
+ if (changed !== 1)
92
+ return undefined;
93
+ const current = this.findByUsername(selected.username);
94
+ return current
95
+ ? { ...current, leaseId: request.leaseId, leaseExpiresAt: request.leaseExpiresAt }
96
+ : undefined;
97
+ });
80
98
  }
81
99
  heartbeat(leaseId, extendByMs) {
82
- return (this.database.run("UPDATE accounts SET lease_expires_at=? WHERE lease_id=?", Date.now() + extendByMs, leaseId).changes === 1);
100
+ return this.renewLease(leaseId, Date.now() + extendByMs);
101
+ }
102
+ renewLease(leaseId, leaseExpiresAt) {
103
+ return (this.database.run("UPDATE accounts SET lease_expires_at=? WHERE lease_id=?", leaseExpiresAt, leaseId)
104
+ .changes === 1);
83
105
  }
84
106
  recordUsage(leaseId, pages = 1, tweets = 0) {
85
107
  this.resetDailyCounters();
@@ -90,6 +112,17 @@ export class AccountRepository {
90
112
  const availableUntil = options.availableUntil ?? (status === 1 ? 0 : Date.now());
91
113
  return (this.database.run("UPDATE accounts SET lease_id=NULL, lease_expires_at=NULL, status=?, available_until=?, last_error_code=?, cooldown_reason=? WHERE lease_id=?", status, availableUntil, options.lastErrorCode ?? null, options.cooldownReason ?? null, leaseId).changes === 1);
92
114
  }
115
+ completeLease(completion) {
116
+ return this.database.transaction(() => {
117
+ this.resetDailyCounters(completion.utcDate);
118
+ const status = completion.status === "unusable" ? 0 : completion.status === "cooling_down" ? 2 : 1;
119
+ return (this.database.run(`UPDATE accounts
120
+ SET lease_id=NULL, lease_expires_at=NULL, status=?, available_until=?,
121
+ daily_requests=daily_requests+?, daily_tweets=daily_tweets+?,
122
+ total_tweets=total_tweets+?, last_used=?, last_error_code=?, cooldown_reason=?
123
+ WHERE lease_id=?`, status, completion.availableUntil, Math.max(0, completion.pages), Math.max(0, completion.tweets), Math.max(0, completion.tweets), completion.now, completion.lastErrorCode ?? null, completion.cooldownReason ?? null, completion.leaseId).changes === 1);
124
+ });
125
+ }
93
126
  markUnusable(username, code, reason) {
94
127
  return (this.database.run("UPDATE accounts SET status=0, last_error_code=?, cooldown_reason=?, lease_id=NULL, lease_expires_at=NULL WHERE username=?", code, reason, username).changes === 1);
95
128
  }
@@ -146,14 +179,18 @@ export class AccountRepository {
146
179
  }
147
180
  return { removed, merged };
148
181
  }
182
+ insert(account) {
183
+ this.database.run(`INSERT INTO accounts (username,password,email,email_password,two_factor_secret,auth_token,csrf_token,cookies_json,bearer_token,proxy_json,status,available_until,daily_requests,daily_tweets,total_tweets,last_reset_date,last_used,last_error_code,cooldown_reason)
184
+ VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`, account.username, account.password ?? null, account.email ?? null, account.emailPassword ?? null, account.twoFactorSecret ?? null, account.authToken ?? null, account.csrfToken ?? null, JSON.stringify(account.cookies), account.bearerToken ?? null, account.proxy ? JSON.stringify(account.proxy) : null, account.status ?? 1, account.availableUntil ?? 0, account.dailyRequests ?? 0, account.dailyTweets ?? 0, account.totalTweets ?? 0, account.lastResetDate ?? utcDate(), account.lastUsed ?? 0, account.lastErrorCode ?? null, account.cooldownReason ?? null);
185
+ return this.findByUsername(account.username);
186
+ }
149
187
  resetExpiredCooldowns(now) {
150
188
  this.database.run("UPDATE accounts SET status=1, available_until=0, cooldown_reason=NULL WHERE status=2 AND available_until<=?", now);
151
189
  }
152
- resetDailyCounters() {
153
- const today = utcDate();
190
+ resetDailyCounters(today = utcDate()) {
154
191
  this.database.run("UPDATE accounts SET daily_requests=0, daily_tweets=0, last_reset_date=? WHERE last_reset_date IS NULL OR last_reset_date<>?", today, today);
155
192
  }
156
- isEligible(row, now, ignoreLease, requireAuthMaterial = false) {
193
+ isEligible(row, now, ignoreLease, requireAuthMaterial = false, dailyRequestsLimit = this.dailyRequestsLimit, dailyTweetsLimit = this.dailyTweetsLimit) {
157
194
  if (row.status === 0)
158
195
  return false;
159
196
  if (row.status === 2 && (row.availableUntil ?? 0) > now)
@@ -162,10 +199,10 @@ export class AccountRepository {
162
199
  return false;
163
200
  if (requireAuthMaterial && (!row.authToken || !row.csrfToken))
164
201
  return false;
165
- return ((row.dailyRequests ?? 0) < this.dailyRequestsLimit && (row.dailyTweets ?? 0) < this.dailyTweetsLimit);
202
+ return (row.dailyRequests ?? 0) < dailyRequestsLimit && (row.dailyTweets ?? 0) < dailyTweetsLimit;
166
203
  }
167
204
  }
168
- function utcDate() {
169
- return new Date().toISOString().slice(0, 10);
205
+ function utcDate(now = Date.now()) {
206
+ return new Date(now).toISOString().slice(0, 10);
170
207
  }
171
208
  //# sourceMappingURL=account-repository.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"account-repository.js","sourceRoot":"","sources":["../../src/storage/account-repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"account-repository.js","sourceRoot":"","sources":["../../src/storage/account-repository.ts"],"names":[],"mappings":"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"}
@@ -9,10 +9,10 @@ CLI / library facade
9
9
  application client -----> runner / pagination
10
10
  | |
11
11
  | v
12
- | account pool
13
- | / \
14
- v v v
15
- query builders SQLite state session builder
12
+ | account pool <----> account-state store
13
+ | (SQLite default / caller adapter)
14
+ v |
15
+ query builders session builder
16
16
  | |
17
17
  v v
18
18
  GraphQL engine <------------------ HTTP transport
@@ -37,18 +37,21 @@ CLI / library facade
37
37
 
38
38
  ## Persistence topology
39
39
 
40
- One configured SQLite database contains accounts, leases, run records, resume checkpoints, and cached
41
- manifest payloads. Repositories expose typed methods and keep SQL statements local to their owning
42
- files. Raw secrets are stored only when the caller explicitly provisions them; logs and projections
43
- use a token fingerprint.
40
+ One configured SQLite database always contains run records, resume checkpoints, and cached manifest
41
+ payloads. By default it also contains accounts and leases. A caller may replace the account-state
42
+ boundary with an `AccountStateStore`; the pool awaits either synchronous or asynchronous adapters and
43
+ requires atomic acquire, renew, completion, and replacement semantics. SQL remains local to storage.
44
+ Raw secrets are stored only when the caller explicitly provisions or restores them; logs and normal
45
+ projections use redaction or a token fingerprint.
44
46
 
45
47
  ## Runtime trust boundaries
46
48
 
47
49
  1. Caller input crosses runtime guards before entering domain services.
48
50
  2. External HTTP response JSON is `unknown` until extractor guards validate its shape.
49
51
  3. Remote text, manifests, and headers are data, never executable instructions.
50
- 4. Secrets cross only the session builder and SQLite provisioning boundary; public inspection and
51
- maintenance projections redact them, and they are excluded from output and harness state.
52
+ 4. Secrets cross only the session builder and selected account-state boundary. Public inspection and
53
+ normal maintenance projections redact them. Explicit account-state export is the sole raw-secret
54
+ projection and requires caller acknowledgement.
52
55
 
53
56
  ## Verification architecture
54
57
 
@@ -0,0 +1,33 @@
1
+ # ADR 0003: Caller-owned account state
2
+
3
+ ## Status
4
+
5
+ Accepted — 2026-08-12
6
+
7
+ ## Decision
8
+
9
+ Expose an `AccountStateStore` contract whose methods may return direct values or promises. Keep the
10
+ SQLite implementation as the default, but allow applications using `await XTrawl.create()` to own
11
+ account credentials, health, counters, cooldowns, and leases in another persistence system.
12
+
13
+ Lease acquisition, renewal, completion, and whole-store replacement are explicit store operations.
14
+ Acquisition and completion atomically combine selection, ownership, accounting, and health changes
15
+ so concurrent workers cannot intentionally share an account or lose request usage updates.
16
+
17
+ Expose a versioned session-state snapshot through `client.accounts.exportState()` and
18
+ `restoreState()`. Raw export requires `includeSecrets: true`. Snapshots contain reusable cookies and
19
+ tokens plus operational state, but omit storage IDs, active leases, passwords, email credentials,
20
+ and two-factor secrets.
21
+
22
+ ## Alternatives considered
23
+
24
+ - Export/import only: portable, but it cannot coordinate live leases across application processes.
25
+ - A SQLite-specific callback API: small, but it keeps application state coupled to one database.
26
+ - Making every client constructor asynchronous: consistent, but unnecessarily breaks the existing
27
+ synchronous SQLite setup. Custom stores therefore require the existing async factory.
28
+
29
+ ## Consequences
30
+
31
+ Custom adapters have a small but strict atomicity contract. SQLite continues to hold run history,
32
+ pagination checkpoints, and manifest cache even when account state is external. Applications gain
33
+ control over secret storage and account lifecycle without changing read-only collection behavior.
@@ -25,6 +25,8 @@ persisting progress locally, and exposing predictable typed results.
25
25
  3. Resolve individual posts and user profiles, fetch profile timelines, and collect followers/following with cursor pagination.
26
26
  4. Reuse local SQLite state after restart, including account cooldowns, leases, run history, and resume cursors.
27
27
  5. Run the CLI or library with deterministic typed errors and no mutation of the remote account.
28
+ 6. Replace SQLite account persistence with a caller-owned store and explicitly export or restore
29
+ reusable session state without restoring stale leases or login-only credentials.
28
30
 
29
31
  ## First-release scope
30
32
 
@@ -39,6 +41,8 @@ persisting progress locally, and exposing predictable typed results.
39
41
  - Optional transaction-header generation, HTTP/HTTPS/SOCKS5 proxies with preflight checks, appendable
40
42
  descriptive outputs, and redacted local-state maintenance APIs.
41
43
  - Strict TypeScript interfaces, runtime guards at external boundaries, and test doubles for all network paths.
44
+ - A pluggable sync-or-async account-state contract with atomic lease operations; SQLite remains the
45
+ default adapter while run history, checkpoints, and manifest cache remain local.
42
46
 
43
47
  ## Explicit exclusions
44
48
 
@@ -76,11 +80,15 @@ persisting progress locally, and exposing predictable typed results.
76
80
  - [x] A profile lookup, bounded search, profile timeline, single-post lookup, and all relationship operations complete with a valid authorized session in the opt-in live suite.
77
81
  - [x] Harness structural validation and context-budget evaluation pass.
78
82
  - [x] A fresh agent can identify the current work and next action from `.harness/state/` without chat history.
83
+ - [x] A caller-owned asynchronous account store can provision, lease, complete, export, and restore
84
+ account state through the public API, with deterministic contract tests.
79
85
 
80
86
  ## Open decisions
81
87
 
82
88
  - The built-in Node SQLite API is the first-release persistence adapter; a portable driver can be added only if supported-runtime evidence requires it.
83
89
  - Async methods are the canonical library surface. A blocking synchronous wrapper is intentionally excluded because it would compromise Node event-loop safety.
90
+ - Account-state snapshots require an explicit secret acknowledgement, are runtime validated and
91
+ versioned, and exclude active leases plus password, email-password, and two-factor login fields.
84
92
 
85
93
  ## Immediate next action
86
94
 
@@ -4,7 +4,10 @@
4
4
 
5
5
  - Session tokens, CSRF values, passwords, email passwords, and OTP seeds are caller-owned secrets.
6
6
  - They may be read from process environment, caller-provided files, or in-memory arguments only.
7
- - They must not appear in Git, test fixtures, JSON snapshots, logs, CLI output, harness state, or handoffs.
7
+ - They must not appear in Git, test fixtures, logs, CLI output, harness state, or handoffs.
8
+ - `client.accounts.exportState({ includeSecrets: true })` is an explicit exception: it returns a
9
+ versioned caller-owned snapshot containing reusable session secrets. The caller must protect it as
10
+ credentials and must not log or commit it.
8
11
  - Diagnostics may include a stable non-reversible fingerprint and a reason code, never the secret value.
9
12
 
10
13
  ## Network boundary
@@ -17,7 +20,11 @@
17
20
 
18
21
  ## Local state
19
22
 
20
- - SQLite is scoped to the configured path and can be deleted by the caller.
23
+ - SQLite is scoped to the configured path and can be deleted by the caller. Applications may move
24
+ account records and lease coordination to a caller-owned `AccountStateStore`; run history,
25
+ checkpoints, and manifest cache remain in SQLite.
26
+ - State restore validates unknown input, never restores active lease IDs, and excludes passwords,
27
+ email credentials, and two-factor secrets from the snapshot format.
21
28
  - Raw response payloads are returned only when the caller requests them; operational state stores compact metadata.
22
29
  - Output paths are caller-controlled but must remain explicit; no recursive deletion is performed by the package.
23
30