feat: update event handling to use async/await for improved reliability

Signed-off-by: Innei <tukon479@gmail.com>
This commit is contained in:
Innei
2025-11-20 23:51:30 +08:00
parent ac9f12b172
commit 1835aff210
6 changed files with 19 additions and 22 deletions

View File

@@ -38,11 +38,11 @@ type MultipartParseOptions = {
abortSignal: AbortSignal
}
function formatBytesToMb (bytes: number): number {
function formatBytesToMb(bytes: number): number {
return Number((bytes / BYTES_PER_MB).toFixed(2))
}
function formatBytesForDisplay (bytes: number): string {
function formatBytesForDisplay(bytes: number): string {
return `${formatBytesToMb(bytes)} MB`
}
@@ -101,7 +101,7 @@ export class PhotoController {
await this.photoAssetService.uploadAssets(inputs, {
progress: async (event) => {
sendEvent(event)
await sendEvent(event)
},
abortSignal,
})
@@ -109,7 +109,7 @@ export class PhotoController {
const message = error instanceof Error ? error.message : '上传失败'
this.logger.error(error)
sendEvent({ type: 'error', payload: { message } })
await sendEvent({ type: 'error', payload: { message } })
}
},
})

View File

@@ -29,7 +29,7 @@ export class DataSyncController {
context,
handler: async ({ sendEvent }) => {
const progressHandler: DataSyncProgressEmitter = async (event) => {
sendEvent(event)
await sendEvent(event)
}
try {
@@ -47,7 +47,7 @@ export class DataSyncController {
const message = error instanceof Error ? error.message : 'Unknown error'
this.logger.error('Failed to run data sync', error)
sendEvent({ type: 'error', payload: { message } })
await sendEvent({ type: 'error', payload: { message } })
}
},
})

View File

@@ -56,7 +56,7 @@ export class SuperAdminBuilderDebugController {
if (event.type !== 'log') {
return
}
sendEvent({ type: 'log', payload: event.payload })
await sendEvent({ type: 'log', payload: event.payload })
}
try {
@@ -67,7 +67,7 @@ export class SuperAdminBuilderDebugController {
logEmitter,
})
sendEvent({
await sendEvent({
type: 'complete',
payload: {
storageKey: result.storageKey,
@@ -80,7 +80,7 @@ export class SuperAdminBuilderDebugController {
} catch (error) {
const message = error instanceof Error ? error.message : 'Unknown error'
this.logger.error('Builder debug run failed', error)
sendEvent({ type: 'error', payload: { message } })
await sendEvent({ type: 'error', payload: { message } })
}
},
})
@@ -114,7 +114,7 @@ export class SuperAdminBuilderDebugController {
private async executeDebugRun(
params: StorageResolution & {
file: UploadedDebugFile
sendEvent: (event: BuilderDebugProgressEvent) => void
sendEvent: (event: BuilderDebugProgressEvent) => Promise<void>
logEmitter: DataSyncProgressEmitter
},
) {
@@ -128,7 +128,7 @@ export class SuperAdminBuilderDebugController {
const normalizedObject = this.normalizeStorageObjectKey(uploaded, tempKey)
cleanupKeys.add(normalizedObject.key)
sendEvent({
await sendEvent({
type: 'start',
payload: {
storageKey: normalizedObject.key,

View File

@@ -9,8 +9,8 @@ export interface CreateProgressSseResponseOptions<TEvent> {
}
export interface SseHandlerHelpers<TEvent> {
sendEvent: (event: TEvent) => void
sendChunk: (chunk: string) => void
sendEvent: (event: TEvent) => Promise<void>
sendChunk: (chunk: string) => Promise<void>
abortSignal: AbortSignal
}
@@ -46,15 +46,15 @@ export function createProgressSseResponse<TEvent>({
stopHeartbeat()
})
const sendEvent = (event: TEvent) => {
return stream.writeSSE({
const sendEvent = async (event: TEvent) => {
await stream.writeSSE({
event: eventName,
data: JSON.stringify(event),
})
}
const sendChunk = (chunk: string) => {
void stream.write(chunk)
const sendChunk = async (chunk: string) => {
await stream.write(chunk)
}
await stream.write(': connected\n\n')
@@ -73,9 +73,7 @@ export function createProgressSseResponse<TEvent>({
try {
await handler({
sendEvent: (event) => {
void sendEvent(event)
},
sendEvent,
sendChunk,
abortSignal,
})

View File

@@ -124,7 +124,6 @@ export function PhotoLibraryActionBar() {
onClick={handleUploadClick}
className="flex items-center gap-1 text-xs sm:text-sm"
>
<DynamicIcon name="upload" className="h-3.5 w-3.5" />
<span className="hidden sm:inline">{t(photoLibraryActionKeys.upload)}</span>
<span className="sm:hidden">{t(photoLibraryActionKeys.uploadShort)}</span>
</Button>

View File

@@ -214,7 +214,7 @@ export function PhotoSyncProgressPanel({ progress }: PhotoSyncProgressPanelProps
const recentLogs = progress.logs.slice(-8).reverse()
return (
<div className="bg-background-tertiary relative overflow-hidden rounded-lg p-6">
<div className="bg-background-tertiary relative overflow-hidden p-6">
<BorderOverlay />
<div className="flex flex-wrap items-center justify-between gap-4">
<div>