mirror of
https://github.com/yaklang/yaklang-chrome-extension.git
synced 2026-09-25 04:31:52 +08:00
161 lines
5.3 KiB
TypeScript
161 lines
5.3 KiB
TypeScript
import type { BackgroundRequestHandler } from '../router';
|
|
import { ok } from '../response';
|
|
import { requiredDebuggerTarget, requiredRequestTarget } from '../request-context';
|
|
import {
|
|
captureBrowserTransformRecovery,
|
|
confirmBrowserTransformRecovery,
|
|
deleteBrowserTransformProfile,
|
|
executeBrowserTransform,
|
|
getBrowserTransformRecovery,
|
|
listBrowserTransformProfiles,
|
|
resetBrowserTransformRecovery,
|
|
saveBrowserTransformProfile,
|
|
startBrowserTransformRecovery,
|
|
validateBrowserTransformRecovery,
|
|
} from '@/features/browser-transform/service';
|
|
import {
|
|
latestBrowserTransformValidation,
|
|
proposeBrowserTransformProfile,
|
|
validateInferredBrowserTransformProfile,
|
|
} from '@/features/browser-analysis/service';
|
|
import { appendAuditEvent } from '@/features/diagnostics/audit';
|
|
|
|
export const handleTransformRequest: BackgroundRequestHandler = async (request, sender) => {
|
|
switch (request.action) {
|
|
case 'analysis.profile.propose': {
|
|
const input = request.payload;
|
|
const target = await requiredRequestTarget(input, sender);
|
|
return ok(await proposeBrowserTransformProfile(
|
|
target,
|
|
input.candidateId,
|
|
input.callableId,
|
|
input.inputPaths,
|
|
input.name,
|
|
));
|
|
}
|
|
case 'analysis.profile.validate': {
|
|
const input = request.payload;
|
|
const target = await requiredRequestTarget(input, sender);
|
|
const result = await validateInferredBrowserTransformProfile(
|
|
target,
|
|
input.candidateId,
|
|
input.callableId,
|
|
input.packet,
|
|
input.inputPaths,
|
|
input.name,
|
|
input.observed,
|
|
input.comparisonMode,
|
|
);
|
|
void appendAuditEvent({
|
|
category: 'capability',
|
|
action: 'analysis.profile.validate',
|
|
outcome: result.valid ? 'success' : 'denied',
|
|
targetTabId: target.tabId,
|
|
summary: result.proofLevel,
|
|
});
|
|
return ok(result);
|
|
}
|
|
case 'analysis.profile.validation.latest': return ok(
|
|
await latestBrowserTransformValidation(
|
|
await requiredRequestTarget(request.payload, sender),
|
|
),
|
|
);
|
|
case 'transform.profile.list': {
|
|
const input = request.payload;
|
|
const target = input.tabId ? await requiredRequestTarget(input, sender) : undefined;
|
|
return ok(await listBrowserTransformProfiles(
|
|
target ? { tabId: target.tabId, frameId: target.frameId } : undefined,
|
|
));
|
|
}
|
|
case 'transform.profile.save': {
|
|
const profile = await saveBrowserTransformProfile(request.payload);
|
|
void appendAuditEvent({
|
|
category: 'capability',
|
|
action: 'transform.profile.save',
|
|
outcome: 'success',
|
|
targetTabId: profile.target.tabId,
|
|
summary: profile.name,
|
|
});
|
|
return ok(profile);
|
|
}
|
|
case 'transform.profile.delete': return ok(
|
|
await deleteBrowserTransformProfile(request.payload.id),
|
|
);
|
|
case 'transform.recovery.get': return ok(
|
|
await getBrowserTransformRecovery(request.payload.id),
|
|
);
|
|
case 'transform.recovery.start': {
|
|
const status = await startBrowserTransformRecovery(request.payload.id);
|
|
void appendAuditEvent({
|
|
category: 'capability',
|
|
action: 'transform.recovery.start',
|
|
outcome: 'success',
|
|
targetTabId: status.target.tabId,
|
|
summary: '等待一次真实业务操作',
|
|
});
|
|
return ok(status);
|
|
}
|
|
case 'transform.recovery.capture': {
|
|
const input = request.payload;
|
|
const target = await requiredDebuggerTarget(input, sender);
|
|
const recovery = await captureBrowserTransformRecovery(
|
|
input.id,
|
|
target,
|
|
input.callFrameId,
|
|
input.strategy,
|
|
);
|
|
void appendAuditEvent({
|
|
category: 'capability',
|
|
action: 'transform.recovery.capture',
|
|
outcome: 'success',
|
|
targetTabId: target.tabId,
|
|
summary: recovery.binding.name,
|
|
});
|
|
return ok(recovery);
|
|
}
|
|
case 'transform.recovery.validate': {
|
|
const result = await validateBrowserTransformRecovery(
|
|
request.payload.id,
|
|
request.payload.packet,
|
|
);
|
|
void appendAuditEvent({
|
|
category: 'capability',
|
|
action: 'transform.recovery.validate',
|
|
outcome: 'success',
|
|
durationMs: result.execution.durationMs,
|
|
summary: result.recovery.validation?.proofLevel,
|
|
});
|
|
return ok(result);
|
|
}
|
|
case 'transform.recovery.confirm': {
|
|
const profile = await confirmBrowserTransformRecovery(
|
|
request.payload.id,
|
|
request.payload.validationId,
|
|
);
|
|
void appendAuditEvent({
|
|
category: 'capability',
|
|
action: 'transform.recovery.confirm',
|
|
outcome: 'success',
|
|
targetTabId: profile.target.tabId,
|
|
summary: profile.name,
|
|
});
|
|
return ok(profile);
|
|
}
|
|
case 'transform.recovery.reset': return ok(
|
|
await resetBrowserTransformRecovery(request.payload.id),
|
|
);
|
|
case 'transform.execute': {
|
|
const result = await executeBrowserTransform(request.payload);
|
|
void appendAuditEvent({
|
|
category: 'capability',
|
|
action: `transform.${result.direction}`,
|
|
outcome: 'success',
|
|
durationMs: result.durationMs,
|
|
summary: `${result.nodeDurations.length} 个 Pipeline 节点`,
|
|
});
|
|
return ok(result);
|
|
}
|
|
default: return undefined;
|
|
}
|
|
};
|