diff options
Diffstat (limited to 'client')
-rw-r--r-- | client/src/app/core/plugins/plugin.service.ts | 3 | ||||
-rw-r--r-- | client/src/app/shared/misc/utils.ts | 36 |
2 files changed, 38 insertions, 1 deletions
diff --git a/client/src/app/core/plugins/plugin.service.ts b/client/src/app/core/plugins/plugin.service.ts index 3bb82e8a9..3af36765a 100644 --- a/client/src/app/core/plugins/plugin.service.ts +++ b/client/src/app/core/plugins/plugin.service.ts | |||
@@ -18,6 +18,7 @@ import { PublicServerSetting } from '@shared/models/plugins/public-server.settin | |||
18 | import { getDevLocale, isOnDevLocale } from '@app/shared/i18n/i18n-utils' | 18 | import { getDevLocale, isOnDevLocale } from '@app/shared/i18n/i18n-utils' |
19 | import { RegisterClientHelpers } from '../../../types/register-client-option.model' | 19 | import { RegisterClientHelpers } from '../../../types/register-client-option.model' |
20 | import { PluginTranslation } from '@shared/models/plugins/plugin-translation.model' | 20 | import { PluginTranslation } from '@shared/models/plugins/plugin-translation.model' |
21 | import { importModule } from '@app/shared/misc/utils' | ||
21 | 22 | ||
22 | interface HookStructValue extends RegisterClientHookOptions { | 23 | interface HookStructValue extends RegisterClientHookOptions { |
23 | plugin: ServerConfigPlugin | 24 | plugin: ServerConfigPlugin |
@@ -222,7 +223,7 @@ export class PluginService implements ClientHook { | |||
222 | console.log('Loading script %s of plugin %s.', clientScript.script, plugin.name) | 223 | console.log('Loading script %s of plugin %s.', clientScript.script, plugin.name) |
223 | 224 | ||
224 | return this.zone.runOutsideAngular(() => { | 225 | return this.zone.runOutsideAngular(() => { |
225 | return import(/* webpackIgnore: true */ clientScript.script) | 226 | return importModule(clientScript.script) |
226 | .then((script: ClientScriptModule) => script.register({ registerHook, peertubeHelpers })) | 227 | .then((script: ClientScriptModule) => script.register({ registerHook, peertubeHelpers })) |
227 | .then(() => this.sortHooksByPriority()) | 228 | .then(() => this.sortHooksByPriority()) |
228 | .catch(err => console.error('Cannot import or register plugin %s.', pluginInfo.plugin.name, err)) | 229 | .catch(err => console.error('Cannot import or register plugin %s.', pluginInfo.plugin.name, err)) |
diff --git a/client/src/app/shared/misc/utils.ts b/client/src/app/shared/misc/utils.ts index 85fc1c3a0..f26240d21 100644 --- a/client/src/app/shared/misc/utils.ts +++ b/client/src/app/shared/misc/utils.ts | |||
@@ -134,6 +134,41 @@ function scrollToTop () { | |||
134 | window.scroll(0, 0) | 134 | window.scroll(0, 0) |
135 | } | 135 | } |
136 | 136 | ||
137 | // Thanks: https://github.com/uupaa/dynamic-import-polyfill | ||
138 | function importModule (path: string) { | ||
139 | return new Promise((resolve, reject) => { | ||
140 | const vector = '$importModule$' + Math.random().toString(32).slice(2) | ||
141 | const script = document.createElement('script') | ||
142 | |||
143 | const destructor = () => { | ||
144 | delete window[ vector ] | ||
145 | script.onerror = null | ||
146 | script.onload = null | ||
147 | script.remove() | ||
148 | URL.revokeObjectURL(script.src) | ||
149 | script.src = '' | ||
150 | } | ||
151 | |||
152 | script.defer = true | ||
153 | script.type = 'module' | ||
154 | |||
155 | script.onerror = () => { | ||
156 | reject(new Error(`Failed to import: ${path}`)) | ||
157 | destructor() | ||
158 | } | ||
159 | script.onload = () => { | ||
160 | resolve(window[ vector ]) | ||
161 | destructor() | ||
162 | } | ||
163 | const absURL = (environment.apiUrl || window.location.origin) + path | ||
164 | const loader = `import * as m from "${absURL}"; window.${vector} = m;` // export Module | ||
165 | const blob = new Blob([ loader ], { type: 'text/javascript' }) | ||
166 | script.src = URL.createObjectURL(blob) | ||
167 | |||
168 | document.head.appendChild(script) | ||
169 | }) | ||
170 | } | ||
171 | |||
137 | export { | 172 | export { |
138 | sortBy, | 173 | sortBy, |
139 | durationToString, | 174 | durationToString, |
@@ -147,5 +182,6 @@ export { | |||
147 | objectToFormData, | 182 | objectToFormData, |
148 | objectLineFeedToHtml, | 183 | objectLineFeedToHtml, |
149 | removeElementFromArray, | 184 | removeElementFromArray, |
185 | importModule, | ||
150 | scrollToTop | 186 | scrollToTop |
151 | } | 187 | } |