@push.rocks/smartproxy
Version:
A powerful proxy package with unified route-based configuration for high traffic management. Features include SSL/TLS support, flexible routing patterns, WebSocket handling, advanced security options, and automatic ACME certificate management.
72 lines • 6.04 kB
JavaScript
import * as plugins from '../../plugins.js';
import { AsyncFileSystem } from '../../core/utils/fs-utils.js';
export class CertStore {
constructor(certDir) {
this.certDir = certDir;
}
async initialize() {
await AsyncFileSystem.ensureDir(this.certDir);
}
async getCertificate(routeName) {
const certPath = this.getCertPath(routeName);
const metaPath = `${certPath}/meta.json`;
if (!await AsyncFileSystem.exists(metaPath)) {
return null;
}
try {
const meta = await AsyncFileSystem.readJSON(metaPath);
const [cert, key] = await Promise.all([
AsyncFileSystem.readFile(`${certPath}/cert.pem`),
AsyncFileSystem.readFile(`${certPath}/key.pem`)
]);
let ca;
const caPath = `${certPath}/ca.pem`;
if (await AsyncFileSystem.exists(caPath)) {
ca = await AsyncFileSystem.readFile(caPath);
}
return {
cert,
key,
ca,
expiryDate: new Date(meta.expiryDate),
issueDate: new Date(meta.issueDate)
};
}
catch (error) {
console.error(`Failed to load certificate for ${routeName}: ${error}`);
return null;
}
}
async saveCertificate(routeName, certData) {
const certPath = this.getCertPath(routeName);
await AsyncFileSystem.ensureDir(certPath);
// Save certificate files in parallel
const savePromises = [
AsyncFileSystem.writeFile(`${certPath}/cert.pem`, certData.cert),
AsyncFileSystem.writeFile(`${certPath}/key.pem`, certData.key)
];
if (certData.ca) {
savePromises.push(AsyncFileSystem.writeFile(`${certPath}/ca.pem`, certData.ca));
}
// Save metadata
const meta = {
expiryDate: certData.expiryDate.toISOString(),
issueDate: certData.issueDate.toISOString(),
savedAt: new Date().toISOString()
};
savePromises.push(AsyncFileSystem.writeJSON(`${certPath}/meta.json`, meta));
await Promise.all(savePromises);
}
async deleteCertificate(routeName) {
const certPath = this.getCertPath(routeName);
if (await AsyncFileSystem.isDirectory(certPath)) {
await AsyncFileSystem.removeDir(certPath);
}
}
getCertPath(routeName) {
// Sanitize route name for filesystem
const safeName = routeName.replace(/[^a-zA-Z0-9-_]/g, '_');
return `${this.certDir}/${safeName}`;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydC1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3Byb3hpZXMvc21hcnQtcHJveHkvY2VydC1zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUcvRCxNQUFNLE9BQU8sU0FBUztJQUNwQixZQUFvQixPQUFlO1FBQWYsWUFBTyxHQUFQLE9BQU8sQ0FBUTtJQUFHLENBQUM7SUFFaEMsS0FBSyxDQUFDLFVBQVU7UUFDckIsTUFBTSxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU0sS0FBSyxDQUFDLGNBQWMsQ0FBQyxTQUFpQjtRQUMzQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sUUFBUSxHQUFHLEdBQUcsUUFBUSxZQUFZLENBQUM7UUFFekMsSUFBSSxDQUFDLE1BQU0sZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzVDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sZUFBZSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUV0RCxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFDcEMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsV0FBVyxDQUFDO2dCQUNoRCxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxVQUFVLENBQUM7YUFDaEQsQ0FBQyxDQUFDO1lBRUgsSUFBSSxFQUFzQixDQUFDO1lBQzNCLE1BQU0sTUFBTSxHQUFHLEdBQUcsUUFBUSxT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