いしぐめも

プログラミングとかしたことを書きます。

Personium 1.7.22 で組み込まれる予定の新機能

そろそろ Personium 1.7.22 がリリースされるので、新規リリースに伴い追加された機能などを書いてみたいと思います。

個人的に気になったものをピックアップしていきたいと思います。

サービスコレクションの動的パス対応

いきなり手前味噌で恐縮ですが、以下のようなプルリクを送りました。

Implement for relaying request of dynamic path service execution. by yoh1496 · Pull Request #593 · personium/personium-core · GitHub

CRUD操作にあたり、追加の動作を JavaScript (Rhino) で記述できる、いわゆる「エンジンスクリプト」機能ですが、 今まではパスが静的なものに限定されていたところを動的に解決されるようにしました、という内容です。

概要

Personiumでは https://cell.pds.example.com/box/engine というサービスコレクションに対し、

<p:service language="JavaScript" xmlns:p="urn:x-personium:xmlns" xmlns:D="DAV:">
  <p:path name="edit" src="edit.js"/>
  <p:path name="view" src="view.js"/>
</p:service>

のように設定することで、

https://cell.pds.example.com/box/engine/edit → edit.js 
https://cell.pds.example.com/box/engine/view → view.js

といった感じで、edit.js, view.js に独自の処理を実装し、特定のURLに紐づけることができます。(p:path タグでAPIのルートを定義できるイメージ)

p:path タグの name 属性で指定されるパスが src 属性で指定されるJavaScriptファイルに紐づけられるわけですが、従来は name 属性には文字列の完全一致しか条件として書けませんでした。

これではID を含むタイプのURLが実現できない( articles/12345/view みたいな)、という問題点がありましたが、最悪クエリ文字列で何とかなるのでそれでしのいできました。ただやはり、他のサービスとの連携となると無理が出てきました。

今回のプルリクでは JAX-RSURIテンプレートを使用し、

<p:service language="JavaScript" xmlns:p="urn:x-personium:xmlns" xmlns:D="DAV:">
  <p:path name="{id: \d+ }/edit" src="edit.js"/>
  <p:path name="{id: \d+ }/view" src="view.js"/>
</p:service>

このような設定をすることも可能になりました。

効果1: 1Data 1URLの実現

上記でも例として書きましたが、各データに対してURLを持たせることができます。

効果2: リライトのようなことができる

ちょっとトリッキーですが、JAX-RSURIテンプレートで広くマッチするように設定し、リライトのようなことができます。

<p:service language="JavaScript" xmlns:p="urn:x-personium:xmlns" xmlns:D="DAV:">
  <p:path name="{id: .+?}" src="frontend.js"/>
</p:service>

ここで frontend.js では HTMLをレンダリングする虚無みたいな JavaScript を書かなければいけなくなりますが、フラグメント(ハッシュ)をルーティングに使用するHashRouterから解放されるという利点があります。

認証にハッシュを使用する場合など、ハッシュの利用に制限がかかるケースがあるため、大きな前進かと思います。

課題

残る課題としては、エンドポイントの向き先を動的にすることはできましたが、動的なパラメータの部分をパースする処理はエンジンスクリプト側に委ねられています。ここがまた苦しみを生みそうなので、Core側でカバーできるように変えたいところです。

起動まわりの改善

tochi-y さんを中心にPersoniumの起動まわりをDockerなどの技術を使って改善していこうという活動が進んでいます。わたしもCore単体で起動するDockerfileを書いたりしてますが、それが取り込まれました。

Implementing multi-stage Dockerfile by yoh1496 · Pull Request #594 · personium/personium-core · GitHub

オタメシ用途では簡単に作ったり壊したりできるDockerは便利ですね。

効果1: テスト用の環境を整えるのが楽になった

Personiumはテストを実施するのにElasticSearchなど準備しなければならず、環境の構築だけでもスキルが要求され、気軽に開発に参加してねとは言いづらい状況でした。

Dockerのエコシステムに加わることで、それがかなり改善されるのではないかと考えています。

終わりに

初めての試みとして、次期リリースでの変更点などをピックアップしてみました。

なかなか内容の勘所が掴めず、目についた新機能ばかりを紹介してしまいましたが、ほかにも色々Issueは解決されてますので、気になる方はリリースノートを見てください~

--

Personiumコミュニティではメンバーを募集しています。Personiumに興味のある方がいらっしゃったらぜひご参加ください!

Personium | オープンソースPDSソフトウェア

GitHub ヘの Issue 登録だけでも大歓迎です!

Personium · GitHub