mychat v0.1.04x with Elysia/Bun
Demo/ 動作サンプル
v0.1.030からhttpsになりました
https://mychat.jp:9013/
MacOS と Linux 用の Bun インストール
Advance preparations/ 事前準備
unzipインストールして準備する
for Linux: Bun をインストールするにはunzipパッケージが必要です。入っていなければ入れておきます。
sudo apt install unzip
Bun install/ Bunインストール
curl -fsSL https://bun.sh/install | bash
or
curl -fsSL https://bun.sh/install | bash -s "bun-v1.0.25"
Clone mychat/ クローンで mychat をダウンロードする
git clone https://github.com/toshirot/mychat.git
source /home/<ユーザー名>/.bashrc
or
git clone git@github.com:toshirot/mychat.git
source /home/<ユーザー名>/.bashrc
Bun initialization/ Bunを初期化する
cd mychat
bun init
Execution at port 9012/ ポート9012で実行する
※v0.1.023から「.tsx」ファイルを起動しています
bun dev
e.g. "dev": "sudo bun run --hot src/index-9012.tsx"
if you want to change the port, change "const PORT = 9012;".
Here, the default is "PORT = 9012", so if you want to use it as is, you will need to open that port.
ポートなどを変更したい場合は「const PORT = 9012;」等で変更してください。
ここでは、デフォルトで「PORT = 9012」としていますが、そのポートを開いておく必要があります。
// 修正箇所 src/index-9012.tsx
// ホストまたはIP
const HOST = '74.226.208.203' //←ここを自分の使うHOSTへ変更する
// ポート HTTP と WebSocket 共通
const PORT = 9012; //←ここを自分の使うPORTへ変更する
v0.1.030からの https 化を準備する
v0.1.030からは httpではなく https で起動します。
もし既に、ドメイン持ってるサイト内に構築するならsrc/index-9012.tsx などに証明書のパスを書くだけで良いですが、
証明書が無い場合は、ドメインとletsencryptなどの証明書を各自ご用意ください。
コード上は以下のように 環境変数envを使っています。各envに証明書を登録するか、コメントアウトしているpemファイルへのパスの方を使うかはご自由に選択されてください。
const KEYS = {
cert: process.env.MYCHAT_CERT,
key: process.env.MYCHAT_PRIV
// cert: Bun.file("/etc/letsencrypt/live/"+HOST+"/cert.pem"),
// key: Bun.file("/etc/letsencrypt/live/"+HOST+"/privkey.pem")
}
また、sudoでの権限で bun 実行権限も必要なので、
下記のように sudo bun が実行できることが必要かもしれません。
※httpバージョンは、v0.1.026までになります
#sudo bun が実行できるようにする
#bunのパスを調べる
$ which bun
/home/<ユーザー名>/.bun/bin/bun
#ルートへリンクする
sudo ln -s /home/<ユーザー名>/.bun/bin/bun /usr/bin/bun
# /usr/bin/bunがリンクされてることを確認 これで sudo bun が動作します
$ sudo ls -l /usr/bin/bun
lrwxrwxrwx 1 root root 23 3月 31 00:22 /usr/bin/bun -> /home/<ユーザー名>/.bun/bin/bun
Test/ テスト
現在、testの実行に問題があります。https://github.com/toshirot/mychat/issues/8
※/test/crypto/encrypt-decrypt.test.ts で「process.env.PASS_PHRASE」を使ってるので
事前にenv.PASS_PHRASEに何かパスフレーズな文字列を入れておいてください。
たとえば、こんな感じで。
$ export PASS_PHRASE="mypassphrase"
テストの実行
bun test
Crypto/ 暗号化について
@see https://github.com/toshirot/mychat/issues/2
v0.1.040でパスフレーズを実装しました。
現況データは次のようにAESで暗号化されて送受信されます。
Sanitize/ サニタイズについて
普通はサニタイズは、サーバー側でやれば良いのだけど、end-to-endで暗号化すると、サーバー側は全く読めなくなるので、サニタイズもできない。そこで、クライアント側で送信側と受信側で2回やってる
クライアント送信側だけでも良さそうだけど、まぁ何があるかわからないので、一応念のために受信側でもやってみた。そのうち問題なければ解除しても良い。
メッセージ中のURLと画像URL変換について
画像urlを img 要素に変換する
urlをlink 要素 に変換する
※画像urlの判定は現状拡張子のみ
## Discussions/ ディスカッション
[https://github.com/toshirot/mychat/discussions/13](https://github.com/toshirot/mychat/discussions)
## @see Qiita
Simple Documentation for v0.1.017
ただし、Qiitaでは、v0.1.017までの解説をしています。
https://qiita.com/toshirot/items/d4664e7fdcdde468f501
## Tree at v0.1.031
```
.mychat/
├─ src/
│ ├─ index-9012.tsx // bun dev で起動するファイル
│ └─ utiles.ts // 各種関数
├─ public/ // static ディレクトリ
│ ├─ css/ // static CSS
│ │ ├─ base.css // ベースCSS
│ │ ├─ input-box.css // インプットボックスCSS
│ │ └─ msg-box.css // メッセージボックスCSS
│ ├─ img
│ │ └─ config-icon.png
│ └─ js
│ ├─ cripto-js.js // 暗号/復号
│ └─ purify.min.js // サニタイズ
├─ db/
│ ├─ mychat.sqlite // 通常の SQLiteファイル
│ ├─ mychat.sqlite-shm // WALモード用ファイル
│ ├─ mychat.sqlite-wal // WALモード用ファイル
│
├─ bench/ // ベンチマーク
├─ test/ // テスト bun test で起動する
├─ README.md
├─ bun.lockb // @see https://bun.sh/docs/install/lockfile
├─ node_modules/
├─ happydom.ts // @see https://bun.sh/guides/test/happy-dom
├─ package.json
├─ bunfig.toml // @see https://bun.sh/docs/runtime/bunfig
└─ tsconfig.json // @see https://bun.sh/docs/runtime/jsx#configuration
```
## Default pakage.json
#### 注意※2023/1/7 "elysia": "0.7.30", が "elysia": "0.8.00" だとエラーがでた
* v0.1.030からdevは sudo で実行しています
```
{
"name": "mychat",
"version": "0.1.042",
"scripts": {
"test": "bun test",
"dev": "sudo bun run --hot src/index-9012.tsx",
"action": "sudo bun run src/index-9012.tsx;process.exit();"
},
"dependencies": {
"@elysiajs/cookie": "^0.8.0",
"@elysiajs/html": "^0.7.3",
"@elysiajs/static": "^0.8.1",
"@types/crypto-js": "^4.2.1",
"@types/dotenv": "^8.2.0",
"@types/node": "^20.12.11",
"cookie-parser": "^1.4.6",
"crypto": "^1.0.1",
"crypto-js": "^4.2.0",
"elysia": "0.7.30",
"express-session": "^1.18.0",
"passport": "^0.7.0",
"passport-google-oauth2": "^0.2.0",
"qrcode": "^1.5.3",
"sanitize-filename": "^1.6.3",
"speakeasy": "^2.0.0"
},
"devDependencies": {
"@happy-dom/global-registrator": "^12.10.3",
"@types/bun": "^1.0.0",
"bun-types": "latest"
},
"module": "src/index-9012.tsx",
"type": "module",
"peerDependencies": {
"typescript": "^5.0.0"
}
}
```