X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=client%2Fsrc%2Froot-helpers%2Fplugins-manager.ts;h=9cba633738254321066562c6c314dab8ec3b87da;hb=636d73c58866ed235c207719e41fdde3c2d6c969;hp=f1687d91d1c1f6c9c0b98f4d4157387e32717a9c;hpb=9df52d660feb722404be00a50f3c8a612bec1c15;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/root-helpers/plugins-manager.ts b/client/src/root-helpers/plugins-manager.ts index f1687d91d..9cba63373 100644 --- a/client/src/root-helpers/plugins-manager.ts +++ b/client/src/root-helpers/plugins-manager.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-implied-eval */ import * as debug from 'debug' import { firstValueFrom, ReplaySubject } from 'rxjs' import { first, shareReplay } from 'rxjs/operators' @@ -14,6 +15,7 @@ import { RegisterClientHookOptions, RegisterClientSettingsScript, RegisterClientVideoFieldOptions, + RegisteredExternalAuthConfig, ServerConfigPlugin } from '../../../shared/models' import { environment } from '../environments/environment' @@ -77,6 +79,11 @@ class PluginsManager { return isTheme ? '/themes' : '/plugins' } + static getExternalAuthHref (auth: RegisteredExternalAuthConfig) { + return environment.apiUrl + `/plugins/${auth.name}/${auth.version}/auth/${auth.authName}` + + } + loadPluginsList (config: HTMLServerConfig) { for (const plugin of config.plugin.registered) { this.addPlugin(plugin) @@ -227,7 +234,7 @@ class PluginsManager { console.log('Loading script %s of plugin %s.', clientScript.script, plugin.name) const absURL = (environment.apiUrl || window.location.origin) + clientScript.script - return import(/* webpackIgnore: true */ absURL) + return dynamicImport(absURL) .then((script: ClientScriptModule) => script.register({ registerHook, registerVideoField, registerSettingsScript, peertubeHelpers })) .then(() => this.sortHooksByPriority()) .catch(err => console.error('Cannot import or register plugin %s.', pluginInfo.plugin.name, err)) @@ -250,3 +257,45 @@ export { OnFormFields, OnSettingsScripts } + +// --------------------------------------------------------------------------- + +async function dynamicImport (url: string) { + try { + // eslint-disable-next-line no-new-func + return new Function(`return import('${url}')`)() + } catch { + console.log('Fallback to import polyfill') + + return new Promise((resolve, reject) => { + const vector = '$importModule$' + Math.random().toString(32).slice(2) + const script = document.createElement('script') + + const destructor = () => { + delete window[vector] + script.onerror = null + script.onload = null + script.remove() + URL.revokeObjectURL(script.src) + script.src = '' + } + + script.defer = true + script.type = 'module' + + script.onerror = () => { + reject(new Error(`Failed to import: ${url}`)) + destructor() + } + script.onload = () => { + resolve(window[vector]) + destructor() + } + const loader = `import * as m from "${url}"; window.${vector} = m;` // export Module + const blob = new Blob([ loader ], { type: 'text/javascript' }) + script.src = URL.createObjectURL(blob) + + document.head.appendChild(script) + }) + } +}