diff --git a/packages/plugins/@nocobase/plugin-action-import/src/client/useShared.ts b/packages/plugins/@nocobase/plugin-action-import/src/client/useShared.ts index f3dd38acc8..41040fdebc 100644 --- a/packages/plugins/@nocobase/plugin-action-import/src/client/useShared.ts +++ b/packages/plugins/@nocobase/plugin-action-import/src/client/useShared.ts @@ -129,10 +129,10 @@ export const useShared = () => { }; } const file = value[0] ?? {}; - if (file.size > 10 * 1024 * 1024) { + if (file.size > 80 * 1024 * 1024) { return { type: 'error', - message: t('File size cannot exceed 10M'), + message: t('File size cannot exceed 80M'), }; } if (!INCLUDE_FILE_TYPE.includes(file.type)) { diff --git a/packages/plugins/@nocobase/plugin-async-task-manager/src/server/plugin.ts b/packages/plugins/@nocobase/plugin-async-task-manager/src/server/plugin.ts index 114cdd2124..812ac6c9bd 100644 --- a/packages/plugins/@nocobase/plugin-async-task-manager/src/server/plugin.ts +++ b/packages/plugins/@nocobase/plugin-async-task-manager/src/server/plugin.ts @@ -3,8 +3,11 @@ import { BaseTaskManager } from './base-task-manager'; import { AsyncTasksManager } from './interfaces/async-task-manager'; import { CommandTaskType } from './command-task-type'; import asyncTasksResource from './resourcers/async-tasks'; +import { throttle } from 'lodash'; export class PluginAsyncExportServer extends Plugin { + private progressThrottles: Map = new Map(); + async afterAdd() {} async beforeLoad() { @@ -17,13 +20,37 @@ export class PluginAsyncExportServer extends Plugin { }); this.app.container.get('AsyncTaskManager').registerTaskType(CommandTaskType); - this.app.acl.allow('asyncTasks', ['get', 'fetchFile'], 'loggedIn'); } + getThrottledProgressEmitter(taskId: string, userId: string) { + if (!this.progressThrottles.has(taskId)) { + this.progressThrottles.set( + taskId, + throttle( + (progress: any) => { + this.app.emit('ws:sendToTag', { + tagKey: 'userId', + tagValue: userId, + message: { + type: 'async-tasks:progress', + payload: { + taskId, + progress, + }, + }, + }); + }, + 500, + { leading: true, trailing: true }, + ), + ); + } + return this.progressThrottles.get(taskId); + } + async load() { this.app.resourceManager.define(asyncTasksResource); - const asyncTaskManager = this.app.container.get('AsyncTaskManager'); this.app.on(`ws:message:request:async-tasks:list`, async (message) => { @@ -71,38 +98,36 @@ export class PluginAsyncExportServer extends Plugin { asyncTaskManager.on('taskProgress', ({ task, progress }) => { const userId = task.tags['userId']; if (userId) { - this.app.emit('ws:sendToTag', { - tagKey: 'userId', - tagValue: userId, - message: { - type: 'async-tasks:progress', - payload: { - taskId: task.taskId, - progress, - }, - }, - }); + const throttledEmit = this.getThrottledProgressEmitter(task.taskId, userId); + throttledEmit(progress); } }); asyncTaskManager.on('taskStatusChange', ({ task, status }) => { const userId = task.tags['userId']; - if (userId) { - this.app.emit('ws:sendToTag', { - tagKey: 'userId', - tagValue: userId, - message: { - type: 'async-tasks:status', - payload: { - taskId: task.taskId, - status: task.toJSON().status, - }, - }, - }); - } - }); + if (!userId) return; + + this.app.emit('ws:sendToTag', { + tagKey: 'userId', + tagValue: userId, + message: { + type: 'async-tasks:status', + payload: { + taskId: task.taskId, + status: task.toJSON().status, + }, + }, + }); + + if (status.type !== 'running' && status.type !== 'pending') { + const throttled = this.progressThrottles.get(task.taskId); + if (throttled) { + // @ts-ignore + throttled.cancel(); + this.progressThrottles.delete(task.taskId); + } + } - asyncTaskManager.on('taskStatusChange', ({ status }) => { if (status.type === 'success') { this.app.emit('workflow:dispatch'); }