From 84e1b69a30b4be74a4a54ceefe18b71fb9cd1c71 Mon Sep 17 00:00:00 2001 From: Xavier Jouslin de Noray <xavier.jouslindenoray@savoirfairelinux.com> Date: Wed, 13 Sep 2023 08:46:34 -0400 Subject: [PATCH] Plugin Architecture: request send all plugin duplicate by achitecture Gitlab: #6 Change-Id: I41f2cd35f4d674f6557691b87385dfa865263549 --- src/services/file_manager.service.ts | 7 ++-- src/services/plugins_manager.service.ts | 43 ++++++++++++++++++------- tests/plugins.manager.test.ts | 4 +-- 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/services/file_manager.service.ts b/src/services/file_manager.service.ts index 1317ea9..925e0bc 100644 --- a/src/services/file_manager.service.ts +++ b/src/services/file_manager.service.ts @@ -49,12 +49,13 @@ export class FileManagerService { const zip = new StreamZip.async({ file: path }); const entries = await zip.entries(); for (const entry of Object.values(entries)) { - if (entry.name.startsWith(folderPath)) { - files.push(entry.name); + const lib = entry.name.split('/')[1]; + if (entry.name.startsWith(folderPath) && !files.includes(lib)) { + files.push(lib); } } zip.close(); - return files.map((file: string) => file.split('/')[1]); + return files; } catch (e) { return []; } diff --git a/src/services/plugins_manager.service.ts b/src/services/plugins_manager.service.ts index 8d45c73..96ff1a5 100644 --- a/src/services/plugins_manager.service.ts +++ b/src/services/plugins_manager.service.ts @@ -59,6 +59,7 @@ export class PluginsManager { } return await Promise.all( this.plugins + .filter(plugin => this.isPluginAvailable(plugin.id, arch)) .map(async (plugin: Plugins) => { return { id: plugin.id, @@ -81,7 +82,6 @@ export class PluginsManager { author: plugin.author, }; }) - .filter(async plugin => this.isPluginAvailable((await plugin).id, arch)) ); } @@ -137,6 +137,10 @@ export class PluginsManager { ) { return undefined; } + const platform = this.getPlatform(arch); + if (platform === undefined) { + return undefined; + } return ( // eslint-disable-next-line __dirname + @@ -145,13 +149,19 @@ export class PluginsManager { '/' + id + '/' + - arch + + platform + '/' + id + '.jpl' ); } + getPlatform(arch: string): string | undefined { + return Array.from(this.archesResolution.entries()).find(([_, value]) => + value.includes(arch) + )?.[0]; + } + async getNewPlugin( path: string, platforms: string[] @@ -231,10 +241,12 @@ export class PluginsManager { plugin.arches.includes(arch as string) && arch !== undefined ); + const platform = this.getPlatform(arch as string); if ( plugin === undefined || process.env.DATA_DIRECTORY === undefined || - plugin.icon === undefined + plugin.icon === undefined || + platform === undefined ) { return ''; } @@ -247,7 +259,7 @@ export class PluginsManager { '/' + plugin.id + '/' + - arch + + platform + '/' + plugin.id + '.jpl', @@ -284,7 +296,7 @@ export class PluginsManager { } // eslint-disable-next-line dataDirectory = __dirname + '/../..' + dataDirectory; - const plugins = []; + const plugins: Plugins[] = []; const pluginsPath = await this.fileManager.listFiles(dataDirectory); if (pluginsPath === undefined || pluginsPath.length === 0) { return; @@ -308,7 +320,8 @@ export class PluginsManager { '.jpl', [platformPath] ); - if (plugin === undefined) { + // TODO: should refactor this because it's possible that two plugins in different platform have the same id + if ( plugin === undefined) { continue; } plugins.push(plugin); @@ -325,10 +338,12 @@ export class PluginsManager { (plugin: Plugins) => plugin.id === id && plugin.arches.includes(arch) && arch !== undefined ); + const platform = this.getPlatform(arch); if ( plugin === undefined || process.env.DATA_DIRECTORY === undefined || - plugin.background === undefined + plugin.background === undefined || + platform === undefined ) { return ''; } @@ -342,7 +357,7 @@ export class PluginsManager { '/' + plugin.id + '/' + - arch + + platform + '/' + plugin.id + '.jpl', @@ -361,7 +376,10 @@ export class PluginsManager { if (this.archesResolution.has(platform)) { const oldArches = this.archesResolution.get(platform); if (oldArches === undefined) { - this.archesResolution.set(platform, arches); + this.archesResolution.set( + platform, + JSON.parse(JSON.stringify(arches)) + ); continue; } for (const arch of arches) { @@ -369,9 +387,12 @@ export class PluginsManager { oldArches.push(arch); } } - this.archesResolution.set(platform, oldArches); + this.archesResolution.set( + platform, + JSON.parse(JSON.stringify(oldArches)) + ); } else { - this.archesResolution.set(platform, arches); + this.archesResolution.set(platform, JSON.parse(JSON.stringify(arches))); } } } diff --git a/tests/plugins.manager.test.ts b/tests/plugins.manager.test.ts index 5ca17dc..7732666 100644 --- a/tests/plugins.manager.test.ts +++ b/tests/plugins.manager.test.ts @@ -128,7 +128,7 @@ describe('Plugins manager service tests', function () { process.env.DATA_DIRECTORY = '/path/to/plugins'; stub(Object.getPrototypeOf(pluginsManagerService), 'isPluginAvailable').returns(true); - + stub(Object.getPrototypeOf(pluginsManagerService), 'getPlatform').returns(['test']); const actualPath = await pluginsManagerService.getPluginPath('test', 'test'); expect(actualPath).toContain(expectedPath); @@ -282,7 +282,7 @@ describe('Plugins manager service tests', function () { fileManager.readArchive.resolves(JSON.stringify(manifest)); fileManager.readArchive.resolves(expected); - + stub(Object.getPrototypeOf(pluginsManagerService), 'getPlatform').returns(['test']); const actual = await pluginsManagerService['getIcon']("test", "test"); expect(actual).toEqual(expected); -- GitLab