@shrub/queue-local 0.5.50

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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2019 jjvainav
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ export * from "./module";
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./module"), exports);
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsMkNBQXlCIn0=
@@ -0,0 +1,19 @@
1
+ import { IModule, IModuleConfigurator, IModuleInitializer } from "@shrub/core";
2
+ import { QueueModule } from "@shrub/queue";
3
+ export declare const IQueueLocalConfiguration: import("@shrub/core").IModuleConfigurationType<IQueueLocalConfiguration>;
4
+ export interface IQueueLocalConfiguration {
5
+ /** Enables the use of the local job queue. */
6
+ useLocalQueue(options?: IQueueLocalOptions): void;
7
+ }
8
+ /** Defines options for the local job queue. */
9
+ export interface IQueueLocalOptions {
10
+ /** A set of queue name patterns defining the queues the local adapter will handle; if not defined, local job queue will be used for all queues. */
11
+ readonly queueNamePatterns?: string[];
12
+ }
13
+ export declare class QueueLocalModule implements IModule {
14
+ private readonly adapter;
15
+ readonly name = "queue-local";
16
+ readonly dependencies: (typeof QueueModule)[];
17
+ initialize(init: IModuleInitializer): void;
18
+ configure({ config }: IModuleConfigurator): void;
19
+ }
package/dist/module.js ADDED
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.QueueLocalModule = exports.IQueueLocalConfiguration = void 0;
7
+ const core_1 = require("@shrub/core");
8
+ const queue_1 = require("@shrub/queue");
9
+ const async_queue_1 = require("@sprig/async-queue");
10
+ const event_emitter_1 = require("@sprig/event-emitter");
11
+ const unique_id_1 = __importDefault(require("@sprig/unique-id"));
12
+ const cron_parser_1 = require("cron-parser");
13
+ exports.IQueueLocalConfiguration = core_1.createConfig();
14
+ class QueueLocalModule {
15
+ constructor() {
16
+ this.adapter = new LocalQueueAdapter([]);
17
+ this.name = "queue-local";
18
+ this.dependencies = [queue_1.QueueModule];
19
+ }
20
+ initialize(init) {
21
+ init.config(exports.IQueueLocalConfiguration).register(() => ({
22
+ useLocalQueue: options => this.adapter.addQueueNamePatterns(options && options.queueNamePatterns || ["*"])
23
+ }));
24
+ }
25
+ configure({ config }) {
26
+ config.get(queue_1.IQueueConfiguration).useQueue(this.adapter);
27
+ }
28
+ }
29
+ exports.QueueLocalModule = QueueLocalModule;
30
+ class LocalQueueAdapter extends queue_1.QueueAdapter {
31
+ constructor() {
32
+ super(...arguments);
33
+ this.queues = new Map();
34
+ }
35
+ getQueueInstance(name) {
36
+ let queue = this.queues.get(name);
37
+ if (!queue) {
38
+ const jobCompleted = new event_emitter_1.EventEmitter();
39
+ const jobFailed = new event_emitter_1.EventEmitter();
40
+ const jobProgress = new event_emitter_1.EventEmitter();
41
+ const asyncQueue = new async_queue_1.AsyncQueue();
42
+ const callbacks = [];
43
+ let index = 0;
44
+ const getCallback = () => {
45
+ // round robin
46
+ index = callbacks.length >= index ? 0 : index;
47
+ return callbacks.length ? callbacks[index++] : undefined;
48
+ };
49
+ const pushJob = (job, onFinished) => asyncQueue.push(async () => {
50
+ // TODO: how to handle if there are no handlers for the queue?
51
+ const callback = getCallback();
52
+ if (callback) {
53
+ await callback(job)
54
+ .then(returnValue => jobCompleted.emit({ job, returnValue }))
55
+ .catch(error => jobFailed.emit({ job, error }))
56
+ .finally(() => onFinished());
57
+ }
58
+ });
59
+ queue = {
60
+ get onJobCompleted() {
61
+ return jobCompleted.event;
62
+ },
63
+ get onJobFailed() {
64
+ return jobFailed.event;
65
+ },
66
+ get onJobProgress() {
67
+ return jobProgress.event;
68
+ },
69
+ add: options => {
70
+ const job = {
71
+ id: unique_id_1.default(),
72
+ data: options.data || {},
73
+ progress: 0,
74
+ updateProgress(progress) {
75
+ this.progress = progress;
76
+ jobProgress.emit({ job, progress });
77
+ return Promise.resolve();
78
+ }
79
+ };
80
+ const getDelay = (options) => {
81
+ if (options.delay) {
82
+ return options.delay;
83
+ }
84
+ if (options.repeat && options.repeat.cron) {
85
+ // if we want to execute immediately simply skip returning a delay
86
+ if (!options.repeat.immediate) {
87
+ const now = Date.now();
88
+ const next = cron_parser_1.parseExpression(options.repeat.cron).next().getTime();
89
+ return next - now;
90
+ }
91
+ }
92
+ return undefined;
93
+ };
94
+ const onFinished = () => {
95
+ if (options.repeat && options.repeat.cron) {
96
+ queue.add({
97
+ name: options.name,
98
+ data: options.data,
99
+ delay: getDelay({ repeat: { cron: options.repeat.cron } }),
100
+ // make sure immediate is not set
101
+ repeat: { cron: options.repeat.cron }
102
+ });
103
+ }
104
+ };
105
+ const delay = getDelay(options);
106
+ if (delay !== undefined) {
107
+ setTimeout(() => pushJob(job, onFinished), delay);
108
+ }
109
+ else {
110
+ pushJob(job, onFinished);
111
+ }
112
+ return Promise.resolve(job);
113
+ },
114
+ // TODO: need to support concurrent job processing
115
+ process: options => {
116
+ callbacks.push(options.callback);
117
+ return {
118
+ close: () => {
119
+ this.queues.delete(name);
120
+ return new Promise(resolve => {
121
+ if (asyncQueue.isIdle) {
122
+ resolve();
123
+ }
124
+ else {
125
+ asyncQueue.onIdle.once(() => resolve());
126
+ }
127
+ });
128
+ }
129
+ };
130
+ }
131
+ };
132
+ this.queues.set(name, queue);
133
+ }
134
+ return queue;
135
+ }
136
+ }
137
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL21vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxzQ0FBNkY7QUFDN0Ysd0NBR3NCO0FBQ3RCLG9EQUFnRDtBQUNoRCx3REFBb0Q7QUFDcEQsaUVBQXdDO0FBQ3hDLDZDQUE4QztBQUlqQyxRQUFBLHdCQUF3QixHQUFHLG1CQUFZLEVBQTRCLENBQUM7QUFZakYsTUFBYSxnQkFBZ0I7SUFBN0I7UUFDcUIsWUFBTyxHQUFHLElBQUksaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFNUMsU0FBSSxHQUFHLGFBQWEsQ0FBQztRQUNyQixpQkFBWSxHQUFHLENBQUMsbUJBQVcsQ0FBQyxDQUFDO0lBVzFDLENBQUM7SUFURyxVQUFVLENBQUMsSUFBd0I7UUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQ0FBd0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ2xELGFBQWEsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzdHLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVELFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBdUI7UUFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQywyQkFBbUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0QsQ0FBQztDQUNKO0FBZkQsNENBZUM7QUFFRCxNQUFNLGlCQUFrQixTQUFRLG9CQUFZO0lBQTVDOztRQUNxQixXQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7SUFtSHhELENBQUM7SUFqSGEsZ0JBQWdCLENBQUMsSUFBWTtRQUNuQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFD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
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@shrub/queue-local",
3
+ "description": "Provides a job/worker queue that runs locally.",
4
+ "version": "0.5.50",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/jjvainav/shrub.git"
9
+ },
10
+ "main": "dist/index.js",
11
+ "module": "dist/esm/index.js",
12
+ "typings": "dist/index.d.ts",
13
+ "files": [
14
+ "dist"
15
+ ],
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "engines": {
20
+ "node": ">=10.18.0"
21
+ },
22
+ "scripts": {
23
+ "build": "tsc -b .",
24
+ "clean": "rimraf ./dist && rimraf tsconfig.tsbuildinfo"
25
+ },
26
+ "dependencies": {
27
+ "@shrub/core": "0.5.50",
28
+ "@shrub/logging": "0.5.50",
29
+ "@shrub/queue": "0.5.50",
30
+ "@sprig/async-queue": "0.2.0",
31
+ "@sprig/event-emitter": "^0.2.0",
32
+ "@sprig/unique-id": "^0.2.0",
33
+ "cron-parser": "^4.3.0"
34
+ },
35
+ "gitHead": "e32c3a3fc3cbbbfdebf6847a313f623de4976af1"
36
+ }