diff --git a/CHANGELOG.md b/CHANGELOG.md index 70fbf0e..de03721 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -208,4 +208,12 @@ Inital commit, which is working with the browser # 1.3.7 - Fixes: - - `helpers/mapMethods`: Fixing `tranformMap`. Now correctly assigning `onlyValidProps` \ No newline at end of file + - `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. \ No newline at end of file diff --git a/contribute/VERSION b/contribute/VERSION index 8ed486a..2fe9589 100644 --- a/contribute/VERSION +++ b/contribute/VERSION @@ -1 +1 @@ -1.3.7 \ No newline at end of file +1.3.9 \ No newline at end of file diff --git a/lib/helpers/limit.ts b/lib/helpers/limit.ts index 641944f..028b067 100644 --- a/lib/helpers/limit.ts +++ b/lib/helpers/limit.ts @@ -4,8 +4,7 @@ */ import { EventEmitter } from "events"; -import { ILogger } from "js-logger"; -import { DEBUG } from "../index.browser"; +import { getNopeLogger, ILogger, LoggerLevel } from "../index.browser"; import { generateId } from "./idMethods"; import { difference } from "./setMethods"; @@ -20,7 +19,11 @@ export type TLimitedOptions = { /** * 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 }; /** * An emitter to use. */ @@ -28,7 +31,7 @@ export type TLimitedOptions = { /** * 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. */ @@ -40,7 +43,7 @@ export type TLimitedOptions = { /** * A logger to use. */ - logger: ILogger | false; + loggerLevel: false | LoggerLevel; /** * An overview with active Tasks. This is relevant for multiple Funtions. */ @@ -61,10 +64,11 @@ export function getLimitedOptions( options: Partial ): Partial { const defaultSettings: Partial = { - queue: {}, + queue: [], + mapping: {}, emitter: new EventEmitter(), maxParallel: 0, - logger: false, + loggerLevel: false, activeTasks: new Set(), awaitingTasks: new Set(), }; @@ -82,37 +86,66 @@ export function limitedCalls( func: (...args) => Promise, options: Partial ) { + let logger: ILogger | false = false; + // Define the Default-Settings const defaultSettins: TLimitedOptions = { functionId: Date.now().toString(), - queue: {}, + queue: [], + mapping: {}, emitter: new EventEmitter(), - getLock: (newTaskId: string) => { + getLock: () => { const tasks = difference( settingsToUse.activeTasks, 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, - logger: false, + loggerLevel: false, activeTasks: new Set(), awaitingTasks: new Set(), }; 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) { // Generate the Call-ID const taskId = generateId(); const pauseTask = () => { + if (logger) { + logger[settingsToUse.loggerLevel as LoggerLevel]( + `pausing taskId="${taskId}".` + ); + } settingsToUse.awaitingTasks.add(taskId); }; const continueTask = () => { + if (logger) { + logger[settingsToUse.loggerLevel as LoggerLevel]( + `continuing taskId="${taskId}".` + ); + } settingsToUse.awaitingTasks.delete(taskId); }; @@ -120,7 +153,7 @@ export function limitedCalls( args.push(pauseTask, continueTask); // 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 let resolve = null; @@ -138,10 +171,11 @@ export function limitedCalls( // Delete the Task settingsToUse.activeTasks.delete(taskId); + settingsToUse.awaitingTasks.delete(taskId); if (typeof settingsToUse.callbackBetween === "function") { - if (settingsToUse.logger && settingsToUse.logger.enabledFor(DEBUG)) { - settingsToUse.logger.debug( + if (logger) { + logger[settingsToUse.loggerLevel as LoggerLevel]( `using 'callbackBetween' for taskId="${taskId}". Calling now` ); } @@ -149,25 +183,19 @@ export function limitedCalls( settingsToUse .callbackBetween() .then((_) => { - if ( - settingsToUse.logger && - settingsToUse.logger.enabledFor(DEBUG) - ) { - settingsToUse.logger.debug( + if (logger) { + logger[settingsToUse.loggerLevel as LoggerLevel]( `awaited 'callbackBetween' for taskId="${taskId}". Transmitting results now` ); } // Emit, that there is a new task available - settingsToUse.emitter.emit("data", settingsToUse.functionId); + settingsToUse.emitter.emit("data"); }) .catch((_) => { // Log some stuff - if ( - settingsToUse.logger && - settingsToUse.logger.enabledFor(DEBUG) - ) { - settingsToUse.logger.debug( + if (logger) { + logger[settingsToUse.loggerLevel as LoggerLevel]( `something went wrong with 'callbackBetween' for taskId="${taskId}". Transmitting results now!` ); } @@ -176,8 +204,8 @@ export function limitedCalls( settingsToUse.emitter.emit("data", settingsToUse.functionId); }); } else { - if (settingsToUse.logger && settingsToUse.logger.enabledFor(DEBUG)) { - settingsToUse.logger.debug( + if (logger) { + logger[settingsToUse.loggerLevel as LoggerLevel]( `no 'callbackBetween' for taskId="${taskId}". Transmitting results now` ); } @@ -194,55 +222,45 @@ export function limitedCalls( reject = _reject; }); - settingsToUse.emitter.emit("data", settingsToUse.functionId); + settingsToUse.emitter.emit("data"); return promise; }; - settingsToUse.emitter.on("data", (_functionId) => { - // If the function ids matches - if (settingsToUse.functionId == _functionId) { - // Check if there is - if (settingsToUse.queue[settingsToUse.functionId].length > 0) { + if (settingsToUse.emitter.listeners("data").length == 0) { + settingsToUse.emitter.on("data", () => { + if (settingsToUse.queue.length > 0) { // 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. settingsToUse.activeTasks.add(taskId); // Remove the items: - settingsToUse.queue[settingsToUse.functionId].splice(0, 1); + settingsToUse.queue.splice(0, 1); + // Try to perform the call. try { - if ( - settingsToUse.logger && - settingsToUse.logger.enabledFor(DEBUG) - ) { - settingsToUse.logger.debug( - `calling function '${_functionId}' for the task taskId="${taskId}"` + if (logger) { + logger[settingsToUse.loggerLevel as LoggerLevel]( + `calling function '${functionId}' for the task taskId="${taskId}"` ); } - func(...args) + settingsToUse.mapping[functionId](...args) .then((result) => { - if ( - settingsToUse.logger && - settingsToUse.logger.enabledFor(DEBUG) - ) { - settingsToUse.logger.debug( - `called function '${_functionId}' for the task taskId="${taskId}"` + if (logger) { + logger[settingsToUse.loggerLevel as LoggerLevel]( + `called function '${functionId}' for the task taskId="${taskId}"` ); } settingsToUse.emitter.emit(taskId, null, result); }) .catch((error) => { - if ( - settingsToUse.logger && - settingsToUse.logger.enabledFor(DEBUG) - ) { - settingsToUse.logger.debug( - `called function '${_functionId}' for the task taskId="${taskId}", but resulted in an error` + if (logger) { + logger[settingsToUse.loggerLevel as LoggerLevel]( + `called function '${functionId}' for the task taskId="${taskId}", but resulted in an error` ); } settingsToUse.emitter.emit(taskId, error, null); @@ -252,8 +270,8 @@ export function limitedCalls( } } } - } - }); + }); + } return wrapped; } diff --git a/package.json b/package.json index af8b4db..e204b6e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nope", - "version": "1.3.7", + "version": "1.3.9", "description": "NoPE Runtime for Nodejs. For Browser-Support please use nope-browser", "files": [ "dist-nodejs/**/*",