mirror of
https://github.com/searxng/searxng.git
synced 2025-12-29 07:00:02 +00:00
* [mod] client/simple: client plugins
Defines a new interface for client side *"plugins"* that coexist with server
side plugin system. Each plugin (e.g., `InfiniteScroll`) extends the base
`ts Plugin`. Client side plugins are independent and lazy‑loaded via `router.ts`
when their `load()` conditions are met. On each navigation request, all
applicable plugins are instanced.
Since these are client side plugins, we can only invoke them once DOM is fully
loaded. E.g. `Calculator` will not render a new `answer` block until fully
loaded and executed.
For some plugins, we might want to handle its availability in `settings.yml`
and toggle in UI, like we do for server side plugins. In that case, we extend
`py Plugin` instancing only the information and then checking client side if
[`settings.plugins`](1ad832b1dc/client/simple/src/js/toolkit.ts (L134))
array has the plugin id.
* [mod] client/simple: rebuild static
67 lines
1.5 KiB
TypeScript
67 lines
1.5 KiB
TypeScript
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
/**
|
|
* Base class for client-side plugins.
|
|
*
|
|
* @remarks
|
|
* Handle conditional loading of the plugin in:
|
|
*
|
|
* - client/simple/src/js/router.ts
|
|
*
|
|
* @abstract
|
|
*/
|
|
export abstract class Plugin {
|
|
/**
|
|
* Plugin name.
|
|
*/
|
|
protected readonly id: string;
|
|
|
|
/**
|
|
* @remarks
|
|
* Don't hold references of this instance outside the class.
|
|
*/
|
|
protected constructor(id: string) {
|
|
this.id = id;
|
|
|
|
void this.invoke();
|
|
}
|
|
|
|
private async invoke(): Promise<void> {
|
|
try {
|
|
console.debug(`[PLUGIN] ${this.id}: Running...`);
|
|
const result = await this.run();
|
|
if (!result) return;
|
|
|
|
console.debug(`[PLUGIN] ${this.id}: Running post-exec...`);
|
|
// @ts-expect-error
|
|
void (await this.post(result as NonNullable<Awaited<ReturnType<this["run"]>>>));
|
|
} catch (error) {
|
|
console.error(`[PLUGIN] ${this.id}:`, error);
|
|
} finally {
|
|
console.debug(`[PLUGIN] ${this.id}: Done.`);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Plugin goes here.
|
|
*
|
|
* @remarks
|
|
* The plugin is already loaded at this point. If you wish to execute
|
|
* conditions to exit early, consider moving the logic to:
|
|
*
|
|
* - client/simple/src/js/router.ts
|
|
*
|
|
* ...to avoid unnecessarily loading this plugin on the client.
|
|
*/
|
|
protected abstract run(): Promise<unknown>;
|
|
|
|
/**
|
|
* Post-execution hook.
|
|
*
|
|
* @remarks
|
|
* The hook is only executed if `#run()` returns a truthy value.
|
|
*/
|
|
// @ts-expect-error
|
|
protected abstract post(result: NonNullable<Awaited<ReturnType<this["run"]>>>): Promise<void>;
|
|
}
|