SvelteKitでfile sessionを実装してみる
#svelte #sveltekit #nodejs #備忘 #開発
SvelteKit + Luciaで簡単な認証を見てみる で、Luciaがどうやってsessionを実装しているかを見た
これを参考に、雑にファイルでsession管理できないかをやってみる
基本的な思想としては、
ファイル名がsessionToken
ファイル更新日時がsession更新日時
もしファイルアクセス日時がとれるなら、そっちを使ってもいいかも
ファイルの中身はjson形式
というか、sessionのObjectをそのまま書き出す感じ
ってな感じで
プロジェクト作成
$ npx sv create sveltekit-file-session
┌ Welcome to the Svelte CLI! (v0.6.23)
│
◇ Which template would you like?
│ SvelteKit minimal
│
◇ Add type checking with Typescript?
│ Yes, using Typescript syntax
│
◆ Project created
│
◇ What would you like to add to your project? (use arrow keys / space bar)
│ vitest
│
◆ Successfully setup add-ons
│
◇ Which package manager do you want to install dependencies with?
│ npm
│
◆ Successfully installed dependencies
│
◇ Project next steps ─────────────────────────────────────────────────────╮
│ │
│ 1: cd sveltekit-file-session │
│ 2: git init && git add -A && git commit -m "Initial commit" (optional) │
│ 3: npm run dev -- --open │
│ │
│ To close the dev server, hit Ctrl-C │
│ │
│ Stuck? Visit us at https://svelte.dev/chat │
│ │
├──────────────────────────────────────────────────────────────────────────╯
│
└ You're all set!
要らないけど、クセでvitest入れちゃった
sveltekitでファイルの読み書き
基本的にはnodejsの機能で要件を満たせるとは思ってるけど、一応確認していく
下記が出来ることが必要
ファイルロック
読み込み
上書き
削除
存在チェック
更新日時・アクセス日時の取得
と思って調べ始めると、nodejsのfsモジュールではファイルロックができないっぽい
対応するライブラリを入れたりする必要がありそう
ファイルの排他制御をするためのライブラリとして出てきたのが proper-lockfile
GitHub - moxystudio/node-proper-lockfile: An inter-process and inter-machine lockfile utility that works on a local or network file system.
$ npm install proper-lockfile
たぶんこれで必要な機能はそろうはず
あとはLuciaのサンプルと同じように実装してみる
追記 更新日時・アクセス日時の取得に関して、Luciaのサンプルではsession自体に有効期限を持たせていたので、不要になった
作成手順
Luciaのサンプルをコピーしてきて、DBにアクセスするところなど一部をファイルベースに書き換えただけ
また、sha256のハッシュ化などを他のライブラリに頼っていたのを自前で実装した
それだけなので、特に書くことはないかな
気が向いたらgitにあげるかもやけど、備忘録レベルなのでHDDの藻屑になるかも
動くところまで作った後の感想
lockがちゃんと動いているかの確認まではしてないけど、
ファイルがなかったらlockしないなどちょっと不便に感じるところもあるかなーって感じ
lockしたいファイルがないなら作るくらいのことはしてほしかった
今回は同期関数だけで作ったけど、ファイル操作とかlock周りは非同期的な関数で実装したほうが良いかも
lockしようとして失敗しても何回かリトライして、最終的にlockできればOK、みたいなケースもあるはず
可能であれば、ファイルの読み書きと同時にlockしてlock解除したいなーって気持ちがある
別のライブラリを使ったりすればこの辺は便利になるかも
例えNoSQLやFileDBを使ったとしてもどこかでlockの機構は必要になるから、
それがファイルのlockってのは簡単でいいのかも
それ以外は使い慣れたsessionの仕組みに出来たので満足ではある
更新日時
2025/03/03 かきおわり
2025/03/01 かきはじめ