eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 2.14 kB
JavaScript
import{getDefaultChatGptCredentialStore}from"./credential-store.js";import{CHATGPT_LOGIN_HINT,ChatGptSignInRequiredError,requestChatGptTokens}from"./oauth.js";function createCodexTokenBroker(e={}){let t=e.store??getDefaultChatGptCredentialStore(),n=e.now??Date.now,r={kind:`checking`},i,a;return{getToken(e){return getToken(e.reason)},async refreshState(){i=void 0;try{await getToken(`request`)}catch{}return r},state(){return r}};function getToken(e){let t=e===`rejected`;if(!t&&i!==void 0&&isFresh(i,n()))return Promise.resolve(i);if(a!==void 0&&(!t||a.forced))return a.promise;let r=a?.promise,o=(r===void 0?resolveToken(t):r.catch(()=>void 0).then(()=>resolveToken(t))).finally(()=>{a?.promise===o&&(a=void 0)});return a={forced:t,promise:o},o}async function resolveToken(a){try{let o=await t.read();if(!o)throw i=void 0,a?new ChatGptSignInRequiredError:(r={kind:`signed-out`},Error(`ChatGPT subscription is not signed in. ${CHATGPT_LOGIN_HINT}`));let s=tokenFrom(o)?.token;(a||!isFresh(tokenFrom(o),n()))&&(o=await t.update(async t=>{if(!t)throw new ChatGptSignInRequiredError;return`accessToken`in t&&isFresh(tokenFrom(t),n())&&(!a||tokenFrom(t)?.token!==s)?t:requestChatGptTokens({grant_type:`refresh_token`,refresh_token:t.refreshToken},{fetch:e.fetch,previous:t,now:n})}));let c=tokenFrom(o);if(!c)throw Error(`ChatGPT access token is unavailable. ${CHATGPT_LOGIN_HINT}`);return i=c,r=readyState(c),c}catch(e){throw i=void 0,e instanceof ChatGptSignInRequiredError?r={kind:`reauth-required`}:r.kind!==`signed-out`&&(r={kind:`unavailable`,reason:e instanceof Error?e.message:String(e)}),e}}}let defaultBroker;function getDefaultCodexTokenBroker(){return defaultBroker??=createCodexTokenBroker(),defaultBroker}function tokenFrom(e){if(`accessToken`in e)return{token:e.accessToken,expiresAt:e.expiresAt,...e.accountId&&{accountId:e.accountId},...e.accountLabel&&{accountLabel:e.accountLabel}}}function readyState(e){return{kind:`ready`,...e.accountLabel!==void 0&&{accountLabel:e.accountLabel}}}function isFresh(e,t){return e!==void 0&&(e.expiresAt===void 0||e.expiresAt-3e5>t)}export{createCodexTokenBroker,getDefaultCodexTokenBroker};