diff options
author | Chocobozzz <me@florianbigard.com> | 2019-07-26 09:41:49 +0200 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2019-07-26 15:18:29 +0200 |
commit | 16d54696294d15f8ab6ba3a6bcfac21528fec2f2 (patch) | |
tree | 24e1c64d69a75a348cfaa38bfab6430c99132bfd | |
parent | ba211e7386bb2f25e37a4c5bcdfeb4237e1cd315 (diff) | |
download | PeerTube-16d54696294d15f8ab6ba3a6bcfac21528fec2f2.tar.gz PeerTube-16d54696294d15f8ab6ba3a6bcfac21528fec2f2.tar.zst PeerTube-16d54696294d15f8ab6ba3a6bcfac21528fec2f2.zip |
Run hooks and register plugins outside angular
-rw-r--r-- | client/src/app/core/plugins/plugin.service.ts | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/client/src/app/core/plugins/plugin.service.ts b/client/src/app/core/plugins/plugin.service.ts index 714abd82d..cca779177 100644 --- a/client/src/app/core/plugins/plugin.service.ts +++ b/client/src/app/core/plugins/plugin.service.ts | |||
@@ -1,4 +1,4 @@ | |||
1 | import { Injectable } from '@angular/core' | 1 | import { Injectable, NgZone } from '@angular/core' |
2 | import { Router } from '@angular/router' | 2 | import { Router } from '@angular/router' |
3 | import { ServerConfigPlugin } from '@shared/models' | 3 | import { ServerConfigPlugin } from '@shared/models' |
4 | import { ServerService } from '@app/core/server/server.service' | 4 | import { ServerService } from '@app/core/server/server.service' |
@@ -11,7 +11,6 @@ import { getHookType, internalRunHook } from '@shared/core-utils/plugins/hooks' | |||
11 | import { ClientHook, ClientHookName, clientHookObject } from '@shared/models/plugins/client-hook.model' | 11 | import { ClientHook, ClientHookName, clientHookObject } from '@shared/models/plugins/client-hook.model' |
12 | import { PluginClientScope } from '@shared/models/plugins/plugin-client-scope.type' | 12 | import { PluginClientScope } from '@shared/models/plugins/plugin-client-scope.type' |
13 | import { RegisterClientHookOptions } from '@shared/models/plugins/register-client-hook.model' | 13 | import { RegisterClientHookOptions } from '@shared/models/plugins/register-client-hook.model' |
14 | import { PeerTubePlugin } from '@shared/models/plugins/peertube-plugin.model' | ||
15 | import { HttpClient } from '@angular/common/http' | 14 | import { HttpClient } from '@angular/common/http' |
16 | import { RestExtractor } from '@app/shared/rest' | 15 | import { RestExtractor } from '@app/shared/rest' |
17 | import { PluginType } from '@shared/models/plugins/plugin.type' | 16 | import { PluginType } from '@shared/models/plugins/plugin.type' |
@@ -52,6 +51,7 @@ export class PluginService implements ClientHook { | |||
52 | constructor ( | 51 | constructor ( |
53 | private router: Router, | 52 | private router: Router, |
54 | private server: ServerService, | 53 | private server: ServerService, |
54 | private zone: NgZone, | ||
55 | private authHttp: HttpClient, | 55 | private authHttp: HttpClient, |
56 | private restExtractor: RestExtractor | 56 | private restExtractor: RestExtractor |
57 | ) { | 57 | ) { |
@@ -157,20 +157,22 @@ export class PluginService implements ClientHook { | |||
157 | } | 157 | } |
158 | } | 158 | } |
159 | 159 | ||
160 | async runHook <T> (hookName: ClientHookName, result?: T, params?: any): Promise<T> { | 160 | runHook <T> (hookName: ClientHookName, result?: T, params?: any): Promise<T> { |
161 | if (!this.hooks[hookName]) return Promise.resolve(result) | 161 | return this.zone.runOutsideAngular(async () => { |
162 | if (!this.hooks[ hookName ]) return result | ||
162 | 163 | ||
163 | const hookType = getHookType(hookName) | 164 | const hookType = getHookType(hookName) |
164 | 165 | ||
165 | for (const hook of this.hooks[hookName]) { | 166 | for (const hook of this.hooks[ hookName ]) { |
166 | console.log('Running hook %s of plugin %s.', hookName, hook.plugin.name) | 167 | console.log('Running hook %s of plugin %s.', hookName, hook.plugin.name) |
167 | 168 | ||
168 | result = await internalRunHook(hook.handler, hookType, result, params, err => { | 169 | result = await internalRunHook(hook.handler, hookType, result, params, err => { |
169 | console.error('Cannot run hook %s of script %s of plugin %s.', hookName, hook.clientScript.script, hook.plugin.name, err) | 170 | console.error('Cannot run hook %s of script %s of plugin %s.', hookName, hook.clientScript.script, hook.plugin.name, err) |
170 | }) | 171 | }) |
171 | } | 172 | } |
172 | 173 | ||
173 | return result | 174 | return result |
175 | }) | ||
174 | } | 176 | } |
175 | 177 | ||
176 | nameToNpmName (name: string, type: PluginType) { | 178 | nameToNpmName (name: string, type: PluginType) { |
@@ -211,10 +213,12 @@ export class PluginService implements ClientHook { | |||
211 | 213 | ||
212 | console.log('Loading script %s of plugin %s.', clientScript.script, plugin.name) | 214 | console.log('Loading script %s of plugin %s.', clientScript.script, plugin.name) |
213 | 215 | ||
214 | return import(/* webpackIgnore: true */ clientScript.script) | 216 | return this.zone.runOutsideAngular(() => { |
215 | .then((script: ClientScriptModule) => script.register({ registerHook, peertubeHelpers })) | 217 | return import(/* webpackIgnore: true */ clientScript.script) |
216 | .then(() => this.sortHooksByPriority()) | 218 | .then((script: ClientScriptModule) => script.register({ registerHook, peertubeHelpers })) |
217 | .catch(err => console.error('Cannot import or register plugin %s.', pluginInfo.plugin.name, err)) | 219 | .then(() => this.sortHooksByPriority()) |
220 | .catch(err => console.error('Cannot import or register plugin %s.', pluginInfo.plugin.name, err)) | ||
221 | }) | ||
218 | } | 222 | } |
219 | 223 | ||
220 | private buildScopeStruct () { | 224 | private buildScopeStruct () { |