src/lifecycles/unload.ts

Summary

Maintainability
A
2 hrs
Test Coverage
import { MOOA_EVENT, StatusEnum } from '../model/constants'
import { reasonableTime } from '../helper/timeouts'
import { customEvent, mooaLog } from '../helper/app.helper'

const appsToUnload: any = {}

export async function toUnloadPromise(app: any, mooaInstance?: any) {
  const unloadInfo = appsToUnload[app.name]

  if (app.status === StatusEnum.NOT_LOADED) {
    unloadingApp(app, unloadInfo)
    return app
  }

  if (app.status === StatusEnum.UNLOADING) {
    await unloadInfo.promise
    return app
  }

  if (app.status !== StatusEnum.NOT_MOUNTED) {
    return app
  }

  if (!unloadInfo) {
    return app
  }

  try {
    app.status = StatusEnum.UNLOADING
    customEvent(MOOA_EVENT.UNLOADING, { app: app })
    mooaLog('Unloading application', app.name, app.status)
    await reasonableTime(
      app.unload(),
      `Unloading application '${app.name}'`,
      app.timeouts.unload
    )
  } catch (err) {
    console.error('Unloading Error', err)
    return app
  }

  unloadingApp(app, unloadInfo)

  return app
}

function unloadingApp(app: any, unloadInfo: any) {
  delete appsToUnload[app.name]

  delete app.bootstrap
  delete app.mount
  delete app.unmount
  delete app.unload

  app.status = StatusEnum.NOT_LOADED

  unloadInfo.resolve()
}

export function getUnloadApps() {
  return appsToUnload
}

export function addAppToUnload(
  app: any,
  promiseGetter: any,
  resolve: any,
  reject: any
) {
  appsToUnload[app.name] = { app, resolve, reject }
  Object.defineProperty(appsToUnload[app.name], 'promise', {
    get: promiseGetter
  })
}