*refactor ssl support

This commit is contained in:
Derrick Hammer 2023-04-18 20:43:37 -04:00
parent 3b1b6425ae
commit 714da70209
Signed by: pcfreak30
GPG Key ID: C997C339BE476FF2
2 changed files with 31 additions and 16 deletions

View File

@ -20,7 +20,7 @@ export async function start() {
const dht = getSwarm();
let sslOptions: boolean | http2.SecureServerOptions = false;
if (getSslManager().enabled) {
if (getSslManager().ready) {
sslOptions = {
SNICallback: () => getSslManager().context,
} as http2.SecureServerOptions;

View File

@ -6,37 +6,47 @@ import config from "../config.js";
export type SSLManagerRenewHandler = (domain: string) => Promise<boolean>;
export class SSLManager {
private _context?: tls.SecureContext;
private _key?: Buffer;
private _cert?: Buffer;
private _domain: string;
private _renewHandler?: SSLManagerRenewHandler;
constructor(domain: string) {
this._domain = domain;
}
private _context?: tls.SecureContext;
get context(): tls.SecureContext {
return this._context as tls.SecureContext;
}
private _cert?: Buffer;
set cert(cert: Buffer) {
this._cert = cert;
this._maybeUpdateContext();
}
private _renewHandler?: SSLManagerRenewHandler;
get renewHandler(): SSLManagerRenewHandler {
return this._renewHandler as any;
}
set renewHandler(value: SSLManagerRenewHandler) {
this._renewHandler = value;
}
set privateKey(key: Buffer) {
this._key = key;
this._maybeUpdateContext();
}
set cert(cert: Buffer) {
this._cert = cert;
this._maybeUpdateContext();
get enabled() {
return config.bool("core.ssl");
}
private _maybeUpdateContext() {
if (b4a.isBuffer(this._cert) && b4a.isBuffer(this._key)) {
this._context = tls.createSecureContext({
cert: this._cert,
key: this._key,
});
}
get ready() {
return this.enabled && this.renewHandler;
}
public async renew(): Promise<boolean> {
@ -50,8 +60,13 @@ export class SSLManager {
return result;
}
get enabled() {
return config.bool("core.ssl") && this._renewHandler;
private _maybeUpdateContext() {
if (b4a.isBuffer(this._cert) && b4a.isBuffer(this._key)) {
this._context = tls.createSecureContext({
cert: this._cert,
key: this._key,
});
}
}
}