refactor match3d runtime adapters

This commit is contained in:
2026-05-12 14:02:42 +08:00
parent 5cb5329f4e
commit 22810245f5
8 changed files with 358 additions and 43 deletions

View File

@@ -104,10 +104,6 @@ import {
ApiClientError,
BACKGROUND_AUTH_REQUEST_OPTIONS,
} from '../../services/apiClient';
import {
fetchCreationEntryConfig,
type CreationEntryConfig,
} from '../../services/creationEntryConfigService';
import {
getPublicAuthUserByCode,
getPublicAuthUserById,
@@ -132,6 +128,10 @@ import {
deleteBigFishWork,
listBigFishWorks,
} from '../../services/big-fish-works';
import {
type CreationEntryConfig,
fetchCreationEntryConfig,
} from '../../services/creationEntryConfigService';
import {
cancelCreativeAgentSession,
confirmCreativePuzzleTemplate,
@@ -144,13 +144,7 @@ import {
shouldRestoreCustomWorldAgentUiState,
} from '../../services/customWorldAgentUiState';
import { match3dCreationClient } from '../../services/match3d-creation';
import {
clickMatch3DItem,
finishMatch3DTimeUp,
restartMatch3DRun,
startMatch3DRun,
stopMatch3DRun,
} from '../../services/match3d-runtime';
import { createServerMatch3DRuntimeAdapter } from '../../services/match3d-runtime';
import {
deleteMatch3DWork,
getMatch3DWorkDetail,
@@ -2599,6 +2593,10 @@ export function PlatformEntryFlowShellImpl({
},
});
const match3dRuntimeAdapter = useMemo(
() => createServerMatch3DRuntimeAdapter(),
[],
);
const match3dFlow = usePlatformCreationAgentFlowController<
Match3DAgentSessionSnapshot,
CreateMatch3DSessionRequest,
@@ -4376,11 +4374,11 @@ export function PlatformEntryFlowShellImpl({
try {
const { run } = options.embedded
? await startMatch3DRun(
? await match3dRuntimeAdapter.startRun(
profile.profileId,
RECOMMEND_RUNTIME_BACKGROUND_AUTH_OPTIONS,
)
: await startMatch3DRun(profile.profileId);
: await match3dRuntimeAdapter.startRun(profile.profileId);
setMatch3DRun(run);
setMatch3DRuntimeReturnStage(returnStage);
if (!options.embedded) {
@@ -4412,6 +4410,7 @@ export function PlatformEntryFlowShellImpl({
[
isMatch3DBusy,
match3dFlow,
match3dRuntimeAdapter,
resolveMatch3DErrorMessage,
setMatch3DError,
setSelectionStage,
@@ -6671,7 +6670,7 @@ export function PlatformEntryFlowShellImpl({
match3dFlow.setIsBusy(true);
setMatch3DError(null);
void restartMatch3DRun(match3dRun.runId)
void match3dRuntimeAdapter.restartRun(match3dRun.runId)
.then(({ run }) => {
setMatch3DRun(run);
})
@@ -6693,14 +6692,14 @@ export function PlatformEntryFlowShellImpl({
if (!runId) {
return Promise.reject(new Error('抓大鹅运行态缺少 runId。'));
}
return clickMatch3DItem(runId, payload);
return match3dRuntimeAdapter.clickItem(runId, payload);
}}
onTimeExpired={() => {
if (!match3dRun?.runId) {
return;
}
void finishMatch3DTimeUp(match3dRun.runId)
void match3dRuntimeAdapter.finishTimeUp(match3dRun.runId)
.then(({ run }) => {
setMatch3DRun(run);
})
@@ -6868,6 +6867,7 @@ export function PlatformEntryFlowShellImpl({
match3dError,
match3dFlow,
match3dRun,
match3dRuntimeAdapter,
platformBootstrap.platformTab,
platformThemeClass,
puzzleError,
@@ -8560,7 +8560,7 @@ export function PlatformEntryFlowShellImpl({
error={match3dError}
onBack={() => {
if (match3dRun?.runId && match3dRun.status === 'running') {
void stopMatch3DRun(match3dRun.runId).catch(
void match3dRuntimeAdapter.stopRun(match3dRun.runId).catch(
() => undefined,
);
}
@@ -8573,7 +8573,7 @@ export function PlatformEntryFlowShellImpl({
match3dFlow.setIsBusy(true);
setMatch3DError(null);
void restartMatch3DRun(match3dRun.runId)
void match3dRuntimeAdapter.restartRun(match3dRun.runId)
.then(({ run }) => {
setMatch3DRun(run);
})
@@ -8597,14 +8597,14 @@ export function PlatformEntryFlowShellImpl({
new Error('抓大鹅运行态缺少 runId。'),
);
}
return clickMatch3DItem(runId, payload);
return match3dRuntimeAdapter.clickItem(runId, payload);
}}
onTimeExpired={() => {
if (!match3dRun?.runId) {
return;
}
void finishMatch3DTimeUp(match3dRun.runId)
void match3dRuntimeAdapter.finishTimeUp(match3dRun.runId)
.then(({ run }) => {
setMatch3DRun(run);
})

View File

@@ -54,6 +54,7 @@ import {
import { match3dCreationClient } from '../../services/match3d-creation';
import {
clickMatch3DItem,
createServerMatch3DRuntimeAdapter,
finishMatch3DTimeUp,
restartMatch3DRun,
startMatch3DRun,
@@ -348,14 +349,35 @@ vi.mock('../../services/match3d-works', () => ({
listMatch3DWorks: vi.fn(),
}));
vi.mock('../../services/match3d-runtime', () => ({
const match3dRuntimeServiceMocks = vi.hoisted(() => ({
clickMatch3DItem: vi.fn(),
createServerMatch3DRuntimeAdapter: vi.fn(),
finishMatch3DTimeUp: vi.fn(),
restartMatch3DRun: vi.fn(),
startMatch3DRun: vi.fn(),
stopMatch3DRun: vi.fn(),
}));
const match3dServerRuntimeAdapterMock = vi.hoisted(() => ({
clickItem: vi.fn(),
finishTimeUp: vi.fn(),
getRun: vi.fn(),
restartRun: vi.fn(),
startRun: vi.fn(),
stopRun: vi.fn(),
}));
vi.mock('../../services/match3d-runtime', async () => {
const actual = await vi.importActual<
typeof import('../../services/match3d-runtime')
>('../../services/match3d-runtime');
return {
...actual,
...match3dRuntimeServiceMocks,
};
});
vi.mock('../../services/square-hole-creation', () => ({
squareHoleCreationClient: {
createSession: vi.fn(),
@@ -1453,6 +1475,24 @@ function TestWrapper({
beforeEach(() => {
vi.resetAllMocks();
vi.mocked(createServerMatch3DRuntimeAdapter).mockReturnValue(
match3dServerRuntimeAdapterMock,
);
match3dServerRuntimeAdapterMock.startRun.mockRejectedValue(
new Error('未启动抓大鹅运行态'),
);
match3dServerRuntimeAdapterMock.clickItem.mockRejectedValue(
new Error('未执行抓大鹅点击'),
);
match3dServerRuntimeAdapterMock.restartRun.mockRejectedValue(
new Error('未重新开始抓大鹅运行态'),
);
match3dServerRuntimeAdapterMock.finishTimeUp.mockResolvedValue({
run: buildMockMatch3DRun('match3d-profile-time-up'),
});
match3dServerRuntimeAdapterMock.stopRun.mockResolvedValue({
run: buildMockMatch3DRun('match3d-profile-stopped'),
});
window.history.replaceState(null, '', '/');
window.sessionStorage.clear();
window.localStorage.clear();
@@ -4465,7 +4505,7 @@ test('public code search opens a published Match3D work by M3 code and starts ru
vi.mocked(listMatch3DGallery).mockResolvedValue({
items: [match3dWork],
});
vi.mocked(startMatch3DRun).mockResolvedValue({
match3dServerRuntimeAdapterMock.startRun.mockResolvedValue({
run: buildMockMatch3DRun(match3dWork.profileId),
});
@@ -4483,7 +4523,9 @@ test('public code search opens a published Match3D work by M3 code and starts ru
await user.click(screen.getByRole('button', { name: '启动' }));
await waitFor(() => {
expect(startMatch3DRun).toHaveBeenCalledWith('match3d-profile-public-1');
expect(match3dServerRuntimeAdapterMock.startRun).toHaveBeenCalledWith(
'match3d-profile-public-1',
);
});
expect(
await screen.findByText('抓大鹅运行态match3d-run-match3d-profile-public-1'),