@tsed/pulse 8.11.2-rc.1 → 8.12.0-rc.1

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.
@@ -1,8 +1,12 @@
1
1
  import { StoreMerge, useDecorators } from "@tsed/core";
2
2
  import { Injectable } from "@tsed/di";
3
3
  import { PROVIDER_TYPE_PULSE } from "../constants/constants.js";
4
- export function Pulse(options) {
4
+ export function JobsController(options) {
5
5
  return useDecorators(options?.namespace && StoreMerge("pulse", options), Injectable({
6
6
  type: PROVIDER_TYPE_PULSE
7
7
  }));
8
8
  }
9
+ /**
10
+ * @deprecated Use `JobsController` instead.
11
+ */
12
+ export const Pulse = JobsController;
package/lib/esm/index.js CHANGED
@@ -7,5 +7,4 @@ export * from "./decorators/every.js";
7
7
  export * from "./decorators/pulse.js";
8
8
  export * from "./interfaces/interfaces.js";
9
9
  export * from "./interfaces/PulseStore.js";
10
- export * from "./PulseModule.js";
11
- export * from "./services/PulseFactory.js";
10
+ export * from "./services/PulseService.js";
@@ -0,0 +1,121 @@
1
+ import { Pulse } from "@pulsecron/pulse";
2
+ import { constant, DIContext, injectable, injector, logger, runInContext } from "@tsed/di";
3
+ import { $asyncEmit } from "@tsed/hooks";
4
+ import { v4 as uuid } from "uuid";
5
+ import { PROVIDER_TYPE_PULSE } from "../constants/constants.js";
6
+ function getOpts() {
7
+ return constant("pulse", { enabled: false });
8
+ }
9
+ function addPulseDefinitionsForProvider(pulse, provider) {
10
+ const store = provider.store.get("pulse", {});
11
+ if (!store.define) {
12
+ return;
13
+ }
14
+ Object.entries(store.define).forEach(([propertyKey, { name, ...options }]) => {
15
+ const instance = injector().get(provider.token);
16
+ const jobProcessor = instance[propertyKey].bind(instance);
17
+ const jobName = getNameForJob(propertyKey, store.namespace, name);
18
+ pulse.define(jobName, jobProcessor, options);
19
+ });
20
+ }
21
+ async function scheduleJobsForProvider(pulse, provider) {
22
+ const store = provider.store.get("pulse", {});
23
+ if (!store.every) {
24
+ return;
25
+ }
26
+ const promises = Object.entries(store.every).map(([propertyKey, { interval, name, ...options }]) => {
27
+ const jobName = getNameForJob(propertyKey, store.namespace, name);
28
+ return pulse.every(interval, jobName, {}, options);
29
+ });
30
+ await Promise.all(promises);
31
+ }
32
+ function getNameForJob(propertyKey, namespace, customName) {
33
+ const name = customName || propertyKey;
34
+ return namespace ? `${namespace}.${name}` : name;
35
+ }
36
+ async function afterListen(pulse) {
37
+ const opts = getOpts();
38
+ if (opts.enabled) {
39
+ const providers = injector().getProviders(PROVIDER_TYPE_PULSE);
40
+ if (!opts.disableJobProcessing) {
41
+ logger().info({
42
+ event: "PULSE_ADD_DEFINITIONS",
43
+ message: "Pulse add definitions"
44
+ });
45
+ providers.forEach((provider) => addPulseDefinitionsForProvider(pulse, provider));
46
+ await $asyncEmit("$beforePulseStart");
47
+ }
48
+ await pulse.start();
49
+ if (!opts.disableJobProcessing) {
50
+ logger().info({
51
+ event: "PULSE_ADD_JOBS",
52
+ message: "Pulse add scheduled jobs"
53
+ });
54
+ await Promise.all(providers.map((provider) => scheduleJobsForProvider(pulse, provider)));
55
+ await $asyncEmit("$afterPulseStart");
56
+ }
57
+ }
58
+ }
59
+ async function onDestroy(pulse) {
60
+ const opts = getOpts();
61
+ if (opts.enabled) {
62
+ if (opts.drainJobsBeforeClose && "drain" in pulse) {
63
+ logger().info({
64
+ event: "PULSE_DRAIN",
65
+ message: "Pulse is draining all jobs before close"
66
+ });
67
+ await pulse.drain();
68
+ }
69
+ else {
70
+ logger().info({
71
+ event: "PULSE_STOP",
72
+ message: "Pulse is stopping"
73
+ });
74
+ await pulse.stop();
75
+ }
76
+ await pulse.close({ force: true });
77
+ logger().info({ event: "PULSE_STOP", message: "Pulse stopped" });
78
+ }
79
+ }
80
+ export const PulseService = injectable(Pulse)
81
+ .factory(() => {
82
+ const opts = getOpts();
83
+ if (opts.enabled) {
84
+ const pulse = new Pulse(opts);
85
+ return new Proxy(pulse, {
86
+ set(target, prop, value) {
87
+ return Reflect.set(target, prop, value);
88
+ },
89
+ get(target, prop) {
90
+ if (prop === "pulse") {
91
+ return target;
92
+ }
93
+ if (prop === "$define") {
94
+ return Reflect.get(target, "define", target);
95
+ }
96
+ if (prop === "define") {
97
+ return (name, processor, options) => {
98
+ return target["define"](name, (job) => {
99
+ const $ctx = new DIContext({
100
+ id: uuid()
101
+ });
102
+ $ctx.set("job", job);
103
+ return runInContext($ctx, () => processor(job));
104
+ }, options);
105
+ };
106
+ }
107
+ return Reflect.get(target, prop, target);
108
+ }
109
+ });
110
+ }
111
+ return new Proxy({}, { get: () => () => Promise.resolve() });
112
+ })
113
+ .hooks({
114
+ $afterListen: afterListen,
115
+ $onDestroy: onDestroy
116
+ })
117
+ .token();
118
+ /**
119
+ * @deprecated Use `Pulse` from `pulse` instead.
120
+ */
121
+ export const PulseModule = Pulse;
@@ -1,5 +1,9 @@
1
1
  interface PulseOptions {
2
2
  namespace?: string;
3
3
  }
4
- export declare function Pulse(options?: PulseOptions): ClassDecorator;
4
+ export declare function JobsController(options?: PulseOptions): ClassDecorator;
5
+ /**
6
+ * @deprecated Use `JobsController` instead.
7
+ */
8
+ export declare const Pulse: typeof JobsController;
5
9
  export {};
@@ -7,5 +7,4 @@ export * from "./decorators/every.js";
7
7
  export * from "./decorators/pulse.js";
8
8
  export * from "./interfaces/interfaces.js";
9
9
  export * from "./interfaces/PulseStore.js";
10
- export * from "./PulseModule.js";
11
- export * from "./services/PulseFactory.js";
10
+ export * from "./services/PulseService.js";
@@ -1,15 +1,13 @@
1
1
  import { PulseConfig } from "@pulsecron/pulse";
2
+ export type PulseSettings = PulseConfig & {
3
+ enabled?: boolean;
4
+ disableJobProcessing?: boolean;
5
+ drainJobsBeforeClose?: boolean;
6
+ };
2
7
  declare global {
3
8
  namespace TsED {
4
9
  interface Configuration {
5
- pulse?: {
6
- /**
7
- * Enable Pulse jobs. Default false.
8
- */
9
- enabled?: boolean;
10
- disableJobProcessing?: boolean;
11
- drainJobsBeforeClose?: boolean;
12
- } & PulseConfig;
10
+ pulse?: PulseSettings;
13
11
  }
14
12
  }
15
13
  }
@@ -0,0 +1,13 @@
1
+ import { Pulse } from "@pulsecron/pulse";
2
+ export declare const PulseService: {
3
+ readonly __type: "token_factory";
4
+ };
5
+ /**
6
+ * @deprecated Use `Pulse` from `pulse` instead.
7
+ */
8
+ export type PulseService = Pulse;
9
+ /**
10
+ * @deprecated Use `Pulse` from `pulse` instead.
11
+ */
12
+ export declare const PulseModule: typeof Pulse;
13
+ export type PulseModule = Pulse;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@tsed/pulse",
3
3
  "description": "@pulsecron/pulse package for Ts.ED framework",
4
4
  "type": "module",
5
- "version": "8.11.2-rc.1",
5
+ "version": "8.12.0-rc.1",
6
6
  "source": "./src/index.ts",
7
7
  "main": "./lib/esm/index.js",
8
8
  "module": "./lib/esm/index.js",
@@ -27,11 +27,11 @@
27
27
  },
28
28
  "devDependencies": {
29
29
  "@pulsecron/pulse": "^1.6.3",
30
- "@tsed/barrels": "8.11.2-rc.1",
31
- "@tsed/core": "8.11.2-rc.1",
32
- "@tsed/di": "8.11.2-rc.1",
33
- "@tsed/platform-http": "8.11.2-rc.1",
34
- "@tsed/typescript": "8.11.2-rc.1",
30
+ "@tsed/barrels": "8.12.0-rc.1",
31
+ "@tsed/core": "8.12.0-rc.1",
32
+ "@tsed/di": "8.12.0-rc.1",
33
+ "@tsed/platform-http": "8.12.0-rc.1",
34
+ "@tsed/typescript": "8.12.0-rc.1",
35
35
  "eslint": "9.12.0",
36
36
  "typescript": "5.4.5",
37
37
  "vitest": "3.1.4"
@@ -1,131 +0,0 @@
1
- import { __decorate, __metadata } from "tslib";
2
- import { Constant, DIContext, Inject, InjectorService, Module, runInContext } from "@tsed/di";
3
- import { Logger } from "@tsed/logger";
4
- import { v4 as uuid } from "uuid";
5
- import { PROVIDER_TYPE_PULSE } from "./constants/constants.js";
6
- import { PulseService } from "./services/PulseFactory.js";
7
- let PulseModule = class PulseModule {
8
- async $afterListen() {
9
- if (this.enabled) {
10
- const providers = this.getProviders();
11
- if (!this.disableJobProcessing) {
12
- this.logger.info({
13
- event: "PULSE_ADD_DEFINITIONS",
14
- message: "Pulse add definitions"
15
- });
16
- providers.forEach((provider) => this.addPulseDefinitionsForProvider(provider));
17
- await this.injector.emit("$beforePulseStart");
18
- }
19
- await this.pulse.start();
20
- if (!this.disableJobProcessing) {
21
- this.logger.info({
22
- event: "PULSE_ADD_JOBS",
23
- message: "Pulse add scheduled jobs"
24
- });
25
- await Promise.all(providers.map((provider) => this.scheduleJobsForProvider(provider)));
26
- await this.injector.emit("$afterPulseStart");
27
- }
28
- }
29
- }
30
- async $onDestroy() {
31
- if (this.enabled) {
32
- if (this.drainJobsBeforeClose && "drain" in this.pulse) {
33
- this.logger.info({
34
- event: "PULSE_DRAIN",
35
- message: "Pulse is draining all jobs before close"
36
- });
37
- await this.pulse.drain();
38
- }
39
- else {
40
- this.logger.info({
41
- event: "PULSE_STOP",
42
- message: "Pulse is stopping"
43
- });
44
- await this.pulse.stop();
45
- }
46
- await this.pulse.close({ force: true });
47
- this.logger.info({ event: "PULSE_STOP", message: "Pulse stopped" });
48
- }
49
- }
50
- define(name, processor, options) {
51
- return this.pulse.define(name, (job, ...rest) => {
52
- const $ctx = new DIContext({
53
- injector: this.injector,
54
- id: uuid(),
55
- logger: this.injector.logger
56
- });
57
- $ctx.set("job", job);
58
- return runInContext($ctx, () => processor(job, ...rest));
59
- }, options);
60
- }
61
- every(interval, name, data, options) {
62
- return this.pulse.every(interval, name, data, options);
63
- }
64
- schedule(when, name, data) {
65
- return this.pulse.schedule(when, name, data);
66
- }
67
- now(name, data) {
68
- return this.pulse.now(name, data);
69
- }
70
- create(name, data) {
71
- return this.pulse.create(name, data);
72
- }
73
- getProviders() {
74
- return this.injector.getProviders(PROVIDER_TYPE_PULSE);
75
- }
76
- addPulseDefinitionsForProvider(provider) {
77
- const store = provider.store.get("pulse", {});
78
- if (!store.define) {
79
- return;
80
- }
81
- Object.entries(store.define).forEach(([propertyKey, { name, ...options }]) => {
82
- const instance = this.injector.get(provider.token);
83
- const jobProcessor = instance[propertyKey].bind(instance);
84
- const jobName = this.getNameForJob(propertyKey, store.namespace, name);
85
- this.define(jobName, jobProcessor, options);
86
- });
87
- }
88
- async scheduleJobsForProvider(provider) {
89
- const store = provider.store.get("pulse", {});
90
- if (!store.every) {
91
- return;
92
- }
93
- const promises = Object.entries(store.every).map(([propertyKey, { interval, name, ...options }]) => {
94
- const jobName = this.getNameForJob(propertyKey, store.namespace, name);
95
- return this.every(interval, jobName, {}, options);
96
- });
97
- await Promise.all(promises);
98
- }
99
- getNameForJob(propertyKey, namespace, customName) {
100
- const name = customName || propertyKey;
101
- return namespace ? `${namespace}.${name}` : name;
102
- }
103
- };
104
- __decorate([
105
- Inject(),
106
- __metadata("design:type", Logger)
107
- ], PulseModule.prototype, "logger", void 0);
108
- __decorate([
109
- Inject(),
110
- __metadata("design:type", InjectorService)
111
- ], PulseModule.prototype, "injector", void 0);
112
- __decorate([
113
- Inject(),
114
- __metadata("design:type", PulseService)
115
- ], PulseModule.prototype, "pulse", void 0);
116
- __decorate([
117
- Constant("pulse.enabled", false),
118
- __metadata("design:type", Boolean)
119
- ], PulseModule.prototype, "enabled", void 0);
120
- __decorate([
121
- Constant("pulse.drainJobsBeforeClose", false),
122
- __metadata("design:type", Boolean)
123
- ], PulseModule.prototype, "drainJobsBeforeClose", void 0);
124
- __decorate([
125
- Constant("pulse.disableJobProcessing", false),
126
- __metadata("design:type", Boolean)
127
- ], PulseModule.prototype, "disableJobProcessing", void 0);
128
- PulseModule = __decorate([
129
- Module()
130
- ], PulseModule);
131
- export { PulseModule };
@@ -1,12 +0,0 @@
1
- import { Pulse } from "@pulsecron/pulse";
2
- import { Configuration, registerProvider } from "@tsed/di";
3
- // create Alias to avoid confusing import between Pulse from "@pulsecron/pulse" and Pulse decorator
4
- export const PulseService = Pulse;
5
- registerProvider({
6
- token: Pulse,
7
- deps: [Configuration],
8
- useFactory(settings) {
9
- const opts = settings.get("pulse", { enabled: false });
10
- return opts.enabled ? new Pulse(opts) : {};
11
- }
12
- });
@@ -1,24 +0,0 @@
1
- import { DefineOptions, Job, JobAttributesData, Processor } from "@pulsecron/pulse";
2
- import { InjectorService, OnDestroy, Provider } from "@tsed/di";
3
- import { Logger } from "@tsed/logger";
4
- import { AfterListen } from "@tsed/platform-http";
5
- import { PulseService } from "./services/PulseFactory.js";
6
- export declare class PulseModule implements OnDestroy, AfterListen {
7
- protected logger: Logger;
8
- protected injector: InjectorService;
9
- protected pulse: PulseService;
10
- private enabled;
11
- private drainJobsBeforeClose;
12
- private disableJobProcessing;
13
- $afterListen(): Promise<any>;
14
- $onDestroy(): Promise<any>;
15
- define<T extends JobAttributesData>(name: string, processor: Processor<T>, options?: DefineOptions): void;
16
- every(interval: string, name: string, data?: any, options?: any): Promise<Job<JobAttributesData> | Job<JobAttributesData>[]>;
17
- schedule(when: Date | string, name: string, data?: any): Promise<Job<{}>[]> | Promise<Job<any>>;
18
- now(name: string, data?: any): Promise<Job<JobAttributesData>>;
19
- create(name: string, data?: any): Job<any>;
20
- protected getProviders(): Provider<any>[];
21
- protected addPulseDefinitionsForProvider(provider: Provider): void;
22
- protected scheduleJobsForProvider(provider: Provider<any>): Promise<void>;
23
- protected getNameForJob(propertyKey: string, namespace?: string, customName?: string): string;
24
- }
@@ -1,3 +0,0 @@
1
- import { Pulse } from "@pulsecron/pulse";
2
- export declare const PulseService: typeof Pulse;
3
- export type PulseService = Pulse;