@comake/skl-js-engine
Version:
Standard Knowledge Language Javascript Engine
66 lines (54 loc) • 2.14 kB
text/typescript
import type { NodeObject } from 'jsonld';
import type { CapabilityConfig, JSONObject, OrArray } from './util/Types';
// Define the custom capability handler type
// Using any to avoid circular dependency
export type CustomCapabilityHandler = (
args: JSONObject,
sklEngine: any,
capabilityConfig?: CapabilityConfig
) => Promise<OrArray<NodeObject>>;
// Global custom capabilities registry
class GlobalCustomCapabilitiesRegistry {
private readonly customCapabilities: Map<string, CustomCapabilityHandler> = new Map();
public register(capabilityId: string, handler: CustomCapabilityHandler): void {
this.customCapabilities.set(capabilityId, handler);
}
public unregister(capabilityId: string): boolean {
return this.customCapabilities.delete(capabilityId);
}
public has(capabilityId: string): boolean {
return this.customCapabilities.has(capabilityId);
}
public async execute(
capabilityId: string,
args: JSONObject,
sklEngine: any,
capabilityConfig?: CapabilityConfig
): Promise<OrArray<NodeObject>> {
const handler = this.customCapabilities.get(capabilityId);
if (!handler) {
throw new Error(`Custom capability '${capabilityId}' not found`);
}
return await handler(args, sklEngine, capabilityConfig);
}
public getAll(): string[] {
return [ ...this.customCapabilities.keys() ];
}
public clear(): void {
this.customCapabilities.clear();
}
}
// Global instance
const globalCustomCapabilities = new GlobalCustomCapabilitiesRegistry();
// Export functions for external use
export const customCapabilities = {
register(capabilityId: string, handler: CustomCapabilityHandler): void {
globalCustomCapabilities.register(capabilityId, handler);
},
unregister: (capabilityId: string): boolean => globalCustomCapabilities.unregister(capabilityId),
has: (capabilityId: string): boolean => globalCustomCapabilities.has(capabilityId),
getAll: (): string[] => globalCustomCapabilities.getAll(),
clear: (): void => globalCustomCapabilities.clear()
};
// Export the registry instance for internal use
export { globalCustomCapabilities };