codefree-proxy 0.1.3 → 0.1.4

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,17 +1,184 @@
1
+ import { createHmac, randomUUID } from 'node:crypto';
2
+ import { mkdir, writeFile } from 'node:fs/promises';
3
+ /* codefree-token-sync-patch */
4
+ import { saveCodeFreeORefreshToken } from '../auth/codefree-o.js';
5
+ /**
6
+ * Mirror a rotated refresh token into the native CodeFree-O store.
7
+ *
8
+ * The upstream rotates x_cf_refresh_token on every refresh, so whichever client
9
+ * refreshes must publish the new value or the other client is left holding a
10
+ * consumed token. Best-effort: a failure here must not fail the completion.
11
+ */
12
+ async function mirrorRefreshTokenToNative(credentials) {
13
+ if (!credentials?.refreshCfToken)
14
+ return;
15
+ if (process.env.CODEFREE_PROXY_NO_MIRROR === '1')
16
+ return;
17
+ try {
18
+ await saveCodeFreeORefreshToken(credentials.refreshCfToken, credentials.refreshCfTokenExpiresAt);
19
+ }
20
+ catch (error) {
21
+ console.log(`[debug] native refresh-token mirror failed: ${error?.message ?? error}`);
22
+ }
23
+ }
24
+ import { homedir } from 'node:os';
25
+ import { dirname, join } from 'node:path';
26
+
1
27
  export const UPSTREAM_URL = 'https://www.srdcloud.cn/api/acbackend/codechat/v1/completions';
2
28
  export const CLIENT_VERSION = '0.3.6';
29
+ const CF_APP_ID = '2542334461226y3rzqmr';
30
+ const CF_CLIENT_SECRET = '254233446135xuMOKaXTmgNMby4f42Ae7DRhEBAe';
31
+ const CF_SIGNING_SECRET_B64 = 'HJhzHSFDctmDwSiXLdiidecX8p1uBmG2HHbTf5rD9n4=';
32
+ const CF_USER_URL = 'https://www.srdcloud.cn/api/usercenterbackend/user';
33
+ const OAUTH_TOKEN_URL = 'https://www.srdcloud.cn/api/usercenterbackend/oauth/access_token';
34
+ const CONFIG_PATH = join(homedir(), '.codefree-proxy', 'config.json');
35
+ let refreshPromise = null;
36
+
37
+ function buildCfTokenHeaders(credentials, method = 'POST') {
38
+ if (!credentials?.cfToken)
39
+ return {};
40
+ const timestamp = Math.floor(Date.now() / 1000).toString();
41
+ const nonce = `remote-cf-token-hmac-manual-${Date.now()}-${randomUUID()}`;
42
+ const signaturePayload = `${method.toUpperCase()}\n${CF_APP_ID}\n${timestamp}\n${nonce}`;
43
+ const signature = createHmac('sha256', Buffer.from(CF_SIGNING_SECRET_B64, 'base64'))
44
+ .update(signaturePayload)
45
+ .digest('base64');
46
+ const headers = {
47
+ 'X-Cf-AppId': CF_APP_ID,
48
+ 'X-Cf-Timestamp': timestamp,
49
+ 'X-Cf-Nonce': nonce,
50
+ 'X-Cf-Signature': signature,
51
+ 'X-Cf-Token': credentials.cfToken,
52
+ projectId: '0'
53
+ };
54
+ if (credentials.gitUrls)
55
+ headers.gitUrls = String(credentials.gitUrls);
56
+ return headers;
57
+ }
58
+
59
+ async function responseJson(response) {
60
+ const text = await response.text();
61
+ if (!text)
62
+ return {};
63
+ try {
64
+ return JSON.parse(text);
65
+ }
66
+ catch {
67
+ return Object.fromEntries(new URLSearchParams(text).entries());
68
+ }
69
+ }
70
+
71
+ async function saveModernCredentials(credentials) {
72
+ await mkdir(dirname(CONFIG_PATH), { recursive: true });
73
+ await writeFile(CONFIG_PATH, `${JSON.stringify(credentials, null, 2)}\n`, { encoding: 'utf8', mode: 0o600 });
74
+ }
75
+
76
+ async function exchangeRefreshToken(credentials, fetchImpl) {
77
+ if (credentials.refreshCfToken) {
78
+ const response = await fetchImpl(OAUTH_TOKEN_URL, {
79
+ method: 'POST',
80
+ headers: {
81
+ accept: 'application/json',
82
+ 'content-type': 'application/x-www-form-urlencoded'
83
+ },
84
+ body: new URLSearchParams({
85
+ grant_type: 'refresh_x_cf_token',
86
+ client_id: CF_APP_ID,
87
+ client_secret: CF_CLIENT_SECRET,
88
+ x_cf_refresh_token: credentials.refreshCfToken
89
+ })
90
+ });
91
+ const data = await responseJson(response);
92
+ if (!response.ok || !data.x_cf_token)
93
+ return false;
94
+ credentials.cfToken = data.x_cf_token;
95
+ const cfTtl = Number(data.x_cf_token_expires_in);
96
+ credentials.cfTokenExpiresAt = Date.now() + (Number.isFinite(cfTtl) && cfTtl > 0 ? cfTtl * 1000 : 7_200_000);
97
+ if (data.x_cf_refresh_token)
98
+ credentials.refreshCfToken = data.x_cf_refresh_token;
99
+ const refreshTtl = Number(data.x_cf_refresh_token_expires_in);
100
+ if (Number.isFinite(refreshTtl) && refreshTtl > 0)
101
+ credentials.refreshCfTokenExpiresAt = Date.now() + refreshTtl * 1000;
102
+ if (data.uid !== undefined && String(data.uid).length > 0)
103
+ credentials.userId = String(data.uid);
104
+ credentials.modernAuthAppId = CF_APP_ID;
105
+ credentials.modernAuthUpdatedAt = Date.now();
106
+ await saveModernCredentials(credentials);
107
+ await mirrorRefreshTokenToNative(credentials);
108
+ return true;
109
+ }
110
+ return false;
111
+ }
112
+
113
+ async function fetchCfToken(credentials, fetchImpl) {
114
+ if (!credentials.accessToken)
115
+ return false;
116
+ const response = await fetchImpl(CF_USER_URL, {
117
+ headers: {
118
+ authorization: `Bearer ${credentials.accessToken}`,
119
+ accept: 'application/json',
120
+ },
121
+ });
122
+ const data = await responseJson(response);
123
+ if (!response.ok || !data.x_cf_token)
124
+ return false;
125
+ credentials.cfToken = data.x_cf_token;
126
+ const ttl = Number(data.x_cf_token_expires_in);
127
+ credentials.cfTokenExpiresAt = Date.now() + (Number.isFinite(ttl) && ttl > 0 ? ttl * 1000 : 1_800_000);
128
+ if (data.id !== undefined)
129
+ credentials.userId = String(data.id);
130
+ credentials.modernAuthUpdatedAt = Date.now();
131
+ await saveModernCredentials(credentials);
132
+ return true;
133
+ }
134
+
135
+ async function ensureModernCredentials(credentials, fetchImpl) {
136
+ if (!credentials)
137
+ return;
138
+ const expiresAt = Number(credentials.cfTokenExpiresAt || 0);
139
+ if (expiresAt > Date.now() + 30_000)
140
+ return;
141
+ if (refreshPromise)
142
+ return refreshPromise;
143
+ refreshPromise = (async () => {
144
+ if (await fetchCfToken(credentials, fetchImpl))
145
+ return;
146
+ if (await exchangeRefreshToken(credentials, fetchImpl)) {
147
+ if (credentials.cfToken && Number(credentials.cfTokenExpiresAt) > Date.now() + 30_000)
148
+ return;
149
+ if (await fetchCfToken(credentials, fetchImpl))
150
+ return;
151
+ }
152
+ const error = new Error('CodeFree 登录态已失效,无法续期访问令牌。请重新运行 codefree-o login,然后重启 codefree-proxy。');
153
+ error.code = 'CODEFREE_AUTH_EXPIRED';
154
+ throw error;
155
+ })();
156
+ try {
157
+ await refreshPromise;
158
+ }
159
+ finally {
160
+ refreshPromise = null;
161
+ }
162
+ }
163
+
3
164
  export function buildUpstreamHeaders(credentials, model) {
4
- return {
165
+ const headers = {
5
166
  'content-type': 'application/json',
6
167
  accept: 'text/event-stream',
7
- apiKey: credentials.apiKey,
8
168
  authorization: 'Bearer codefree',
9
- userId: credentials.userId,
10
- subService: 'cli_chat',
169
+ userId: String(credentials.userId),
170
+ projectId: '0',
171
+ subService: 'codefree_o_chat',
11
172
  clientType: 'codefree-cli',
12
173
  clientVersion: CLIENT_VERSION,
13
- modelName: model
174
+ modelName: model,
175
+ 'X-Codefree-Quota-Schema': '1'
14
176
  };
177
+ if (credentials.apiKey)
178
+ headers.apiKey = String(credentials.apiKey);
179
+ if (credentials.sessionId)
180
+ headers.sessionId = credentials.sessionId;
181
+ return { ...headers, ...buildCfTokenHeaders(credentials, 'POST') };
15
182
  }
16
183
  export async function postUpstreamJson(body, credentials, options = {}) {
17
184
  const fetchImpl = options.fetchImpl ?? fetch;
@@ -19,6 +186,7 @@ export async function postUpstreamJson(body, credentials, options = {}) {
19
186
  const controller = new AbortController();
20
187
  const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? 120_000);
21
188
  try {
189
+ await ensureModernCredentials(credentials, fetchImpl);
22
190
  return await fetchImpl(UPSTREAM_URL, {
23
191
  method: 'POST',
24
192
  headers: buildUpstreamHeaders(credentials, model ?? ''),
@@ -0,0 +1,97 @@
1
+ /** Shared retry helpers for SRD Cloud acbackend transient failures. */
2
+ // Keep total wall time under typical --timeout 300s when each attempt may take ~120s (SRD 504).
3
+ export const UPSTREAM_RETRY = {
4
+ maxAttempts: 2,
5
+ baseDelayMs: 1500,
6
+ };
7
+ export function sleep(ms) {
8
+ return new Promise((resolve) => setTimeout(resolve, ms));
9
+ }
10
+ export function parseRetCode(bodyText) {
11
+ const text = (bodyText || '').trim();
12
+ if (!text)
13
+ return null;
14
+ try {
15
+ const data = JSON.parse(text);
16
+ if (data && typeof data.retCode === 'number')
17
+ return data.retCode;
18
+ }
19
+ catch {
20
+ // fall through to regex
21
+ }
22
+ const match = /"retCode"\s*:\s*(\d+)/.exec(text);
23
+ return match ? Number(match[1]) : null;
24
+ }
25
+ export function isRetriableUpstreamError(status, bodyText) {
26
+ if (status === 502 || status === 503 || status === 504)
27
+ return true;
28
+ // retCode 51 = SRD Cloud gateway / inference timeout
29
+ return parseRetCode(bodyText) === 51;
30
+ }
31
+ export function formatUpstreamError(status, bodyText) {
32
+ const body = (bodyText || '').trim();
33
+ const retCode = parseRetCode(body);
34
+ if (status === 504 || retCode === 51) {
35
+ return `Upstream gateway timeout (HTTP ${status}${retCode != null ? `, retCode ${retCode}` : ''}). SRD Cloud 推理超时,请重试或缩短上下文。`;
36
+ }
37
+ if (status === 502 || status === 503) {
38
+ return `Upstream temporarily unavailable (HTTP ${status}${retCode != null ? `, retCode ${retCode}` : ''}). 请稍后重试。`;
39
+ }
40
+ if (retCode != null) {
41
+ return `Upstream error (HTTP ${status}, retCode ${retCode}): ${body.slice(0, 200)}`;
42
+ }
43
+ return body || `Upstream error (HTTP ${status})`;
44
+ }
45
+ export function errorMessage(error) {
46
+ return error instanceof Error ? error.message : String(error);
47
+ }
48
+ /**
49
+ * POST with retries. onPost(body, credentials, options) must return a fetch Response-like object.
50
+ * 401/403 returned immediately for auth refresh by the caller.
51
+ */
52
+ export async function fetchUpstreamWithRetry(onPost, body, credentials, options, label = 'upstream') {
53
+ const maxAttempts = UPSTREAM_RETRY.maxAttempts;
54
+ let lastErrorBody = '';
55
+ let lastStatus = 0;
56
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
57
+ let response;
58
+ try {
59
+ response = await onPost(body, credentials, options);
60
+ }
61
+ catch (error) {
62
+ if (attempt < maxAttempts) {
63
+ const delay = UPSTREAM_RETRY.baseDelayMs * attempt;
64
+ console.log(`[debug] ${label} network error attempt=${attempt}/${maxAttempts} retryIn=${delay}ms err=${errorMessage(error)}`);
65
+ await sleep(delay);
66
+ continue;
67
+ }
68
+ throw error;
69
+ }
70
+ if (response.ok) {
71
+ if (attempt > 1)
72
+ console.log(`[debug] ${label} succeeded after ${attempt} attempts`);
73
+ return { response, errorBody: null };
74
+ }
75
+ if (response.status === 401 || response.status === 403) {
76
+ return { response, errorBody: null };
77
+ }
78
+ const errorBody = await response.text();
79
+ lastErrorBody = errorBody;
80
+ lastStatus = response.status;
81
+ console.log(`[debug] ${label} non-ok: status=${response.status} body=${errorBody.slice(0, 200)} attempt=${attempt}/${maxAttempts}`);
82
+ if (attempt < maxAttempts && isRetriableUpstreamError(response.status, errorBody)) {
83
+ const delay = UPSTREAM_RETRY.baseDelayMs * attempt;
84
+ console.log(`[debug] ${label} retriable (e.g. retCode 51 / 5xx), retryIn=${delay}ms`);
85
+ await sleep(delay);
86
+ continue;
87
+ }
88
+ return {
89
+ response: { ok: false, status: lastStatus, text: async () => lastErrorBody },
90
+ errorBody: lastErrorBody,
91
+ };
92
+ }
93
+ return {
94
+ response: { ok: false, status: lastStatus || 502, text: async () => lastErrorBody },
95
+ errorBody: lastErrorBody,
96
+ };
97
+ }
package/dist/server.js CHANGED
@@ -2,7 +2,7 @@ import Fastify from 'fastify';
2
2
  import { AuthManager } from './auth/auth-manager.js';
3
3
  import { registerOpenAIRoutes } from './proxy/openai-routes.js';
4
4
  export function buildServer(options = {}) {
5
- const app = Fastify({ logger: true });
5
+ const app = Fastify({ logger: true, bodyLimit: 10 * 1024 * 1024 });
6
6
  registerOpenAIRoutes(app, {
7
7
  auth: options.auth ?? new AuthManager(),
8
8
  upstreamFetch: options.upstreamFetch,
@@ -10,4 +10,4 @@ export function buildServer(options = {}) {
10
10
  });
11
11
  return app;
12
12
  }
13
- //# sourceMappingURL=server.js.map
13
+ //# sourceMappingURL=server.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codefree-proxy",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "OpenAI-compatible local proxy for SRD Cloud CodeFree",
5
5
  "license": "MIT",
6
6
  "author": "Maxwell",
@@ -1,30 +0,0 @@
1
- import type { StoredCredentials } from './config-store.js';
2
- export interface BrowserLoginOptions {
3
- openBrowser?: (url: string) => void;
4
- timeoutMs?: number;
5
- fetchImpl?: typeof fetch;
6
- codeVerifier?: string;
7
- randomCode?: string;
8
- baseUrl?: string;
9
- }
10
- export interface PkcePair {
11
- codeVerifier: string;
12
- codeChallenge: string;
13
- }
14
- export interface AuthorizeUrlOptions {
15
- codeVerifier?: string;
16
- randomCode?: string;
17
- baseUrl?: string;
18
- }
19
- export declare function createPkcePair(codeVerifier?: string): PkcePair;
20
- export declare function buildAuthorizeUrl(port: number, options?: AuthorizeUrlOptions): {
21
- url: string;
22
- state: string;
23
- codeVerifier: string;
24
- };
25
- export declare function exchangeCodeForToken(code: string, codeVerifier: string, fetchImpl?: typeof fetch, baseUrl?: string): Promise<{
26
- sessionId: string;
27
- userId: string;
28
- }>;
29
- export declare function fetchEncryptedApiKey(sessionId: string, userId: string, fetchImpl?: typeof fetch, baseUrl?: string): Promise<string>;
30
- export declare function authorizeWithBrowser(options?: BrowserLoginOptions): Promise<StoredCredentials>;
@@ -1,181 +0,0 @@
1
- import { createHash, randomBytes } from 'node:crypto';
2
- import { spawn } from 'node:child_process';
3
- import { createServer } from 'node:http';
4
- import { URLSearchParams } from 'node:url';
5
- import { decryptApiKey } from './codefree-o.js';
6
- const BASE_URL = 'https://www.srdcloud.cn';
7
- const REDIRECT_PATH = '/login/oauth-srdcloud-redirect';
8
- const AUTHORIZE_PATH = '/login/oauth/authorize';
9
- const ACCESS_TOKEN_PATH = '/login/oauth/access_token';
10
- const API_KEY_PATH = '/api/acbackend/usermanager/v1/users/apikey';
11
- const PKCE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';
12
- function clientIdForBaseUrl(baseUrl) {
13
- if (baseUrl.includes('dev'))
14
- return '2510a379050azejezeas';
15
- if (baseUrl.includes('test'))
16
- return '2512525649b2unrogn26';
17
- return '251384680635inwsxjcm';
18
- }
19
- function randomPkceVerifier() {
20
- return Array.from(randomBytes(64)).map((byte) => PKCE_CHARS[byte % PKCE_CHARS.length]).join('');
21
- }
22
- function base64Url(buffer) {
23
- return buffer.toString('base64').replaceAll('+', '-').replaceAll('/', '_').replace(/=+$/, '');
24
- }
25
- export function createPkcePair(codeVerifier = randomPkceVerifier()) {
26
- return {
27
- codeVerifier,
28
- codeChallenge: base64Url(createHash('sha256').update(codeVerifier).digest())
29
- };
30
- }
31
- export function buildAuthorizeUrl(port, options = {}) {
32
- const baseUrl = options.baseUrl ?? BASE_URL;
33
- const randomCode = options.randomCode ?? String(Math.floor(1000 + Math.random() * 9000));
34
- const { codeVerifier, codeChallenge } = createPkcePair(options.codeVerifier);
35
- const callbackUrl = `http://127.0.0.1:${port}/oauth2callback?from=codefree-o&randomCode=${randomCode}`;
36
- const state = Buffer.from(callbackUrl, 'utf8').toString('base64');
37
- const params = new URLSearchParams({
38
- client_id: clientIdForBaseUrl(baseUrl),
39
- redirect_uri: `${baseUrl}${REDIRECT_PATH}`,
40
- response_type: 'code',
41
- state,
42
- code_challenge: codeChallenge,
43
- code_challenge_method: 'S256'
44
- });
45
- return { url: `${baseUrl}${AUTHORIZE_PATH}?${params.toString()}`, state, codeVerifier };
46
- }
47
- export async function exchangeCodeForToken(code, codeVerifier, fetchImpl = fetch, baseUrl = BASE_URL) {
48
- const params = new URLSearchParams({
49
- grant_type: 'authorization_code',
50
- client_id: clientIdForBaseUrl(baseUrl),
51
- code,
52
- redirect_uri: `${baseUrl}${REDIRECT_PATH}`,
53
- code_verifier: codeVerifier
54
- });
55
- const response = await fetchImpl(`${baseUrl}${ACCESS_TOKEN_PATH}?${params.toString()}`, { method: 'GET' });
56
- if (!response.ok)
57
- throw new Error(`token exchange failed: ${response.status} ${await response.text()}`);
58
- const parsed = new URLSearchParams(await response.text());
59
- const sessionId = parsed.get('ori_session_id') ?? '';
60
- const userId = parsed.get('uid') ?? '';
61
- if (!sessionId || !userId)
62
- throw new Error('token exchange response missing ori_session_id or uid');
63
- return { sessionId, userId };
64
- }
65
- export async function fetchEncryptedApiKey(sessionId, userId, fetchImpl = fetch, baseUrl = BASE_URL) {
66
- const response = await fetchImpl(`${baseUrl}${API_KEY_PATH}`, {
67
- method: 'GET',
68
- headers: {
69
- Accept: '*/*',
70
- 'User-Agent': 'node',
71
- sessionId,
72
- userId,
73
- projectId: '0'
74
- }
75
- });
76
- if (!response.ok)
77
- throw new Error(`apikey fetch failed: ${response.status} ${await response.text()}`);
78
- const data = await response.json();
79
- const encryptedApiKey = data.encryptedApiKey ?? data.apikey;
80
- if (!encryptedApiKey)
81
- throw new Error('apikey response missing encryptedApiKey');
82
- return encryptedApiKey;
83
- }
84
- function defaultOpenBrowser(url) {
85
- const command = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'cmd' : 'xdg-open';
86
- const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];
87
- const child = spawn(command, args, { detached: true, stdio: 'ignore' });
88
- child.unref();
89
- }
90
- function escapeHtml(value) {
91
- return value
92
- .replaceAll('&', '&amp;')
93
- .replaceAll('<', '&lt;')
94
- .replaceAll('>', '&gt;')
95
- .replaceAll('"', '&quot;')
96
- .replaceAll("'", '&#39;');
97
- }
98
- function startCallbackServer(timeoutMs) {
99
- return new Promise((resolve, reject) => {
100
- let settled = false;
101
- let timeout;
102
- let resolveCode;
103
- let rejectCode;
104
- const codePromise = new Promise((resolveInner, rejectInner) => {
105
- resolveCode = resolveInner;
106
- rejectCode = rejectInner;
107
- });
108
- const server = createServer((request, response) => {
109
- const url = new URL(request.url ?? '/', 'http://127.0.0.1');
110
- if (url.pathname !== '/oauth2callback') {
111
- response.writeHead(404);
112
- response.end('not found');
113
- return;
114
- }
115
- const code = url.searchParams.get('code');
116
- const error = url.searchParams.get('error');
117
- if (error) {
118
- response.writeHead(400, { 'content-type': 'text/html; charset=utf-8' });
119
- response.end(`<h2>Authorization failed</h2><p>${escapeHtml(error)}</p>`);
120
- if (!settled) {
121
- settled = true;
122
- clearTimeout(timeout);
123
- rejectCode(new Error(`OAuth error: ${error}`));
124
- }
125
- return;
126
- }
127
- if (!code) {
128
- response.writeHead(400, { 'content-type': 'text/html; charset=utf-8' });
129
- response.end('<h2>Authorization failed</h2><p>Missing code</p>');
130
- return;
131
- }
132
- response.writeHead(200, { 'content-type': 'text/html; charset=utf-8' });
133
- response.end('<h2>Authorization successful</h2><p>You can close this tab.</p>');
134
- if (!settled) {
135
- settled = true;
136
- clearTimeout(timeout);
137
- resolveCode(code);
138
- }
139
- });
140
- server.on('error', reject);
141
- server.listen(0, '127.0.0.1', () => {
142
- const port = server.address().port;
143
- timeout = setTimeout(() => {
144
- if (!settled) {
145
- settled = true;
146
- rejectCode(new Error('OAuth callback timed out'));
147
- }
148
- }, timeoutMs);
149
- timeout.unref();
150
- resolve({
151
- port,
152
- codePromise,
153
- close: () => new Promise((done) => server.close(() => done()))
154
- });
155
- });
156
- });
157
- }
158
- export async function authorizeWithBrowser(options = {}) {
159
- const timeoutMs = options.timeoutMs ?? 300_000;
160
- const baseUrl = options.baseUrl ?? BASE_URL;
161
- const callback = await startCallbackServer(timeoutMs);
162
- const codePromise = callback.codePromise;
163
- const { url, codeVerifier } = buildAuthorizeUrl(callback.port, { codeVerifier: options.codeVerifier, randomCode: options.randomCode, baseUrl });
164
- try {
165
- ;
166
- (options.openBrowser ?? defaultOpenBrowser)(url);
167
- const code = await codePromise;
168
- const token = await exchangeCodeForToken(code, codeVerifier, options.fetchImpl ?? fetch, baseUrl);
169
- const encryptedApiKey = await fetchEncryptedApiKey(token.sessionId, token.userId, options.fetchImpl ?? fetch, baseUrl);
170
- return {
171
- userId: token.userId,
172
- apiKey: decryptApiKey(encryptedApiKey),
173
- sessionId: token.sessionId,
174
- updatedAt: Date.now()
175
- };
176
- }
177
- finally {
178
- await callback.close();
179
- }
180
- }
181
- //# sourceMappingURL=browser-login.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser-login.js","sourceRoot":"","sources":["../../src/auth/browser-login.ts"],"names":[],"mappings":"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"}