import type { Match3DClickItemRequest, Match3DClickItemResult, Match3DRunResponse, } from '../../../packages/shared/src/contracts/match3dRuntime'; import { confirmLocalMatch3DClick, resolveLocalMatch3DTimer, startLocalMatch3DRun, stopLocalMatch3DRun, } from './match3dLocalRuntime'; import { clickMatch3DItem, finishMatch3DTimeUp, getMatch3DRun, type Match3DRuntimeRequestOptions, restartMatch3DRun, startMatch3DRun, stopMatch3DRun, } from './match3dRuntimeClient'; export type Match3DRuntimeAdapter = { startRun: ( profileId: string, options?: Match3DRuntimeRequestOptions, ) => Promise; getRun: (runId: string) => Promise; clickItem: ( runId: string, payload: Match3DClickItemRequest, ) => Promise; restartRun: (runId: string) => Promise; stopRun: (runId: string) => Promise; finishTimeUp: (runId: string) => Promise; }; export type LocalMatch3DRuntimeAdapterOptions = { clearCount?: number; initialRun?: Match3DRunResponse['run']; }; type ServerMatch3DRuntimeAdapterDependencies = { clickItem: typeof clickMatch3DItem; finishTimeUp: typeof finishMatch3DTimeUp; getRun: typeof getMatch3DRun; restartRun: typeof restartMatch3DRun; startRun: typeof startMatch3DRun; stopRun: typeof stopMatch3DRun; }; const defaultServerMatch3DRuntimeAdapterDependencies: ServerMatch3DRuntimeAdapterDependencies = { clickItem: clickMatch3DItem, finishTimeUp: finishMatch3DTimeUp, getRun: getMatch3DRun, restartRun: restartMatch3DRun, startRun: startMatch3DRun, stopRun: stopMatch3DRun, }; export function createServerMatch3DRuntimeAdapter( dependencies: ServerMatch3DRuntimeAdapterDependencies = defaultServerMatch3DRuntimeAdapterDependencies, ): Match3DRuntimeAdapter { return { clickItem: (runId, payload) => dependencies.clickItem(runId, payload), finishTimeUp: (runId) => dependencies.finishTimeUp(runId), getRun: (runId) => dependencies.getRun(runId), restartRun: (runId) => dependencies.restartRun(runId), startRun: (profileId, options) => dependencies.startRun(profileId, options), stopRun: (runId) => dependencies.stopRun(runId), }; } export function createLocalMatch3DRuntimeAdapter( options: LocalMatch3DRuntimeAdapterOptions = {}, ): Match3DRuntimeAdapter { let authorityRun = options.initialRun ?? startLocalMatch3DRun(options.clearCount); return { async startRun() { authorityRun = startLocalMatch3DRun(options.clearCount); return { run: authorityRun }; }, async getRun() { authorityRun = resolveLocalMatch3DTimer(authorityRun); return { run: authorityRun }; }, async clickItem(_runId, payload) { const result = await confirmLocalMatch3DClick(authorityRun, payload); authorityRun = result.run; return result; }, async restartRun() { authorityRun = startLocalMatch3DRun(options.clearCount); return { run: authorityRun }; }, async stopRun() { authorityRun = stopLocalMatch3DRun(authorityRun); return { run: authorityRun }; }, async finishTimeUp() { authorityRun = resolveLocalMatch3DTimer(authorityRun); return { run: authorityRun }; }, }; }