本記事はAIを利用して作成した技術解説・実装例です。掲載するコードや手順は一次情報を基に構成していますが、筆者による実機での動作確認は行っていません。環境やバージョンによって動作が異なる場合があります。 、RFC 10050(Protocol-Specific Profiles for JSContact)の仕様に基づき、限られた連絡先情報(JSContact)を安全かつ実用的に扱うためのプロファイル構造やレジストリの仕組みを解説します。網羅的なデータ交換ではなく、特定のプロトコル要求に合わせたサブセット定義の設計方針と、対応プロパティの決定ルールを明確に示します。
目的
本書の目的は、RFC 10050で定義される「JSContactプロファイル」の概念とメッセージ構造を読み解き、プロトコル固有の要件に応じてどのプロパティや制限が適用されるかを整理することです。一次情報に示されたIANAレジストリの仕様やルールを分解し、データ交換における設計アプローチを明らかにします。
前提・注意点
JSContactはアドレス帳やディレクトリサービス向けのデータモデルであり、通常はCardDAVやJMAP for Contactsなどのプロトコルで全要素のサポートが期待されます。しかし、一部のプロトコルや文書仕様では、すべてのセマンティクスが不要である場合があります。
RFC 10050は、こうした状況に対応するため、JSContact要素の名前付きサブセット(プロファイル)を登録するIANAレジストリを定義しています。
JSContactプロファイルの基本概念
プロファイルとは、バージョン管理されたJSContact要素(プロパティ、型、値など)の名前付きセットです。プロファイル内で使用される要素は、IANAのJSContactレジストリグループに登録されている必要があります。
プロファイルは、元の定義に対する追加の制限を定義できますが、制限を緩めることは認められていません。JSContactオブジェクトは、そのすべてのプロパティがプロファイルで定義されたセットに含まれ、かつ値が制限に適合している場合に、そのプロファイルに準拠しているとみなされます。
flowchart TD
A[JSContact Object] --> B{Comply with Profile?}
B -- Yes --> C[Properties in Profile Set]
B -- Yes --> D[Values Meet Restrictions]
C --> E[Valid Data Exchange]
D --> E
B -- No --> F[Protocol-Specific Handling]
プロファイル名とバージョンの仕様
プロファイルには一意の名前とバージョンが割り当てられます。
プロファイル名: ASCIIの小文字アルファベットおよび数字で構成され、ハイフンで区切ることができます。アルファベットで始まり、1文字以上255文字以下である必要があります。
プロファイルバージョン: 正の整数であり、プロファイルのプロパティに変更があった場合は必ず増加します。初期値は1です。
プロパティエントリの構成要素
プロファイルは、サポートするプロパティを決定するプロパティエントリのリストを定義します。各エントリには以下の要素が含まれます。
Property Name: 参照するJSContactプロパティ名。
Property Context: このプロファイルをサポートするJSContactオブジェクトタイプのカンマ区切りリスト。
Restricted Attributes: プロパティの属性を制限。例えば「mandatory」を指定すると、本来オプショナルであるプロパティを必須化できます。
Restricted Property Type: プロパティの値の型を制限し、将来の型拡張を防いだり、元の型のサブセットに限定したりします。
Restricted Enum Values: 列挙値を許可された値のサブセットに制限します。
Restricted PatchObject: PatchObjectのキーを単一のJSON Pointer参照トークンに制限します(値が「yes」の場合)。
なお、すべてのプロファイルにおいて @type と version プロパティは常時サポートされるため、プロファイルのエントリにこれらを含めることはできません。
サポートされるプロパティの決定プロセス
プロファイルのサポートプロパティは、プロファイルのエントリとIANA登録プロパティに基づいて決定されます。手順の概要は以下の通りです。
プロパティコンテキストに「Card」を含むエントリがある場合、そのプロパティでセットを初期化します。該当エントリがない場合は、CardオブジェクトのすべてのIANA登録プロパティで初期化します。
セット内のプロパティがオブジェクト型、リスト、マップ、またはオブジェクト型のunionを持つ場合、それらのオブジェクトタイプをコンテキストに含むプロパティを追加します。存在しない場合はIANA登録プロパティを追加します。
すべてのオブジェクト型が考慮されるまで上記の手順を繰り返します。
IANAの考慮事項
本仕様により、IANAに「JSContact Profiles」レジストリが新設されています。新しいプロファイル名やバージョンの追加には「Specification Required」ポリシーが適用され、既存プロファイルの更新には「Expert Review」が適用されます。登録されるエントリには名前、バージョン、および仕様へのリファレンスが含まれます。
まとめ
本記事の実行前確認ポイントと制約事項の回収は以下の通りです。
【実機確認前】実際の通信ログやJMAP/CardDAVサーバーとのやり取りは実施していません。
プロファイル名が命名規則(小文字アルファベット、数字、ハイフン、1〜255文字)に従っているか確認する必要があります。
プロパティの制限事項(mandatoryや型の限定など)が元の定義に矛盾していないかを設計段階で検証することが重要です。
