Archived
1
0

Add deinit for plugins

This commit is contained in:
Asher 2021-01-20 15:48:35 -06:00
parent 3c6fac9ce4
commit 017b1cc633
No known key found for this signature in database
GPG Key ID: D63C1EF81242354A
3 changed files with 23 additions and 1 deletions

View File

@ -46,7 +46,7 @@ interface Application extends pluginapi.Application {
/* /*
* Clone of the above without functions. * Clone of the above without functions.
*/ */
plugin: Omit<Plugin, "init" | "router" | "applications"> plugin: Omit<Plugin, "init" | "deinit" | "router" | "applications">
} }
/** /**
@ -254,6 +254,21 @@ export class PluginAPI {
return p return p
} }
public async dispose(): Promise<void> {
await Promise.all(
Array.from(this.plugins.values()).map(async (p) => {
if (!p.deinit) {
return
}
try {
await p.deinit()
} catch (error) {
this.logger.error("plugin failed to deinit", field("name", p.name), field("error", error.message))
}
}),
)
}
} }
interface PackageJSON { interface PackageJSON {

View File

@ -15,6 +15,7 @@ import { Heart } from "../heart"
import { redirect, replaceTemplates } from "../http" import { redirect, replaceTemplates } from "../http"
import { PluginAPI } from "../plugin" import { PluginAPI } from "../plugin"
import { getMediaMime, paths } from "../util" import { getMediaMime, paths } from "../util"
import { wrapper } from "../wrapper"
import * as apps from "./apps" import * as apps from "./apps"
import * as domainProxy from "./domainProxy" import * as domainProxy from "./domainProxy"
import * as health from "./health" import * as health from "./health"
@ -148,6 +149,7 @@ export const register = async (
await papi.loadPlugins() await papi.loadPlugins()
papi.mount(app, wsApp) papi.mount(app, wsApp)
app.use("/api/applications", apps.router(papi)) app.use("/api/applications", apps.router(papi))
wrapper.onDispose(() => papi.dispose())
app.use(() => { app.use(() => {
throw new HttpError("Not Found", HttpCode.NotFound) throw new HttpError("Not Found", HttpCode.NotFound)

View File

@ -167,6 +167,11 @@ export interface Plugin {
*/ */
init(config: PluginConfig): void init(config: PluginConfig): void
/**
* Called when the plugin should dispose/shutdown everything.
*/
deinit?(): Promise<void>
/** /**
* Returns the plugin's router. * Returns the plugin's router.
* *