clever-queue 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/.gitlab-ci.yml +13 -0
  2. package/.prettierrc.json +4 -0
  3. package/README.md +15 -0
  4. package/dist/engine/index.d.ts +21 -0
  5. package/dist/engine/index.js +187 -0
  6. package/dist/engine/index.js.map +1 -0
  7. package/dist/engine/interfaces.d.ts +28 -0
  8. package/dist/engine/interfaces.js +9 -0
  9. package/dist/engine/interfaces.js.map +1 -0
  10. package/dist/errors.d.ts +13 -0
  11. package/dist/errors.js +42 -0
  12. package/dist/errors.js.map +1 -0
  13. package/dist/helpers/errors.d.ts +7 -0
  14. package/dist/helpers/errors.js +20 -0
  15. package/dist/helpers/errors.js.map +1 -0
  16. package/dist/helpers/index.d.ts +3 -0
  17. package/dist/helpers/index.js +30 -0
  18. package/dist/helpers/index.js.map +1 -0
  19. package/dist/helpers/logs.d.ts +75 -0
  20. package/dist/helpers/logs.js +32 -0
  21. package/dist/helpers/logs.js.map +1 -0
  22. package/dist/helpers/traces.d.ts +1 -0
  23. package/dist/helpers/traces.js +24 -0
  24. package/dist/helpers/traces.js.map +1 -0
  25. package/dist/index.d.ts +7 -0
  26. package/dist/index.js +37 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/queue/index.d.ts +19 -0
  29. package/dist/queue/index.js +110 -0
  30. package/dist/queue/index.js.map +1 -0
  31. package/dist/queue/interfaces.d.ts +27 -0
  32. package/dist/queue/interfaces.js +18 -0
  33. package/dist/queue/interfaces.js.map +1 -0
  34. package/dist/runner/index.d.ts +14 -0
  35. package/dist/runner/index.js +83 -0
  36. package/dist/runner/index.js.map +1 -0
  37. package/dist/runner/interfaces.d.ts +19 -0
  38. package/dist/runner/interfaces.js +13 -0
  39. package/dist/runner/interfaces.js.map +1 -0
  40. package/dist/task/index.d.ts +14 -0
  41. package/dist/task/index.js +81 -0
  42. package/dist/task/index.js.map +1 -0
  43. package/dist/task/interfaces.d.ts +17 -0
  44. package/dist/task/interfaces.js +19 -0
  45. package/dist/task/interfaces.js.map +1 -0
  46. package/eslint.config.mjs +68 -0
  47. package/exemples/index01.js +116 -0
  48. package/exemples/index01.ts +98 -0
  49. package/exemples/index02.mjs +13 -0
  50. package/exemples/tsconfig.json +24 -0
  51. package/package.json +55 -0
  52. package/src/engine/index.ts +166 -0
  53. package/src/engine/interfaces.ts +33 -0
  54. package/src/helpers/errors.ts +16 -0
  55. package/src/helpers/index.ts +3 -0
  56. package/src/helpers/logs.ts +91 -0
  57. package/src/helpers/traces.ts +24 -0
  58. package/src/index.ts +13 -0
  59. package/src/queue/index.ts +93 -0
  60. package/src/queue/interfaces.ts +38 -0
  61. package/src/runner/index.ts +64 -0
  62. package/src/runner/interfaces.ts +24 -0
  63. package/src/task/index.ts +65 -0
  64. package/src/task/interfaces.ts +34 -0
  65. package/src/tsconfig.json +27 -0
  66. package/test/miscellaneous/test.mjs +92 -0
  67. package/test/units/engine.mjs +35 -0
  68. package/test/units/queue.mjs +34 -0
  69. package/test/units/task.mjs +50 -0
package/.gitlab-ci.yml ADDED
@@ -0,0 +1,13 @@
1
+ # You can override the included template(s) by including variable overrides
2
+ # SAST customization: https://docs.gitlab.com/ee/user/application_security/sast/#customizing-the-sast-settings
3
+ # Secret Detection customization: https://docs.gitlab.com/ee/user/application_security/secret_detection/pipeline/#customization
4
+ # Dependency Scanning customization: https://docs.gitlab.com/ee/user/application_security/dependency_scanning/#customizing-the-dependency-scanning-settings
5
+ # Container Scanning customization: https://docs.gitlab.com/ee/user/application_security/container_scanning/#customizing-the-container-scanning-settings
6
+ # Note that environment variables can be set in several places
7
+ # See https://docs.gitlab.com/ee/ci/variables/#cicd-variable-precedence
8
+ stages:
9
+ - test
10
+ sast:
11
+ stage: test
12
+ include:
13
+ - template: Security/SAST.gitlab-ci.yml
@@ -0,0 +1,4 @@
1
+ {
2
+ "printWidth": 180,
3
+ "endOfLine": "auto"
4
+ }
package/README.md ADDED
@@ -0,0 +1,15 @@
1
+ # clever-queue
2
+
3
+
4
+
5
+ ## Purpose
6
+
7
+ Queuing system for promises that handle concurring, throttling, weighting and prioritizing in a clever fashion.
8
+
9
+ ## Features - Tracking Work in Progree
10
+
11
+ - [ ] Promises
12
+ - [ ] Concurrency running
13
+ - [ ] Priority & BestEffort queues
14
+ - [ ] Throttling
15
+ - [ ] Weighted Queue
@@ -0,0 +1,21 @@
1
+ import * as Queue from "../queue";
2
+ import * as Runner from "../runner";
3
+ import * as Task from "../task";
4
+ type Status = "unknown" | "initialiazing" | "running" | "stopping" | "destroying";
5
+ import { Options, Statistics } from "./interfaces";
6
+ declare class Engine {
7
+ #private;
8
+ status: Status;
9
+ readonly runners: Runner.Runner[];
10
+ readonly queues: Queue.Queue[];
11
+ constructor(opt: Options);
12
+ start(): void;
13
+ stop(): void;
14
+ createQueue(options: Queue.Options): Queue.Queue;
15
+ createRunner(options: Runner.Options): Runner.Runner;
16
+ createTask(function_: Task.FunctionToExecute, options: Task.Options): Task.Task;
17
+ getNextTask(priorityGreaterOrEqualTo: number): Promise<Task.Task | undefined>;
18
+ statistics(): Statistics;
19
+ }
20
+ export { Options, Statistics, ErrorsList } from "./interfaces";
21
+ export { Engine };
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ // clever-queue
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || function (mod) {
20
+ if (mod && mod.__esModule) return mod;
21
+ var result = {};
22
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
23
+ __setModuleDefault(result, mod);
24
+ return result;
25
+ };
26
+ Object.defineProperty(exports, "__esModule", { value: true });
27
+ exports.Engine = exports.ErrorsList = void 0;
28
+ const _ = __importStar(require("../helpers"));
29
+ const Queue = __importStar(require("../queue"));
30
+ const Runner = __importStar(require("../runner"));
31
+ const Task = __importStar(require("../task"));
32
+ const TICK_START = 42;
33
+ const interfaces_1 = require("./interfaces");
34
+ const defaultOptions = {
35
+ bestEffortRunners: 1,
36
+ autostart: true,
37
+ logFunction: undefined,
38
+ };
39
+ class Engine {
40
+ status = "unknown";
41
+ runners = [];
42
+ queues = [];
43
+ constructor(opt) {
44
+ this.status = "initialiazing";
45
+ const options = { ...defaultOptions, ...opt };
46
+ this.#checkOptionsConsistancy(options);
47
+ // create runners
48
+ for (let index = 0; index < (options.bestEffortRunners ?? 0); index++)
49
+ this.createRunner({ priority: Runner.Priorities.BestEffort });
50
+ if (options.logFunction)
51
+ options.logFunction({ body: "engine has been initialized" });
52
+ if (options.autostart)
53
+ this.start();
54
+ }
55
+ start() {
56
+ this.status = "running";
57
+ }
58
+ stop() {
59
+ this.status = "stopping";
60
+ for (const queue of this.queues)
61
+ queue.stop();
62
+ for (const runner of this.runners)
63
+ runner.stop();
64
+ }
65
+ createQueue(options) {
66
+ const queue = new Queue.Queue({ logFunction: options.logFunction, ...options });
67
+ this.queues.push(queue);
68
+ this.#resetLastTick(options.priority);
69
+ return queue;
70
+ }
71
+ createRunner(options) {
72
+ const runner = new Runner.Runner({ logFunction: options.logFunction, ...options }, this);
73
+ this.runners.push(runner);
74
+ return runner;
75
+ }
76
+ createTask(function_, options) {
77
+ return new Task.Task(function_, { logFunction: options.logFunction, ...options });
78
+ }
79
+ #checkOptionsConsistancy(options) {
80
+ if (!options)
81
+ throw new _.Errors.CQError(interfaces_1.ErrorsList.NoOptionsOnEngineInitialization);
82
+ if (!options.bestEffortRunners || options.bestEffortRunners < 1)
83
+ throw new _.Errors.CQError(interfaces_1.ErrorsList.bestEffortRunnersOptionMustBeGreaterThanZero);
84
+ }
85
+ #getSumWeightFunction = (priority) => {
86
+ let result = 0;
87
+ for (const q of this.queues)
88
+ if (q.options.priority === priority)
89
+ result += q.options.weight;
90
+ return result;
91
+ };
92
+ #resetLastTick(priority) {
93
+ for (const q of this.queues)
94
+ if (q.options.priority === priority)
95
+ q.tick = TICK_START;
96
+ }
97
+ #getNextWeightedQueue(priority) {
98
+ let minTick = Infinity;
99
+ let result = undefined;
100
+ for (const q of this.queues)
101
+ if (q.options.priority === priority && q.tick <= minTick) {
102
+ minTick = q.tick;
103
+ result = q;
104
+ }
105
+ return result;
106
+ }
107
+ #howMuchTasksWaitingInQueues(priority) {
108
+ let result = 0;
109
+ for (const q of this.queues)
110
+ if (q.options.priority === priority)
111
+ result += q.tasks.length;
112
+ return result;
113
+ }
114
+ /*
115
+ async getNextTask(priorityGreaterOrEqualTo: number): Promise<Task.Task> {
116
+ for (let priority = Queue.Priorities.Absolute; priority <= priorityGreaterOrEqualTo; priority++) {
117
+ // Iterate on Each PriorityLevel From Absolute to param function
118
+ while (this.#howMuchTasksWaitingInQueues(priority) > 0) {
119
+ let task: Task.Task | undefined;
120
+ while (!task) {
121
+ const nextPriorityQueue = this.#getNextQueue(priority); // Find Next Priority Queue to process
122
+ if (nextPriorityQueue) {
123
+ nextPriorityQueue.tick += this.#getSumWeightFunction(priority) / nextPriorityQueue.options.weight; // Update tick with related weight
124
+ if (nextPriorityQueue.tasks.length > 0) {
125
+ task = nextPriorityQueue.tasks.shift(); // If queue is not empty, this is our next Task to process
126
+ if (task) task.runner();
127
+ console.log(nextPriorityQueue.options.name, nextPriorityQueue.tick);
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }
134
+ */
135
+ async getNextTask(priorityGreaterOrEqualTo) {
136
+ let task = undefined;
137
+ // Iterate on Each PriorityLevel From Absolute to parameter
138
+ for (let priority = Queue.Priorities.Absolute; priority <= priorityGreaterOrEqualTo; priority++) {
139
+ // Check if there is task waiting of this priority level
140
+ while (this.#howMuchTasksWaitingInQueues(priority) > 0) {
141
+ // Find Next Weighted Queue of this priority level to check
142
+ const nextPriorityQueue = this.#getNextWeightedQueue(priority);
143
+ if (nextPriorityQueue) {
144
+ // update Tick (next check) according to queue related weigth
145
+ nextPriorityQueue.tick += this.#getSumWeightFunction(priority) / nextPriorityQueue.options.weight;
146
+ // If queue is not empty, we've got our next Task to process
147
+ if (nextPriorityQueue.tasks.length > 0) {
148
+ // dequeue task from queue
149
+ task = nextPriorityQueue.tasks.shift();
150
+ if (task)
151
+ return task;
152
+ }
153
+ }
154
+ }
155
+ }
156
+ return undefined;
157
+ }
158
+ statistics() {
159
+ let taskCount = 0;
160
+ const runners = [];
161
+ const queues = [];
162
+ for (const runner of this.runners) {
163
+ if (runner.status == "running")
164
+ taskCount += 1;
165
+ runners.push(runner.statistics());
166
+ }
167
+ for (const queue of this.queues) {
168
+ taskCount += queue.tasks.length;
169
+ queues.push(queue.statistics());
170
+ }
171
+ const stat = {
172
+ engine: {
173
+ status: this.status,
174
+ runners: this.runners.length,
175
+ queues: this.queues.length,
176
+ tasks: taskCount,
177
+ },
178
+ runners,
179
+ queues,
180
+ };
181
+ return stat;
182
+ }
183
+ }
184
+ exports.Engine = Engine;
185
+ var interfaces_2 = require("./interfaces");
186
+ Object.defineProperty(exports, "ErrorsList", { enumerable: true, get: function () { return interfaces_2.ErrorsList; } });
187
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import * as _ from "../helpers";
2
+ import * as Runner from "../runner/interfaces";
3
+ import * as Queue from "../runner/interfaces";
4
+ interface Options {
5
+ autostart?: boolean;
6
+ bestEffortRunners?: number;
7
+ logFunction?: _.Logs.LogFunction;
8
+ }
9
+ interface Statistics {
10
+ engine: {
11
+ status: string;
12
+ runners: number;
13
+ queues: number;
14
+ tasks: number;
15
+ };
16
+ runners: Runner.Statistics[];
17
+ queues: Queue.Statistics[];
18
+ }
19
+ type ErrorListKeys = "NoOptionsOnEngineInitialization" | "bestEffortRunnersOptionMustBeGreaterThanZero";
20
+ declare const ErrorsList: {
21
+ [index in ErrorListKeys]: {
22
+ name: string;
23
+ message: string;
24
+ };
25
+ };
26
+ export { LogFunction } from "../helpers/logs";
27
+ export { TraceFunction } from "../helpers/traces";
28
+ export { Options, Statistics, ErrorsList };
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ErrorsList = void 0;
4
+ const ErrorsList = {
5
+ NoOptionsOnEngineInitialization: { name: "NoOptionsOnEngineInitialization", message: "You must provide an options parameter to Engine" },
6
+ bestEffortRunnersOptionMustBeGreaterThanZero: { name: "bestEffortRunnersOptionMustBeGreaterThanZero", message: "bestEffortRunners Option must be equal or superior to 1" },
7
+ };
8
+ exports.ErrorsList = ErrorsList;
9
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/engine/interfaces.ts"],"names":[],"mappings":";;;AAuBA,MAAM,UAAU,GAEZ;IACF,+BAA+B,EAAE,EAAE,IAAI,EAAE,iCAAiC,EAAE,OAAO,EAAE,iDAAiD,EAAE;IACxI,4CAA4C,EAAE,EAAE,IAAI,EAAE,8CAA8C,EAAE,OAAO,EAAE,yDAAyD,EAAE;CAC3K,CAAC;AAI4B,gCAAU"}
@@ -0,0 +1,13 @@
1
+ declare const CQErrors: {
2
+ [index: string]: {
3
+ name: string;
4
+ message: string;
5
+ };
6
+ };
7
+ declare class CQError extends Error {
8
+ constructor(error: {
9
+ name: string;
10
+ message: string;
11
+ }, context?: object);
12
+ }
13
+ export { CQError, CQErrors };
package/dist/errors.js ADDED
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CQErrors = exports.CQError = void 0;
4
+ const CQErrors = {
5
+ NoOptionsOnEngineInitialization: { name: "NoOptionsOnEngineInitialization", message: "You must provide an options parameter to Engine" },
6
+ defaultRunnersOptionMustBeGreaterThanZero: { name: "concurrentRunnersOptionMustBeGreaterThanZero", message: "concurrentRunners Option must be equal or superior to 1" },
7
+ priorityRunnersOptionMustBeZeroOrGreaterThanZero: {
8
+ name: "dedicatedPriorityRunnersOptionMustBeZeroOrGreaterThanZero",
9
+ message: "dedicatedPriorityRunners Option must be equal or superior to 0",
10
+ },
11
+ priorityRunnersOptionMustBeLessThanconcurrentRunners: {
12
+ name: "dedicatedPriorityRunnersOptionMustBeLessThanconcurrentRunners",
13
+ message: "dedicatedPriorityRunners Option must be less than concurrentRunners option",
14
+ },
15
+ BadPriorityOptionsOnQueueInitialization: {
16
+ name: "BadPriorityOptionsOnQueueInitialization",
17
+ message: "You must provide a 'priority' parameter for Queue initialization from 0 (absolute priority) to 255 (best effort priority), you may use CleverQueue.Priorities constants",
18
+ },
19
+ NoWeightOptionsOnQueueInitialization: {
20
+ name: "NoWeightOptionsOnQueueInitialization",
21
+ message: "You must provide a 'weight' parameter for Queue initialization",
22
+ },
23
+ NoOptionsOnQueueInitialization: { name: "NoOptionsOnQueueInitialization", message: "You must provide an options parameter to Queue" },
24
+ };
25
+ exports.CQErrors = CQErrors;
26
+ class CQError extends Error {
27
+ constructor(error, context) {
28
+ if (!error) {
29
+ error = {
30
+ name: "undocumentedError",
31
+ message: "Undocumented Error, please raise an issue to developpers",
32
+ };
33
+ }
34
+ super(error.message);
35
+ this.name = error.name;
36
+ this.message = error.message;
37
+ if (context)
38
+ this.cause = JSON.stringify(context);
39
+ }
40
+ }
41
+ exports.CQError = CQError;
42
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA,MAAM,QAAQ,GAA2D;IACvE,+BAA+B,EAAE,EAAE,IAAI,EAAE,iCAAiC,EAAE,OAAO,EAAE,iDAAiD,EAAE;IACxI,yCAAyC,EAAE,EAAE,IAAI,EAAE,8CAA8C,EAAE,OAAO,EAAE,yDAAyD,EAAE;IACvK,gDAAgD,EAAE;QAChD,IAAI,EAAE,2DAA2D;QACjE,OAAO,EAAE,gEAAgE;KAC1E;IACD,oDAAoD,EAAE;QACpD,IAAI,EAAE,+DAA+D;QACrE,OAAO,EAAE,4EAA4E;KACtF;IAED,uCAAuC,EAAE;QACvC,IAAI,EAAE,yCAAyC;QAC/C,OAAO,EACL,yKAAyK;KAC5K;IACD,oCAAoC,EAAE;QACpC,IAAI,EAAE,sCAAsC;QAC5C,OAAO,EAAE,gEAAgE;KAC1E;IAED,8BAA8B,EAAE,EAAE,IAAI,EAAE,gCAAgC,EAAE,OAAO,EAAE,gDAAgD,EAAE;CACtI,CAAC;AAiBgB,4BAAQ;AAf1B,MAAM,OAAQ,SAAQ,KAAK;IACzB,YAAY,KAAwC,EAAE,OAAgB;QACpE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG;gBACN,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,0DAA0D;aACpE,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,IAAI,OAAO;YAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;CACF;AAEQ,0BAAO"}
@@ -0,0 +1,7 @@
1
+ declare class CQError extends Error {
2
+ constructor(error: {
3
+ name: string;
4
+ message: string;
5
+ }, context?: object);
6
+ }
7
+ export { CQError };
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CQError = void 0;
4
+ class CQError extends Error {
5
+ constructor(error, context) {
6
+ if (!error) {
7
+ error = {
8
+ name: "undocumentedError",
9
+ message: "Undocumented Error, please raise an issue to developpers",
10
+ };
11
+ }
12
+ super(error.message);
13
+ this.name = error.name;
14
+ this.message = error.message;
15
+ if (context)
16
+ this.cause = JSON.stringify(context);
17
+ }
18
+ }
19
+ exports.CQError = CQError;
20
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/helpers/errors.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAQ,SAAQ,KAAK;IACzB,YAAY,KAAwC,EAAE,OAAgB;QACpE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG;gBACN,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,0DAA0D;aACpE,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,IAAI,OAAO;YAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;CACF;AAEQ,0BAAO"}
@@ -0,0 +1,3 @@
1
+ export * as Errors from "./errors";
2
+ export * as Logs from "./logs";
3
+ export * as Traces from "./traces";
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.Traces = exports.Logs = exports.Errors = void 0;
27
+ exports.Errors = __importStar(require("./errors"));
28
+ exports.Logs = __importStar(require("./logs"));
29
+ exports.Traces = __importStar(require("./traces"));
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mDAAmC;AACnC,+CAA+B;AAC/B,mDAAmC"}
@@ -0,0 +1,75 @@
1
+ export declare type HrTime = [number, number];
2
+ export declare type TimeInput = HrTime | number | Date;
3
+ export type AnyValueScalar = string | number | boolean;
4
+ export type AnyValueArray = Array<AnyValue>;
5
+ /**
6
+ * AnyValueMap is a map from string to AnyValue (attribute value or a nested map)
7
+ */
8
+ export interface AnyValueMap {
9
+ [attributeKey: string]: AnyValue;
10
+ }
11
+ /**
12
+ * AnyValue can be one of the following:
13
+ * - a scalar value
14
+ * - a byte array
15
+ * - array of any value
16
+ * - map from string to any value
17
+ * - empty value
18
+ */
19
+ export type AnyValue = AnyValueScalar | Uint8Array | AnyValueArray | AnyValueMap | null | undefined;
20
+ export type LogBody = AnyValue;
21
+ export type LogAttributes = AnyValueMap;
22
+ export declare enum SeverityNumber {
23
+ UNSPECIFIED = 0,
24
+ TRACE = 1,
25
+ TRACE2 = 2,
26
+ TRACE3 = 3,
27
+ TRACE4 = 4,
28
+ DEBUG = 5,
29
+ DEBUG2 = 6,
30
+ DEBUG3 = 7,
31
+ DEBUG4 = 8,
32
+ INFO = 9,
33
+ INFO2 = 10,
34
+ INFO3 = 11,
35
+ INFO4 = 12,
36
+ WARN = 13,
37
+ WARN2 = 14,
38
+ WARN3 = 15,
39
+ WARN4 = 16,
40
+ ERROR = 17,
41
+ ERROR2 = 18,
42
+ ERROR3 = 19,
43
+ ERROR4 = 20,
44
+ FATAL = 21,
45
+ FATAL2 = 22,
46
+ FATAL3 = 23,
47
+ FATAL4 = 24
48
+ }
49
+ export interface LogRecord {
50
+ /**
51
+ * The time when the log record occurred as UNIX Epoch time in nanoseconds.
52
+ */
53
+ timestamp?: TimeInput;
54
+ /**
55
+ * Time when the event was observed by the collection system.
56
+ */
57
+ observedTimestamp?: TimeInput;
58
+ /**
59
+ * Numerical value of the severity.
60
+ */
61
+ severityNumber?: SeverityNumber;
62
+ /**
63
+ * The severity text.
64
+ */
65
+ severityText?: string;
66
+ /**
67
+ * A value containing the body of the log record.
68
+ */
69
+ body?: LogBody;
70
+ /**
71
+ * Attributes that define the log record.
72
+ */
73
+ attributes?: LogAttributes;
74
+ }
75
+ export type LogFunction = (logRecord: LogRecord) => void;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SeverityNumber = void 0;
4
+ var SeverityNumber;
5
+ (function (SeverityNumber) {
6
+ SeverityNumber[SeverityNumber["UNSPECIFIED"] = 0] = "UNSPECIFIED";
7
+ SeverityNumber[SeverityNumber["TRACE"] = 1] = "TRACE";
8
+ SeverityNumber[SeverityNumber["TRACE2"] = 2] = "TRACE2";
9
+ SeverityNumber[SeverityNumber["TRACE3"] = 3] = "TRACE3";
10
+ SeverityNumber[SeverityNumber["TRACE4"] = 4] = "TRACE4";
11
+ SeverityNumber[SeverityNumber["DEBUG"] = 5] = "DEBUG";
12
+ SeverityNumber[SeverityNumber["DEBUG2"] = 6] = "DEBUG2";
13
+ SeverityNumber[SeverityNumber["DEBUG3"] = 7] = "DEBUG3";
14
+ SeverityNumber[SeverityNumber["DEBUG4"] = 8] = "DEBUG4";
15
+ SeverityNumber[SeverityNumber["INFO"] = 9] = "INFO";
16
+ SeverityNumber[SeverityNumber["INFO2"] = 10] = "INFO2";
17
+ SeverityNumber[SeverityNumber["INFO3"] = 11] = "INFO3";
18
+ SeverityNumber[SeverityNumber["INFO4"] = 12] = "INFO4";
19
+ SeverityNumber[SeverityNumber["WARN"] = 13] = "WARN";
20
+ SeverityNumber[SeverityNumber["WARN2"] = 14] = "WARN2";
21
+ SeverityNumber[SeverityNumber["WARN3"] = 15] = "WARN3";
22
+ SeverityNumber[SeverityNumber["WARN4"] = 16] = "WARN4";
23
+ SeverityNumber[SeverityNumber["ERROR"] = 17] = "ERROR";
24
+ SeverityNumber[SeverityNumber["ERROR2"] = 18] = "ERROR2";
25
+ SeverityNumber[SeverityNumber["ERROR3"] = 19] = "ERROR3";
26
+ SeverityNumber[SeverityNumber["ERROR4"] = 20] = "ERROR4";
27
+ SeverityNumber[SeverityNumber["FATAL"] = 21] = "FATAL";
28
+ SeverityNumber[SeverityNumber["FATAL2"] = 22] = "FATAL2";
29
+ SeverityNumber[SeverityNumber["FATAL3"] = 23] = "FATAL3";
30
+ SeverityNumber[SeverityNumber["FATAL4"] = 24] = "FATAL4";
31
+ })(SeverityNumber || (exports.SeverityNumber = SeverityNumber = {}));
32
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/helpers/logs.ts"],"names":[],"mappings":";;;AAyBA,IAAY,cA0BX;AA1BD,WAAY,cAAc;IACxB,iEAAe,CAAA;IACf,qDAAS,CAAA;IACT,uDAAU,CAAA;IACV,uDAAU,CAAA;IACV,uDAAU,CAAA;IACV,qDAAS,CAAA;IACT,uDAAU,CAAA;IACV,uDAAU,CAAA;IACV,uDAAU,CAAA;IACV,mDAAQ,CAAA;IACR,sDAAU,CAAA;IACV,sDAAU,CAAA;IACV,sDAAU,CAAA;IACV,oDAAS,CAAA;IACT,sDAAU,CAAA;IACV,sDAAU,CAAA;IACV,sDAAU,CAAA;IACV,sDAAU,CAAA;IACV,wDAAW,CAAA;IACX,wDAAW,CAAA;IACX,wDAAW,CAAA;IACX,sDAAU,CAAA;IACV,wDAAW,CAAA;IACX,wDAAW,CAAA;IACX,wDAAW,CAAA;AACb,CAAC,EA1BW,cAAc,8BAAd,cAAc,QA0BzB"}
@@ -0,0 +1 @@
1
+ export type TraceFunction = () => void;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ /*
3
+ interface EventRecord {
4
+ // https://opentelemetry.io/docs/specs/otel/logs/data-model/
5
+ timestamp?: number; // Time when the event occurred.
6
+ observedTimestamp: number; // Time when the event was observed.
7
+ traceId?: string; // Request trace id.
8
+ spanId?: string; // Request span id.
9
+ traceFlags?: number; // W3C trace flag.
10
+ SeverityText; // The severity text (also known as log level).
11
+ SeverityNumber; // Numerical value of the severity.
12
+ Body; // The body of the log record.
13
+ Resource; // Describes the source of the log.
14
+ InstrumentationScope; // Describes the scope that emitted the log.
15
+ Attributes; // Additional information about the event.
16
+ }
17
+
18
+ declare type AttributeValue = string | number | boolean | Array<null | undefined | string> | Array<null | undefined | number> | Array<null | undefined | boolean>;
19
+ interface Attributes {
20
+ [attributeKey: string]: AttributeValue | undefined;
21
+ }
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ //# sourceMappingURL=traces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traces.js","sourceRoot":"","sources":["../../src/helpers/traces.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;EAoBE"}
@@ -0,0 +1,7 @@
1
+ import * as Engine from "./engine";
2
+ declare function createEngine(options: Engine.Options): Engine.Engine;
3
+ export * as Engine from "./engine/interfaces";
4
+ export * as Runner from "./runner/interfaces";
5
+ export * as Queue from "./queue/interfaces";
6
+ export * as Task from "./task/interfaces";
7
+ export { createEngine };
package/dist/index.js ADDED
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.Task = exports.Queue = exports.Runner = exports.Engine = void 0;
27
+ exports.createEngine = createEngine;
28
+ // clever-queue
29
+ const Engine = __importStar(require("./engine"));
30
+ function createEngine(options) {
31
+ return new Engine.Engine(options);
32
+ }
33
+ exports.Engine = __importStar(require("./engine/interfaces"));
34
+ exports.Runner = __importStar(require("./runner/interfaces"));
35
+ exports.Queue = __importStar(require("./queue/interfaces"));
36
+ exports.Task = __importStar(require("./task/interfaces"));
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAYS,oCAAY;AAZrB,eAAe;AACf,iDAAmC;AAEnC,SAAS,YAAY,CAAC,OAAuB;IAC3C,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,8DAA8C;AAC9C,8DAA8C;AAC9C,4DAA4C;AAC5C,0DAA0C"}
@@ -0,0 +1,19 @@
1
+ import * as Task from "../task";
2
+ import { Options, Statistics } from "./interfaces";
3
+ type GetSumWeightFunction = (priority: number) => number;
4
+ type Status = "unknown" | "initialiazing" | "running" | "stopping" | "destroying";
5
+ declare class Queue {
6
+ #private;
7
+ status: Status;
8
+ readonly options: Options;
9
+ tick: number;
10
+ tasks: Task.Task[];
11
+ constructor(opt: Options);
12
+ start(): void;
13
+ stop(): void;
14
+ createTaskAndEnqueue(function_: Task.FunctionToExecute, options: Task.Options): Promise<unknown>;
15
+ enqueue(task: Task.Task): Promise<unknown>;
16
+ statistics(): Statistics;
17
+ }
18
+ export { Options, Statistics, ErrorsList, Priorities } from "./interfaces";
19
+ export { Queue, GetSumWeightFunction };