fix(acme): Fix port 80 ACME management and challenge route concurrency issues by deduplicating port listeners, preserving challenge route state across certificate manager recreations, and adding mutex locks to route updates.

This commit is contained in:
2025-05-19 03:40:58 +00:00
parent 0bd35c4fb3
commit 3fcdce611c
13 changed files with 1494 additions and 351 deletions

View File

@ -0,0 +1,45 @@
/**
* Simple mutex implementation for async operations
*/
export class Mutex {
private isLocked: boolean = false;
private waitQueue: Array<() => void> = [];
/**
* Acquire the lock
*/
async acquire(): Promise<void> {
return new Promise<void>((resolve) => {
if (!this.isLocked) {
this.isLocked = true;
resolve();
} else {
this.waitQueue.push(resolve);
}
});
}
/**
* Release the lock
*/
release(): void {
this.isLocked = false;
const nextResolve = this.waitQueue.shift();
if (nextResolve) {
this.isLocked = true;
nextResolve();
}
}
/**
* Run a function exclusively with the lock
*/
async runExclusive<T>(fn: () => Promise<T>): Promise<T> {
await this.acquire();
try {
return await fn();
} finally {
this.release();
}
}
}