@nest-boot/schedule 7.0.3 → 7.2.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.
@@ -0,0 +1,233 @@
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 __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ require("reflect-metadata");
46
+ jest.mock("@nest-boot/bullmq", () => ({
47
+ InjectQueue: jest.fn(() => jest.fn()),
48
+ }));
49
+ const common_1 = require("@nestjs/common");
50
+ const core_1 = require("@nestjs/core");
51
+ const testing_1 = require("@nestjs/testing");
52
+ const bullmq_1 = require("bullmq");
53
+ const schedule_decorator_1 = require("./schedule.decorator");
54
+ const schedule_module_definition_1 = require("./schedule.module-definition");
55
+ const schedule_registry_1 = require("./schedule.registry");
56
+ describe("ScheduleRegistry", () => {
57
+ class ControllerSchedules {
58
+ constructor() {
59
+ this.calls = [];
60
+ }
61
+ async syncUsers() {
62
+ await Promise.resolve();
63
+ this.calls.push("syncUsers");
64
+ }
65
+ undecorated() {
66
+ return undefined;
67
+ }
68
+ }
69
+ __decorate([
70
+ (0, schedule_decorator_1.Cron)("*/5 * * * *", {
71
+ attempts: 2,
72
+ timezone: "Asia/Shanghai",
73
+ }),
74
+ __metadata("design:type", Function),
75
+ __metadata("design:paramtypes", []),
76
+ __metadata("design:returntype", Promise)
77
+ ], ControllerSchedules.prototype, "syncUsers", null);
78
+ class ProviderSchedules {
79
+ constructor() {
80
+ this.calls = [];
81
+ }
82
+ async refreshCache() {
83
+ await Promise.resolve();
84
+ this.calls.push("refreshCache");
85
+ }
86
+ }
87
+ __decorate([
88
+ (0, schedule_decorator_1.Interval)("1000", {
89
+ removeOnComplete: true,
90
+ }),
91
+ __metadata("design:type", Function),
92
+ __metadata("design:paramtypes", []),
93
+ __metadata("design:returntype", Promise)
94
+ ], ProviderSchedules.prototype, "refreshCache", null);
95
+ const createRegistry = async (controller = new ControllerSchedules(), provider = new ProviderSchedules(), schedulers = []) => {
96
+ const queue = {
97
+ getJobSchedulers: jest.fn().mockResolvedValue(schedulers),
98
+ removeJobScheduler: jest.fn().mockResolvedValue(undefined),
99
+ upsertJobScheduler: jest.fn().mockResolvedValue(undefined),
100
+ };
101
+ const reflector = {
102
+ get: jest.fn((key, handler) => Reflect.getMetadata(key, handler)),
103
+ };
104
+ const discoveryService = {
105
+ getControllers: jest.fn(() => [
106
+ {
107
+ instance: controller,
108
+ },
109
+ {
110
+ instance: null,
111
+ },
112
+ ]),
113
+ getProviders: jest.fn(() => [
114
+ {
115
+ instance: provider,
116
+ },
117
+ {
118
+ instance: undefined,
119
+ },
120
+ ]),
121
+ };
122
+ const metadataScanner = {
123
+ getAllMethodNames: jest.fn((prototype) => Object.getOwnPropertyNames(prototype).filter((key) => key !== "constructor")),
124
+ };
125
+ const moduleRef = await testing_1.Test.createTestingModule({
126
+ providers: [
127
+ schedule_registry_1.ScheduleRegistry,
128
+ {
129
+ provide: bullmq_1.Queue,
130
+ useValue: queue,
131
+ },
132
+ {
133
+ provide: core_1.Reflector,
134
+ useValue: reflector,
135
+ },
136
+ {
137
+ provide: core_1.DiscoveryService,
138
+ useValue: discoveryService,
139
+ },
140
+ {
141
+ provide: core_1.MetadataScanner,
142
+ useValue: metadataScanner,
143
+ },
144
+ ],
145
+ }).compile();
146
+ const registry = moduleRef.get(schedule_registry_1.ScheduleRegistry);
147
+ jest.spyOn(registry.logger, "log").mockImplementation(jest.fn());
148
+ return {
149
+ controller,
150
+ discoveryService,
151
+ metadataScanner,
152
+ provider,
153
+ queue,
154
+ reflector,
155
+ registry,
156
+ };
157
+ };
158
+ beforeEach(() => {
159
+ jest.spyOn(common_1.Logger.prototype, "log").mockImplementation(jest.fn());
160
+ });
161
+ afterEach(() => {
162
+ jest.restoreAllMocks();
163
+ });
164
+ it("should discover decorated methods, clean stale schedulers, and register schedules", async () => {
165
+ const { controller, queue, registry } = await createRegistry(undefined, undefined, [
166
+ {
167
+ name: "Old.cron",
168
+ pattern: "0 0 * * *",
169
+ },
170
+ {
171
+ name: "Old.interval",
172
+ every: 5000,
173
+ },
174
+ {
175
+ name: "ControllerSchedules.syncUsers",
176
+ pattern: "*/5 * * * *",
177
+ },
178
+ ]);
179
+ await registry.onApplicationBootstrap();
180
+ await registry.get("ControllerSchedules.syncUsers")?.handler();
181
+ expect(controller.calls).toEqual(["syncUsers"]);
182
+ expect(queue.removeJobScheduler).toHaveBeenCalledTimes(2);
183
+ expect(queue.removeJobScheduler).toHaveBeenCalledWith("Old.cron");
184
+ expect(queue.removeJobScheduler).toHaveBeenCalledWith("Old.interval");
185
+ expect(queue.upsertJobScheduler).toHaveBeenCalledWith("ControllerSchedules.syncUsers", {
186
+ pattern: "*/5 * * * *",
187
+ tz: "Asia/Shanghai",
188
+ }, {
189
+ name: "ControllerSchedules.syncUsers",
190
+ opts: {
191
+ attempts: 2,
192
+ },
193
+ });
194
+ expect(queue.upsertJobScheduler).toHaveBeenCalledWith("ProviderSchedules.refreshCache", {
195
+ every: 1000,
196
+ tz: "UTC",
197
+ }, {
198
+ name: "ProviderSchedules.refreshCache",
199
+ opts: {
200
+ removeOnComplete: true,
201
+ },
202
+ });
203
+ });
204
+ it("should ignore non-object wrappers and methods without schedule metadata", async () => {
205
+ const { discoveryService, metadataScanner, queue, reflector, registry } = await createRegistry();
206
+ await registry.onApplicationBootstrap();
207
+ expect(discoveryService.getControllers).toHaveBeenCalledTimes(1);
208
+ expect(discoveryService.getProviders).toHaveBeenCalledTimes(1);
209
+ expect(metadataScanner.getAllMethodNames).toHaveBeenCalledTimes(2);
210
+ expect(reflector.get).toHaveBeenCalledWith(schedule_module_definition_1.SCHEDULE_METADATA_KEY, Object.getOwnPropertyDescriptor(ControllerSchedules.prototype, "undecorated")?.value);
211
+ expect(queue.removeJobScheduler).not.toHaveBeenCalled();
212
+ expect(queue.upsertJobScheduler).toHaveBeenCalledTimes(2);
213
+ expect(registry.get("ControllerSchedules.undecorated")).toBeUndefined();
214
+ });
215
+ it("should load decorator metadata fallback branches", async () => {
216
+ await jest.isolateModulesAsync(async () => {
217
+ jest.doMock("@nest-boot/bullmq", () => ({
218
+ InjectQueue: jest.fn(() => jest.fn()),
219
+ }));
220
+ jest.doMock("bullmq", () => ({
221
+ Queue: undefined,
222
+ }));
223
+ jest.doMock("@nestjs/core", () => ({
224
+ DiscoveryService: undefined,
225
+ MetadataScanner: undefined,
226
+ Reflector: undefined,
227
+ }));
228
+ const module = await Promise.resolve().then(() => __importStar(require("./schedule.registry")));
229
+ expect(module.ScheduleRegistry).toBeDefined();
230
+ });
231
+ });
232
+ });
233
+ //# sourceMappingURL=schedule.registry.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.registry.spec.js","sourceRoot":"","sources":["../src/schedule.registry.spec.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4BAA0B;AAE1B,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;CACtC,CAAC,CAAC,CAAC;AAEJ,2CAAwC;AACxC,uCAA4E;AAC5E,6CAAuC;AACvC,mCAA+B;AAE/B,6DAAsD;AACtD,6EAAqE;AACrE,2DAAuD;AAEvD,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,MAAM,mBAAmB;QAAzB;YACE,UAAK,GAAa,EAAE,CAAC;QAcvB,CAAC;QARO,AAAN,KAAK,CAAC,SAAS;YACb,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/B,CAAC;QAED,WAAW;YACT,OAAO,SAAS,CAAC;QACnB,CAAC;KACF;IARO;QAJL,IAAA,yBAAI,EAAC,aAAa,EAAE;YACnB,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,eAAe;SAC1B,CAAC;;;;wDAID;IAOH,MAAM,iBAAiB;QAAvB;YACE,UAAK,GAAa,EAAE,CAAC;QASvB,CAAC;QAJO,AAAN,KAAK,CAAC,YAAY;YAChB,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC;KACF;IAJO;QAHL,IAAA,6BAAQ,EAAC,MAAM,EAAE;YAChB,gBAAgB,EAAE,IAAI;SACvB,CAAC;;;;yDAID;IAGH,MAAM,cAAc,GAAG,KAAK,EAC1B,UAAU,GAAG,IAAI,mBAAmB,EAAE,EACtC,QAAQ,GAAG,IAAI,iBAAiB,EAAE,EAClC,aAIM,EAAE,EACR,EAAE;QACF,MAAM,KAAK,GAAG;YACZ,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,UAAU,CAAC;YACzD,kBAAkB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;YAC1D,kBAAkB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;SAC3D,CAAC;QACF,MAAM,SAAS,GAAG;YAChB,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,GAAW,EAAE,OAAsC,EAAE,EAAE,CACnE,OAAO,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAClC;SACF,CAAC;QACF,MAAM,gBAAgB,GAAG;YACvB,cAAc,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;gBAC5B;oBACE,QAAQ,EAAE,UAAU;iBACrB;gBACD;oBACE,QAAQ,EAAE,IAAI;iBACf;aACF,CAAC;YACF,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;gBAC1B;oBACE,QAAQ,EAAE,QAAQ;iBACnB;gBACD;oBACE,QAAQ,EAAE,SAAS;iBACpB;aACF,CAAC;SACH,CAAC;QACF,MAAM,eAAe,GAAG;YACtB,iBAAiB,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,SAAiB,EAAE,EAAE,CAC/C,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,MAAM,CAC1C,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,aAAa,CAC/B,CACF;SACF,CAAC;QACF,MAAM,SAAS,GAAG,MAAM,cAAI,CAAC,mBAAmB,CAAC;YAC/C,SAAS,EAAE;gBACT,oCAAgB;gBAChB;oBACE,OAAO,EAAE,cAAK;oBACd,QAAQ,EAAE,KAAK;iBAChB;gBACD;oBACE,OAAO,EAAE,gBAAS;oBAClB,QAAQ,EAAE,SAAS;iBACpB;gBACD;oBACE,OAAO,EAAE,uBAAgB;oBACzB,QAAQ,EAAE,gBAAgB;iBAC3B;gBACD;oBACE,OAAO,EAAE,sBAAe;oBACxB,QAAQ,EAAE,eAAe;iBAC1B;aACF;SACF,CAAC,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,oCAAgB,CAAC,CAAC;QAEjD,IAAI,CAAC,KAAK,CAAE,QAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAE1E,OAAO;YACL,UAAU;YACV,gBAAgB;YAChB,eAAe;YACf,QAAQ;YACR,KAAK;YACL,SAAS;YACT,QAAQ;SACT,CAAC;IACJ,CAAC,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,KAAK,CAAC,eAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QACjG,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,cAAc,CAC1D,SAAS,EACT,SAAS,EACT;YACE;gBACE,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,WAAW;aACrB;YACD;gBACE,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,IAAI;aACZ;YACD;gBACE,IAAI,EAAE,+BAA+B;gBACrC,OAAO,EAAE,aAAa;aACvB;SACF,CACF,CAAC;QAEF,MAAM,QAAQ,CAAC,sBAAsB,EAAE,CAAC;QACxC,MAAM,QAAQ,CAAC,GAAG,CAAC,+BAA+B,CAAC,EAAE,OAAO,EAAE,CAAC;QAE/D,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,oBAAoB,CACnD,+BAA+B,EAC/B;YACE,OAAO,EAAE,aAAa;YACtB,EAAE,EAAE,eAAe;SACpB,EACD;YACE,IAAI,EAAE,+BAA+B;YACrC,IAAI,EAAE;gBACJ,QAAQ,EAAE,CAAC;aACZ;SACF,CACF,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,oBAAoB,CACnD,gCAAgC,EAChC;YACE,KAAK,EAAE,IAAI;YACX,EAAE,EAAE,KAAK;SACV,EACD;YACE,IAAI,EAAE,gCAAgC;YACtC,IAAI,EAAE;gBACJ,gBAAgB,EAAE,IAAI;aACvB;SACF,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,GACrE,MAAM,cAAc,EAAE,CAAC;QAEzB,MAAM,QAAQ,CAAC,sBAAsB,EAAE,CAAC;QAExC,MAAM,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACnE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,oBAAoB,CACxC,kDAAqB,EACrB,MAAM,CAAC,wBAAwB,CAC7B,mBAAmB,CAAC,SAAS,EAC7B,aAAa,CACd,EAAE,KAAK,CACT,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACxD,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,IAAI,EAAE;YACxC,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;gBACtC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;aACtC,CAAC,CAAC,CAAC;YACJ,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;gBAC3B,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC,CAAC;YACJ,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;gBACjC,gBAAgB,EAAE,SAAS;gBAC3B,eAAe,EAAE,SAAS;gBAC1B,SAAS,EAAE,SAAS;aACrB,CAAC,CAAC,CAAC;YAEJ,MAAM,MAAM,GAAG,wDAAa,qBAAqB,GAAC,CAAC;YAEnD,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}