mirror of
https://github.com/Afilmory/afilmory
synced 2026-04-24 23:05:05 +00:00
feat: update event handling to use async/await for improved reliability
Signed-off-by: Innei <tukon479@gmail.com>
This commit is contained in:
@@ -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 } })
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
@@ -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 } })
|
||||
}
|
||||
},
|
||||
})
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user