Copyright © 2020-2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
CBOR は、コンパクトなバイナリデータのシリアル化およびメッセージング形式です。この 仕様では、Linked Data をシリアル化するための CBOR ベースの形式である CBOR-LD 1.0 を定義します。 このエンコーディングは、現在数億ものシステムに導入されている既存の JSON-LD エコシステムを 活用するように設計されており、Linked Data の効率的なエンコーディング方式を求める利用者に コンパクトなシリアル化形式を提供します。セマンティック圧縮方式を利用することにより、汎用的な 圧縮方式よりも 60% を超えて優れた圧縮率を実現できます。この形式は 主として、ストレージおよび帯域幅に制約のあるプログラミング環境で Linked Data を使用する手段を 提供し、相互運用可能なセマンティックなワイヤレベルの プロトコルを構築し、CBOR ベースのストレージエンジンに Linked Data を効率的に格納することを目的としています。
この節では、この 文書の公開時点におけるステータスについて説明します。現在の W3C 公開文書の一覧およびこの技術報告書の最新改訂版は、 W3C 標準および草案 索引で確認できます。
この文書は実験的なものです。
この文書で説明されている機能を 実証できるリファレンス実装があります。
この文書は、JSON-LD ワーキンググループによって、 勧告 トラックを使用した 作業草案として公開されました。
作業草案としての公開は、 W3C およびそのメンバーによる 承認を意味するものではありません。
これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される 可能性があります。この文書を進行中の作業以外のものとして 引用することは適切ではありません。
この文書は、 W3C 特許 ポリシーの下で活動するグループによって作成されました。 W3C は、グループの成果物に関連して行われた 特許開示の公開リスト を管理しています。そのページには、 特許を開示するための手順も含まれています。必須クレームが含まれていると考える 特許について実際に 知識を有する個人は、 必須クレーム に関する情報を、 W3C 特許ポリシーの第6節に従って開示しなければなりません。
この文書には、 2025年8月18日付 W3C プロセス文書が適用されます。
このセクションは非規範的です。
CBOR は、コンパクトなバイナリデータのシリアル化およびメッセージング形式です。この 仕様では、Linked Data をシリアル化するための CBOR ベースの形式である CBOR-LD 1.0 を定義します。 このエンコーディングは、現在数億ものシステムに導入されている既存の JSON-LD エコシステムを 活用するように設計されており、Linked Data の効率的なエンコーディング方式を求める利用者に コンパクトなシリアル化形式を提供します。セマンティック圧縮方式を利用することにより、汎用的な 圧縮方式よりも 60% を超えて優れた圧縮率を実現できます。この形式は 主として、ストレージおよび帯域幅に制約のあるプログラミング環境で Linked Data を使用する手段を 提供し、相互運用可能なセマンティックなワイヤレベルの プロトコルを構築し、CBOR ベースのストレージエンジンに Linked Data を効率的に格納することを目的としています。
このセクションは非規範的です。
この文書は、CBOR における Linked Data のシリアル化に関する詳細な仕様です。 この文書は主として、次の読者を対象としています:
非規範的と明記されたセクションに加えて、この仕様に含まれるすべての作成ガイドライン、図、例、および注記は 非規範的です。この仕様のそれ以外のすべての内容は規範的です。
この文書におけるキーワード してもよい、しなければならない、および 任意 は、 BCP 14 [RFC2119] [RFC8174] に記載されているとおりに解釈されるものとします。ただし、ここに示すように、 すべて大文字で表記されている場合に限ります。
このセクションは非規範的です。
この仕様の開発に参加する方法はいくつか あります:
このセクションは非規範的です。
CBOR-LD は、次の設計目標を満たします:
同様に、次の事項は目標ではありません。
この仕様に取り組む中で、次の落とし穴が 特定されています:
このセクションは非規範的です。
大まかに言えば、CBOR-LD は JSON-LD のコンパクトなバイナリシリアル化であり、 追加の圧縮のために次の仕組みを使用できます:
コーデックは、型付き値を汎用的な方法で圧縮するための基本的なプリミティブです。セマンティック圧縮 は JSON-LD の用語を圧縮するためのものです。レジストリ辞書は、ユースケース固有の方法で型付き値を 圧縮するためのものです。これらはいずれも任意であり、CBOR-LD は、これらの圧縮戦略の いずれか、すべて、またはいずれも使用せずに利用できます。これらの戦略のうち、 特定のユースケースで使用される一連のものを総称して、処理モデルと呼びます。処理モデルについては、 4. 処理 モデルで詳しく説明します。
このセクションは非規範的です。
セマンティック圧縮は、コンパクトな CBOR-LD ペイロードを作成するための強力な手段です。中核となる考え方は、 外部 JSON-LD コンテキストオブジェクトの情報内容を使用して JSON-LD の用語を圧縮することです。 これらの外部コンテキストオブジェクトは、ペイロードの作成者と利用者の双方が利用できるため、 可逆な方法でこれを実行できます。
一般的なセマンティック圧縮処理では、JSON-LD 文書を取得し、 次の処理を行います:
@context 値を見つけます。埋め込みコンテキスト値は圧縮できません)。
このセクションは非規範的です。
2. 基本概念で説明したように、特定の ユースケースで使用される圧縮および 変換戦略の特定の組み合わせを、処理モデルと呼びます。 すべての CBOR-LD ペイロードには厳密に 1 つの処理モデルが関連付けられており、そのモデルは、 ペイロードの CBOR タグに識別子が含まれる CBOR-LD レジストリエントリによって選択されます( 5. CBOR-LD 用の CBOR タグを参照)。
処理モデルは、実装が JSON-LD 文書を CBOR-LD に、また CBOR-LD から JSON-LD にどのように変換するかを決定します。具体的には、処理モデルは次を指定します:
ユースケース固有の型付き値圧縮に使用されるレジストリ辞書は、
CBOR-LD レジストリエントリの別個の
部分であり、その typeTables フィールドを通じて設定されます(
5.1 CBOR-LD レジストリを参照)。これらは
処理モデルとは独立して選択され、
処理モデルの一部ではありません。
processingModel を指定しない CBOR-LD レジストリエントリは、
デフォルト処理モデルを使用します。デフォルト処理モデルはこの
仕様で定義され、次のように動作します:
xsd:date および xsd:dateTime コーデック、ならびに
multibase
コーデックが含まれ、それぞれ値に関連付けられた JSON-LD 型に基づいて適用されます。
適用可能なコーデックまたは typeTable エントリが型に存在しない値、および
参照されるコンテキストのいずれにも含まれない用語は、そのまま保持されるため、適合する任意の JSON-LD
文書を損失なくラウンドトリップできます。
存在する場合、CBOR-LD レジストリ
エントリの processingModel メンバーは、以下で定義されるメンバーを持つ
マップです。このメンバーが存在しない場合は、デフォルト
処理モデル
が適用されます。
semanticCompressiontrue です。true の場合、用語識別子は
3. セマンティック
圧縮で説明されているとおりに自動生成されます。
codecs@type として @id で
定義されている値に一致する予約値 url のいずれかです。
変換中、値の型に関連付けられたコーデックが存在する場合、その値の圧縮および展開に
使用されます。codecs が存在せず、デフォルト処理モデルも使用されていない場合、
汎用の型付き値コーデックは適用されません。
この仕様では、以下の表に示すコーデック識別子を定義します。別の仕様で定義された処理モデルは、 その仕様が対応するコーデックを 定義している場合、追加のコーデック識別子を使用してもよいものとします。
| コーデック識別子 | コーデック | デフォルト処理 モデルで関連付けられる型 |
|---|---|---|
url |
URL コーデック | url |
xsd-date |
XSD Date コーデック | http://www.w3.org/2001/XMLSchema#date |
xsd-date-time |
XSD DateTime コーデック | http://www.w3.org/2001/XMLSchema#dateTime |
multibase |
Multibase コーデック | https://w3id.org/security#multibase |
この形式で表現すると、デフォルト処理モデルは セマンティック圧縮を有効にし、 この仕様で定義される各コーデックを、それが圧縮する型に関連付けます:
processingModel:
semanticCompression: true
codecs:
url: url
"http://www.w3.org/2001/XMLSchema#date": xsd-date
"http://www.w3.org/2001/XMLSchema#dateTime": xsd-date-time
"https://w3id.org/security#multibase": multibase
レジストリエントリは、processingModel メンバーを完全に省略しても
同一の動作を得ることができます。
ユーザーがセマンティック圧縮の使用を望まない場合、および/または
デフォルト処理モデルに含まれるもの以外のコーデックで圧縮したい場合、レジストリエントリで
カスタム処理モデルを指定できます。次は、セマンティック
圧縮を使用せず、xsd-date-time コーデックのみを使用する処理モデルの例です:
processingModel:
semanticCompression: false
codecs:
"http://www.w3.org/2001/XMLSchema#dateTime": xsd-date-time
4.2.1 コーデック識別子 には、この仕様で定義されているコーデックが 列挙されています。CBOR-LD コーデックは拡張ポイントとしても意図されています。処理モデルは、 ここでは規定されておらず、その代わりに処理モデルを定義する 仕様またはその他の文書で定義されているコーデックを使用してもよいものとします。
この仕様は、 ユーザー指定のコーデックがどのように動作するか、またそれらをどのように指定するかを制約 しません。そのようなコーデックを使用する処理モデルを定義する文書は、 相互運用可能な実装に十分な精度で各コーデックを指定する 責任を負い、テストおよび正確性についても責任を負います。この 仕様で定義されるコーデックは、IRI で識別されなければなりません。
次の例は、型 https://example.org/vocab#ip-address の IP アドレス
値を圧縮するコーデックを使用する処理モデルを示しています。
processingModel:
semanticCompression: true
codecs:
url: url
"http://www.w3.org/2001/XMLSchema#dateTime": xsd-date-time
"https://example.org/vocab#ip-address": ip-address
ここで、ip-address コーデックのエンコードおよびデコード動作は、
外部でアルゴリズムとして
規定されます。
CBOR-LD ペイロードは、バイナリレベルでそれと識別できる必要があります。CBOR はネイティブに 「タグ」機能によってこれをサポートします。これは、グローバルレジストリを介して残りの ペイロードを記述する、バイナリデータ内のヘッダー値です。
CBOR タグ 0xCB1D(タグ値 51997)は、CBOR-LD で使用するために
IANA
CBOR タグレジストリに登録されています。このタグ値の直後に続くデータは、
圧縮されたペイロードの作成に使用されたレジストリエントリを識別します。
CBOR-LD ペイロードは、タグ 0xCB1D が付けられた項目が
2 要素の配列となるように構成されなければならず、最初の要素は
メジャータイプ 0 の整数で
なければなりません。
この整数は CBOR-LD レジストリエントリ ID です。バイナリ構造は
tag([registryEntryId, payload]) です。
次に、CBOR-LD レジストリエントリ ID の値を使用して、CBOR-LD レジストリ内の CBOR-LD レジストリエントリを検索します。
単一の CBOR タグ値を使用しながら、利用時に異なる圧縮テーブル素材を必要とする CBOR-LD の可能なユースケースを無制限に拡張できるようにするため、 以下を定義します。
CBOR-LD レジストリは、CBOR-LD ペイロードの利用者に、 展開に必要な用語コーデックマップを再構築するために必要な情報を提供するグローバルリストです。 CBOR-LD レジストリエントリには、以下が含まれます:
Registry Entry ID: 正の整数。
Use Case: このエントリを使用する CBOR-LD ペイロードの種類。
typeTables: このレジストリエントリで使用されるレジストリ辞書のコレクション。各
レジストリ辞書は、型
テーブル型によって識別され、その
型の値をコンパクトにエンコードするために整数へマッピングします。型テーブル型は、予約済み
カテゴリ(コンテキスト値に適用される context、または @id 型の
URL 値に適用される url)のいずれか、または JSON-LD 型識別子であり、その場合、辞書は
その型の型付きリテラル値に適用されます。エンコードおよびデコード時にこれらの
辞書がどのように選択され適用されるかについては、6.5.2
値コーデックを参照してください。
processingModel: このレジストリエントリで使用される処理モデル。このフィールドが
存在しない場合、レジストリエントリはデフォルト処理モデルを使用します。
処理モデルは、
以下を指定します:
xsd:date および xsd:dateTime 値用、ならびに
multibase エンコードされた値用のコーデック)と、
各コーデックが適用される JSON-LD 型、および
processingModel メンバーをどのように
表現するか(デフォルトモデルの具体例を含む)については、
4.2 処理モデルの
表現を参照してください。
provisional: エントリが暫定的であるかどうかを示すブール値。暫定エントリは
変更または削除される可能性があります。
文字列 "callerProvidedTable" は typeTables に現れることがあり、このユース
ケースでは、グローバルに定義されていない
Type Table が必要であることを示します。
現在の CBOR-LD レジストリはオンラインで 利用できます。
登録要件は、要求するレジストリエントリ ID に応じて異なります。範囲は以下のとおりです:
登録要求は、リポジトリのフォークを介して CBOR-LD レジストリに対して作成された プルリクエストの形式でなければなりません。これらの要求には、以下を含めなければなりません:
tables ディレクトリに追加された .yml ファイル。ファイル名には要求する
レジストリエントリ ID を使用し、
レジストリエントリの技術的内容を指定します。このファイルが
想定されるファイル形式に適合しない場合、要求は説明なしに拒否されることがあります。
256–65,535 の範囲でエントリを登録するには、認知された標準開発組織(SDO)による 成熟した仕様または標準文書を要求とともに提供しなければなりません。 仕様またはその他の文書が受け入れ可能かどうかの判断には、W3C が W3C 標準からの規範的参照を許可または禁止する際に、 組織および文書を評価する方法と同様の基準を使用します。 これらの要求は、割り当て前に専門家によるレビューを受けます。JSON-LD 系列の 仕様のメンテナーおよび/または W3C スタッフが このレビューを担当します。
ID 65 536 以上の合理的で適合する登録要求は、 追加のレビューなしに、「先着順」で レジストリリポジトリのメンテナーによってマージされます。
このアルゴリズムは、マップ typeTable、整数 registryEntryId、および
JSON-LD
文書 jsonldDocument を入力として受け取り、16 進文字列
cborldBytes を返します。
registryEntryId を
6.6.1 CBOR
タグ構造取得アルゴリズムに渡した結果を prefix に設定します。
state を空のマップに設定します。
registryEntryId に関連付けられたレジストリエントリがセマンティック
圧縮を必要とする場合:
state.strategy を "compression" に設定します。
state.typeTable を typeTable に設定します。
state.registryEntryId を registryEntryId に設定します。
state を
6.2.1
変換初期化アルゴリズムに渡した結果を state に設定します。
state および
jsonldDocument を inputDocuments として
6.2.2
文書変換アルゴリズムに渡した結果を
output に設定します。
suffix を output の CBOR エンコーディングに設定します。
suffix を jsonldDocument の CBOR エンコーディングに設定します。
prefix の 16 進エンコーディングを suffix の前に付加したものを
cborldBytes に設定します。
cborldBytes を返します。
このアルゴリズムは、CBOR-LD ペイロード cborldBytes を受け取り、JSON-LD 文書
jsonldDocument を返します。
state を空のマップに設定します。
cborldBytes を
6.6.2 レジストリ
エントリ ID 取得アルゴリズムに渡した結果を result に設定します。
state.registryEntryId を
result.registryEntryId に設定し、suffix を
result.suffix に設定します。
state.registryEntryId に関連付けられたレジストリエントリが
セマンティック圧縮を使用する場合:
state.strategy を "decompression" に設定します。
registryEntryId に関連付けられた CBOR-LD Varint レジストリエントリの
typeTables 配列内の各エントリ type: map について、
そのエントリを state.typeTable に追加し、
state.reverseTypeTable 内の type の値を
inverseMap に設定します。ここで
inverseMap は、map のマッピングを反転したものです。
state を
6.2.1
変換初期化アルゴリズムに渡した結果を state に設定します。
suffix をバイト列からマップへデコードした結果を
input に設定します。
state および
input を inputDocuments として
6.2.2
文書変換アルゴリズムに渡した結果を
jsonldDocument に設定します。
suffix をバイト列からマップへデコードした結果を
jsonldDocument に設定します。
jsonldDocument を返します。
このセクションのアルゴリズムは、データ形式間で入力を抽象的に 変換するための「コンバーター」の動作を説明します。このセクションの後半で定義する 「圧縮」および「展開」戦略などの「戦略」と組み合わせて使用すると、 これらのアルゴリズムを具体的なデータ形式間の変換に使用できます。 「圧縮」戦略は JSON-LD から CBOR-LD に変換し、「展開」 戦略は CBOR-LD から JSON-LD に変換します。
このアルゴリズムはマップ state を受け取り、それを返します。
state を
6.4.1
コンテキストローダー初期化アルゴリズムに渡した結果を
state に設定します。
termMap および
previousActiveContext を 6.3.1 アクティブコンテキスト初期化アルゴリズムに渡した結果を
state.initialActiveContext に設定します。
state.typesEncodedAsBytes を空の集合に設定します。
state.typesEncodedAsBytes に追加します。
state を返します。
このアルゴリズムは、マップ state およびマップまたは
マップの配列 inputDocuments を受け取り、それぞれマップまたは
マップの配列 outputMaps を返します。
inputDocuments が配列の場合、inputs を
inputDocuments に設定します。それ以外の場合、inputs
を [inputDocuments] に設定します。
outputMaps を空の配列に設定します。
inputs 内の input ごとに:
output を空のマップに設定します。
state、input、
output、および
state.initialActiveContext を activeContext として
6.2.3
一般変換アルゴリズムに渡した結果を result に設定します。
result.output を outputMaps に追加します。
state を result.state に設定します。
inputDocuments が配列の場合、outputMaps を返します。それ以外の場合、
outputMaps の
最初の要素を返します。
このアルゴリズムは、マップ input、output、state、および
activeContext
を入力として受け取り、マップ state および output を含むマップを返します。
state.strategy が "compression" に設定されている場合:
state、activeContext、input、および
output を渡して、
6.2.5.1 圧縮用コンテキスト変換アルゴリズムを実行した結果を
contextConversionResult に設定します。
activeContext を contextConversionResult.activeContext に、
output
を contextConversionResult.output に、state を
contextConversionResult.state に設定します。
state、
activeContext、input、および output を渡して
6.2.6.1 展開用コンテキスト変換アルゴリズムを実行して得られた
result の result.activeContext を activeContext に、
result.output を output に、result.state を
state に設定します。
state.strategy が "compression" に設定されている場合、
activeContext および input を渡して
6.2.5.4
圧縮用オブジェクト型取得アルゴリズムを実行した結果を
objectTypes に設定します。
state、activeContext、および input を渡して
6.2.6.4 展開用オブジェクト型取得アルゴリズムを実行した結果を
objectTypes に設定します。
activeContext および
objectTypes を
6.3.4
型スコープコンテキスト適用アルゴリズムに渡した結果を
activeContext に設定します。
state.strategy が "compression" に設定されている場合、
state、
input、および activeContext を渡して
6.2.5.3 圧縮用入力エントリ取得アルゴリズムを実行した結果を
termEntries に設定します。
state、input、output、および activeContext を渡して
6.2.6.3 展開用入力エントリ取得アルゴリズムを実行した結果を
termEntries に設定します。
termEntries 内の [termInfo, value] ごとに:
term を termInfo.term に設定します。
activeContext
および term を
6.3.3 プロパティスコープコンテキスト適用アルゴリズムに渡した結果を
valueActiveContext に設定します。
plural を termInfo.plural の値に設定し、
termType を termInfo.def 内の @type
の値に設定します。
plural が true に設定されている場合、values を
value の値に設定します。それ以外の場合、values を
value の値を単一の要素として含む配列に設定します。
outputs を空の配列に設定します。
values 内の unconvertedValue ごとに:
state、termType、unconvertedValue
を value として、valueActiveContext
を activeContext として
6.2.4
値変換アルゴリズムに
渡した結果を result に設定します。
state を result.state に設定し、
result.output を outputs に追加します。
plural が true に設定されている場合、outputValues を
outputs に設定します。それ以外の場合、outputValues
を outputs の最初の要素に設定します。
state.strategy が "compression" に設定されている場合、
output 内で termInfo.termId の値が
outputValues にマッピングされるように設定します。それ以外の場合、
output 内で termInfo.term の値が outputValues
にマッピングされるように設定します。
result を空のマップに設定します。
result.state を state に、result.output を
output に設定します。
result を返します。
このアルゴリズムは、マップ state、activeContext、termInfo、および
値 value と termType を受け取ります。
マップ state および output を含む result オブジェクトを返します。
value が null の場合、null を返します。
state.strategy が "compression" に設定されている場合、
state、termType、
termInfo、および value を 6.2.5.2
圧縮用値変換アルゴリズムに渡した結果を output に設定します。
state、
termType、
termInfo、および value を 6.2.6.2
展開用値変換アルゴリズムに渡した結果を output に設定します。
output が定義されている場合、state および
output を含むマップ result を返します。
value が配列の場合:
outputs を空の配列に設定します。
value の各 element について:
activeContext、state、
termInfo、termType、および element を
value として渡して 6.2.4 値変換アルゴリズムを
実行した結果を result とします。state を
result.state に設定し、
result.output
を outputs に追加します。
result を空のマップに設定します。result.state
を state に、result.output を
outputs に設定します。
result を返します。
output を空のマップに設定します。
state、
activeContext、value を input として、および output を
6.2.3
一般変換アルゴリズムに渡した結果を
result に設定します。
result を返します。
このセクションのアルゴリズムは、JSON-LD から CBOR-LD へ 変換するために、前述の「変換」アルゴリズムとともに使用する 「圧縮」戦略を定義します。
このアルゴリズムは、マップ state、activeContext、input、
および output を受け取り、
マップ output、state、
および activeContext を含むマップ result を返します。
state、activeContext、および input を渡して
6.3.2
埋め込みコンテキスト適用アルゴリズムを実行した結果を
applyEmbeddedResult に設定します。
activeContext を applyEmbeddedResult.activeContext に、
state を
applyEmbeddedResult.state に設定します。
input にエントリを持たない場合:
result を空のマップに設定します。
result.state を state に、
result.activeContext を activeContext に設定します。
result を返します。
context を input 内の "@context" の値に設定します。
encodedContexts を空の配列に設定します。
context が配列の場合、isArray を true に、
contexts を context に設定します。
それ以外の場合、isArray を false に、contexts を
[context] に設定します。
contexts 内の contextValue ごとに:
state.typeTable および contextValue を渡して
6.5.1.1
コンテキストエンコーダーの作成を
実行した結果を encoderData に設定します。
encoderData が空のマップの場合、contextValue を
encodedContexts に追加します。
encoderData の値を
encodedContexts に追加します。
isArray が true の場合、id を
state.keywordsMap 内の "@context" の値に 1 を加えた値に設定し、
output 内の id の値を encodedContexts に設定します。
id を state.keywordsMap 内の "@context" の値に
設定し、output 内の id の値を
encodedContexts の最初の要素に設定します。
result.output を output に、result.state を
state に、result.activeContext
を activeContext に設定します。
result を返します。
このアルゴリズムは、マップ state および termInfo、ならびに値
valueToEncode および termType を受け取り、
マップ encoderData を返します。
valueToEncode がオブジェクトの場合、返ります。
state、termInfo、valueToToEncode、および
termType を渡して 6.5.2.1 値エンコーダーの作成を実行した結果を
result に設定します。
result を返します。
このアルゴリズムは、マップ state、activeContext、および
input を受け取り、配列 entries を返します。
entries を空の配列として初期化します。
keys を、辞書式順序でソートされた input のキーに設定します。
keys 内の key ごとに:
key が "@context" の場合、続行します。
value を input 内の key の値に設定します。
value が配列の場合、plural を true に設定します。
それ以外の場合、plural を false に設定します。
key が
state.termToId にエントリを持たない場合、termId を
key に設定します。
plural が true の場合、termId を
state.termToId 内の key の値に 1 を加えた値に設定します。
termId を
state.termToId 内の key の値に設定します。
activeContext.termMap が
key のエントリを持つ場合、definition を
activeContext.termMap 内の key の値に設定します。
それ以外の場合、
definition を空のマップに設定します。
entryTerm を新しいマップに設定します。
entryTerm 内の "term" の値を
key の値に設定します。entryTerm 内の "def" の値を
definition の値に設定します。termId および plural
を entryTerm に追加します。
entryTerm および
value の 2 要素を持つ配列 entry を作成します。
entry を entries に追加します。
entries を返します。
このアルゴリズムは、マップ activeContext および input を受け取り、集合
objectTypes を返します。
objectTypes を空の集合に設定します。
activeContext.typeTerms 内の term ごとに:
term が input にエントリを持つ場合:
types を input 内の term の値に設定します。
types 内の各値を objectTypes に追加します。
objectTypes を返します。
このセクションのアルゴリズムは、CBOR-LD から JSON-LD へ 変換するために、前述の「変換」アルゴリズムとともに使用する 「展開」戦略を定義します。
このアルゴリズムは、マップ state、activeContext、input、
および output を受け取り、
マップ output、state、および
activeContext を含むマップ result を返します。
state.reverseTypeTable を渡して
6.5.1.3
コンテキストデコーダーの作成を実行した結果を
decoderData に設定します。
contextTermId を
state.keywordsMap 内の "@context" の値に設定します。
contextTermId が input にエントリを持つ場合、
decoderData および
input 内の contextTermId の値を value として
6.5.1.4
コンテキストのデコードに渡した結果を
output 内の "@context" の値に設定します。
contextTermIdPlural を contextTermId の値に 1 を加えた値に設定します。
contextTermIdPlural が input にエントリを持つ場合:
contextTermId も input にエントリを
持っていた場合、
ERR_INVALID_ENCODED_CONTEXT エラーをスローします。
encodedContexts を input 内の
contextTermIdPlural の値に設定します。encodedContexts が
配列でない場合、ERR_INVALID_ENCODED_CONTEXT エラーをスローします。
contexts を空の配列に設定します。
encodedContexts 内の各 valueToDecode について、
decoderData および valueToDecode を
value として 6.5.1.4 コンテキストのデコードに渡した結果を
contexts に追加します。
output 内の "@context" の値を contexts に設定します。
activeContext、output を input として、および
state を渡して 6.3.2
埋め込みコンテキスト適用アルゴリズムを実行した結果を
embeddedContextResult に設定します。
result を embeddedContextResult に設定し、result.output
を output に設定します。result を返します。
このアルゴリズムは、マップ state および termInfo、ならびに値
termType および valueToDecode を受け取り、値
decodedValue を返します。
value がマップの場合、返ります。
valueToDecode、
state、termInfo、および termType を渡して
6.5.2.3
値デコーダーの作成を実行した結果を
decoderData に設定します。
decoderData を渡して 6.5.2.4 値のデコードを実行した結果を
decodedValue に設定します。
decodedValue を返します。
このアルゴリズムは、マップ state、activeContext、および
input を受け取り、配列
entries を返します。
entries を空の配列に初期化します。
input 内のキーと値のペア key および value ごとに:
key が
state.keywordsMap 内の "@context" の値、またはその値に 1
を加えた値の場合、続行します。
key が文字列の場合、plural を false に、
term を key に設定します。
key が奇数の場合、plural を true に設定します。それ以外の場合、
plural を false に設定します。
plural が true の場合、term を
state.idToTerm 内の
key から 1 を引いた値に設定します。
その値にエントリがない場合、エラー
ERR_UNKNOWN_CBORLD_TERM_ID をスローします。
term を
state.idToTerm 内の key の値に設定します。
その値にエントリがない場合、
エラー ERR_UNKNOWN_CBORLD_TERM_ID をスローします。
definition を
activeContext.termMap 内の term の値に設定します。
entryTerm を新しいマップに設定します。
entryTerm 内の "termId" の値を
key の値に設定します。entryTerm 内の "def" の値を
definition の値に設定します。term および plural
を entryTerm に追加します。
entryTerm および
value の 2 要素を持つ配列 entry を作成します。
entry を entries に追加します。
entries の各要素内の term の値で
entries をソートします。
entries を返します。
このアルゴリズムは、マップ state、activeContext、input を
入力として受け取り、
集合 objectTypes を返します。
objectTypes を空の集合に設定します。
activeContext.typeTerms 内の term ごとに:
term が
state.termToId にエントリを持たない場合、termId を
term に設定します。
termId を
state.termToId 内の term の値に設定します。
termId も termId に 1 を加えた値も
input に存在しない場合、続行します。
termId が input に存在する場合、
value を input 内の termId の値に設定します。
value を input 内の
termId に 1 を加えた値に設定します。
key が文字列の場合、plural を false に、
term を key に設定します。
key が奇数の場合、plural を true に設定します。それ以外の場合、
plural を false に設定します。
plural が true の場合、term を
state.idToTerm 内の
id から 1 を引いた値に設定します。
その値にエントリがない場合、エラー
ERR_UNKNOWN_CBORLD_TERM_ID をスローします。
term を
state.idToTerm 内の id の値に設定します。
その値にエントリがない場合、
エラー ERR_UNKNOWN_CBORLD_TERM_ID をスローします。
definition を
activeContext.termMap 内の term の値に設定します。
termInfo を新しいマップに設定します。
entryTerm 内の "def" の値を
definition の値に設定します。term、termId、および
plural を termInfo に追加します。
value が配列でない場合、values を
value を単一の要素として含む配列に設定します。
それ以外の場合、values を value の値に設定します。
values 内の各 value について:
value、
termInfo、state、および "@vocab" を
termType として渡して 6.5.2.3
値デコーダーの作成を実行した結果を
decoderData に設定します。
decoderData が存在する場合、decoderData を渡して 6.5.2.4
値のデコードを実行した結果を
`objectTypes に追加します。
value を objectTypes に追加します。
objectTypes を返します。
このセクションのアルゴリズムでは、JSON-LD 文書に関連付けられた コンテキスト文書のどの構成要素が、圧縮または展開中の任意の時点で 使用されているかを判定する方法について説明します。 これらのアルゴリズムには、CBOR-LD で埋め込みコンテキスト、型スコープコンテキスト、および プロパティスコープコンテキストを適用する方法が含まれます。これは、この仕様の後半で定義されるコンテキスト 読み込みアルゴリズムとは対照的です。コンテキスト読み込みアルゴリズムでは、 CBOR-LD の中核的な圧縮手法である、用語から整数へのマッピングを 構築する方法について説明します。アクティブコンテキスト処理アルゴリズムとコンテキスト 読み込みアルゴリズムを合わせて、CBOR-LD への変換および CBOR-LD からの変換時に JSON-LD コンテキスト文書をどのように処理すべきかを規定します。
このアルゴリズムは、マップ previousActiveContext および termMap を受け取り、
マップ activeContext を返します。使用中のアクティブコンテキストを
更新し、'@type' のすべての別名を検索します。
activeContext を新しいマップに設定します。
activeContext.previousActiveContext を previousActiveContext に設定します。
activeContext.termMap を termMap に設定します。
activeContext.typeTerms を配列 ['@type'] に設定します。
termMap 内の [term, def] ごとに:
def 内の "@id" の値が "@type" の場合、term を
activeContext.typeTerms に追加します。
activeContext を返します。
このアルゴリズムは、マップ state、activeContext、および input を
入力として受け取り、
マップ state および activeContext を含むマップ result を返します。
state、
activeContext.termMap を
activeTermMap として、および input 内の '@context' の値を
contexts として
6.3.5 用語
マップ更新アルゴリズムに渡した結果を termMapUpdateResult に設定します。
state を termMapUpdateResult.state に設定します。
termMap を termMapUpdateResult.activeTermMap に設定します。
termMap および activeContext を
previousActiveContext として渡して、
6.3.1
アクティブコンテキスト初期化アルゴリズムを実行した結果を
newActiveContext に設定します。
result を新しいマップに設定し、result.activeContext を
newActiveContext に、
result.state を state に設定します。
result を返します。
このアルゴリズムは、マップ state、activeContext、および文字列
term を入力として受け取り、
マップ state および activeContext を含むマップ result を返します。
activeContext を渡して 6.3.6 用語マップ復元アルゴリズムを
実行した結果を revertedTermMap に設定します。
termDef を
activeContext.termMap 内の term の値に設定します。contexts を
termDef 内の "@context" の値に設定します。
state、
revertedTermMap を
activeTermMap として、true を propertyScope として、および
contexts を
6.3.5 用語
マップ更新アルゴリズムに渡した結果を termMapUpdateResult に設定します。
state を termMapUpdateResult.state に設定します。
termMap を termMapUpdateResult.activeTermMap に設定します。
termMap および activeContext を
previousActiveContext として渡して、
6.3.1
アクティブコンテキスト初期化アルゴリズムを実行した結果を
newActiveContext に設定します。
result を新しいマップに設定し、result.activeContext を
newActiveContext に、
result.state を state に設定します。
result を返します。
このアルゴリズムは、マップ state、activeContext 、および集合
objectTypes を入力として受け取り、
マップ state および activeContext を含むマップ result を返します。
objectTypesSorted を空の配列に設定します。
objectTypes の要素を辞書式順序でソートし、その要素を順番に
objectTypesSorted に追加します。
newTermMap を activeContext.termMap に設定します。
objectTypesSorted 内の type ごとに:
typeDef を newTermMap 内の type の値に設定します。
contexts を
typeDef 内の "@context" の値に設定します。
state、
newTermMap を
activeTermMap として、contexts、および true を
typeScope として
6.3.5
用語マップ更新アルゴリズムに渡した結果を
termMapUpdateResult に設定します。
state を termMapUpdateResult.state に、
newTermMap を
termMapUpdateResult.activeTermMap に設定します。
newTermMap を termMap として、および activeContext を
previousActiveContext として渡して、
6.3.1
アクティブコンテキスト初期化アルゴリズムを実行した結果を
newActiveContext に設定します。
result を新しいマップに設定し、result.activeContext を
newActiveContext に、
result.state を state に設定します。
result を返します。
このアルゴリズムは、マップ state、activeTermMap、および値
contexts、ならびにブール値 typeScope
および propertyScope を入力として受け取ります。後者 2 つは指定されない場合、いずれも
false がデフォルトです。マップ state
および activeTermMap を返します。
contexts が配列でない場合、contexts の以前の値を
唯一の要素として持つ配列に contexts を設定します。
allowProtectedOverride を propertyScope の値に設定します。
propagateDefault を typeScope の値の否定に設定します。
contexts 内の contextIdentifier ごとに:
state および
contextIdentifier を渡して 6.4.2 コンテキスト読み込みアルゴリズムを
実行した結果を loadResult に設定します。
entry を loadResult.entry に、
context を entry.context に、state
を loadResult.state に設定します。
@propagate が context に現れる場合、propagate
を context 内の @propagate の値に設定します。
それ以外の場合、propagate を propagateDefault の値に設定します。
newTermMap を空のマップに設定します。entry.termMap 内の
[key,
value] ごとに:
value の内容を新しいマップ
newValue にシャローコピーし、propagate
を newValue に追加します。
newTermMap 内の key の値を
newValue に設定します。
activeTermMap 内の [term, activeDef] ごとに:
def を
newTermMap 内の term の値とします。
def が定義されている場合:
activeDef 内の protected の値が
true の場合:
allowProtectedOverride が
false に設定され、かつ def が
activeDef と同一でない場合、
エラー ERR_PROTECTED_TERM_REDEFINITION をスローします。
newTermMap 内の term の値を、
activeDef の値を含み、
propagate が
def.propagate の値に設定されたマップに設定します。
term が context に現れる場合、newTermMap 内の
term の値を、
activeDef のすべての値を含むマップに設定します。
activeTermMap の値を newTermMap の値に設定します。
result を空のマップに設定します。
result.state を state に、
result.activeTermMap を activeTermMap に設定します。
result を返します。
このアルゴリズムはマップ activeContext を入力として受け取り、マップ
newTermMap を返します。
newTermMap を空のマップに設定します。
nonPropagatingTerms を空の配列に設定します。
activeContext 内の [term, def] ごとに:
def.propagate が false に設定されている場合、term を
nonPropagatingTerms に追加し、
このループの次の反復に進みます。
newTermMap 内の term の値を
def に設定します。
nonPropagatingTerms 内の term ごとに:
currentContext を activeContext.previousActiveContext に設定します。
def を
currentContext.termMap 内の term の値に設定します。
def が未定義ではなく、かつ def.propagate が
false に設定されている間:
currentContext を
activeContext.previousActiveContext に設定します。
def を
currentContext.termMap 内の term の値に設定します。
def が未定義でない場合、newTermMap 内の term の値を
def に設定します。
newTermMap を返します。
このセクションのアルゴリズムでは、CBOR-LD の中核的な圧縮手法として使用される 用語と整数の間のマッピングを構築する方法を定義します。
このアルゴリズムはマップ state を受け取り、それを返します。
state.contextMap を新しいマップに設定します。
state.nextTermId を 100 に設定します。
state.keywordsMap を、JSON-LD キーワードとそれらに関連付けられた
整数値の次のマップに設定します:
{
'@context' => 0,
'@type' => 2,
'@id' => 4,
'@value' => 6,
'@direction' => 8,
'@graph' => 10,
'@included' => 12,
'@index' => 14,
'@json' => 16,
'@language' => 18,
'@list' => 20,
'@nest' => 22,
'@reverse' => 24,
'@base' => 26,
'@container' => 28,
'@default' => 30,
'@embed' => 32,
'@explicit' => 34,
'@none' => 36,
'@omitDefault' => 38,
'@prefix' => 40,
'@preserve' => 42,
'@protected' => 44,
'@requireAll' => 46,
'@set' => 48,
'@version' => 50,
'@vocab' => 52,
'@propagate' => 54
}
state.keywordsMap の各エントリを state.termToId に追加します。
state.strategy が "decompression" に設定されている場合、state.idToTerm を
state.termToId の逆マップ
(すなわち、整数から JSON-LD キーワードへのマップ)に設定します。
state を返します。
このアルゴリズムは、マップ state およびコンテキストマップまたは URL
contextIdentifier を受け取り、
マップ state および entry を含むマップ
result を返します。
state.contextMap が contextIdentifier のエントリを持つ場合:
result を空のマップに初期化します。
result.state を state に設定します。
result.entry を
state.contextMap 内の contextIdentifier の値に設定します。
result を返します。
context が文字列の場合:
context をそのオブジェクト内の
"@context" の値に設定します。
contextUrl を contextIdentifier の値に設定します。
context を contextIdentifier に設定します。
state、context、および設定されている場合は contextUrl を
6.4.3
コンテキスト追加アルゴリズムに渡した結果を
result に設定します。
result を返します。
このアルゴリズムは、マップ state、コンテキストオブジェクト context、およびコンテキスト
URL contextUrl を受け取り、
マップ state および entry を含むマップ result を返します。
context がエントリ "@import" を持つ場合:
importUrl を `context 内の "@import" の値に設定します。
state.contextMap が importUrl のエントリを持たない場合:
importUrl に関連付けられたコンテキストオブジェクトを取得し、
importContext をそのオブジェクト内の
"@context" の値に設定します。
state、importContext を context として、
および importUrl を contextUrl として渡して
6.4.3
コンテキスト追加アルゴリズムを実行した結果を
importedContextAdditionResult に設定します。
state を importedContextAdditionResult.state に、
importEntry を
importedContextAdditionResult.entry に設定します。
importEntry を
state.contextMap 内の importUrl の値に設定します。
context を、context のすべてのエントリと
importEntry.context を含むマップに設定します。
termMap を空のマップに設定します。
entry を context および termMap を含むオブジェクトに設定します。
sortedTerms を、context 内のキーを
辞書式順序でソートした結果に設定します。
context にエントリを持つ場合は isProtected を
true に、それ以外の場合は false に設定します。
sortedTerms 内の term ごとに:
term が state.keywordsMap にエントリを持つ場合、このループの次の
反復に進みます。
definition を context 内の term の値に設定します。
definition が null の場合、この
ループの次の反復に進みます。
definition が文字列の場合:
newDefinition を空のマップに設定します。
newDefinition 内の "@id" の値を definition に設定します。
definition の値を newDefinition に設定します。
definition 内の protected の値を
isProtected に設定します。
termMap 内の term の値を definition に設定します。
term が state.termToId にエントリを持たない場合:
termId を state.nextTermId に設定します。
state.nextTermId を 2 増加させます。
state.termToId 内の term の値を
termId に設定します。
state.idToTerm 内の termId の値を
term に設定します。
contextUrl が定義されている場合、state.contextMap 内の
contextUrl の値を entry に設定します。
state.contextMap 内の context の値を
entry に設定します。
result を空のマップに設定します。
result.state を state に、result.entry を
entry に設定します。
result を返します。
このセクションのコーデックは、JSON-LD 内の個々の値を CBOR に変換する方法、およびその逆の方法を 厳密に規定します。これらは前のセクションのアルゴリズムで使用され、CBOR-LD が プリミティブ型と非プリミティブ型の両方を CBOR として効率的に エンコードできるようにします。
このアルゴリズムは、マップ typeTable および値 contextValue を受け取り、
マップ encoderData を返します。
encoderData を空のマップに初期化します。
contextValue が文字列でない場合、返ります。
contextTable を
typeTable 内の "context" の値に設定します。
encoderData.context を contextValue に、
encoderData.contextTable を
contextTable に設定します。
encoderData を返します。
このアルゴリズムは、マップ encoderData を受け取り、CBOR バイナリデータを返します。
encoderData.context が
encoderData.contextTable にエントリを持つ場合、
encoderData 内の encoderData.context の値を
メジャータイプ 0(符号なし整数)オブジェクトとして CBOR エンコードしたものを返します。
encoderData.context の値をメジャータイプ 3
(テキスト文字列)オブジェクトとして CBOR エンコードしたものを返します。
このアルゴリズムは、マップ reverseTypeTable を受け取り、
マップ encoderData を返します。
reverseContextTable を
reverseTypeTable 内の "context" の値に設定します。
decoderData を空のマップに初期化します。
decoderData.reverseContextTable を
reverseContextTable の値に設定し、
decoderData を返します。
このアルゴリズムは、マップ decoderData および値 value を受け取り、
値を返します。
value が数値でない場合、value を返します。
decoderData.reverseContextTable が
value のエントリを持つ場合、そのエントリの
値を返します。
このアルゴリズムは、マップ state および termInfo、ならびに値
termType および valueToEncode を受け取り、マップ encoderData
または valueToEncode を返します。
isUrl を false に設定します。
termInfo.term が "@id" または "@type" の場合、isUrl を
true に設定します。
termInfo.def 内の "@id" の値が "@id" または "@type" の場合、
isUrl を true に設定します。
termType が "@id" または "@vocab" の場合、isUrl を true
に設定します。
isUrl が true の場合、tableType を "url" に設定します。
termType が定義されている場合、tableType を
termType に設定します。
tableType を "none" に設定します。
state.typeTable が tableType のエントリを持つ場合:
subTable を
state.typeTable 内の tableType の値に設定します。
subTable が valueToEncode のエントリを持つ場合:
intValue を
subTable 内の valueToEncode の値に設定します。
includeSign を false に設定します。
state.typesEncodedAsBytes が
tableType のエントリを持つ場合、convertToBytes を
true に設定します。
それ以外の場合、convertToBytes を false に設定します。
tableType が "none" ではなく、valueToEncode が
整数の場合:
intValue を valueToEncode の値に設定します。
convertToBytes および includeSign を
true に設定します。
intValue が定義されている場合:
encoderData を空のマップに初期化します。
encoderData.intValue を
intValue
の値に、encoderData.convertToBytes
を
convertToBytes の値に、また
encoderData.includeSign を
includeSign の値に設定します。
encoderData を返します。
tableType が state.processingModeTypeEncoders にエントリを持つ場合、
encoderData を、そのエントリのコーデックに関連付けられた
Create Encoder アルゴリズムを呼び出した結果に設定します。
encoderData が定義されている場合、encoderData を返します。
valueToEncode を返します。
このアルゴリズムは、マップ encoderData を受け取り、CBOR バイナリデータを返します。
encoderData.convertToBytes が true の場合:
intValue をバイト列に変換した結果を bytes に設定し、
includeSign の値を使用して
整数のバイナリ表現を符号付きにするか
符号なしにするかを決定します。
bytes をメジャータイプ 2(バイト文字列)オブジェクトとして CBOR エンコードしたものを返します。
intValue をメジャータイプ 0(符号なし
整数)オブジェクトとして CBOR エンコードしたものを返します。
このアルゴリズムは、マップ state および termInfo、ならびに値
termType および valueToDecode を受け取り、マップ
decoderData を返します。
isUrl を false に設定します。
termInfo.term が "@id" または "@type" の場合、isUrl を
true に設定します。
termInfo.def 内の "@id" の値が "@id" または "@type" の場合、
isUrl を true に設定します。
termType が "@id" または "@vocab" の場合、isUrl を true
に設定します。
isUrl が true の場合、tableType を "url" に設定します。
termType が定義されている場合、tableType を
termType に設定します。
tableType を "none" に設定します。
state.reverseTypeTable が tableType のエントリを持つ場合:
subTable を
state.reverseTypeTable 内の tableType の値に設定します。
useTable を false に設定します。
valueToDecode がバイト配列であり、
state.typesEncodedAsBytes が
tableType のエントリを持つ場合:
useTable を true に設定します。
intValue を
valueToDecode のバイト列を符号なし整数に変換した値に設定します。
valueToDecode が整数であり、
state.typesEncodedAsBytes が
tableType のエントリを持たない場合:
useTable を true に設定します。
intValue を valueToDecode に設定します。
useTable が true の場合:
intValue が subTable に存在しない場合、エラー
ERR_UNKNOWN_COMPRESSED_VALUE をスローします。
decoded を
subTable 内の intValue の値に設定します。
valueToDecode がバイト配列であり、tableType
が "none" でない場合、
decoded を valueToDecode の整数変換結果に設定します。
decoded が定義されている場合、decoderData を空の
マップに初期化し、decoderData.decoded を
decoded の値に設定して、decoderData を返します。
tableType が state.processingModeTypeDecoders にエントリを持つ場合、
DecoderData を、そのエントリのコーデックに関連付けられた
Create Decoder アルゴリズムを呼び出した結果に設定します。
decoderData が定義されている場合、decoderData を返します。
valueToDecode が配列でない場合、
decoderData を空のマップに初期化し、
decoderData.decoded を valueToDecode に設定して、
decoderData を返します。
このアルゴリズムは、マップ decoderData を受け取り、値を返します。
decoderData.decoded を返します。
URL コーデックは、値のプレフィックスに基づいて URL 値を圧縮します。 ここでプレフィックスとは、URL プレフィックス テーブル内で最長一致するエントリです。URL は配列としてエンコードされ、最初の整数が URL のプレフィックスを識別します。コーデックはまず、その値が既知の JSON-LD 用語識別子と一致するかどうかを確認し、一致する場合は単純な整数としてエンコードします。それ以外の場合は、 値のプレフィックスに基づいて、以下のプレフィックス固有のサブコーデックのいずれかに 処理を委譲します。
URL プレフィックステーブルは、URL プレフィックスをそれらに 関連付けられた圧縮整数識別子にマッピングします。URL コーデックを使用する実装は、以下のテーブルを使用しなければなりません。URL プレフィックス逆引きテーブルは、この テーブルを反転したものです(すなわち、整数から URL プレフィックス文字列へのマップ)。
| URL プレフィックス | 整数識別子 |
|---|---|
http:// |
1 |
https:// |
2 |
urn:uuid: |
3 |
data: |
4 |
did:v1:nym: |
1024 |
did:key: |
1025 |
このアルゴリズムは、マップ state、マップ termInfo、
および文字列 valueToEncode を受け取り、エンコーダーオブジェクト
または undefined を返します。
valueToEncode が文字列でない場合、
ERR_UNSUPPORTED_JSON_TYPE エラーをスローします。
state.termToId 内で
valueToEncode を検索した結果を termId に設定します。
termId が整数の場合、6.5.3.3
URL の
エンコードを介して呼び出されたときに、termId を
メジャータイプ 0(符号なし整数)の CBOR 項目としてエンコードするエンコーダーを返します。
valueToEncode を URL として解析しようとします。
解析に失敗した場合(すなわち、その値が有効な URL でない場合)、
undefined を返します。
valueToEncode が prefix で始まり、
prefix に続く valueToEncode の残りの部分に
":"(U+003A COLON)文字が含まれないような、URL プレフィックス
テーブル内のエントリを prefix に設定します。そのような
エントリが存在しない場合は、undefined を返します(これは、この URL を
圧縮できないことを意味します)。
prefix が "https://" または
"http://" の場合、
valueToEncode を渡して
6.5.3.6.1 HTTP
URL エンコーダーの作成を実行した結果を返します。
prefix が "urn:uuid:" の場合、
valueToEncode を渡して
6.5.3.7.1 UUID
URN エンコーダーの作成を実行した結果を返します。
prefix が "data:" の場合、
valueToEncode を渡して
6.5.3.8.1 Data
URL エンコーダーの作成を実行した結果を返します。
prefix が "did:v1:nym:" または
"did:key:" の場合、
valueToEncode を渡して
6.5.3.9.1
Base58 DID URL エンコーダーの作成を実行した結果を返します。
undefined を返します(これは、この URL を圧縮 できないことを意味します)。
このアルゴリズムは、 6.5.3.2 URL エンコーダーの作成によって生成されたエンコーダーオブジェクトを受け取り、CBOR バイナリデータを返します。
termId をメジャータイプ 0(符号なし整数)オブジェクトとして
CBOR エンコードしたものを返します。
encode メソッドを呼び出し、結果の CBOR バイナリデータを返します。
このアルゴリズムは、マップ state、マップ termInfo、
および値 valueToDecode を受け取り、デコーダーオブジェクトまたは
undefined を返します。
valueToDecode が文字列の場合、undefined を返します
(これは、その値がすでに非圧縮の URL 文字列であり、そのまま渡すことを意味します)。
valueToDecode が配列の場合:
prefixId を
valueToDecode の最初の要素に設定します。
prefix を、URL プレフィックス
逆引きテーブル内の prefixId に対応する値に設定します。
prefix が "http://" または
"https://" の場合、valueToDecode を渡して
6.5.3.6.3
HTTP URL デコーダーの作成を実行した結果を
decoder に設定します。
prefix が "urn:uuid:" の場合、
valueToDecode を渡して
6.5.3.7.3
UUID URN デコーダーの作成を実行した結果を
decoder に設定します。
prefix が "data:" の場合、
valueToDecode を渡して
6.5.3.8.3
Data URL デコーダーの作成を実行した結果を
decoder に設定します。
prefix が "did:v1:nym:" または
"did:key:" の場合、valueToDecode を渡して
6.5.3.9.4 Base58 DID URL デコーダーの作成を実行した結果を
decoder に設定します。
prefix が上記のいずれにも一致しなかった場合(
prefixId に
URL プレフィックス逆引きテーブル内の
エントリがない場合を含む)、または
decoder が
undefined の場合(これは、サブデコーダーが
valueToDecode の形状を拒否したことを意味します)、
ERR_UNKNOWN_COMPRESSED_VALUE エラーをスローします。
decoder を返します。
valueToDecode が整数の場合、
state.idToTerm 内で valueToDecode を検索した
結果を term に設定し、
6.5.3.5 URL のデコード
の呼び出しによって term を返すデコーダーを返します。
undefined を返します。
このアルゴリズムは、 6.5.3.4 URL デコーダーの作成によって生成されたデコーダーオブジェクトを受け取り、文字列値を返します。
term 文字列を返します。
decode メソッドを呼び出し、結果の文字列を返します。
HTTP URL コーデックは、プレフィックスが
http:// または https:// である値を処理します。エンコードされた HTTP URL は、
2 要素の CBOR 配列
[prefixId, remainder] として表現されます。ここで prefixId は
URL プレフィックステーブルの整数であり、remainder は
URL からプレフィックスを取り除いた部分をテキスト文字列として表したものです。
このアルゴリズムは文字列 value を受け取り、
エンコーダーオブジェクトまたは undefined を返します。
value が "https://" で始まる場合、
prefix を "https://" に設定します。
value が "http://" で始まる場合、
prefix を "http://" に設定します。
undefined を返します。
value および
prefix を含むエンコーダーオブジェクトを返します。
このアルゴリズムは、 6.5.3.6.1 HTTP URL エンコーダーの作成からのエンコーダーオブジェクトを受け取り、CBOR バイナリデータを返します。
encoderData.prefix の値を prefixId に設定します。
encoderData.prefix の後から始まる
encoderData.value の部分文字列を rest に設定します。
[prefixId, rest] を CBOR エンコードしたものを返します。これは、
メジャータイプ 0(符号なし整数)項目の後にメジャータイプ 3
(テキスト文字列)項目を含むメジャータイプ 4(配列)です。
このアルゴリズムは CBOR 配列 valueToDecode を受け取り、
デコーダーオブジェクトまたは undefined を返します。
valueToDecode がちょうど 2 要素を持ち、2 番目の
要素がテキスト文字列の場合:
valueToDecode[0] の値を
prefix に設定します。
prefix を含むデコーダーオブジェクトを返します。
undefined を返します。
このアルゴリズムは、
6.5.3.6.3 HTTP
URL デコーダーの作成からのデコーダーオブジェクトおよび CBOR 配列
valueToDecode を受け取り、文字列を返します。
decoderData.prefix と
valueToDecode[1] を連結したものを返します。
UUID URN コーデックは、プレフィックスが
urn:uuid: である値を処理します。エンコードされた UUID URN は 2 要素の CBOR 配列
[3, uuidValue] であり、uuidValue は、
UUID をバイナリ形式で表現する 16 バイトのメジャータイプ 2(バイト文字列)
(UUID 文字列がすべて小文字の場合)、または UUID 値をそのまま含む
メジャータイプ 3(テキスト文字列)(大文字と小文字の区別をバイナリ形式を介して
ラウンドトリップできない場合)のいずれかです。
このアルゴリズムは文字列 value を受け取り、エンコーダー
オブジェクトまたは undefined を返します。
value が "urn:uuid:" で始まらない場合、
undefined を返します。
value を含むエンコーダーオブジェクトを返します。
このアルゴリズムはエンコーダーオブジェクトを受け取り、CBOR バイナリデータを返します。
prefixId を 3(
URL プレフィックステーブル内の
"urn:uuid:" のエントリ)に設定します。
"urn:uuid:" の後から始まる
encoderData.value の部分文字列を rest に設定します。
rest に大文字が含まれない場合(すなわち、小文字化した形式と
等しい場合):
rest を解析して得られる UUID の 16 バイトのバイナリ表現を
uuidBytes に設定します。
rest を有効な UUID として解析できない場合、
エラーがスローされ、エンコードは失敗します。
[3, uuidBytes] を CBOR エンコードしたものを返します。これは、
メジャータイプ 0(符号なし整数)項目の後に長さ 16 のメジャータイプ 2
(バイト文字列)項目を含むメジャータイプ 4(配列)です。
[3, rest] を CBOR エンコードしたものを返します。これは、
メジャータイプ 0(符号なし整数)項目の後にメジャータイプ 3
(テキスト文字列)項目を含むメジャータイプ 4(配列)です。
このアルゴリズムは CBOR 配列 valueToDecode を受け取り、
デコーダーオブジェクトまたは undefined を返します。
valueToDecode がちょうど 2 要素を持ち、2 番目の
要素がバイト文字列またはテキスト文字列のいずれかである場合、デコーダーオブジェクトを返します。
undefined を返します。
このアルゴリズムはデコーダーオブジェクトおよび CBOR 配列
valueToDecode を受け取り、文字列を返します。
valueToDecode[1] がテキスト文字列の場合、uuid
を valueToDecode[1] に設定します。
valueToDecode[1] の UUID 文字列表現
(小文字でハイフン区切りの形式)を uuid に設定します。
"urn:uuid:" と
uuid を連結したものを返します。
Data URL コーデックは、プレフィックスが
data: である値([RFC2397] で定義されている data URL)を処理します。
Base64 エンコードされた data URL
(data:<mediatype>;base64,<data> に一致するもの)は、
3 要素の CBOR 配列
[4, mediatype, dataBytes] としてエンコードされます。Base64 でない data URL は、
2 要素の CBOR 配列 [4, rest] としてエンコードされます。ここで
rest は "data:" の後に続く URL の部分です。
このアルゴリズムは文字列 value を受け取り、エンコーダー
オブジェクトまたは undefined を返します。
value が "data:" で始まらない場合、
undefined を返します。
value を正規表現
^data:(?<mediatype>.*);base64,(?<data>.*)$
に一致させようとします。ここで各 .* は貪欲です(すなわち、文字列
";base64," が複数回出現する場合、
mediatype グループは最後の出現箇所まで拡張されます)。
data を data キャプチャ
グループの値に設定します。
data を Base64 からデコードし、
Base64 に再エンコードします。結果が data と等しい場合、
value を持ち、base64 が
true に設定されたエンコーダーオブジェクトを返します。
value を持ち、base64 が
false に設定されたエンコーダーオブジェクトを返します。
このアルゴリズムは、 6.5.3.8.1 Data URL エンコーダーの作成からのエンコーダーオブジェクトを受け取り、CBOR バイナリデータを返します。
prefixId を 4(
URL プレフィックステーブル内の
"data:" のエントリ)に設定します。
encoderData.base64 が true の場合:
encoderData.value を解析して、mediatype
("data:" と ";base64," の間の部分文字列)
および dataBytes(Base64 データ部分をバイナリデコードしたもの)を
抽出します。
[prefixId, mediatype, dataBytes] を CBOR エンコードしたものを返します。これは、
メジャータイプ 0 の整数、メジャータイプ 3 のテキスト文字列、および
メジャータイプ 2 のバイト文字列を含むメジャータイプ 4(配列)です。
"data:" の後から始まる
encoderData.value の部分文字列を rest に設定します。
[prefixId, rest] を CBOR エンコードしたものを返します。これは、
メジャータイプ 0 の整数とメジャータイプ 3 のテキスト文字列を含む
メジャータイプ 4(配列)です。
このアルゴリズムは CBOR 配列 valueToDecode を受け取り、
デコーダーオブジェクトまたは undefined を返します。
valueToDecode がちょうど 3 要素を持ち、2 番目の
要素がテキスト文字列で、3 番目の要素がバイト文字列の場合、
デコーダーオブジェクト(Base64 モード)を返します。
valueToDecode がちょうど 2 要素を持ち、
2 番目の要素がテキスト文字列の場合、デコーダーオブジェクト
(非 Base64 モード)を返します。
undefined を返します。
このアルゴリズムはデコーダーオブジェクトおよび CBOR 配列
valueToDecode を受け取り、文字列を返します。
valueToDecode が 3 要素を持つ場合(Base64 モード):
mediatype を valueToDecode[1] に設定します。
valueToDecode[2] を Base64 エンコードしたものを encodedData
に設定します。
"data:"、
mediatype、";base64,"、および
encodedData を連結したものを返します。
"data:" と
valueToDecode[1] を連結したものを返します。
Base58 DID URL コーデックは、プレフィックスが
did:v1:nym: または did:key: であり、
オーソリティ(および任意のフラグメント)コンポーネントが通常 multibase
base58btc エンコードされた文字列(文字
'z' で始まるもの)である DID URL を処理します。圧縮された DID URL は、2 要素または
3 要素の CBOR 配列 [prefixId, authority] または
[prefixId, authority, fragment] としてエンコードされます。コンポーネントが
'z' で始まり、有効な base58btc である場合、生のバイト
文字列として格納されます。それ以外の場合はテキスト文字列として格納されます。
このアルゴリズムは文字列 value を受け取り、
エンコーダーオブジェクトまたは undefined を返します。
"did:" で始まるURL プレフィックステーブル内の
各 [prefix, prefixId] ペアについて:
value が prefix で始まる場合、
value、prefix、および
prefixId を含むエンコーダーオブジェクトを返します。
undefined を返します。
このアルゴリズムは、 6.5.3.9.1 Base58 DID URL エンコーダーの作成からのエンコーダーオブジェクトを受け取り、CBOR バイナリ データを返します。
encoderData.prefix の後から始まる
encoderData.value の部分文字列を suffix に設定します。
suffix を '#' の最初の出現箇所で分割して
authority と、存在する場合は
fragment を生成します。
authority に
Multibase Base58 から CBOR トークンへ
アルゴリズムを適用した結果を
authorityEncoded に設定します。
entries を
[encoderData.prefixId, authorityEncoded] に初期化します。
fragment が定義されている場合:
fragment に
Multibase Base58 から CBOR
トークンへアルゴリズムを適用した結果を
fragmentEncoded に設定します。
fragmentEncoded を entries に追加します。
entries をメジャータイプ 4
(配列)として CBOR エンコードしたものを返します。
Multibase Base58 から CBOR トークンへアルゴリズムは文字列
str を受け取り、メジャータイプ 2(バイト文字列)の CBOR
トークン(値が base58btc multibase 文字列の場合)またはメジャータイプ 3
(テキスト文字列)の CBOR トークンのいずれかを返します。
str が 'z' で始まる場合:
str の base58btc 内容
(すなわち str[1:])をデコードした結果を
decoded に設定します。
decoded の
メジャータイプ 2(バイト文字列)の CBOR トークンを返します。
str のメジャータイプ 3(テキスト文字列)の CBOR トークンを返します。
このアルゴリズムは CBOR 配列 valueToDecode を受け取り、
デコーダーオブジェクトまたは undefined を返します。
valueToDecode がちょうど 2 または 3 要素を持つ場合:
valueToDecode[0] の値を
prefix に設定します。
prefix を含むデコーダーオブジェクトを返します。
undefined を返します。
このアルゴリズムは、
6.5.3.9.4
Base58 DID URL デコーダーの作成からのデコーダーオブジェクトおよび CBOR 配列
valueToDecode を受け取り、文字列を返します。
url を decoderData.prefix に設定します。
valueToDecode[1] がバイト文字列の場合、
'z' に続けて
valueToDecode[1] を base58btc エンコードしたものを url に追加します。
valueToDecode[1] を url に追加します。
valueToDecode が 2 要素より多く持つ場合:
valueToDecode[2] がバイト文字列の場合、
"#z" に続けて
valueToDecode[2] を base58btc エンコードしたものを url に追加します。
"#" に続けて
valueToDecode[2] を url に追加します。
url を返します。
XSD Date コーデックは、型が
http://www.w3.org/2001/XMLSchema#date である値を圧縮します。日付値は、
Unix エポック
(1970-01-01T00:00:00Z)からの秒数を表す整数として表現され、非負の値には CBOR メジャータイプ 0(符号なし
整数)として、エポックより前の日付にはメジャータイプ 1(負の整数)として
エンコードされます。このコーデックは、この表現を介して正確にラウンドトリップできる日付文字列のみを
圧縮します。それ以外の場合、元の
文字列がそのまま保持されます。
このアルゴリズムは文字列 value を受け取り、エンコーダー
オブジェクトまたは undefined を返します。
value に文字 'T'(時刻要素を示す)が含まれる場合、
undefined を返します(この値は代わりに
XSD DateTime
コーデックによって圧縮されます)。
value を ISO 8601 日付文字列として解析し、
Unix エポックからのミリ秒数として表した結果を parsed に設定します。
parsed が有効な数値でない場合、
undefined を返します。
value および
parsed を含むエンコーダーオブジェクトを返します。
このアルゴリズムは、 6.5.4.1 XSD Date エンコーダーの作成からのエンコーダーオブジェクトを受け取り、CBOR バイナリデータを返します。
secondsSinceEpoch を
floor(encoderData.parsed / 1000) に設定します。
reconstituted を、Unix
エポックから secondsSinceEpoch × 1000 ミリ秒後の時点を表す ISO 8601 文字列に設定します。
expectedDate を
reconstituted 内で最初に出現する
'T' より前の部分文字列に設定します。
encoderData.value が
expectedDate と等しくない場合、圧縮は非可逆になります。encoderData.value を
メジャータイプ 3(テキスト
文字列)オブジェクトとして CBOR エンコードしたものを返します。
secondsSinceEpoch が
0 以上の場合、
secondsSinceEpoch をメジャータイプ 0(符号なし整数)
オブジェクトとして CBOR エンコードしたものを返します。
secondsSinceEpoch を
メジャータイプ 1(負の整数)オブジェクトとして CBOR エンコードしたものを返します。
このアルゴリズムは値 valueToDecode を受け取り、
デコーダーオブジェクトまたは undefined を返します。
valueToDecode が整数(正、負、または
0)の場合、デコーダーオブジェクトを返します。
undefined を返します。
このアルゴリズムはデコーダーオブジェクトおよび整数値
value を受け取り、文字列を返します。
dateString を、Unix エポックから
value * 1000 ミリ秒後の時点を表す ISO 8601 文字列に設定します。
dateString 内で最初に
出現する 'T' より前の部分文字列を返します。
XSD DateTime コーデックは、型が
http://www.w3.org/2001/XMLSchema#dateTime である値を圧縮します。秒精度の
日時値は、Unix エポックからの秒数を表す単一の整数
(メジャータイプ 0 または 1)としてエンコードされます。秒未満の精度を持つ日時値は、
2 要素の CBOR 配列 [seconds,
milliseconds] としてエンコードされ、いずれもメジャータイプ 0 の整数となります。XSD
Date コーデックと同様に、圧縮が可逆である場合にのみ値が圧縮されます
(元の文字列がエンコーディングを介して正確にラウンドトリップする場合)。
このアルゴリズムは文字列 value を受け取り、エンコーダー
オブジェクトまたは undefined を返します。
value に文字 'T' が含まれない場合、
undefined を返します(この値は代わりに
XSD Date コーデックによって圧縮されます)。
value を
ISO 8601 日時文字列として解析し、Unix エポックからのミリ秒数として表した結果を
parsed に設定します。
parsed が有効な数値でない場合、
undefined を返します。
value および
parsed を含むエンコーダーオブジェクトを返します。
このアルゴリズムは、 6.5.5.1 XSD DateTime エンコーダーの作成からのエンコーダーオブジェクトを受け取り、CBOR バイナリ データを返します。
secondsSinceEpoch を
floor(encoderData.parsed / 1000) に設定します。
encoderData.value に文字
'.' が含まれない場合(ミリ秒要素なし):
expectedDate を、Unix
エポックから secondsSinceEpoch * 1000 ミリ秒後の時点を表す ISO 8601 文字列で、
部分文字列 ".000Z" を
"Z" に置換したものに設定します。
encoderData.value が
expectedDate と等しくない場合、圧縮は非可逆になります。
encoderData.value をメジャータイプ 3
(テキスト文字列)オブジェクトとして CBOR エンコードしたものを返します。
secondsSinceEpoch が
0 以上の場合、
secondsSinceEpoch をメジャータイプ 0(符号なし整数)
オブジェクトとして CBOR エンコードしたものを返します。
secondsSinceEpoch を
メジャータイプ 1(負の整数)オブジェクトとして CBOR エンコードしたものを返します。
millisecondIndex を
encoderData.value 内で最初に出現する
'.' のインデックスに設定します。
milliseconds を、
encoderData.value の
millisecondIndex + 1 の位置から始まる数字の整数値に設定します。
expectedDate を、Unix エポックから
secondsSinceEpoch * 1000 + milliseconds ミリ秒後の時点を表す
ISO 8601 文字列に設定します。
encoderData.value が
expectedDate と等しくない場合、圧縮は非可逆になります。
encoderData.value をメジャータイプ 3
(テキスト文字列)オブジェクトとして CBOR エンコードしたものを返します。
[secondsSinceEpoch, milliseconds] を CBOR エンコードしたものを返します。これは、
2 つのメジャータイプ 0(符号なし整数)項目を含むメジャータイプ 4(配列)です。
このアルゴリズムは値 valueToDecode を受け取り、
デコーダーオブジェクトまたは undefined を返します。
valueToDecode が整数の場合、デコーダーオブジェクトを返します。
valueToDecode がちょうど 2 要素からなる配列で、
両方の要素が数値の場合、デコーダーオブジェクトを返します。
undefined を返します。
このアルゴリズムはデコーダーオブジェクトおよび値 value
(整数または整数からなる 2 要素の配列のいずれか)を受け取り、
文字列を返します。
value が整数の場合:
instantMs を value * 1000 に設定します。
dateString を、Unix エポックから
instantMs ミリ秒後の時点を表す ISO 8601 文字列に設定します。
dateString の部分文字列 ".000Z" を
"Z" に置換したものを返します。
value が 2 要素の配列の場合):
instantMs を
value[0] * 1000 + value[1] に設定します。
instantMs を返します。
Multibase コーデックは、型が
https://w3id.org/security#multibase である値を圧縮します。multibase エンコードされた
文字列は、最初のバイトが
Multibase プレフィックスバイトであり、残りのバイトが
デコードされた
バイナリペイロードである、生のバイト文字列に変換されます。これにより、
Base エンコード文字のオーバーヘッドなしでバイナリペイロードをコンパクトに格納できます。
次の multibase エンコーディングがサポートされています:
| Multibase プレフィックス文字 | Multibase プレフィックスバイト | エンコーディング |
|---|---|---|
z |
0x7a |
Base58btc |
u |
0x75 |
Base64url(パディングなし) |
M |
0x4d |
Base64pad |
このアルゴリズムは値 value を受け取り、エンコーダー
オブジェクトまたは undefined を返します。
value が文字列でない場合、undefined を返します。
value の最初の文字が 'z'、
'u'、または 'M' の場合、
value を含むエンコーダーオブジェクトを返します。
undefined を返します(サポートされていない multibase
エンコーディング)。
このアルゴリズムは、 6.5.6.1 Multibase エンコーダーの作成からのエンコーダーオブジェクトを受け取り、CBOR バイナリデータを返します。
prefixChar を
encoderData.value の最初の文字に設定します。
prefixByte を、prefixChar に対応するMultibase プレフィックスバイト
に設定します。
content を、
encoderData.value の最初の文字の後から始まる部分文字列に設定します。
prefixChar が 'z' の場合、
content を base58btc デコードしたものを
suffixBytes に設定します。
prefixChar が 'u' の場合、
content を base64url デコードしたものを
suffixBytes に設定します。
prefixChar が 'M' の場合)、
content を base64pad デコードしたものを
suffixBytes に設定します。
bytes を長さ
1 + length(suffixBytes) のバイト配列に設定し、最初のバイトを
prefixByte に、残りのバイトを
suffixBytes に設定します。
bytes をメジャータイプ 2(バイト
文字列)オブジェクトとして CBOR エンコードしたものを返します。
このアルゴリズムは値 valueToDecode を受け取り、
デコーダーオブジェクトまたは undefined を返します。
valueToDecode がバイト文字列でない場合、
undefined を返します。
valueToDecode の最初のバイトが 0x7a、
0x75、または 0x4d の場合、デコーダーオブジェクトを返します。
undefined を返します(サポートされていない multibase
プレフィックスバイト)。
このアルゴリズムはデコーダーオブジェクトおよびバイト文字列
value を受け取り、文字列を返します。
prefixByte を value の最初のバイトに設定します。
suffix を value の残りのバイト
(すなわち、最初のバイト以降のすべてのバイト)に設定します。
prefixByte が 0x7a('z')の場合:
"z" と suffix の base58btc エンコーディングを
連結したものを返します。
prefixByte が 0x75('u')の場合:
"u" と suffix の base64url エンコーディング
(パディングなし)を連結したものを返します。
prefixByte が 0x4d('M')の場合:
"M" と suffix の base64pad エンコーディングを
連結したものを返します。
value を返します。
registryEntryId を入力として受け取り、バイト文字列
prefix を返します。
registryEntryBytes を registryEntryID の CBOR エンコーディングに設定します。
prefix を、バイト文字列 0xD9CB1D82 の末尾に
registryEntryBytes を追加した結果に設定します。
prefix を返します。
このアルゴリズムは、エンコードされた CBOR-LD ペイロード cborldBytes を入力として受け取り、
デコード対象となる主要データ suffix と、suffix の展開に使用
すべき registryEntryId の値を返します。
cborldbytes の CBOR タグが 0xCB1D(タグ値 51997)でない場合、
ERR_NON_CBOR_LD_TAG エラーをスローします。
ERR_INVALID_PAYLOAD_STRUCTURE エラーをスローします。
registryEntryId の値を、タグ付き
配列のインデックス 0 にある整数の値に設定します。
suffix の値を配列の 2 番目の要素の値に設定します。
result を空のマップに設定します。
result.suffix を suffix の値に設定し、
result.registryEntryId を
registryEntryId の値に設定します。
result を返します。
このセクションは非規範的です。
このセクションは非規範的です。
このセクションは非規範的です。
この仕様では、利用者が CBOR-LD ペイロードを識別できるようにするため、CBOR タグを登録します。 以下は暫定的なものであり、まだ IANA によって承認されていません。
タグ: 51997
レジストリ: https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml
データ項目: 配列
セマンティクス: タグ値 51997 は、ペイロードが CBOR-LD であることを示します。
セマンティクスの説明: https://w3c.github.io/cbor-ld/#cbor-tags-for-cbor-ld
連絡先: Wesley Smith (wsmith@digitalbazaar.com)
Referenced in:
Referenced in:
Referenced in:
Referenced in: