feat(dcrouter): add managed local dcrouter mode with status controls and gateway integration

This commit is contained in:
2026-05-09 20:04:02 +00:00
parent 595e84cdb6
commit dc37a71802
19 changed files with 873 additions and 31 deletions
+59 -1
View File
@@ -54,6 +54,7 @@ export interface IBackupsState {
export interface ISettingsState {
settings: interfaces.data.ISettings | null;
backupPasswordConfigured: boolean;
managedDcRouterStatus: interfaces.data.IManagedDcRouterStatus | null;
}
export interface IAppStoreState {
@@ -142,6 +143,7 @@ export const settingsStatePart = await appState.getStatePart<ISettingsState>(
{
settings: null,
backupPasswordConfigured: false,
managedDcRouterStatus: null,
},
'soft',
);
@@ -898,17 +900,21 @@ export const triggerScheduleAction = backupsStatePart.createAction<{ scheduleId:
export const fetchSettingsAction = settingsStatePart.createAction(async (statePartArg) => {
const context = getActionContext();
try {
const [settingsResp, passwordResp] = await Promise.all([
const [settingsResp, passwordResp, managedDcRouterResp] = await Promise.all([
new plugins.domtools.plugins.typedrequest.TypedRequest<
interfaces.requests.IReq_GetSettings
>('/typedrequest', 'getSettings').fire({ identity: context.identity! }),
new plugins.domtools.plugins.typedrequest.TypedRequest<
interfaces.requests.IReq_GetBackupPasswordStatus
>('/typedrequest', 'getBackupPasswordStatus').fire({ identity: context.identity! }),
new plugins.domtools.plugins.typedrequest.TypedRequest<
interfaces.requests.IReq_GetManagedDcRouterStatus
>('/typedrequest', 'getManagedDcRouterStatus').fire({ identity: context.identity! }),
]);
return {
settings: settingsResp.settings,
backupPasswordConfigured: passwordResp.status.isConfigured,
managedDcRouterStatus: managedDcRouterResp.status,
};
} catch (err) {
console.error('Failed to fetch settings:', err);
@@ -935,6 +941,58 @@ export const updateSettingsAction = settingsStatePart.createAction<{
}
});
export const fetchManagedDcRouterStatusAction = settingsStatePart.createAction(async (statePartArg) => {
const context = getActionContext();
try {
const response = await new plugins.domtools.plugins.typedrequest.TypedRequest<
interfaces.requests.IReq_GetManagedDcRouterStatus
>('/typedrequest', 'getManagedDcRouterStatus').fire({ identity: context.identity! });
return { ...statePartArg.getState(), managedDcRouterStatus: response.status };
} catch (err) {
console.error('Failed to fetch managed dcrouter status:', err);
return statePartArg.getState();
}
});
export const startManagedDcRouterAction = settingsStatePart.createAction(async (statePartArg) => {
const context = getActionContext();
try {
const response = await new plugins.domtools.plugins.typedrequest.TypedRequest<
interfaces.requests.IReq_StartManagedDcRouter
>('/typedrequest', 'startManagedDcRouter').fire({ identity: context.identity! });
return { ...statePartArg.getState(), managedDcRouterStatus: response.status };
} catch (err) {
console.error('Failed to start managed dcrouter:', err);
return statePartArg.getState();
}
});
export const stopManagedDcRouterAction = settingsStatePart.createAction(async (statePartArg) => {
const context = getActionContext();
try {
const response = await new plugins.domtools.plugins.typedrequest.TypedRequest<
interfaces.requests.IReq_StopManagedDcRouter
>('/typedrequest', 'stopManagedDcRouter').fire({ identity: context.identity! });
return { ...statePartArg.getState(), managedDcRouterStatus: response.status };
} catch (err) {
console.error('Failed to stop managed dcrouter:', err);
return statePartArg.getState();
}
});
export const restartManagedDcRouterAction = settingsStatePart.createAction(async (statePartArg) => {
const context = getActionContext();
try {
const response = await new plugins.domtools.plugins.typedrequest.TypedRequest<
interfaces.requests.IReq_RestartManagedDcRouter
>('/typedrequest', 'restartManagedDcRouter').fire({ identity: context.identity! });
return { ...statePartArg.getState(), managedDcRouterStatus: response.status };
} catch (err) {
console.error('Failed to restart managed dcrouter:', err);
return statePartArg.getState();
}
});
export const setBackupPasswordAction = settingsStatePart.createAction<{ password: string }>(
async (statePartArg, dataArg) => {
const context = getActionContext();