【Bun】ElysiaのCron Pluginを使ってみる


定期的なジョブのスケジュール設定を管理するためのコマンドとして unix系では crontab が良く使われますが、スケジュール設定を Elysia で使えるようにしたのが

<b>Bun > Cron Plugin</b> です

https://elysiajs.com/plugins/cron.html

このプラグインは、npm の croner を Elysia へ拡張したという事で、基本的には同様の動作をします。

https://github.com/hexagon/croner

# インストール

cron のプラグインをインストールします。[Elysia自体のインストールはこちらなどをご参照ください(https://qiita.com/toshirot/items/579d6f7cf7dfa787f291)](https://qiita.com/toshirot/items/579d6f7cf7dfa787f291)

```sh:インストール
$ bun add @elysiajs/cron
```
生成ファイルはこうなりました。
```sh:生成されたファイル
./mycrons/
    │  ├─bun.lockb
    │  └─node_modules
    │      ├─@elysiajs
    │      ├─@sinclair
    │      ├─cookie
    │      ├─croner
    │      ├─elysia
    │      ├─eventemitter3
    │      ├─ast-decode-uri-component
    │      ├─fast-querystring
    │      ├─memoirist
    │      ├─moment
    │      └─openapi-types
    └─package.json
```
この node_modules は、もしもこの cron を Bun のみで使いNode.js を使わないなら、キャッシュは「~/.bun/install/cache」にあるので、削除しても大丈夫というか、無い方が Bun の恩恵にあずかれるかも。

```sh:bun node_modules は削除しても大丈夫
$ rm -rf node_modules
```

# サンプル

では、cronのサンプルを書いてみます。
```sh:cron-1.js ファイルを書く
$ vi cron-1.js
```
2秒ごとに現在時間を5回出力するというcronです。
```js:cron-1.js
mport { Elysia } from 'elysia'
import { cron } from '@elysiajs/cron'


new Elysia()
    .use(
        cron({
            name: 'time is',
            pattern: '*/2 * * * * *',
            maxRuns: 5, //最大実行数
            run() {
                // 現在時間を出力する
                // ja-JPの場合は月日が2桁ではなく1桁になるので
                // 参考 ja-JP 2023/1/8 14:37:31
                // ここではスウェーデンのsv-SEを利用した
                // 参考 sv-SE 2023-01-08 14:37:31
                //      xh-ZA 2023-01-08 14:37:31
                //      lt-LT 2023-01-08 14:37:31
                // https://mseeeen.msen.jp/sql-format-datetime-string-with-javascript-without-library/
                const date = new Date()
                    .toLocaleString('sv-SE')
                console.log('now is ', date)
            }
        })
    )

```
# 実行する
```sh:bun cron-1.js を実行する
$ bun cron-1.js
```
# 実行結果
```sh:結果
$ bun cron-1.js
now is  2023-12-02 15:54:42
now is  2023-12-02 15:54:44
now is  2023-12-02 15:54:46
now is  2023-12-02 15:54:48
now is  2023-12-02 15:54:50
```

まぁ「pattern: '*/2 * * * * *'」の部分がスケジュールする時間という事で、crontabと同様に次のような設定になります。

# 構文パターン

```
// ┌──────────────── (optional) second (0 - 59)
// │ ┌────────────── minute (0 - 59)
// │ │ ┌──────────── hour (0 - 23)
// │ │ │ ┌────────── day of month (1 - 31)
// │ │ │ │ ┌──────── month (1 - 12, JAN-DEC)
// │ │ │ │ │ ┌────── day of week (0 - 6, SUN-Mon) 
// │ │ │ │ │ │       (0 to 6 are Sunday to Saturday; 7 is Sunday, the same as 0)
// │ │ │ │ │ │
// * * * * * *
```

ドキュメントについてはcronnercronと同じ構文を使用するため、 [ cronner のドキュメント(https://github.com/hexagon/croner) ](https://github.com/hexagon/croner)を参照してくださいとのことです。

※でもこのサンプルは5回実行したら終わりなので、あとでもっと crontab らしいサンプルを追加しょうかな。

# 最近 Qiita に書いた Bun 関連の記事

https://qiita.com/toshirot/items/94961b6dde72be80ab0c

https://qiita.com/toshirot/items/7a0555b46b3a64a4f643

https://qiita.com/toshirot/items/c4d090bc38f9b85d8cdd

https://qiita.com/toshirot/items/4e8e571dd50a45c651f0

https://qiita.com/toshirot/items/e4eb635596ae4f63bdfd

https://qiita.com/toshirot/items/a81f2073e373b0351493

https://qiita.com/toshirot/items/06a992af8cf8aca9ff95

https://qiita.com/toshirot/items/3af83303f95ac7baa546