Skip to content

Commit 4d93c72

Browse files
committed
feat(plugin-registry): get keychain by keychainId
Adds a utility method where I can just pass in the keychain ID and get back a plugin instance or an exception thrown if it was not found. Fixes hyperledger-cacti#381 Signed-off-by: Peter Somogyvari <[email protected]>
1 parent cbbcbb2 commit 4d93c72

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

packages/cactus-core-api/src/main/typescript/plugin/plugin-registry.ts

+16
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Optional } from "typescript-optional";
22
import { ICactusPlugin, isICactusPlugin } from "../plugin/i-cactus-plugin";
33
import { PluginAspect } from "../plugin/plugin-aspect";
4+
import { IPluginKeychain } from "./keychain/i-plugin-keychain";
45

56
/**
67
* This interface describes the constructor options object that can be used to provide configuration parameters to
@@ -80,6 +81,21 @@ export class PluginRegistry {
8081
return Optional.ofNullable(plugin as T);
8182
}
8283

84+
public findOneByKeychainId<T extends IPluginKeychain>(keychainId: string): T {
85+
const fnTag = "PluginRegistry#findOneByKeychainId()";
86+
if (typeof keychainId !== "string" || keychainId.trim().length < 1) {
87+
throw new Error(`${fnTag} need keychainId arg as non-blank string.`);
88+
}
89+
90+
const plugin = this.findManyByAspect<IPluginKeychain>(
91+
PluginAspect.KEYCHAIN
92+
).find((keychainPlugin) => keychainPlugin.getKeychainId() === keychainId);
93+
94+
return Optional.ofNullable(plugin as T).orElseThrow(
95+
() => new Error(`${fnTag} No keychain found for ID ${keychainId}`)
96+
);
97+
}
98+
8399
public findManyByAspect<T extends ICactusPlugin>(aspect: PluginAspect): T[] {
84100
return this.getPlugins().filter((p) => p.getAspect() === aspect) as T[];
85101
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import test, { Test } from "tape";
2+
import { v4 as uuidv4 } from "uuid";
3+
4+
import {
5+
ICactusPlugin,
6+
IPluginKeychain,
7+
PluginAspect,
8+
PluginRegistry,
9+
} from "../../../main/typescript/public-api";
10+
11+
test("PluginRegistry", (tMain: Test) => {
12+
test("findOneByKeychainId() finds plugin by keychain ID", (t: Test) => {
13+
const keychainId = uuidv4();
14+
15+
const mockKeychainPlugin = {
16+
getKeychainId: () => keychainId,
17+
getAspect: () => PluginAspect.KEYCHAIN,
18+
} as IPluginKeychain;
19+
20+
const pluginRegistry = new PluginRegistry({
21+
plugins: [
22+
mockKeychainPlugin,
23+
{
24+
getAspect: () => PluginAspect.CONSORTIUM,
25+
} as ICactusPlugin,
26+
{
27+
getAspect: () => PluginAspect.KV_STORAGE,
28+
} as ICactusPlugin,
29+
{
30+
getAspect: () => PluginAspect.LEDGER_CONNECTOR,
31+
} as ICactusPlugin,
32+
],
33+
});
34+
35+
t.doesNotThrow(() => pluginRegistry.findOneByKeychainId(keychainId));
36+
const keychainPlugin = pluginRegistry.findOneByKeychainId(keychainId);
37+
t.equal(keychainPlugin, mockKeychainPlugin, "Finds same object OK");
38+
39+
t.throws(
40+
() => pluginRegistry.findOneByKeychainId(""),
41+
/need keychainId arg as non-blank string/,
42+
"Check for keychain ID blankness OK"
43+
);
44+
t.throws(
45+
() => pluginRegistry.findOneByKeychainId("x"),
46+
/No keychain found for ID/,
47+
"Throws for keychain not found OK"
48+
);
49+
50+
t.end();
51+
});
52+
53+
tMain.end();
54+
});

0 commit comments

Comments
 (0)