本文へスキップ

セレクタ

セレクタは、HTTPリクエストまたはWebSocketコマンドがどのデバイスおよび どのセッションを対象としているかを特定します。

デバイスセレクタ — URLパス​

すべてのデバイスレベルのHTTPパスにおいて /{device_type}/{id_or_index}/… 形式として使用されます。

経路の例セレクタの意味
inverse3/0インデックス(0から始まる)に基づく最初のものInverse3
inverse3/A14デバイスIDが A14人Inverse3
inverse3/*すべてのInverse3 デバイス(ワイルドカード)
*inverse/*すべてのInverseシリーズ製品(Inverse3 、Inverse3x、Minverse )
inverse3:left/0インデックス基準で最初の左利き Inverse3
*inverse:right/0インデックス基準で最初の右利き用Inverse シリーズデバイス
verse_grip/0インデックス基準で最初の有線型VerseGrip
wireless_verse_grip/*すべてのワイヤレスVerseGrip
*verse_grip/*すべてのVerseGripシリーズ製品(有線、無線、カスタム)
*verse_grip:custom/0インデックス基準で最初のカスタムVerseGrip(custom_verse_grip/0(上記と同様)

クラスフィルターはインデックス作成の前に適用されます​

<type>:<class>/<N> セレクタはまず クラスフィルターを適用した後、フィルタリングされた集合に対してインデックス作成を行います。 <N>は、元のデバイス一覧ではなく、フィルタリングされた一覧内の位置を指しています:

  • *inverse:left/0 — 「左利き」Inverseシリーズのデバイスの中で0番目 デバイスです。3台のInverseデバイスが接続されている場合(右、左、右の順)、このセレクタは2番目のデバイスとして解釈されます。インデックス 0まずデバイスを選んでから、「左利き用」という条件で絞り込むという方法ではありません。
  • inverse3:right/0 — 右利きInverse3 の 0番目のデバイス。
  • *inverse:left/3 — 左利き用Inverseシリーズのデバイスが4台未満接続されている場合、Inverseデバイス全体の台数が4台を超えていても 404を返します。

同じルールはワイルドカードセレクタにも適用されます。 *inverse/*わあ *verse_grip/*は、当該シリーズの すべての デバイスと一致し、これらのセレクタを対象とする POST および DELETE リクエストは最初のデバイスだけでなく、 一致するすべての 変更をデバイスに反映します。

ルール:

  • GET(曖昧であるため)ワイルドカードセレクタを拒否します → 400
  • POSTわあ DELETEワイルドカードが使用可能です — 操作は一致するすべてのデバイスに適用されます
  • 404 回答は no device matches selector '<sel>' この形式を使用します。ここで <sel>これは、受信された元のセレクタ式です

対応している {device_type} 値: inverse3, verse_grip, wireless_verse_grip、または範囲ワイルドカード *inverse, *verse_grip.

セッションセレクタ — ?session=<expr> クエリパラメータ​

セッションスコープのHTTPエンドポイント(basis、mount、preset、filters、navigation、SDF)は、どのセッションのコンテキストで処理を行うかを特定するために ?session=<expr> クエリパラメータが必要です。

式意味
(中略)すべてのセッション(DELETE(~でのみ許可)
#123 または 123IDが123のセッション
:0インデックスに基づく最初のセッション
:-1インデックス基準の直近のセッション
profile_nameこのプロフィールを持つ最初のセッション(曖昧な場合あり)
profile_name:0このプロファイルを持つセッションのうち、インデックス0のセッション
:default:0プロフィール defaultを持つセッションのうち、インデックス0のセッション
co.haply.hub::*:0プロフィールが co.haply.hub::で始まる最初のセッション(glob ワイルドカード)
:co.haply.hub::*:-1co.haply.hub:: ネームスペースの最後のセッション

例:

GET /inverse3/0/config/navigation?session=:default:0

プロフィール名のワイルドカード​

プロファイルパターンでは、2種類のglobメタ文字が使用可能です:

メタ文字意味
*任意の文字列と一致します(空文字列を含む)
?正確に1文字一致します

それ以外のすべての文字(:, ., -, [, ] (含む)は文字通り一致します([abc]のような文字クラスは サポートされていません). 一致の判定では大文字と小文字が区別されます。

独占 *(または all)は従来通り すべてのセッションという意味です。名前は *で始まるプロフィールと一致させるには、1文字以上の異なる文字を含めてください(例: *foo).

役立つパターン:

  • co.haply.hub::* — co.haply.hub:: その名前空間に属するすべてのプロフィール
  • *-update — -updateで終わるすべてのプロフィール
  • co.haply.*:* — 名前空間が co.haply.で始まるすべてのプロフィール
  • defaul? — defaulで始まる7文字のプロフィールすべて

ワイルドカードパターンは単独では 曖昧です(2つ以上のセッションに一致する可能性があります)。 GET / POST エンドポイントで使用する場合は、末尾に :<index>を付けて、対象を明確に指定します:

# First session in the Haply Hub namespace
GET /inverse3/0/config/basis?session=co.haply.hub::*:0

# Last session in a Unity namespace
GET /inverse3/0/config/mount?session=:co.haply.unity::*:-1

インデックスのない曖昧なワイルドカードは、GET/POSTでは 400として拒否されます。複数のセッションとの一致を明示的に許可するパスでは許可されますが、これは GET /sessions/<sel>(一致するすべての項目を返す)と DELETE エンドポイント(一致するすべての対象に適用)です。

セッションセレクタ — URLパス​

/sessions/{selector} エンドポイントは 経路パラメータと同じ式を許可します。単一のセッションを照会したり、そのセッションが存在するかどうかを確認したりする際に便利です:

GET /sessions # list all active sessions
GET /sessions/:default:0 # one session by profile + index
GET /sessions/:-1 # last active session
GET /sessions/#42 # session id 42
GET /sessions/co.haply.hub::* # every session in the co.haply.hub:: namespace
GET /sessions/co.haply.hub::*:0 # first session in that namespace

これは GET /sessions?session=<selector>機能的には同じです。どちらのパスも、同じハンドラを呼び出します。 GET /sessions/<sel>は :<index> 接尾辞なしで曖昧なワイルドカードパターンを許可する数少ないエンドポイントの一つであり、 GET /sessionsのようなリストラッパー形式に一致するすべての項目を返します。

セレクタはそのまま渡されます

#42わあ *上記のすべてのセレクタ形式(含まれるプロファイルパターンを含む)は、標準のHTTPクライアント(Python requests, libhv, curl, fetch)をそのまま送信します。クライアント側でのURLエンコーディングは必要ありません。シェルでは # または *が含まれるトークンは引用符で囲んでください(例: --session "#42", --session "co.haply.hub::*:0"). そうすれば、シェルはこれをコメントとして扱ったり、ローカルファイルに対してglob展開を行ったりしません。

一つの例外: ? glob メタ文字は パスURL クエリの区切り文字です。パス形式のセレクタ(例: /sessions/defaul?:0)では %3Fパーセントエンコーディングを行う必要があります — GET /sessions/defaul%3F:0. クエリ形式セレクタ(?session=defaul?:0)では、最初の ?クエリを分割し、その後の ? メッセージは変更されることなく、そのまま送信されます。

WebSocketセッションにはセレクタは必要ありません

WebSocket接続では、ユーザー自身がセッションそのものです。 configure および commands 項目は、現在のセッションのデバイスを自動的に対象とします。セッションセレクタは HTTP リクエスト(セッション間のリモート制御を含む、 セッション (参照)でのみ必要です。