small fixes

This commit is contained in:
Martin Karkowski 2022-01-17 18:06:10 +01:00
parent f93b861fbc
commit 9e00eafda8
12 changed files with 169 additions and 138 deletions

View File

@ -65,25 +65,25 @@ export async function createService(
parser.add_argument("--noFuncs", {
help: "Prevents using Functions",
action: "storeTrue",
action: "store_true",
dest: "noFuncs",
});
parser.add_argument("--runInstances", {
help: "Run instances provided in a packages.",
action: "storeTrue",
action: "store_true",
dest: "runInstances",
});
parser.add_argument("--runEveryService", {
help: "Run instances provided in a packages.",
action: "storeTrue",
action: "store_true",
dest: "runEveryService",
});
parser.add_argument("--runExtra", {
help: "Runs every instance in an extra Service",
action: "storeTrue",
action: "store_true",
dest: "runExtra",
});
@ -329,7 +329,6 @@ export async function createService(
__dirname,
"..",
"..",
"..",
"lib",
"templates",
"linux.service.handlebars"
@ -347,7 +346,6 @@ export async function createService(
__dirname,
"..",
"..",
"..",
"lib",
"templates",
"index.js.handlebars"
@ -363,7 +361,6 @@ export async function createService(
__dirname,
"..",
"..",
"..",
"lib",
"templates",
"service.js.handlebars"

View File

@ -14,31 +14,15 @@ import { getNopeLogger } from "../logger/getLogger";
const FOLDERS_TO_CREATE = [
"config",
"modules",
"open-api",
"pages",
join("public", "nope"),
join("dist", "modules"),
"modules"
];
const BASE_FOLDER = __dirname;
const FILES_TO_COPY = [
// Public-Files, like logo etc.
"/public/nope/logo_light.png",
"/public/nope/logo.png",
// Default-Pages
"/pages/_app.tsx",
"/pages/index.tsx",
// Config-Files
"tsconfig.json",
"tsconfigBackend.json",
"tsconfig.browser.json",
// Doc-Files:
"jsdoc.json",
// NextJS
"next.config.js",
"next-env.d.ts",
// Package File:
"package.json",
];
export async function generateFolderStructure(

View File

@ -41,11 +41,12 @@ export async function main() {
console.log(`NoPE - Command Line Interface.
Please select the option you want. Therefore add one of the following options:
\x1b[4mhelp\x1b[0m Show this help.
\x1b[4mrun\x1b[0m Start a NoPE-Backend.
\x1b[4minit\x1b[0m Initialize a new project. This project is empty.
\x1b[4mscan\x1b[0m Trys to update the configuration file.
\x1b[4mservice\x1b[0m Generate Helper Files to provide services
\x1b[4mhelp\x1b[0m Show this help.
\x1b[4mrun\x1b[0m Start a NoPE-Backend.
\x1b[4minit\x1b[0m Initialize a new project. This project is empty.
\x1b[4mscan\x1b[0m Trys to update the configuration file.
\x1b[4mservice\x1b[0m Generate Helper Files to provide services
\x1b[4mrepl\x1b[0m Opens an interactive console.
Have fun using NoPE :)

View File

@ -21,18 +21,25 @@ export async function repl(
defaultValue?: any;
}[] = []
) {
const { dispatcher } = await run(additionalArguments);
const loader = await run(
additionalArguments,
{
// skipLoadingConfig: true
},
true
);
const interactiveConsole = start({});
// Assing the context
interactiveConsole.context.dispatcher = dispatcher;
interactiveConsole.context.dispatcher = loader.dispatcher;
interactiveConsole.context.loader = loader;
// Promise, that will be finished on exiting the interactive console.
const promise = new Promise((resolve) => {
interactiveConsole.once("exit", resolve);
});
await promise;
await dispatcher.dispose();
await loader.dispatcher.dispose();
}
// If requested As Main => Perform the Operation.

View File

@ -17,7 +17,8 @@ import {
validLayers,
} from "../communication/getLayer.nodejs";
import { sleep } from "../helpers/async";
import { getPackageLoader } from "../loader/getPackageLoader";
import { deepClone } from "../helpers/objectMethods";
import { getPackageLoader } from "../loader/getPackageLoader.browser";
import { loadFunctions, loadPackages } from "../loader/loadPackages";
import { generateLogfilePath, useLogFile } from "../logger/fileLogging";
import { getNopeLogger } from "../logger/getLogger";
@ -30,6 +31,51 @@ import {
import { INopePackageLoader } from "../types/nope/nopePackageLoader.interface";
import { NOPELOGO } from "./renderNope";
export interface RunArgs {
file: string;
channel: validLayerOrMirror;
params: string;
// Flag to prevent loading the configuration
skipLoadingConfig: boolean;
// Level of the logger.
log: LoggerLevel;
// The Enable Singletons. Defaults to true
singleton: boolean;
// The default-selector to select the service providers
defaultSelector: ValidDefaultSelectors;
// The default-selector to select the service providers
dispatcherLogLevel: LoggerLevel;
// The default-selector to select the service providers
communicationLogLevel: LoggerLevel;
// Enable File-logging:
logToFile: boolean;
// Delay to wait for system beeing ready.
delay: number;
// Flag to force using the selectors. Might have a performance inpact.
forceUsingSelectors: boolean;
// Define the Timingsparameter
timings: Partial<INopeINopeConnectivityTimeOptions>;
// Forces the Selectors
forceSelectors: boolean;
}
export const DEFAULT_SETTINGS: RunArgs = {
file: "./config/settings.json",
channel: "event",
skipLoadingConfig: false,
params: "not-provided",
log: "debug",
singleton: true,
dispatcherLogLevel: "info",
communicationLogLevel: "info",
delay: 2,
forceSelectors: false,
timings: {},
defaultSelector: "first",
forceUsingSelectors: false,
logToFile: false,
};
/**
* Helper Function to Read-In the Arguments used by the
* cli-tool
@ -42,21 +88,9 @@ export async function readInArgs(
type: "string" | "number";
name: string | string;
defaultValue?: any;
}[] = []
): Promise<{
file: string;
channel: keyof typeof validLayers;
params?: string;
skipLoadingConfig?: boolean;
log: LoggerLevel;
forceEmittingUpdates?: boolean;
defaultSelector: ValidDefaultSelectors;
dispatcherLogLevel: LoggerLevel;
communicationLogLevel?: LoggerLevel;
logToFile?: boolean;
delay: number;
forceUsingSelectors?: boolean;
}> {
}[] = [],
forcedArgs: Partial<RunArgs> = {}
): Promise<RunArgs> {
const parser = new ArgumentParser({
// version: "1.0.0",
add_help: true,
@ -118,13 +152,6 @@ export async function readInArgs(
dest: "defaultSelector",
});
parser.add_argument("--force-emit", {
help: "Forces emitting the events of the system. Otherwise, only subscribed events are emitted.",
action: "append",
nargs: "?",
dest: "forceEmittingUpdates",
});
parser.add_argument("--log-to-file", {
help: "Log will be stored in a logfile.",
action: "append",
@ -173,84 +200,32 @@ export async function readInArgs(
dest: "communicationLogLevel",
});
const args: {
file: string;
channel: keyof typeof validLayers;
params?: string;
skipLoadingConfig?: boolean;
log: LoggerLevel;
forceEmittingUpdates?: boolean;
defaultSelector: ValidDefaultSelectors;
dispatcherLogLevel: LoggerLevel;
communicationLogLevel?: LoggerLevel;
logToFile?: boolean;
delay: number;
forceUsingSelectors?: boolean;
} = parser.parse_args();
const args: RunArgs = parser.parse_args();
if (args.params === "not-provided") {
delete args.params;
}
args.skipLoadingConfig = Array.isArray(args.skipLoadingConfig);
args.forceEmittingUpdates = Array.isArray(args.forceEmittingUpdates);
args.logToFile = Array.isArray(args.logToFile);
args.forceUsingSelectors = Array.isArray(args.forceUsingSelectors);
return args;
return Object.assign(args, forcedArgs);
}
// Define the Main Function.
// This function is used as cli tool.
export async function runNopeBackend(
_args: {
file?: string;
channel?: validLayerOrMirror;
params?: string;
// Flag to prevent loading the configuration
skipLoadingConfig?: boolean;
// Flag to force sending updates.
forceEmittingUpdates?: boolean;
// Level of the logger.
log?: LoggerLevel;
// The Enable Singletons. Defaults to true
singleton?: boolean;
// The default-selector to select the service providers
defaultSelector?: ValidDefaultSelectors;
// The default-selector to select the service providers
dispatcherLogLevel?: LoggerLevel;
// The default-selector to select the service providers
communicationLogLevel?: LoggerLevel;
// Enable File-logging:
logToFile?: boolean;
// Delay to wait for system beeing ready.
delay?: number;
// Flag to force using the selectors. Might have a performance inpact.
forceUsingSelectors?: boolean;
// Define the Timingsparameter
timings?: Partial<INopeINopeConnectivityTimeOptions>;
} = {}
_args: Partial<RunArgs> = {}
): Promise<INopePackageLoader> {
let opts: {
params: string | number;
};
const args = Object.assign(
{
file: "./config/settings.json",
channel: "event",
skipLoadingConfig: false,
params: "not-provided",
log: "debug",
singleton: true,
dispatcherLogLevel: "info",
communicationLogLevel: "info",
delay: 2,
forceSelectors: false,
timings: {},
},
_args
);
// Default Settings
const _defaultSettings: RunArgs = deepClone(DEFAULT_SETTINGS);
const args = Object.assign(_defaultSettings, _args);
try {
// Try to read in the default config file.
@ -313,13 +288,9 @@ export async function runNopeBackend(
logger.info("loading Functions");
await loadFunctions(args.file);
} catch (e) {
logger.error(
"Unable to load the Packages defined in " +
args.file +
" See Output for detailled information",
e
);
return;
logger.error("Unable to load the Packages defined in " + args.file);
logger.error("Returning without config. ");
args.skipLoadingConfig = true;
}
}
@ -355,13 +326,7 @@ export async function runNopeBackend(
logger.info("loading Packages");
await loadPackages(loader, args.file, args.delay);
} catch (e) {
logger.error(
"Unable to load the Packages defined in " +
args.file +
" See Output for detailled information",
e
);
return;
logger.error("Unable to load the Packages defined in " + args.file);
}
}
@ -390,7 +355,9 @@ export async function run(
type: "string" | "number";
name: string | string;
defaultValue?: any;
}[] = []
}[] = [],
forcedArgs: Partial<RunArgs> = {},
quite = false
) {
// Subscribe to unhandled Reactions.
process.on("unhandledRejection", (reason, p) => {
@ -402,10 +369,12 @@ export async function run(
throw reason;
});
console.log(NOPELOGO);
console.log("\n\n");
if (!quite) {
console.log(NOPELOGO);
console.log("\n\n");
}
const args = await readInArgs(additionalArguments);
const args = await readInArgs(additionalArguments, forcedArgs);
return await runNopeBackend(args);
}

View File

@ -7,6 +7,7 @@
*/
import { getSingleton } from "../helpers/singletonMethod";
import { INopePackageLoaderConstructor } from "../types/nope";
import { INopeDispatcherOptions } from "../types/nope/nopeDispatcher.interface";
import { generateNopeBasicPackage } from "./generateNopeBasicPackage";
import { NopePackageLoader } from "./nopePackageLoader";
@ -17,11 +18,16 @@ import { NopePackageLoader } from "./nopePackageLoader";
*/
export function getPackageLoader(
options: INopeDispatcherOptions,
singleton = true
singleton = true,
constructorClass: INopePackageLoaderConstructor = null
) {
if (constructorClass === null || constructorClass === undefined) {
constructorClass = NopePackageLoader;
}
const create = () => {
// Create a loader
const loader = new NopePackageLoader();
const loader = new constructorClass();
// load the default Package:
loader

View File

@ -0,0 +1,26 @@
/**
* @author Martin Karkowski
* @email m.karkowski@zema.de
* @create date 2020-11-06 14:20:32
* @modify date 2021-08-11 19:59:47
* @desc [description]
*/
import { INopeDispatcherOptions } from "../types/nope/nopeDispatcher.interface";
import { getPackageLoader as getBrowserPackageLoader } from "./getPackageLoader.browser";
import { NopePackageLoaderFileAccess } from "./nopePackageLoader.nodejs";
/**
* Function to extract a Singleton Dispatcher
* @param options The provided options for the Dispatcher
*/
export function getPackageLoader(
options: INopeDispatcherOptions,
singleton = true
) {
return getBrowserPackageLoader(
options,
singleton,
NopePackageLoaderFileAccess
);
}

View File

@ -7,5 +7,5 @@
*/
export { generateNopeBasicPackage } from "./generateNopeBasicPackage";
export { getPackageLoader } from "./getPackageLoader";
export { getPackageLoader } from "./getPackageLoader.browser";
export { NopePackageLoader } from "./nopePackageLoader";

View File

@ -6,7 +6,9 @@
* @desc [description]
*/
export * from "./index.browser";
export { generateNopeBasicPackage } from "./generateNopeBasicPackage";
export { getPackageLoader } from "./getPackageLoader.nodejs";
export { NopePackageLoaderFileAccess as NopePackageLoader } from "./nopePackageLoader.nodejs";
export {
IConfigFile,
IPackageConfig,

View File

@ -0,0 +1,34 @@
/**
* @author Martin Karkowski
* @email m.karkowski@zema.de
* @create date 2018-07-01 09:10:35
* @modify date 2022-01-10 16:24:45
* @desc [description]
*/
import { injectable } from "inversify";
import { NopePackageLoader } from "nope_browser/dist/lib/loader/index.browser";
import { resolve } from "path";
import "reflect-metadata";
import { IPackageDescription } from "../types/nope/nopePackage.interface";
/**
* Helper Class to Build an inversify Container.
*
* @export
* @class NopePackageLoader
* @implements {INopePackageLoader}
*/
@injectable()
export class NopePackageLoaderFileAccess extends NopePackageLoader {
async loadPackageFile(path: string, useAutostart = true, useInstance = true) {
const loadedPackage = (await import(resolve(path)))
.DESCRIPTION as IPackageDescription<any>;
if (!useAutostart) {
loadedPackage.autostart = {};
}
if (!useInstance) {
loadedPackage.defaultInstances = [];
}
}
}

View File

@ -6,6 +6,10 @@ import {
IPackageDescription,
} from "./nopePackage.interface";
export interface INopePackageLoaderConstructor {
new (): INopePackageLoader;
}
export interface INopePackageLoader {
/**
* Accessor for a Dispatcher;

View File

@ -2,7 +2,8 @@
"name": "nope",
"version": "1.0.0",
"description": "NoPE Runtime",
"main": "dist/index.browser.js",
"browser": "build/nope.js",
"main": "dist/index.nodejs.js",
"files": [
"build",
"dist",