aweshare 0.6.5 → 0.6.7

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.
@@ -1,21 +1,38 @@
1
1
  import type { ResolvedBackend } from './adapters.js';
2
- export interface CodexProxyOptions {
2
+ export interface BackendProxyOptions {
3
3
  httpProxy?: string;
4
4
  httpsProxy?: string;
5
5
  noProxy?: string;
6
- source: 'HTTP_PROXY' | 'HTTPS_PROXY' | 'ALL_PROXY';
6
+ source: 'config' | 'HTTP_PROXY' | 'HTTPS_PROXY' | 'ALL_PROXY';
7
7
  }
8
- /** Proxy settings for the official Codex account upstream only.
8
+ /** Egress proxy for one backend's upstream requests. Two sources, one rule:
9
+ * an explicit `proxyUrl` in the backend block wins over environment variables.
10
+ *
11
+ * - `proxyUrl` (config.toml, validated by parseCatalog) applies to any backend
12
+ * and fills both the http and the https slot — the user said "this backend's
13
+ * traffic goes through this proxy", and one backend has one egress. NO_PROXY
14
+ * from the environment still applies.
15
+ * - Without `proxyUrl`, environment variables apply to codex-login backends
16
+ * only: a machine-wide HTTPS_PROXY is ambient state (often set for git/npm)
17
+ * and must never capture key-backed backends such as a local Ollama.
9
18
  *
10
19
  * EnvHttpProxyAgent implements HTTP_PROXY/HTTPS_PROXY/NO_PROXY matching. We
11
20
  * also accept ALL_PROXY because coding-agent proxy setups commonly provide it.
12
21
  * SOCKS URLs are deliberately ignored: the producer has no SOCKS dependency,
13
22
  * and silently treating one as HTTP would send account traffic incorrectly.
14
23
  */
15
- export declare function codexProxyOptions(backend: Pick<ResolvedBackend, 'login'>, env?: NodeJS.ProcessEnv): CodexProxyOptions | null;
16
- /** Fetch an upstream request, honoring proxy environment variables only for a
17
- * producer machine's Codex subscription login. */
18
- export declare function fetchUpstream(backend: Pick<ResolvedBackend, 'login'>, url: string, init: RequestInit): Promise<Response>;
24
+ export declare function backendProxyOptions(backend: Pick<ResolvedBackend, 'login' | 'proxyUrl'>, env?: NodeJS.ProcessEnv): BackendProxyOptions | null;
25
+ /** Close and forget routes whose proxy settings no longer belong to any
26
+ * backend. Call after a config (re)load so a replaced proxyUrl releases its
27
+ * pooled connections instead of leaking them for the life of the process.
28
+ * close() reclaims idle sockets only; requests already dispatched through a
29
+ * closed route still complete. */
30
+ export declare function pruneProxyRoutes(backends: ReadonlyArray<Pick<ResolvedBackend, 'login' | 'proxyUrl'>>, env?: NodeJS.ProcessEnv): void;
31
+ /** Fetch an upstream request through the backend's egress proxy when one is
32
+ * configured (config proxyUrl, or proxy environment variables on a codex-login
33
+ * upstream); plain fetch otherwise. */
34
+ export declare function fetchUpstream(backend: Pick<ResolvedBackend, 'login' | 'proxyUrl'>, url: string, init: RequestInit): Promise<Response>;
19
35
  /** A safe, actionable suffix for network errors. Never include proxy URLs:
20
- * they can contain credentials. */
21
- export declare function codexNetworkHint(backend: Pick<ResolvedBackend, 'login'>): string;
36
+ * they can contain credentials. Read-only — building a hint must not create
37
+ * or close pooled routes as a side effect. */
38
+ export declare function egressNetworkHint(backend: Pick<ResolvedBackend, 'login' | 'proxyUrl'>, env?: NodeJS.ProcessEnv): string;
@@ -1,6 +1,14 @@
1
1
  import { EnvHttpProxyAgent } from 'undici';
2
- let cachedRoute;
3
- let cachedSignature;
2
+ // One cached route per distinct proxy settings. A single-slot cache cannot
3
+ // tell "the config changed the proxy" from "a different backend asked": with
4
+ // mixed egress (one proxied backend, one direct) every request would evict —
5
+ // and close — a pooled dispatcher another request may still be about to
6
+ // dispatch through (undici rejects dispatches on a closed dispatcher with
7
+ // UND_ERR_DESTROYED). Direct backends need no route and are never stored.
8
+ const routes = new Map();
9
+ function signatureOf(options) {
10
+ return JSON.stringify(options);
11
+ }
4
12
  function envValue(env, lower, upper) {
5
13
  // Match the conventional lower-case precedence used by proxy-aware clients.
6
14
  return env[lower] ?? env[upper];
@@ -16,14 +24,32 @@ function httpProxy(value) {
16
24
  return undefined;
17
25
  }
18
26
  }
19
- /** Proxy settings for the official Codex account upstream only.
27
+ /** Egress proxy for one backend's upstream requests. Two sources, one rule:
28
+ * an explicit `proxyUrl` in the backend block wins over environment variables.
29
+ *
30
+ * - `proxyUrl` (config.toml, validated by parseCatalog) applies to any backend
31
+ * and fills both the http and the https slot — the user said "this backend's
32
+ * traffic goes through this proxy", and one backend has one egress. NO_PROXY
33
+ * from the environment still applies.
34
+ * - Without `proxyUrl`, environment variables apply to codex-login backends
35
+ * only: a machine-wide HTTPS_PROXY is ambient state (often set for git/npm)
36
+ * and must never capture key-backed backends such as a local Ollama.
20
37
  *
21
38
  * EnvHttpProxyAgent implements HTTP_PROXY/HTTPS_PROXY/NO_PROXY matching. We
22
39
  * also accept ALL_PROXY because coding-agent proxy setups commonly provide it.
23
40
  * SOCKS URLs are deliberately ignored: the producer has no SOCKS dependency,
24
41
  * and silently treating one as HTTP would send account traffic incorrectly.
25
42
  */
26
- export function codexProxyOptions(backend, env = process.env) {
43
+ export function backendProxyOptions(backend, env = process.env) {
44
+ const configured = httpProxy(backend.proxyUrl);
45
+ if (configured) {
46
+ return {
47
+ httpProxy: configured,
48
+ httpsProxy: configured,
49
+ noProxy: envValue(env, 'no_proxy', 'NO_PROXY'),
50
+ source: 'config',
51
+ };
52
+ }
27
53
  if (backend.login !== 'codex')
28
54
  return null;
29
55
  const all = httpProxy(envValue(env, 'all_proxy', 'ALL_PROXY'));
@@ -41,21 +67,42 @@ export function codexProxyOptions(backend, env = process.env) {
41
67
  source,
42
68
  };
43
69
  }
44
- function codexProxyRoute(backend) {
45
- const options = codexProxyOptions(backend);
46
- const signature = options ? JSON.stringify(options) : '';
47
- if (cachedSignature === signature && cachedRoute !== undefined)
48
- return cachedRoute;
49
- cachedSignature = signature;
50
- cachedRoute = options
51
- ? { dispatcher: new EnvHttpProxyAgent(options), source: options.source }
52
- : null;
53
- return cachedRoute;
70
+ function backendProxyRoute(backend, env = process.env) {
71
+ const options = backendProxyOptions(backend, env);
72
+ if (!options)
73
+ return null;
74
+ const signature = signatureOf(options);
75
+ let route = routes.get(signature);
76
+ if (route === undefined) {
77
+ route = { dispatcher: new EnvHttpProxyAgent(options), source: options.source };
78
+ routes.set(signature, route);
79
+ }
80
+ return route;
54
81
  }
55
- /** Fetch an upstream request, honoring proxy environment variables only for a
56
- * producer machine's Codex subscription login. */
82
+ /** Close and forget routes whose proxy settings no longer belong to any
83
+ * backend. Call after a config (re)load so a replaced proxyUrl releases its
84
+ * pooled connections instead of leaking them for the life of the process.
85
+ * close() reclaims idle sockets only; requests already dispatched through a
86
+ * closed route still complete. */
87
+ export function pruneProxyRoutes(backends, env = process.env) {
88
+ const live = new Set();
89
+ for (const backend of backends) {
90
+ const options = backendProxyOptions(backend, env);
91
+ if (options)
92
+ live.add(signatureOf(options));
93
+ }
94
+ for (const [signature, route] of routes) {
95
+ if (live.has(signature))
96
+ continue;
97
+ routes.delete(signature);
98
+ void Promise.resolve(route.dispatcher.close()).catch(() => undefined);
99
+ }
100
+ }
101
+ /** Fetch an upstream request through the backend's egress proxy when one is
102
+ * configured (config proxyUrl, or proxy environment variables on a codex-login
103
+ * upstream); plain fetch otherwise. */
57
104
  export async function fetchUpstream(backend, url, init) {
58
- const route = codexProxyRoute(backend);
105
+ const route = backendProxyRoute(backend);
59
106
  if (!route)
60
107
  return fetch(url, init);
61
108
  // Node's built-in fetch honors undici dispatchers at runtime, but its DOM
@@ -65,13 +112,17 @@ export async function fetchUpstream(backend, url, init) {
65
112
  return fetch(url, options);
66
113
  }
67
114
  /** A safe, actionable suffix for network errors. Never include proxy URLs:
68
- * they can contain credentials. */
69
- export function codexNetworkHint(backend) {
115
+ * they can contain credentials. Read-only — building a hint must not create
116
+ * or close pooled routes as a side effect. */
117
+ export function egressNetworkHint(backend, env = process.env) {
118
+ const options = backendProxyOptions(backend, env);
119
+ if (options) {
120
+ return options.source === 'config'
121
+ ? ' (backend egress used the proxyUrl from config.toml; check that the proxy is reachable)'
122
+ : ` (Codex account request used ${options.source}; check that its HTTP(S) proxy is reachable)`;
123
+ }
70
124
  if (backend.login !== 'codex')
71
125
  return '';
72
- const route = codexProxyRoute(backend);
73
- return route
74
- ? ` (Codex account request used ${route.source}; check that its HTTP(S) proxy is reachable)`
75
- : ' (Codex account request went direct; set HTTPS_PROXY, HTTP_PROXY, or ALL_PROXY if ChatGPT requires a proxy)';
126
+ return ' (Codex account request went direct; set proxyUrl on the backend in config.toml, or HTTPS_PROXY, HTTP_PROXY, or ALL_PROXY before starting the producer, if the upstream needs a proxy)';
76
127
  }
77
128
  //# sourceMappingURL=proxy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}