Format the TypeScript sources with Oxfmt
This commit is contained in:
+11
-35
@@ -19,36 +19,22 @@ function decodeBase64Url(value: string): Uint8Array {
|
||||
}
|
||||
|
||||
function encodeBase64Url(value: Uint8Array): string {
|
||||
const binary = Array.from(value, (byte) => String.fromCharCode(byte)).join(
|
||||
"",
|
||||
);
|
||||
return btoa(binary).replaceAll("+", "-").replaceAll("/", "_")
|
||||
.replaceAll("=", "");
|
||||
const binary = Array.from(value, (byte) => String.fromCharCode(byte)).join("");
|
||||
return btoa(binary).replaceAll("+", "-").replaceAll("/", "_").replaceAll("=", "");
|
||||
}
|
||||
|
||||
const buffer = (value: Uint8Array): ArrayBuffer =>
|
||||
Uint8Array.from(value).buffer;
|
||||
const buffer = (value: Uint8Array): ArrayBuffer => Uint8Array.from(value).buffer;
|
||||
|
||||
async function importMasterKey(
|
||||
encoded: string,
|
||||
usage: KeyUsage,
|
||||
): Promise<CryptoKey> {
|
||||
async function importMasterKey(encoded: string, usage: KeyUsage): Promise<CryptoKey> {
|
||||
const bytes = decodeBase64Url(encoded);
|
||||
if (bytes.length !== 32) {
|
||||
throw new Error("master-key must be 32 bytes encoded as base64url");
|
||||
}
|
||||
return await crypto.subtle.importKey("raw", buffer(bytes), "AES-GCM", false, [
|
||||
usage,
|
||||
]);
|
||||
return await crypto.subtle.importKey("raw", buffer(bytes), "AES-GCM", false, [usage]);
|
||||
}
|
||||
|
||||
export async function decryptCredential(
|
||||
encrypted: string,
|
||||
masterKey: string,
|
||||
): Promise<string> {
|
||||
const [version, encodedNonce, encodedCiphertext, extra] = encrypted.split(
|
||||
":",
|
||||
);
|
||||
export async function decryptCredential(encrypted: string, masterKey: string): Promise<string> {
|
||||
const [version, encodedNonce, encodedCiphertext, extra] = encrypted.split(":");
|
||||
if (version !== "v1" || !encodedNonce || !encodedCiphertext || extra) {
|
||||
throw new Error("credential must use v1:<nonce>:<ciphertext>");
|
||||
}
|
||||
@@ -73,15 +59,10 @@ export async function encryptCredential(
|
||||
await importMasterKey(masterKey, "encrypt"),
|
||||
new TextEncoder().encode(plaintext),
|
||||
);
|
||||
return `v1:${encodeBase64Url(nonce)}:${
|
||||
encodeBase64Url(new Uint8Array(ciphertext))
|
||||
}`;
|
||||
return `v1:${encodeBase64Url(nonce)}:${encodeBase64Url(new Uint8Array(ciphertext))}`;
|
||||
}
|
||||
|
||||
export async function parseCredentials(
|
||||
text: string,
|
||||
masterKey: string,
|
||||
): Promise<BotCredentials> {
|
||||
export async function parseCredentials(text: string, masterKey: string): Promise<BotCredentials> {
|
||||
const value: unknown = parse(text);
|
||||
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
||||
throw new Error("credentials must be a mapping");
|
||||
@@ -112,17 +93,12 @@ export async function parseCredentials(
|
||||
}
|
||||
const { type, model, token } = profile;
|
||||
if (type !== "claude" && type !== "codex" && type !== "opencode") {
|
||||
throw new Error(
|
||||
`${at}.type: expected \"claude\", \"codex\", or \"opencode\"`,
|
||||
);
|
||||
throw new Error(`${at}.type: expected \"claude\", \"codex\", or \"opencode\"`);
|
||||
}
|
||||
if (model !== undefined && (typeof model !== "string" || model === "")) {
|
||||
throw new Error(`${at}.model: expected a model name`);
|
||||
}
|
||||
if (
|
||||
(type === "claude" || type === "opencode") &&
|
||||
typeof token !== "string"
|
||||
) {
|
||||
if ((type === "claude" || type === "opencode") && typeof token !== "string") {
|
||||
throw new Error(`${at}.token: expected an encrypted credential`);
|
||||
}
|
||||
if (token !== undefined && typeof token !== "string") {
|
||||
|
||||
Reference in New Issue
Block a user