# 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.
This commit is contained in:
parent
d240840d4e
commit
d2be54d69a
10
CHANGELOG.md
10
CHANGELOG.md
@ -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.
|
@ -1 +1 @@
|
|||||||
1.3.7
|
1.3.9
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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/**/*",
|
||||||
|
Loading…
Reference in New Issue
Block a user