File size: 1,806 Bytes
cd8bd0a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/**
 * SessionFactory — Creates initialized Session instances
 *
 * For zero-auth providers (Pollinations, Puter): just assigns a fingerprint.
 * For cookie-based providers (ChatGPT Web, DeepSeek Web): would launch
 * headless Playwright, solve Turnstile, and extract cookies.
 *
 * Currently only zero-auth is implemented. Cookie-based provider support
 * is planned for Phase 3.
 */

import { FingerprintRotator } from "./fingerprintRotator.ts";
import { Session } from "./session.ts";
import type { PoolConfig } from "./types.ts";

export class SessionFactory {
  private rotator = new FingerprintRotator();

  constructor(private config: PoolConfig) {}

  /**
   * Create a new session with the next available fingerprint.
   * For zero-auth providers, this is a lightweight operation
   * (just picks a fingerprint). For cookie-based providers this
   * would involve Playwright browser automation.
   */
  createSession(): Session {
    // Round-robin so each session in a warm pool gets a distinct fingerprint
    // (a pool of look-alike sessions defeats the purpose). The rotator still
    // exposes random() for callers that want unpredictability over time.
    const fingerprint = this.rotator.next();
    return new Session(
      fingerprint,
      this.config.cooldownBase,
      this.config.cooldownMax,
      this.config.cooldownJitter,
    );
  }

  /** Reset the fingerprint rotator (e.g., after config change) */
  resetRotator(): void {
    this.rotator.reset();
  }

  /** Number of available fingerprint profiles */
  get profileCount(): number {
    return this.rotator.count;
  }

  /** Build headers from session fingerprint */
  buildHeaders(
    session: Session,
    extra?: Record<string, string>,
  ): Record<string, string> {
    return session.buildHeaders(extra);
  }
}