fix(SmartCertManager): Preserve certificate manager update callback during route updates
This commit is contained in:
81
test/test.route-callback-simple.ts
Normal file
81
test/test.route-callback-simple.ts
Normal file
@ -0,0 +1,81 @@
|
||||
import { tap, expect } from '@git.zone/tstest/tapbundle';
|
||||
import { SmartProxy } from '../ts/index.js';
|
||||
|
||||
tap.test('should set update routes callback on certificate manager', async () => {
|
||||
// Create a simple proxy with a route requiring certificates
|
||||
const proxy = new SmartProxy({
|
||||
routes: [{
|
||||
name: 'test-route',
|
||||
match: {
|
||||
ports: [8443],
|
||||
domains: ['test.local']
|
||||
},
|
||||
action: {
|
||||
type: 'forward',
|
||||
target: { host: 'localhost', port: 3000 },
|
||||
tls: {
|
||||
mode: 'terminate',
|
||||
certificate: 'auto',
|
||||
acme: {
|
||||
email: 'test@local.dev',
|
||||
useProduction: false
|
||||
}
|
||||
}
|
||||
}
|
||||
}]
|
||||
});
|
||||
|
||||
// Mock createCertificateManager to track callback setting
|
||||
let callbackSet = false;
|
||||
const originalCreate = (proxy as any).createCertificateManager;
|
||||
|
||||
(proxy as any).createCertificateManager = async function(...args: any[]) {
|
||||
// Create the actual certificate manager
|
||||
const certManager = await originalCreate.apply(this, args);
|
||||
|
||||
// Track if setUpdateRoutesCallback was called
|
||||
const originalSet = certManager.setUpdateRoutesCallback;
|
||||
certManager.setUpdateRoutesCallback = function(callback: any) {
|
||||
callbackSet = true;
|
||||
return originalSet.call(this, callback);
|
||||
};
|
||||
|
||||
return certManager;
|
||||
};
|
||||
|
||||
await proxy.start();
|
||||
|
||||
// The callback should have been set during initialization
|
||||
expect(callbackSet).toEqual(true);
|
||||
|
||||
// Reset tracking
|
||||
callbackSet = false;
|
||||
|
||||
// Update routes - this should recreate the certificate manager
|
||||
await proxy.updateRoutes([{
|
||||
name: 'new-route',
|
||||
match: {
|
||||
ports: [8444],
|
||||
domains: ['new.local']
|
||||
},
|
||||
action: {
|
||||
type: 'forward',
|
||||
target: { host: 'localhost', port: 3001 },
|
||||
tls: {
|
||||
mode: 'terminate',
|
||||
certificate: 'auto',
|
||||
acme: {
|
||||
email: 'test@local.dev',
|
||||
useProduction: false
|
||||
}
|
||||
}
|
||||
}
|
||||
}]);
|
||||
|
||||
// The callback should have been set again after update
|
||||
expect(callbackSet).toEqual(true);
|
||||
|
||||
await proxy.stop();
|
||||
});
|
||||
|
||||
tap.start();
|
Reference in New Issue
Block a user