@webtypen/webframez-core 0.3.52 → 0.3.53

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.
@@ -10,6 +10,7 @@ export declare class QueueWorkerCommand extends ConsoleCommand {
10
10
  autorestart: boolean;
11
11
  workerOperationId: string | null;
12
12
  workerHadError: boolean;
13
+ lastAutomationCheckAt: any;
13
14
  jobsExecuted: number;
14
15
  jobsSucceeded: number;
15
16
  jobsFailed: number;
@@ -30,7 +31,11 @@ export declare class QueueWorkerCommand extends ConsoleCommand {
30
31
  }): void;
31
32
  getWorkerAutomation(): any[];
32
33
  getWorkerJobclasses(): any[] | null;
33
- checkWorkerAutomation(): any;
34
+ private getWorkerTimezone;
35
+ private getAutomationExecutionPayload;
36
+ private createAutomationEntry;
37
+ private pushIfDue;
38
+ checkWorkerAutomation(since?: any, until?: any): any;
34
39
  runAutomation(): Promise<void>;
35
40
  getNextJobNumber(connection: any): Promise<number>;
36
41
  checkStop(): boolean;
@@ -38,6 +38,7 @@ class QueueWorkerCommand extends ConsoleCommand_1.ConsoleCommand {
38
38
  this.autorestart = false;
39
39
  this.workerOperationId = null;
40
40
  this.workerHadError = false;
41
+ this.lastAutomationCheckAt = null;
41
42
  // Statistics
42
43
  this.jobsExecuted = 0;
43
44
  this.jobsSucceeded = 0;
@@ -306,14 +307,38 @@ class QueueWorkerCommand extends ConsoleCommand_1.ConsoleCommand {
306
307
  }
307
308
  return jobclasses;
308
309
  }
309
- checkWorkerAutomation() {
310
+ getWorkerTimezone() {
311
+ return this.workerConfig.timezone ? this.workerConfig.timezone : "Europe/Berlin";
312
+ }
313
+ getAutomationExecutionPayload(automation, options) {
314
+ return automation.payload || (options && options.payload)
315
+ ? Object.assign(Object.assign({}, (automation.payload ? automation.payload : {})), (options && options.payload ? options.payload : {})) : null;
316
+ }
317
+ createAutomationEntry(automation, type, value, options, executionIdentifier, executionKey, dueAt) {
318
+ return Object.assign(Object.assign({}, automation), { _execution: {
319
+ key: `${automation.jobclass}_${executionKey}${executionIdentifier ? "_" + executionIdentifier : ""}_${dueAt.format("YYYY-MM-DD_HH:mm")}`,
320
+ type: type,
321
+ value: value,
322
+ identifier: executionIdentifier,
323
+ scheduled_at: dueAt.toDate(),
324
+ payload: this.getAutomationExecutionPayload(automation, options),
325
+ } });
326
+ }
327
+ pushIfDue(out, entryFactory, dueAt, since, until) {
328
+ if (dueAt.isAfter(since) && !dueAt.isAfter(until)) {
329
+ out.push(entryFactory(dueAt));
330
+ }
331
+ }
332
+ checkWorkerAutomation(since, until) {
310
333
  const workerAutomation = this.getWorkerAutomation();
311
334
  if (!workerAutomation || workerAutomation.length < 1) {
312
335
  return null;
313
336
  }
314
337
  const out = [];
315
338
  const days = DateFunctions_1.DateFunctions.getDays();
316
- const now = (0, moment_timezone_1.default)().tz(this.workerConfig.timezone ? this.workerConfig.timezone : "Europe/Berlin");
339
+ const timezone = this.getWorkerTimezone();
340
+ const now = until ? until.clone().tz(timezone) : (0, moment_timezone_1.default)().tz(timezone);
341
+ const checkedSince = since ? since.clone().tz(timezone) : now.clone().startOf("minute").subtract(1, "millisecond");
317
342
  let automationIndex = -1;
318
343
  for (let automation of workerAutomation) {
319
344
  automationIndex++;
@@ -357,61 +382,58 @@ class QueueWorkerCommand extends ConsoleCommand_1.ConsoleCommand {
357
382
  const useType = days.includes(type) ? "day_in_week" : type;
358
383
  const executionKey = type + "-" + (value !== undefined && value !== null ? value : "0");
359
384
  const executionIdentifier = options && options.identifier ? options.identifier : automation.identifier ? automation.identifier : null;
360
- const intervalKey = `${automation.jobclass}_${executionKey}${executionIdentifier ? "_" + executionIdentifier : ""}_${now.format("YYYY-MM-DD_HH:mm")}`;
385
+ const entryFactory = (dueAt, executionValue = value) => this.createAutomationEntry(automation, type, executionValue, options, executionIdentifier, executionKey, dueAt);
361
386
  switch (useType) {
362
- case "every_hour":
363
- if (parseInt(now.format("mm")) === parseInt(value && !isNaN(parseInt(value)) ? value : "0")) {
364
- out.push(Object.assign(Object.assign({}, automation), { _execution: {
365
- key: intervalKey,
366
- type: type,
367
- value: parseInt(value),
368
- identifier: executionIdentifier,
369
- payload: automation.payload || (options && options.payload)
370
- ? Object.assign(Object.assign({}, (automation.payload ? automation.payload : {})), (options.payload ? options.payload : {})) : null,
371
- } }));
387
+ case "every_hour": {
388
+ const minute = parseInt(value && !isNaN(parseInt(value)) ? value : "0");
389
+ let dueAt = checkedSince.clone().startOf("hour").minute(minute).second(0).millisecond(0);
390
+ if (!dueAt.isAfter(checkedSince)) {
391
+ dueAt.add(1, "hour");
392
+ }
393
+ while (!dueAt.isAfter(now)) {
394
+ this.pushIfDue(out, (entryDueAt) => entryFactory(entryDueAt, minute), dueAt, checkedSince, now);
395
+ dueAt = dueAt.clone().add(1, "hour");
372
396
  }
373
397
  break;
374
- case "every_x_mins":
398
+ }
399
+ case "every_x_mins": {
375
400
  const intervalMinutes = parseInt(value);
376
- const diffMins = now.diff((0, moment_timezone_1.default)()
377
- .tz(this.workerConfig.timezone ? this.workerConfig.timezone : "Europe/Berlin")
378
- .startOf("day"), "minutes");
379
- if (diffMins % intervalMinutes === 0) {
380
- out.push(Object.assign(Object.assign({}, automation), { _execution: {
381
- key: intervalKey,
382
- type: type,
383
- value: value,
384
- identifier: executionIdentifier,
385
- payload: automation.payload || (options && options.payload)
386
- ? Object.assign(Object.assign({}, (automation.payload ? automation.payload : {})), (options.payload ? options.payload : {})) : null,
387
- } }));
401
+ let dueAt = checkedSince.clone().startOf("minute").second(0).millisecond(0);
402
+ if (!dueAt.isAfter(checkedSince)) {
403
+ dueAt.add(1, "minute");
404
+ }
405
+ while (!dueAt.isAfter(now)) {
406
+ const diffMins = dueAt.diff(dueAt.clone().startOf("day"), "minutes");
407
+ if (diffMins % intervalMinutes === 0) {
408
+ this.pushIfDue(out, entryFactory, dueAt, checkedSince, now);
409
+ }
410
+ dueAt = dueAt.clone().add(1, "minute");
388
411
  }
389
412
  break;
390
- case "daily":
391
- if (now.format("HH:mm") === value) {
392
- out.push(Object.assign(Object.assign({}, automation), { _execution: {
393
- key: intervalKey,
394
- type: type,
395
- value: value,
396
- identifier: executionIdentifier,
397
- payload: automation.payload || (options && options.payload)
398
- ? Object.assign(Object.assign({}, (automation.payload ? automation.payload : {})), (options.payload ? options.payload : {})) : null,
399
- } }));
413
+ }
414
+ case "daily": {
415
+ let day = checkedSince.clone().startOf("day");
416
+ const endDay = now.clone().startOf("day");
417
+ while (!day.isAfter(endDay)) {
418
+ const dueAt = moment_timezone_1.default.tz(`${day.format("YYYY-MM-DD")} ${value}`, "YYYY-MM-DD HH:mm", timezone);
419
+ this.pushIfDue(out, entryFactory, dueAt, checkedSince, now);
420
+ day = day.clone().add(1, "day");
400
421
  }
401
422
  break;
402
- case "day_in_week":
403
- if ((now.format("dddd").toLowerCase() === type || now.format("dddd").toLowerCase() + "s" === type) &&
404
- now.format("HH:mm") === value) {
405
- out.push(Object.assign(Object.assign({}, automation), { _execution: {
406
- key: intervalKey,
407
- type: type,
408
- value: value,
409
- identifier: executionIdentifier,
410
- payload: automation.payload || (options && options.payload)
411
- ? Object.assign(Object.assign({}, (automation.payload ? automation.payload : {})), (options.payload ? options.payload : {})) : null,
412
- } }));
423
+ }
424
+ case "day_in_week": {
425
+ const isoWeekday = days.indexOf(type) + 1;
426
+ let day = checkedSince.clone().startOf("day");
427
+ const endDay = now.clone().startOf("day");
428
+ while (!day.isAfter(endDay)) {
429
+ if (day.isoWeekday() === isoWeekday) {
430
+ const dueAt = moment_timezone_1.default.tz(`${day.format("YYYY-MM-DD")} ${value}`, "YYYY-MM-DD HH:mm", timezone);
431
+ this.pushIfDue(out, entryFactory, dueAt, checkedSince, now);
432
+ }
433
+ day = day.clone().add(1, "day");
413
434
  }
414
435
  break;
436
+ }
415
437
  }
416
438
  }
417
439
  }
@@ -430,7 +452,12 @@ class QueueWorkerCommand extends ConsoleCommand_1.ConsoleCommand {
430
452
  automationChecking = false;
431
453
  break;
432
454
  }
433
- const checkAutomation = this.checkWorkerAutomation();
455
+ const now = (0, moment_timezone_1.default)().tz(this.getWorkerTimezone());
456
+ const checkedSince = this.lastAutomationCheckAt
457
+ ? this.lastAutomationCheckAt.clone()
458
+ : now.clone().startOf("minute").subtract(1, "millisecond");
459
+ this.lastAutomationCheckAt = now.clone();
460
+ const checkAutomation = this.checkWorkerAutomation(checkedSince, now);
434
461
  if (!checkAutomation || checkAutomation.length < 1) {
435
462
  yield this.wait(5000);
436
463
  continue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webtypen/webframez-core",
3
- "version": "0.3.52",
3
+ "version": "0.3.53",
4
4
  "description": "The core package of the typescript based webframez (web-framework) by webtypen.de",
5
5
  "homepage": "https://webtypen.de/",
6
6
  "license": "MIT",