UNPKG

nope-js-browser

Version:

NoPE Runtime for the Browser. For nodejs please use nope-js-node

334 lines (333 loc) 9.95 kB
/** * @author Martin Karkowski * @email m.karkowski@zema.de * @desc Defintion of a generic Module. */ import { TGetPorts, TRenderConfigureServicePage, TServiceGetPortsReturn } from "../ui"; import { ICallOptions } from "./nopeCommunication.interface"; import { INopeDescriptor } from "./nopeDescriptor.interface"; import { INopeObservable } from "./nopeObservable.interface"; import { INopePromise } from "./nopePromise.interface"; /** * Description of an Author * * @export * @interface IAuthor */ export interface IAuthor { surename: string; forename: string; mail: string; } /** * Description of a Version * * @export * @interface IVersion */ export interface IVersion { version: number; date: Date; } export interface INopeModuleDescription { /** * Name of the Module. The name of the module must be written in lowercase. * * @type {string} * @memberof INopeModuleDescription */ identifier: string; /** * Type of the Module * * @type {string} * @memberof INopeModuleDescription */ readonly type: string; /** * A Description of the Module. This is used to describe roughly * what the module is capable of doing. Consider this as Module * a kind of Documentation. Based on the fact, that the module * will be offered in the Network, provide a meaning full documentation * * @type {string} * @memberof INopeModuleDescription */ description: string; /** * The Author of the Module * * @type {IAuthor} * @memberof INopeModuleDescription */ author: IAuthor; /** * Description of the provided Version of the Module. * * @type {IVersion} * @memberof INopeModuleDescription */ version: IVersion; /** * Contains the provided functions. * * > **key** = `id` of the function * * @type {{ [index: string]: IServiceOptions }} * @memberof INopeModuleDescription */ readonly methods: { [index: string]: IServiceOptions; }; readonly events: { [index: string]: IEventOptions; }; readonly properties: { [index: string]: IEventOptions; }; readonly uiLinks: Array<{ name: string; description: string; link: string; }>; } export interface INopeModule extends INopeModuleDescription { /** * Helper Function, to extract the Name of the Property or the Identifier. * * @param {(((...args) => Promise<any>) | INopeObservable<any>)} propOrArg * @return {*} {string} * @memberof INopeModule */ getIdentifierOf(propOrFunc: ((...args: any[]) => Promise<any>) | INopeObservable<any>): string; /** * Function used to register a Function * * @param {string} name Name of the Function * @param {(...args) => Promise<any>} method The Function * @param {IServiceOptions} options The Options used during subscription * @return {Promise<void>} * @memberof IBaseModule */ registerMethod(name: string, method: (...args: any[]) => Promise<any>, options: IServiceOptions): Promise<void>; /** * Function used to unregister a Function * * @param {string} name Name of the Function. * @return {Promise<void>} * @memberof IBaseModule */ unregisterFunction(name: string): Promise<void>; /** * Function to Register a Property. If called for an existing Property, the Data will be * updated. * * @template T Internal Type * @template S Setter Type * @template G Getter Type * @param {string} name Name of the Property. * @param {INopeObservable<T, S, G>} observable The Observable. * @param {IEventOptions} options The Options which are used during registering the Observable. * @return {Promise<void>} * @memberof IBaseModule */ registerProperty<T, S = T, G = T>(name: string, observable: INopeObservable<T, S, G>, options: IEventOptions): Promise<void>; /** * Function used to unregister a Property * * @param {string} name Name of the Property. * @return {Promise<void>} * @memberof IBaseModule */ unregisterProperty(name: string): Promise<void>; /** * Function to list the available Functions of the module. This will hold all available functions * (dynamic and static functions). * * @return {Promise<Array<{ name: string, schema: IDescriptor, options: IServiceOptions }>>} * @memberof IBaseModule */ listMethods(): Promise<Array<{ method: (...args: any[]) => Promise<any>; options: IServiceOptions; }>>; /** * Function used to get an List of all registered Properties. * * @return {Promise<Array<{ name: string, schema: IDescriptor, options: IEventOptions }>>} * @memberof IBaseModule */ listProperties(): Promise<Array<{ observable: INopeObservable<any>; options: IEventOptions; }>>; /** * Function used to initialze the Module. * * @return {Promise<void>} * @memberof IBaseModule */ init(...args: any[]): Promise<void>; /** * Function used to Dispose the Module. * * @return {Promise<void>} * @memberof IBaseModule */ dispose(): Promise<void>; /** * Function used to derive a parsable Description of the Module. * * @return {INopeModuleDescription} * @memberof INopeModule */ toDescription(): INopeModuleDescription; /** * Internal Element, which is used to store elements, that should be added * automaticallay. * * @type {(Array<{accessor: string, options:IEventOptions | IServiceOptions}>)} * @memberof INopeModule */ _markedElements: Array<{ accessor: string; options: IEventOptions | IServiceOptions; type: "method" | "prop" | "event"; }>; } export interface IGenericNopeModule extends INopeModule { dynamicInstanceMethods: { [index: string]: <T>(...args: any[]) => INopePromise<T>; }; dynamicInstanceProperties: { [index: string]: INopeObservable<any>; }; dynamicInstanceMethodsWithOptions: { [index: string]: <T>(options: Partial<ICallOptions>, ...args: any[]) => INopePromise<T>; }; } /** * Descriptor of an Property. * * @export * @interface IEventOptions */ export interface IEventOptions { /** * Mode of the Property Connection. */ mode: "subscribe" | "publish" | Array<"subscribe" | "publish">; /** * Schema of the Property. */ schema: { getter: INopeDescriptor; setter: INopeDescriptor; internal: INopeDescriptor; } | INopeDescriptor; topic: string | { subscribe?: string; publish?: string; }; /** * Flag, to indicate, that the Item is dynamic. * * @type {boolean} * @memberof IEventOptions */ isDynamic?: boolean; } /** * Options, used to register a Function. * * @export * @interface IServiceOptions */ export interface IServiceOptions<T = any> extends Partial<ICallOptions> { /** * Instead of generating a uuid an id could be provided * * @type {string} * @memberof IServiceOptions */ id?: string; /** * Schema of the Function. * * @type {INopeDescriptor} * @memberof IServiceOptions */ schema: INopeDescriptor; /** * The ui definition of the service. */ ui?: { /** * Custom function to render the service in the editor */ serviceConfiguration?: TRenderConfigureServicePage<T>; /** * Helper to enable auto generating a configuration */ autoGenBySchema?: { /** * Function used to Descripe the configured Settings in a short sentence, * based on the given settings. */ getDescriptionText?: (item: { [index: string]: any; }) => string; /** * Function, which will be used to convert the service parameters. * * @return {T} * @memberof IEditPage */ getData?: (item: { [index: string]: any; }) => T; /** * Helper function to generate ports, based on the given items. * @param item */ getPorts?: (item: { [index: string]: any; }) => TServiceGetPortsReturn; } | true; /** * Flag to indicate, that rendering the service configuration requires * a provider itself. This for instance is the case, if some functions * needs to be called. */ requiredProvidersForRendering?: string[]; /** * Helper to generate the Pors based on the provided node data. */ getPorts?: TGetPorts<T>; /** * Helper to get the Icon, it must be available under * 'assets/icons/{icon}.png'. Just enter the **name** * */ icon?: string; }; /** * Flag, to indicate, that the Item is dynamic. * * @type {boolean} * @memberof IServiceOptions */ isDynamic?: boolean; /** * The Package of the service to list it in. */ package?: string; } /** * Parsable Description of a Module */ export interface IParsableDescription { name: string; properties: IEventOptions[]; methods: IServiceOptions[]; }