- Modified:
    - `helpers/limit`: Now providing an logger level in the options, results in creating a logger and logging the desired messages in the provided level.

# 1.3.9
  - Fixing:
    - `helpers/limit`: Now enrows all functions provided.
This commit is contained in:
Martin Karkowski 2022-08-23 12:34:00 +02:00
parent d240840d4e
commit d2be54d69a
4 changed files with 87 additions and 61 deletions

View File

@ -208,4 +208,12 @@ Inital commit, which is working with the browser
# 1.3.7 # 1.3.7
- Fixes: - Fixes:
- `helpers/mapMethods`: Fixing `tranformMap`. Now correctly assigning `onlyValidProps` - `helpers/mapMethods`: Fixing `tranformMap`. Now correctly assigning `onlyValidProps`
# 1.3.8
- Modified:
- `helpers/limit`: Now providing an logger level in the options, results in creating a logger and logging the desired messages in the provided level.
# 1.3.9
- Fixing:
- `helpers/limit`: Now enrows all functions provided.

View File

@ -1 +1 @@
1.3.7 1.3.9

View File

@ -4,8 +4,7 @@
*/ */
import { EventEmitter } from "events"; import { EventEmitter } from "events";
import { ILogger } from "js-logger"; import { getNopeLogger, ILogger, LoggerLevel } from "../index.browser";
import { DEBUG } from "../index.browser";
import { generateId } from "./idMethods"; import { generateId } from "./idMethods";
import { difference } from "./setMethods"; import { difference } from "./setMethods";
@ -20,7 +19,11 @@ export type TLimitedOptions = {
/** /**
* An queue that should be used. If not provided, a queue is used. * An queue that should be used. If not provided, a queue is used.
*/ */
queue: { [index: string]: any[] }; queue: Array<[string, string, any[]]>;
/**
* Mapping for the Functions.
*/
mapping: { [index: string]: (...args) => Promise<any> };
/** /**
* An emitter to use. * An emitter to use.
*/ */
@ -28,7 +31,7 @@ export type TLimitedOptions = {
/** /**
* Helper function to request a lock. * Helper function to request a lock.
*/ */
getLock: (newTaskId: string) => boolean; getLock: (functionId: string, newTaskId: string) => boolean;
/** /**
* An additional function, wich can be used between the next function in is called. e.g. sleep. * An additional function, wich can be used between the next function in is called. e.g. sleep.
*/ */
@ -40,7 +43,7 @@ export type TLimitedOptions = {
/** /**
* A logger to use. * A logger to use.
*/ */
logger: ILogger | false; loggerLevel: false | LoggerLevel;
/** /**
* An overview with active Tasks. This is relevant for multiple Funtions. * An overview with active Tasks. This is relevant for multiple Funtions.
*/ */
@ -61,10 +64,11 @@ export function getLimitedOptions(
options: Partial<TLimitedOptions> options: Partial<TLimitedOptions>
): Partial<TLimitedOptions> { ): Partial<TLimitedOptions> {
const defaultSettings: Partial<TLimitedOptions> = { const defaultSettings: Partial<TLimitedOptions> = {
queue: {}, queue: [],
mapping: {},
emitter: new EventEmitter(), emitter: new EventEmitter(),
maxParallel: 0, maxParallel: 0,
logger: false, loggerLevel: false,
activeTasks: new Set(), activeTasks: new Set(),
awaitingTasks: new Set(), awaitingTasks: new Set(),
}; };
@ -82,37 +86,66 @@ export function limitedCalls<T>(
func: (...args) => Promise<T>, func: (...args) => Promise<T>,
options: Partial<TLimitedOptions> options: Partial<TLimitedOptions>
) { ) {
let logger: ILogger | false = false;
// Define the Default-Settings // Define the Default-Settings
const defaultSettins: TLimitedOptions = { const defaultSettins: TLimitedOptions = {
functionId: Date.now().toString(), functionId: Date.now().toString(),
queue: {}, queue: [],
mapping: {},
emitter: new EventEmitter(), emitter: new EventEmitter(),
getLock: (newTaskId: string) => { getLock: () => {
const tasks = difference( const tasks = difference(
settingsToUse.activeTasks, settingsToUse.activeTasks,
settingsToUse.awaitingTasks settingsToUse.awaitingTasks
); );
return tasks.size <= settingsToUse.maxParallel;
if (logger) {
logger[settingsToUse.loggerLevel as LoggerLevel](
`active Tasks: [${Array.from(tasks)}]; awaiting Tasks: [${Array.from(
settingsToUse.awaitingTasks
)}];`
);
}
return (
settingsToUse.maxParallel < 0 || tasks.size <= settingsToUse.maxParallel
);
}, },
maxParallel: 0, maxParallel: 0,
logger: false, loggerLevel: false,
activeTasks: new Set(), activeTasks: new Set(),
awaitingTasks: new Set(), awaitingTasks: new Set(),
}; };
const settingsToUse: TLimitedOptions = Object.assign(defaultSettins, options); const settingsToUse: TLimitedOptions = Object.assign(defaultSettins, options);
const functionId = settingsToUse.functionId;
settingsToUse.queue[settingsToUse.functionId] = []; settingsToUse.mapping[functionId] = func;
if (settingsToUse.loggerLevel) {
logger = getNopeLogger("limited-calls", settingsToUse.loggerLevel);
}
const wrapped = function (...args) { const wrapped = function (...args) {
// Generate the Call-ID // Generate the Call-ID
const taskId = generateId(); const taskId = generateId();
const pauseTask = () => { const pauseTask = () => {
if (logger) {
logger[settingsToUse.loggerLevel as LoggerLevel](
`pausing taskId="${taskId}".`
);
}
settingsToUse.awaitingTasks.add(taskId); settingsToUse.awaitingTasks.add(taskId);
}; };
const continueTask = () => { const continueTask = () => {
if (logger) {
logger[settingsToUse.loggerLevel as LoggerLevel](
`continuing taskId="${taskId}".`
);
}
settingsToUse.awaitingTasks.delete(taskId); settingsToUse.awaitingTasks.delete(taskId);
}; };
@ -120,7 +153,7 @@ export function limitedCalls<T>(
args.push(pauseTask, continueTask); args.push(pauseTask, continueTask);
// Push the Content to the emitter // Push the Content to the emitter
settingsToUse.queue[settingsToUse.functionId].push([taskId, args]); settingsToUse.queue.push([functionId, taskId, args]);
// lets have an item, that contains the resolve // lets have an item, that contains the resolve
let resolve = null; let resolve = null;
@ -138,10 +171,11 @@ export function limitedCalls<T>(
// Delete the Task // Delete the Task
settingsToUse.activeTasks.delete(taskId); settingsToUse.activeTasks.delete(taskId);
settingsToUse.awaitingTasks.delete(taskId);
if (typeof settingsToUse.callbackBetween === "function") { if (typeof settingsToUse.callbackBetween === "function") {
if (settingsToUse.logger && settingsToUse.logger.enabledFor(DEBUG)) { if (logger) {
settingsToUse.logger.debug( logger[settingsToUse.loggerLevel as LoggerLevel](
`using 'callbackBetween' for taskId="${taskId}". Calling now` `using 'callbackBetween' for taskId="${taskId}". Calling now`
); );
} }
@ -149,25 +183,19 @@ export function limitedCalls<T>(
settingsToUse settingsToUse
.callbackBetween() .callbackBetween()
.then((_) => { .then((_) => {
if ( if (logger) {
settingsToUse.logger && logger[settingsToUse.loggerLevel as LoggerLevel](
settingsToUse.logger.enabledFor(DEBUG)
) {
settingsToUse.logger.debug(
`awaited 'callbackBetween' for taskId="${taskId}". Transmitting results now` `awaited 'callbackBetween' for taskId="${taskId}". Transmitting results now`
); );
} }
// Emit, that there is a new task available // Emit, that there is a new task available
settingsToUse.emitter.emit("data", settingsToUse.functionId); settingsToUse.emitter.emit("data");
}) })
.catch((_) => { .catch((_) => {
// Log some stuff // Log some stuff
if ( if (logger) {
settingsToUse.logger && logger[settingsToUse.loggerLevel as LoggerLevel](
settingsToUse.logger.enabledFor(DEBUG)
) {
settingsToUse.logger.debug(
`something went wrong with 'callbackBetween' for taskId="${taskId}". Transmitting results now!` `something went wrong with 'callbackBetween' for taskId="${taskId}". Transmitting results now!`
); );
} }
@ -176,8 +204,8 @@ export function limitedCalls<T>(
settingsToUse.emitter.emit("data", settingsToUse.functionId); settingsToUse.emitter.emit("data", settingsToUse.functionId);
}); });
} else { } else {
if (settingsToUse.logger && settingsToUse.logger.enabledFor(DEBUG)) { if (logger) {
settingsToUse.logger.debug( logger[settingsToUse.loggerLevel as LoggerLevel](
`no 'callbackBetween' for taskId="${taskId}". Transmitting results now` `no 'callbackBetween' for taskId="${taskId}". Transmitting results now`
); );
} }
@ -194,55 +222,45 @@ export function limitedCalls<T>(
reject = _reject; reject = _reject;
}); });
settingsToUse.emitter.emit("data", settingsToUse.functionId); settingsToUse.emitter.emit("data");
return promise; return promise;
}; };
settingsToUse.emitter.on("data", (_functionId) => { if (settingsToUse.emitter.listeners("data").length == 0) {
// If the function ids matches settingsToUse.emitter.on("data", () => {
if (settingsToUse.functionId == _functionId) { if (settingsToUse.queue.length > 0) {
// Check if there is
if (settingsToUse.queue[settingsToUse.functionId].length > 0) {
// Get the Id and the Args. // Get the Id and the Args.
const [taskId, args] = settingsToUse.queue[settingsToUse.functionId][0]; const [functionId, taskId, args] = settingsToUse.queue[0];
if (settingsToUse.getLock(taskId)) { if (settingsToUse.getLock(functionId, taskId)) {
// Add the Task as active. // Add the Task as active.
settingsToUse.activeTasks.add(taskId); settingsToUse.activeTasks.add(taskId);
// Remove the items: // Remove the items:
settingsToUse.queue[settingsToUse.functionId].splice(0, 1); settingsToUse.queue.splice(0, 1);
// Try to perform the call. // Try to perform the call.
try { try {
if ( if (logger) {
settingsToUse.logger && logger[settingsToUse.loggerLevel as LoggerLevel](
settingsToUse.logger.enabledFor(DEBUG) `calling function '${functionId}' for the task taskId="${taskId}"`
) {
settingsToUse.logger.debug(
`calling function '${_functionId}' for the task taskId="${taskId}"`
); );
} }
func(...args) settingsToUse.mapping[functionId](...args)
.then((result) => { .then((result) => {
if ( if (logger) {
settingsToUse.logger && logger[settingsToUse.loggerLevel as LoggerLevel](
settingsToUse.logger.enabledFor(DEBUG) `called function '${functionId}' for the task taskId="${taskId}"`
) {
settingsToUse.logger.debug(
`called function '${_functionId}' for the task taskId="${taskId}"`
); );
} }
settingsToUse.emitter.emit(taskId, null, result); settingsToUse.emitter.emit(taskId, null, result);
}) })
.catch((error) => { .catch((error) => {
if ( if (logger) {
settingsToUse.logger && logger[settingsToUse.loggerLevel as LoggerLevel](
settingsToUse.logger.enabledFor(DEBUG) `called function '${functionId}' for the task taskId="${taskId}", but resulted in an error`
) {
settingsToUse.logger.debug(
`called function '${_functionId}' for the task taskId="${taskId}", but resulted in an error`
); );
} }
settingsToUse.emitter.emit(taskId, error, null); settingsToUse.emitter.emit(taskId, error, null);
@ -252,8 +270,8 @@ export function limitedCalls<T>(
} }
} }
} }
} });
}); }
return wrapped; return wrapped;
} }

View File

@ -1,6 +1,6 @@
{ {
"name": "nope", "name": "nope",
"version": "1.3.7", "version": "1.3.9",
"description": "NoPE Runtime for Nodejs. For Browser-Support please use nope-browser", "description": "NoPE Runtime for Nodejs. For Browser-Support please use nope-browser",
"files": [ "files": [
"dist-nodejs/**/*", "dist-nodejs/**/*",