check-task-status.ts 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import { checkTaskStatus as fetchCheckTaskStatus } from '@/service/plugins'
  2. import type { PluginStatus } from '../../types'
  3. import { TaskStatus } from '../../types'
  4. import { sleep } from '@/utils'
  5. const INTERVAL = 10 * 1000 // 10 seconds
  6. type Params = {
  7. taskId: string
  8. pluginUniqueIdentifier: string
  9. }
  10. function checkTaskStatus() {
  11. let nextStatus = TaskStatus.running
  12. let isStop = false
  13. const doCheckStatus = async ({
  14. taskId,
  15. pluginUniqueIdentifier,
  16. }: Params) => {
  17. if (isStop) {
  18. return {
  19. status: TaskStatus.success,
  20. }
  21. }
  22. const res = await fetchCheckTaskStatus(taskId)
  23. const { plugins } = res.task
  24. const plugin = plugins.find((p: PluginStatus) => p.plugin_unique_identifier === pluginUniqueIdentifier)
  25. if (!plugin) {
  26. nextStatus = TaskStatus.failed
  27. return {
  28. status: TaskStatus.failed,
  29. error: 'Plugin package not found',
  30. }
  31. }
  32. nextStatus = plugin.status
  33. if (nextStatus === TaskStatus.running) {
  34. await sleep(INTERVAL)
  35. return await doCheckStatus({
  36. taskId,
  37. pluginUniqueIdentifier,
  38. })
  39. }
  40. if (nextStatus === TaskStatus.failed) {
  41. return {
  42. status: TaskStatus.failed,
  43. error: plugin.message,
  44. }
  45. }
  46. return ({
  47. status: TaskStatus.success,
  48. })
  49. }
  50. return {
  51. check: doCheckStatus,
  52. stop: () => {
  53. isStop = true
  54. },
  55. }
  56. }
  57. export default checkTaskStatus