process.env.NODE_ENV = "production";
import preact from "preact";
import { cache, lazy } from "socket-function/src/caching";
import { css, isNode } from "typesafecss";
import fs from "fs";
import os from "os";
import { observable } from "mobx";
import { InputLabel } from "../render-utils/InputLabel";
import { showModal } from "../render-utils/modal";
import { observer } from "../render-utils/observer";
@observer
class DirectoryPrompter extends preact.Component<{
valueKey: string;
onDone: (value: string) => void;
}> {
synced = observable({
value: "",
});
render() {
const { valueKey, onDone } = this.props;
const { value } = this.synced;
return (
this.synced.value = value}
/>
);
}
}
function getStorageKey(key: string) {
if (isNode()) return os.homedir() + "/" + key;
return `apiKeys.ts_${key}`;
}
let state = observable({
keys: [] as string[],
});
if (!isNode()) {
try {
let newKeys = JSON.parse(localStorage.getItem(getStorageKey("__keys"))!);
if (Array.isArray(newKeys)) {
state.keys = newKeys;
}
} catch { }
}
@observer
export class APIKeysControl extends preact.Component {
render() {
return (
);
}
}
let getStorage = lazy((): {
getItem: (key: string) => string | null;
setItem: (key: string, value: string) => void;
} => {
if (!isNode()) return localStorage;
return {
getItem: (key) => {
if (!fs.existsSync(key)) return null;
return fs.readFileSync(key, "utf-8");
},
setItem: (key, value) => {
fs.writeFileSync(key, value);
},
};
});
export const getAPIKey = cache(async function getAPIKey(key: string): Promise {
let innerKey = "key";
if (isNode()) {
if (key.includes(".json.")) {
let [baseKey, innerKeyPart] = key.split(".json.");
baseKey += ".json";
innerKey = innerKeyPart;
key = baseKey;
}
}
let keyKey = getStorageKey(key);
let localStorageValue = getStorage().getItem(keyKey);
if (localStorageValue?.startsWith("{")) {
try {
localStorageValue = JSON.parse(localStorageValue)[innerKey];
} catch { }
}
if (localStorageValue) {
return localStorageValue;
}
if (isNode()) throw new Error(`Add an api key to ${keyKey}`);
let onDone = (value: string) => { };
let promise = new Promise(resolve => {
onDone = resolve;
});
let obj = showModal({ contents: });
try {
let value = await promise;
setAPIKey(key, value);
return value;
} finally {
obj.close();
}
});
export function setAPIKey(key: string, value: string) {
getStorage().setItem(getStorageKey(key), value);
state.keys.push(key);
getStorage().setItem(getStorageKey("__keys"), JSON.stringify(state.keys));
}
@observer
export class ManageAPIKeys extends preact.Component {
render() {
return "ManageAPIKeys";
}
}