From a27386bb92ea7fd3022838d0080431e2477dc29f Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Sat, 13 May 2023 00:55:48 +0800
Subject: [PATCH 1/2] Fix: Use croner for clear-old-data

---
 package-lock.json             | 260 +---------------------------------
 package.json                  |   1 -
 server/jobs.js                |  51 +++----
 server/jobs/clear-old-data.js |  23 +--
 server/server.js              |   2 +-
 5 files changed, 45 insertions(+), 292 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index e3c036835..39e34c89a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -17,7 +17,6 @@
                 "axios-ntlm": "1.3.0",
                 "badge-maker": "~3.3.1",
                 "bcryptjs": "~2.4.3",
-                "bree": "~7.1.5",
                 "cacheable-lookup": "~6.0.4",
                 "chardet": "~1.4.0",
                 "check-password-strength": "^2.0.5",
@@ -3051,6 +3050,7 @@
             "version": "7.21.5",
             "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz",
             "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==",
+            "dev": true,
             "dependencies": {
                 "regenerator-runtime": "^0.13.11"
             },
@@ -3122,14 +3122,6 @@
             "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
             "dev": true
         },
-        "node_modules/@breejs/later": {
-            "version": "4.1.0",
-            "resolved": "https://registry.npmjs.org/@breejs/later/-/later-4.1.0.tgz",
-            "integrity": "sha512-QgGnZ9b7o4k0Ai1ZbTJWwZpZcFK9d+Gb+DyNt4UT9x6IEIs5HVu0iIlmgzGqN+t9MoJSpSPo9S/Mm51UtHr3JA==",
-            "engines": {
-                "node": ">= 10"
-            }
-        },
         "node_modules/@colors/colors": {
             "version": "1.5.0",
             "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
@@ -4899,11 +4891,6 @@
                 "@types/koa": "*"
             }
         },
-        "node_modules/@types/lodash": {
-            "version": "4.14.194",
-            "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz",
-            "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g=="
-        },
         "node_modules/@types/long": {
             "version": "4.0.2",
             "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz",
@@ -6126,11 +6113,6 @@
             "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
             "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
         },
-        "node_modules/boolean": {
-            "version": "3.2.0",
-            "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
-            "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw=="
-        },
         "node_modules/bootstrap": {
             "version": "5.1.3",
             "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz",
@@ -6171,27 +6153,6 @@
                 "node": ">=8"
             }
         },
-        "node_modules/bree": {
-            "version": "7.1.5",
-            "resolved": "https://registry.npmjs.org/bree/-/bree-7.1.5.tgz",
-            "integrity": "sha512-YAs4VQDjc6p3NhNNHBkS9NXK4wryeMq7Y/SCMcgFh0cSD4oXk7B9v53/cqzoejdelD30KEliumzrd4awka+YhQ==",
-            "dependencies": {
-                "@breejs/later": "^4.1.0",
-                "boolean": "^3.1.4",
-                "combine-errors": "^3.0.3",
-                "cron-validate": "^1.4.3",
-                "debug": "^4.3.3",
-                "human-interval": "^2.0.1",
-                "is-string-and-not-blank": "^0.0.2",
-                "is-valid-path": "^0.1.1",
-                "ms": "^2.1.3",
-                "p-wait-for": "3",
-                "safe-timers": "^1.1.0"
-            },
-            "engines": {
-                "node": ">= 12.11.0"
-            }
-        },
         "node_modules/browser-process-hrtime": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
@@ -6818,15 +6779,6 @@
             "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
             "dev": true
         },
-        "node_modules/combine-errors": {
-            "version": "3.0.3",
-            "resolved": "https://registry.npmjs.org/combine-errors/-/combine-errors-3.0.3.tgz",
-            "integrity": "sha512-C8ikRNRMygCwaTx+Ek3Yr+OuZzgZjduCOfSQBjbM8V3MfgcjSTeto/GXP6PAwKvJz/v15b7GHZvx5rOlczFw/Q==",
-            "dependencies": {
-                "custom-error-instance": "2.1.1",
-                "lodash.uniqby": "4.5.0"
-            }
-        },
         "node_modules/combined-stream": {
             "version": "1.0.8",
             "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -7212,14 +7164,6 @@
                 "node": ">=10.0.0"
             }
         },
-        "node_modules/cron-validate": {
-            "version": "1.4.5",
-            "resolved": "https://registry.npmjs.org/cron-validate/-/cron-validate-1.4.5.tgz",
-            "integrity": "sha512-nKlOJEnYKudMn/aNyNH8xxWczlfpaazfWV32Pcx/2St51r2bxWbGhZD7uwzMcRhunA/ZNL+Htm/i0792Z59UMQ==",
-            "dependencies": {
-                "yup": "0.32.9"
-            }
-        },
         "node_modules/croner": {
             "version": "6.0.3",
             "resolved": "https://registry.npmjs.org/croner/-/croner-6.0.3.tgz",
@@ -7371,11 +7315,6 @@
             "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==",
             "dev": true
         },
-        "node_modules/custom-error-instance": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/custom-error-instance/-/custom-error-instance-2.1.1.tgz",
-            "integrity": "sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg=="
-        },
         "node_modules/cypress": {
             "version": "10.11.0",
             "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.11.0.tgz",
@@ -10434,14 +10373,6 @@
                 "node": ">= 6"
             }
         },
-        "node_modules/human-interval": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/human-interval/-/human-interval-2.0.1.tgz",
-            "integrity": "sha512-r4Aotzf+OtKIGQCB3odUowy4GfUDTy3aTWTfLd7ZF2gBCy3XW3v/dJLRefZnOFFnjqs5B1TypvS8WarpBkYUNQ==",
-            "dependencies": {
-                "numbered": "^1.1.0"
-            }
-        },
         "node_modules/human-signals": {
             "version": "1.1.1",
             "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
@@ -10807,36 +10738,6 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
-        "node_modules/is-invalid-path": {
-            "version": "0.1.0",
-            "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz",
-            "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==",
-            "dependencies": {
-                "is-glob": "^2.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/is-invalid-path/node_modules/is-extglob": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
-            "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==",
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
-        "node_modules/is-invalid-path/node_modules/is-glob": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
-            "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==",
-            "dependencies": {
-                "is-extglob": "^1.0.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/is-lambda": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
@@ -10976,22 +10877,6 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
-        "node_modules/is-string-and-not-blank": {
-            "version": "0.0.2",
-            "resolved": "https://registry.npmjs.org/is-string-and-not-blank/-/is-string-and-not-blank-0.0.2.tgz",
-            "integrity": "sha512-FyPGAbNVyZpTeDCTXnzuwbu9/WpNXbCfbHXLpCRpN4GANhS00eEIP5Ef+k5HYSNIzIhdN9zRDoBj6unscECvtQ==",
-            "dependencies": {
-                "is-string-blank": "^1.0.1"
-            },
-            "engines": {
-                "node": ">=6.4.0"
-            }
-        },
-        "node_modules/is-string-blank": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/is-string-blank/-/is-string-blank-1.0.1.tgz",
-            "integrity": "sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw=="
-        },
         "node_modules/is-symbol": {
             "version": "1.0.4",
             "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
@@ -11042,17 +10927,6 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
-        "node_modules/is-valid-path": {
-            "version": "0.1.1",
-            "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz",
-            "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==",
-            "dependencies": {
-                "is-invalid-path": "^0.1.0"
-            },
-            "engines": {
-                "node": ">=0.10.0"
-            }
-        },
         "node_modules/is-weakref": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
@@ -13530,51 +13404,6 @@
             "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
             "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
         },
-        "node_modules/lodash-es": {
-            "version": "4.17.21",
-            "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
-            "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
-        },
-        "node_modules/lodash._baseiteratee": {
-            "version": "4.7.0",
-            "resolved": "https://registry.npmjs.org/lodash._baseiteratee/-/lodash._baseiteratee-4.7.0.tgz",
-            "integrity": "sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ==",
-            "dependencies": {
-                "lodash._stringtopath": "~4.8.0"
-            }
-        },
-        "node_modules/lodash._basetostring": {
-            "version": "4.12.0",
-            "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz",
-            "integrity": "sha512-SwcRIbyxnN6CFEEK4K1y+zuApvWdpQdBHM/swxP962s8HIxPO3alBH5t3m/dl+f4CMUug6sJb7Pww8d13/9WSw=="
-        },
-        "node_modules/lodash._baseuniq": {
-            "version": "4.6.0",
-            "resolved": "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz",
-            "integrity": "sha512-Ja1YevpHZctlI5beLA7oc5KNDhGcPixFhcqSiORHNsp/1QTv7amAXzw+gu4YOvErqVlMVyIJGgtzeepCnnur0A==",
-            "dependencies": {
-                "lodash._createset": "~4.0.0",
-                "lodash._root": "~3.0.0"
-            }
-        },
-        "node_modules/lodash._createset": {
-            "version": "4.0.3",
-            "resolved": "https://registry.npmjs.org/lodash._createset/-/lodash._createset-4.0.3.tgz",
-            "integrity": "sha512-GTkC6YMprrJZCYU3zcqZj+jkXkrXzq3IPBcF/fIPpNEAB4hZEtXU8zp/RwKOvZl43NUmwDbyRk3+ZTbeRdEBXA=="
-        },
-        "node_modules/lodash._root": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
-            "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ=="
-        },
-        "node_modules/lodash._stringtopath": {
-            "version": "4.8.0",
-            "resolved": "https://registry.npmjs.org/lodash._stringtopath/-/lodash._stringtopath-4.8.0.tgz",
-            "integrity": "sha512-SXL66C731p0xPDC5LZg4wI5H+dJo/EO4KTqOMwLYCH3+FmmfAKJEZCm6ohGpI+T1xwsDsJCfL4OnhorllvlTPQ==",
-            "dependencies": {
-                "lodash._basetostring": "~4.12.0"
-            }
-        },
         "node_modules/lodash.camelcase": {
             "version": "4.3.0",
             "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
@@ -13609,15 +13438,6 @@
             "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
             "dev": true
         },
-        "node_modules/lodash.uniqby": {
-            "version": "4.5.0",
-            "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.5.0.tgz",
-            "integrity": "sha512-IRt7cfTtHy6f1aRVA5n7kT8rgN3N1nH6MOWLcHfpWG2SH19E3JksLK38MktLxZDhlAjCP9jpIXkOnRXlu6oByQ==",
-            "dependencies": {
-                "lodash._baseiteratee": "~4.7.0",
-                "lodash._baseuniq": "~4.6.0"
-            }
-        },
         "node_modules/log-symbols": {
             "version": "4.1.0",
             "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -14479,11 +14299,6 @@
             "dev": true,
             "optional": true
         },
-        "node_modules/nanoclone": {
-            "version": "0.2.1",
-            "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
-            "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA=="
-        },
         "node_modules/nanoid": {
             "version": "3.3.6",
             "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
@@ -14871,11 +14686,6 @@
                 "js-sdsl": "4.3.0"
             }
         },
-        "node_modules/numbered": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/numbered/-/numbered-1.1.0.tgz",
-            "integrity": "sha512-pv/ue2Odr7IfYOO0byC1KgBI10wo5YDauLhxY6/saNzAdAs0r1SotGCPzzCLNPL0xtrAwWRialLu23AAu9xO1g=="
-        },
         "node_modules/nwsapi": {
             "version": "2.2.4",
             "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.4.tgz",
@@ -15012,14 +14822,6 @@
                 "node": ">=12.20"
             }
         },
-        "node_modules/p-finally": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
-            "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==",
-            "engines": {
-                "node": ">=4"
-            }
-        },
         "node_modules/p-limit": {
             "version": "2.3.0",
             "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
@@ -15062,17 +14864,6 @@
                 "url": "https://github.com/sponsors/sindresorhus"
             }
         },
-        "node_modules/p-timeout": {
-            "version": "3.2.0",
-            "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
-            "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
-            "dependencies": {
-                "p-finally": "^1.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            }
-        },
         "node_modules/p-try": {
             "version": "2.2.0",
             "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
@@ -15082,20 +14873,6 @@
                 "node": ">=6"
             }
         },
-        "node_modules/p-wait-for": {
-            "version": "3.2.0",
-            "resolved": "https://registry.npmjs.org/p-wait-for/-/p-wait-for-3.2.0.tgz",
-            "integrity": "sha512-wpgERjNkLrBiFmkMEjuZJEWKKDrNfHCKA1OhyN1wg1FrLkULbviEy6py1AyJUgZ72YWFbZ38FIpnqvVqAlDUwA==",
-            "dependencies": {
-                "p-timeout": "^3.0.0"
-            },
-            "engines": {
-                "node": ">=8"
-            },
-            "funding": {
-                "url": "https://github.com/sponsors/sindresorhus"
-            }
-        },
         "node_modules/packet-reader": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
@@ -15673,11 +15450,6 @@
                 "node": ">= 6"
             }
         },
-        "node_modules/property-expr": {
-            "version": "2.0.5",
-            "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz",
-            "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA=="
-        },
         "node_modules/protobufjs": {
             "version": "7.1.2",
             "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.1.2.tgz",
@@ -16157,7 +15929,8 @@
         "node_modules/regenerator-runtime": {
             "version": "0.13.11",
             "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
-            "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+            "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==",
+            "dev": true
         },
         "node_modules/regenerator-transform": {
             "version": "0.15.1",
@@ -16584,11 +16357,6 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
-        "node_modules/safe-timers": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/safe-timers/-/safe-timers-1.1.0.tgz",
-            "integrity": "sha512-9aqY+v5eMvmRaluUEtdRThV1EjlSElzO7HuCj0sTW9xvp++8iJ9t/RWGNWV6/WHcUJLHpyT2SNf/apoKTU2EpA=="
-        },
         "node_modules/safer-buffer": {
             "version": "2.1.2",
             "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -17898,11 +17666,6 @@
                 "hoek": "6.x.x"
             }
         },
-        "node_modules/toposort": {
-            "version": "2.0.2",
-            "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
-            "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="
-        },
         "node_modules/tough-cookie": {
             "version": "2.5.0",
             "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
@@ -19129,23 +18892,6 @@
             "funding": {
                 "url": "https://github.com/sponsors/sindresorhus"
             }
-        },
-        "node_modules/yup": {
-            "version": "0.32.9",
-            "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.9.tgz",
-            "integrity": "sha512-Ci1qN+i2H0XpY7syDQ0k5zKQ/DoxO0LzPg8PAR/X4Mpj6DqaeCoIYEEjDJwhArh3Fa7GWbQQVDZKeXYlSH4JMg==",
-            "dependencies": {
-                "@babel/runtime": "^7.10.5",
-                "@types/lodash": "^4.14.165",
-                "lodash": "^4.17.20",
-                "lodash-es": "^4.17.15",
-                "nanoclone": "^0.2.1",
-                "property-expr": "^2.0.4",
-                "toposort": "^2.0.2"
-            },
-            "engines": {
-                "node": ">=10"
-            }
         }
     }
 }
diff --git a/package.json b/package.json
index 342fd425b..ed7778680 100644
--- a/package.json
+++ b/package.json
@@ -76,7 +76,6 @@
         "axios-ntlm": "1.3.0",
         "badge-maker": "~3.3.1",
         "bcryptjs": "~2.4.3",
-        "bree": "~7.1.5",
         "cacheable-lookup": "~6.0.4",
         "chardet": "~1.4.0",
         "check-password-strength": "^2.0.5",
diff --git a/server/jobs.js b/server/jobs.js
index 66a276064..8e1454261 100644
--- a/server/jobs.js
+++ b/server/jobs.js
@@ -1,41 +1,44 @@
-const path = require("path");
-const Bree = require("bree");
-const { SHARE_ENV } = require("worker_threads");
-const { log } = require("../src/util");
-let bree;
+const { UptimeKumaServer } = require("./uptime-kuma-server");
+const { clearOldData } = require("./jobs/clear-old-data");
+const Cron = require("croner");
+
 const jobs = [
     {
         name: "clear-old-data",
-        interval: "at 03:14",
+        interval: "14 03 * * *",
+        jobFunc: clearOldData,
+        croner: null,
     },
 ];
 
 /**
  * Initialize background jobs
- * @param {Object} args Arguments to pass to workers
- * @returns {Bree}
+ * @returns {Promise<void>}
  */
-const initBackgroundJobs = function (args) {
-    bree = new Bree({
-        root: path.resolve("server", "jobs"),
-        jobs,
-        worker: {
-            env: SHARE_ENV,
-            workerData: args,
-        },
-        workerMessageHandler: (message) => {
-            log.info("jobs", message);
-        }
-    });
+const initBackgroundJobs = async function () {
+    const timezone = await UptimeKumaServer.getInstance().getTimezone();
+
+    for (const job of jobs) {
+        const cornerJob = new Cron(
+            job.interval,
+            {
+                name: job.name,
+                timezone,
+            },
+            job.jobFunc,
+        );
+        job.croner = cornerJob;
+    }
 
-    bree.start();
-    return bree;
 };
 
 /** Stop all background jobs if running */
 const stopBackgroundJobs = function () {
-    if (bree) {
-        bree.stop();
+    for (const job of jobs) {
+        if (job.croner) {
+            job.croner.stop();
+            job.croner = null;
+        }
     }
 };
 
diff --git a/server/jobs/clear-old-data.js b/server/jobs/clear-old-data.js
index ed80b0f74..cf7488cad 100644
--- a/server/jobs/clear-old-data.js
+++ b/server/jobs/clear-old-data.js
@@ -1,12 +1,15 @@
-const { log, exit, connectDb } = require("./util-worker");
 const { R } = require("redbean-node");
+const { log } = require("../../src/util");
 const { setSetting, setting } = require("../util-server");
 
 const DEFAULT_KEEP_PERIOD = 180;
 
-(async () => {
-    await connectDb();
+/**
+ * Clears old data from the heartbeat table of the database.
+ * @return {Promise<void>} A promise that resolves when the data has been cleared.
+ */
 
+const clearOldData = async () => {
     let period = await setting("keepDataPeriodDays");
 
     // Set Default Period
@@ -20,16 +23,16 @@ const DEFAULT_KEEP_PERIOD = 180;
     try {
         parsedPeriod = parseInt(period);
     } catch (_) {
-        log("Failed to parse setting, resetting to default..");
+        log.warn("clearOldData", "Failed to parse setting, resetting to default..");
         await setSetting("keepDataPeriodDays", DEFAULT_KEEP_PERIOD, "general");
         parsedPeriod = DEFAULT_KEEP_PERIOD;
     }
 
     if (parsedPeriod < 1) {
-        log(`Data deletion has been disabled as period is less than 1. Period is ${parsedPeriod} days.`);
+        log.info("clearOldData", `Data deletion has been disabled as period is less than 1. Period is ${parsedPeriod} days.`);
     } else {
 
-        log(`Clearing Data older than ${parsedPeriod} days...`);
+        log.debug("clearOldData", `Clearing Data older than ${parsedPeriod} days...`);
 
         try {
             await R.exec(
@@ -37,9 +40,11 @@ const DEFAULT_KEEP_PERIOD = 180;
                 [ parsedPeriod ]
             );
         } catch (e) {
-            log(`Failed to clear old data: ${e.message}`);
+            log.error("clearOldData", `Failed to clear old data: ${e.message}`);
         }
     }
+};
 
-    exit();
-})();
+module.exports = {
+    clearOldData,
+};
diff --git a/server/server.js b/server/server.js
index ac2851ab4..12a711e80 100644
--- a/server/server.js
+++ b/server/server.js
@@ -1557,7 +1557,7 @@ let needSetup = false;
         }
     });
 
-    initBackgroundJobs(args);
+    await initBackgroundJobs();
 
     // Start cloudflared at the end if configured
     await cloudflaredAutoStart(cloudflaredToken);

From 80c8fd737226fcee13bfd165f8fae067d0b20811 Mon Sep 17 00:00:00 2001
From: Nelson Chan <chakflying@hotmail.com>
Date: Sat, 13 May 2023 01:51:23 +0800
Subject: [PATCH 2/2] Chore: Remove util-worker

---
 server/jobs/util-worker.js | 50 --------------------------------------
 1 file changed, 50 deletions(-)
 delete mode 100644 server/jobs/util-worker.js

diff --git a/server/jobs/util-worker.js b/server/jobs/util-worker.js
deleted file mode 100644
index 1aeec794d..000000000
--- a/server/jobs/util-worker.js
+++ /dev/null
@@ -1,50 +0,0 @@
-const { parentPort, workerData } = require("worker_threads");
-const Database = require("../database");
-const path = require("path");
-
-/**
- * Send message to parent process for logging
- * since worker_thread does not have access to stdout, this is used
- * instead of console.log()
- * @param {any} any The message to log
- */
-const log = function (any) {
-    if (parentPort) {
-        parentPort.postMessage(any);
-    }
-};
-
-/**
- * Exit the worker process
- * @param {number} error The status code to exit
- */
-const exit = function (error) {
-    if (error && error !== 0) {
-        process.exit(error);
-    } else {
-        if (parentPort) {
-            parentPort.postMessage("done");
-        } else {
-            process.exit(0);
-        }
-    }
-};
-
-/** Connects to the database */
-const connectDb = async function () {
-    const dbPath = path.join(
-        process.env.DATA_DIR || workerData["data-dir"] || "./data/"
-    );
-
-    Database.init({
-        "data-dir": dbPath,
-    });
-
-    await Database.connect();
-};
-
-module.exports = {
-    log,
-    exit,
-    connectDb,
-};