openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
100 lines (99 loc) • 3.72 kB
JavaScript
import { D as resolveExpiresAtMsFromDurationMs, F as resolveTimerTimeoutMs, T as positiveSecondsToSafeMilliseconds } from "./number-coercion-CuVhdCBs.mjs";
import { u as toErrorObject } from "./error-coercion-CvJK4lmH.mjs";
import { s as generatePkceVerifierChallenge } from "./provider-openai-chatgpt-auth-fIvYFuQh.mjs";
import { randomBytes } from "node:crypto";
//#region src/plugin-sdk/provider-oauth-runtime.ts
/** Generates an OAuth PKCE verifier and SHA-256 challenge using base64url encoding. */
async function generatePKCE() {
return generatePkceVerifierChallenge();
}
/** Generates a random base64url OAuth state value for CSRF protection. */
function generateBase64UrlOAuthState() {
return randomBytes(32).toString("base64url");
}
/**
* Parses callback URLs, raw query strings, `code#state`, or plain pasted codes.
* Empty input returns an empty object so callers can keep prompting.
*/
function parseOAuthAuthorizationInput(input) {
const value = input.trim();
if (!value) return {};
try {
const url = new URL(value);
return {
code: url.searchParams.get("code") ?? void 0,
state: url.searchParams.get("state") ?? void 0
};
} catch {}
if (value.includes("#")) {
const [code, state] = value.split("#", 2);
return {
code,
state
};
}
if (value.includes("code=")) {
const params = new URLSearchParams(value);
return {
code: params.get("code") ?? void 0,
state: params.get("state") ?? void 0
};
}
return { code: value };
}
/** Converts provider `expires_in` seconds into safe positive milliseconds. */
function resolveOAuthTokenLifetimeMs(value) {
return positiveSecondsToSafeMilliseconds(value);
}
/** Resolves provider token lifetime into an absolute expiry timestamp with optional refresh skew. */
function resolveOAuthTokenExpiresAt(value, options = {}) {
const lifetimeMs = resolveOAuthTokenLifetimeMs(value);
return lifetimeMs === void 0 ? void 0 : resolveExpiresAtMsFromDurationMs(lifetimeMs, {
nowMs: options.nowMs,
bufferMs: options.refreshSkewMs
});
}
/**
* Creates the shared cancellation error used by abortable OAuth login flows.
*/
function createOAuthLoginCancelledError() {
return /* @__PURE__ */ new Error("Login cancelled");
}
/** Throws the shared OAuth cancellation error when a login signal is already aborted. */
function throwIfOAuthLoginAborted(signal) {
if (signal?.aborted) throw createOAuthLoginCancelledError();
}
/** Races a pending OAuth login step against the login abort signal and normalizes rejections. */
function withOAuthLoginAbort(promise, signal, onAbort) {
if (!signal) return promise;
return new Promise((resolve, reject) => {
const cleanup = () => {
signal.removeEventListener("abort", abort);
};
const abort = () => {
cleanup();
onAbort?.();
reject(createOAuthLoginCancelledError());
};
if (signal.aborted) {
abort();
return;
}
signal.addEventListener("abort", abort, { once: true });
promise.then((value) => {
cleanup();
resolve(value);
}, (error) => {
cleanup();
reject(toErrorObject(error, "Non-Error rejection"));
});
});
}
/** Combines a caller abort signal with a bounded timeout signal for OAuth HTTP requests. */
function buildOAuthRequestSignal(options) {
const timeoutSignal = AbortSignal.timeout(resolveTimerTimeoutMs(options.timeoutMs, 0, 0));
if (!options.signal) return timeoutSignal;
return AbortSignal.any([options.signal, timeoutSignal]);
}
//#endregion
export { parseOAuthAuthorizationInput as a, throwIfOAuthLoginAborted as c, generatePKCE as i, withOAuthLoginAbort as l, createOAuthLoginCancelledError as n, resolveOAuthTokenExpiresAt as o, generateBase64UrlOAuthState as r, resolveOAuthTokenLifetimeMs as s, buildOAuthRequestSignal as t };