Copyright © 2017-2023 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
Web of Things は、自身の 機能を機械が解釈可能な Thing Description (TD) で記述し、それらの機能を WoT Interface、すなわち Properties(値の読み取り および書き込み用)、Action(戻り値の有無にかかわらず リモート手続きを実行するため)および Event(通知を シグナルするため)としてモデル化されたネットワーク相互作用を通じて公開できるエンティティ(Thing)で構成されます。
主な Web of Things (WoT) の概念は、 Web of Things (WoT) Architecture 1.1 仕様で説明されています。
スクリプティングは WoT における任意の構成要素であり、通常は WoT Runtime および スクリプト管理を実行できるゲートウェイまたはブラウザーで使用され、WoT のサポートを新しい種類のエンドポイントに拡張し、 TD Directory などの WoT アプリケーションを実装する便利な方法を提供します。
この仕様は、スクリプトが Thing を発見し、操作し、またスクリプトによって指定された WoT Interactions によって特徴付けられるローカルに定義された Thing を公開できるようにする、WoT Interface を表すアプリケーションプログラミング インターフェイス (API) について説明します。
この文書で定義される API は、意図的に Web of Things (WoT) Thing Description 1.1 仕様に密接に従っています。これらの上により抽象的な API を実装すること、または WoT のネットワーク向けインターフェイス(すなわち WoT Interface)を直接実装することが可能です。
この仕様は、少なくとも Eclipse Thingweb プロジェクト(node-wot としても知られる)によって実装されており、 現時点で参照用のオープンソース実装とみなされています。 ソース コード( 例を含む)を確認してください。
この節は、公開時点におけるこの文書のステータスを説明するものです。 現在の W3C 公開物の一覧およびこの技術レポートの最新改訂版は、 https://www.w3.org/TR/ にある W3C 技術レポート インデックスで確認できます。
実装者は、この仕様が不安定であるとみなされていることを 認識しておく必要があります。この仕様が最終的に Candidate Recommendation 段階に到達する前に実装することに関心のあるベンダーは、 リポジトリを購読し、 議論に参加すべきです。
この草案には、 GitHub Issues ページ(WoT Scripting API リポジトリ)を使用して貢献してください。セキュリティおよびプライバシー に関する考慮事項へのフィードバックには、WoT Security and Privacy Issues を使用してください。
この文書は、Web of Things Working Group によって、Note track を使用して Group Note として公開されました。
この Group Note は Web of Things Working Group によって承認されていますが、W3C 自体またはその メンバーによって承認されているものではありません。
これは草案文書であり、いつでも他の文書によって更新、 置換、または廃止される可能性があります。この文書を進行中の作業以外のものとして 引用することは不適切です。
W3C Patent Policy は、 この文書に対していかなるライセンス要件またはコミットメントも 課しません。
この文書は、2023年6月12日版 W3C Process Document によって管理されます。
WoT は、Thing がどのように使用されるか、すなわち Web of Things (WoT) Architecture 1.1 の用語で定義される "consumed" および "exposed" に基づいて、階層化された相互運用性を提供します。
TD を消費することにより、クライアント Thing は、リモートデバイス上のサーバー Thing によって公開される Properties、Actions および Events へアクセスできる ローカル実行時リソースモデルを作成します。
通常、スクリプトは、より単純なデバイスを WoT Thing として 公開および制御し、スクリプトを処理(たとえばインストール、アンインストール、更新など)して実行する 手段を持つブリッジまたはゲートウェイ上で使用されることを想定しています。
この仕様は、単一または 複数テナンシー、スクリプトのデプロイメントおよびライフサイクル管理を含め、 WoT Runtime がスクリプトをどのように処理し実行するかについては仮定しません。 この API は、たとえば Actions (アクションハンドラー)がスクリプトのライフサイクル管理操作を実装する管理用 Thing を公開することにより、スクリプト管理の実装を可能にする汎用メカニズムをすでにサポートしています。
この節は非規範的です。
[WOT-USE-CASES] 文書に列挙されているビジネスユースケースは、ここで説明する スクリプティングのユースケースシナリオに基づいて、この API を使用して実装できます。
この API の複数のバージョンにわたって Thing Descriptions への動的変更を評価した後、編集者は、これらのユースケースを表す最も単純な方法は、 既存の TD を取得し、それを変更(すなわち定義を追加または削除)したうえで、変更された TD に基づいて新しい Thing を作成することだと結論づけました。
非規範的であると示された節と同様に、この仕様におけるすべての作成ガイドライン、 図、例、および注は非規範的です。この仕様におけるその他すべての内容は 規範的です。
この文書におけるキーワード MAY、MUST、および SHOULD は、 ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] に記述されているとおりに解釈されます。
この仕様は、かつて W3C Recommendation になることが期待されていた Working Draft でした。しかし、現在は有益な記述のみを含む WG Note です。 したがって、この適合性の節内の記述をどのように扱うかを検討する必要があります。
この仕様は、以下の user agent (UA)のクラスに対する 適合基準を説明します。
小規模な組み込み実装の要件により、
WoT クライアントインターフェイスとサーバーインターフェイスを分割する必要がありました。
また、発見は分散アプリケーションですが、典型的なシナリオはこの仕様における
汎用発見 API によってカバーされています。その結果、この API を実装する
UA について、
クライアント用、サーバー用、および発見用の 3 つの適合クラスを使用することになりました。
この API を使用するアプリケーションは、
WoT
API object 上の
consume()、produce() および
discover() メソッドの存在を内省することで、
UA
がどの適合クラスを実装しているかを判断できます。
この適合クラスの実装は、
インターフェイスおよび
WoT
API object 上の ConsumedThingconsume() メソッドを実装しなければなりません(MUST)。
この適合クラスの実装は、
インターフェイスおよび
WoT
API object 上の ExposedThingproduce() メソッドを実装しなければなりません(MUST)。
この適合クラスの実装は、
インターフェイス、ThingDiscoveryProcessdiscover() メソッド、
exploreDirectory() メソッド、および
WoT
API object 上の requestThingDescription() メソッドを
実装しなければなりません(MUST)。
これらの適合クラスは、単一の UA に実装されてもよい(MAY)。
この仕様は、複数のプログラミング言語で WoT Scripting API を実装するために使用できます。インターフェイス定義は [WEBIDL] で指定されています。
UA は、 ブラウザー内、または Node.js などの別個のランタイム環境、 あるいは小規模な組み込みランタイム内に実装できます。
この文書で定義される API を実装するためにブラウザー内で実行される ECMAScript を使用する実装は、 Web IDL 仕様 [WEBIDL] で定義される ECMAScript Bindings と整合する方法でそれらを実装しなければなりません(MUST)。
この文書で定義される API を実装するためにランタイム内で TypeScript または ECMAScript を使用する実装は、 TypeScript 仕様 [TYPESCRIPT] で定義される TypeScript Bindings と整合する方法でそれらを実装しなければなりません(MUST)。
一般的な WoT 用語は [WOT-ARCHITECTURE] で定義されています: Thing, Thing Description (略して TD), Partial TD, Web of Things (略して WoT), WoT Interface, Protocol Bindings, WoT Runtime, Consuming a Thing Description, TD Directory, Property, Action, Event, DataSchema, Form, SecurityScheme, NoSecurityScheme などです。
WoT Interaction は、 Interaction Affordance の同義語です。Interaction Affordance(または短く affordance)は、 TD issue 282 で説明されているように、 Thing の機能を参照するときに [WOT-TD] で使用される用語です。しかし、この用語は TD の意味的コンテキストの外では 十分に理解されていません。そのため、可読性のために、この文書では以前の用語である WoT interaction、または単に interaction を代わりに使用します。
WoT network interface は、WoT Interface の同義語です。
JSON Schema は、 これらの 仕様で定義されています。
Promise,
Error,
JSON,
JSON.stringify,
JSON.parse,
internal method および
internal slot は、[ECMASCRIPT]
で定義されています。
WebIDLtypedef object ThingDescription;
[WOT-TD] で 定義される Thing Description (TD)を表します。 これは、 解析済み JSON オブジェクトであり、 JSON Schema validation を使用して検証されることが期待されます。
URL が与えられた TD のフェッチは、 Fetch API や HTTP クライアントライブラリのような外部メソッドを用いて行うべきです。これらは フェッチの詳細指定についてすでに標準化されたオプションを提供しています。
try {
let res = await fetch('https://tds.mythings.biz/sensor11');
// ... additional checks possible on res.headers
let td = await res.json();
let thing = await WOT.consume(td);
console.log("Thing name: " + thing.getThingDescription().title);
} catch (err) {
console.log("Fetching TD failed", err.message);
}
Web of Things (WoT) Thing Description 1.1 仕様は、 デフォルトを用いた短縮された Thing Description の使用を許可しており、クライアントに対して、与えられた TD で明示的に定義されていないプロパティについて、 Web of Things (WoT) Thing Description 1.1 仕様で指定されるデフォルト値でそれらを展開することを求めている点に注意してください。
[WOT-TD]
仕様は、TD
がどのように検証されるべきかを定義しています。したがって、
この API は、ThingDescription
オブジェクトがパラメーターとして使用される前に検証されることを期待します。この
仕様は、次のように基本的な TD
検証を定義します。
TypeError"
をthrowし、
停止する。
必須フィールドのデフォルト値を埋めるための追加手順が追加される可能性があります。
WoT API object をシングルトンとして定義し、適合クラスごとにグループ化された API メソッドを含みます。
WebIDL[SecureContext, Exposed=(Window,Worker)]
namespace WOT {
// methods defined in UA conformance classes
};
WebIDLpartial namespace WOT {
Promise<ConsumedThing> consume(ThingDescription td);
};
ConsumedThing
オブジェクトで解決される
Promise を返します。
このメソッドは、次の手順を実行しなければなりません(MUST):
Promise promise を返し、
次の手順を
並列に実行する。
SecurityError
でrejectし、
停止する。
ConsumedThing
オブジェクトとする。
実装は、 WoT interactions を 実装するために Protocol Bindings をどのように使用するかの複雑さをカプセル化します。 将来的には、その要素が標準化される可能性があります。
ConsumedThing
を構築することと、consume() メソッドを使用することの違いに注意してください。
後者はプロトコルバインディングも初期化しますが、単に構築されたオブジェクトでは、
呼び出されるまで
WoT Interactions
は初期化されません。
WebIDLtypedef object ExposedThingInit;
partial namespace WOT {
Promise<ExposedThing> produce(ExposedThingInit init);
};
ConsumedThing
を拡張する
ExposedThing
オブジェクトで解決される
Promise を返します。
init
オブジェクトは、ExposedThingInit
型のインスタンスです。具体的には、
ExposedThingInit
値は
ExposedThing
の初期化に使用される辞書であり、
[WOT-ARCHITECTURE]
で説明される Partial TD を表します。
そのため、これは Thing Description
と同じ構造を持ちますが、一部の情報を省略することがあります。このメソッドは、次の手順を実行しなければなりません(MUST):
Promise promise を返し、
次の手順を
並列に実行する。
SecurityError
でrejectし、
停止する。
ExposedThing
オブジェクトとする。
SyntaxError
をthrowし、
停止する。
"securityDefinitions"] 内の各
scheme について、
それが少なくとも 1 つの
Protocol Binding
によってサポートされているかを確認するよう、基盤となるプラットフォームへ要求を行う。
サポートされていない場合は、td から
scheme を削除する。
"security"]
が td.["securityDefinitions"] 内に
存在しない場合、
td から security を削除する。
authority がランタイムによって有効なものとして
認識されない場合、
form から
href を削除する。
編集者はこの手順が曖昧であると考えています。次の反復で改善または削除されます。
title の場合、
ランタイムで一意な名前を生成し、title に割り当てる。
@context の場合、
サポートされている最新の Thing Description context URI を割り当てる。instance の場合、
文字列 1.0.0 を割り当てる。forms の場合、
利用可能な
Protocol
Bindings および content types エンコーダーを使用して
Forms のリストを生成する。次に、
得られたリストを forms に割り当てる。
security の場合、
securityDefinitions フィールド内の最初にサポートされる
SecurityScheme のラベルを割り当てる。
SecurityScheme
が見つからない場合は、nosec と呼ばれる
NoSecurityScheme
を生成し、文字列
nosec を security に割り当てる。
security の値を適切に生成する方法についての議論は
まだ未解決です。issue
#299 を参照してください
href の場合、
href を持たない部分的な
Form として
formStub を定義する。
formStub の要件を満たす最初の
Protocol
Binding を使用して、有効な
url を生成する。url を
href に割り当てる。該当する
Protocol
Binding が見つからない場合は、td から
formStub を削除する。
title,
@context, instance,
forms, security, および
href.
required に等しい場合、次の手順を実行する:
Array である場合、optional 内の要素と等しい
すべての要素を削除する
string である場合、value が
optional 内のいずれかの要素と等しければ、
exposedThingInitSchema から key を削除する
JSON Schema でオブジェクトを検証する 手順は、まだ議論中です。現在、この仕様は JSONSchema の検証プロセスを参照しています。 init を exposedThingInitSchema で検証するときは、この 文書に従ってください。ワーキンググループが代替となる形式的アプローチを評価していることに 注意してください。
WebIDLpartial namespace WOT {
Promise<ThingDiscoveryProcess> discover(optional ThingFilter filter = {});
};
ThingFilter である省略可能な
filter 引数に一致する
Thing Description のために
ThingDescription
オブジェクトを提供する発見プロセスを開始します。
このメソッドは、次の手順を実行しなければなりません(MUST):
Promise promise を返し、
次の手順を
並列に実行する。
SecurityError
でrejectし、
停止する。
NotSupportedError で
rejectし、停止する。
ThingDiscoveryProcess
オブジェクトとする。
[[filter]] を
filter に設定する。
[[url]] を
undefined に設定する。
undefined
または null でない場合、
promise を
NotSupportedError で
rejectし、停止する。
OperationError
でrejectし、
停止する。
WebIDLpartial namespace WOT {
Promise<ThingDiscoveryProcess> exploreDirectory(USVString url,
optional ThingFilter filter = {});
};
ThingFilter である省略可能な
filter 引数に一致する
Thing Description のために
ThingDescription
オブジェクトを提供する発見プロセスを開始します。
このメソッドは、次の手順を実行しなければなりません(MUST):
Promise promise を返し、
次の手順を
並列に実行する。
SecurityError
でrejectし、
停止する。
NotSupportedError で
rejectし、停止する。
ThingDiscoveryProcess
オブジェクトとする。
[[url]] を
url に設定する。
[[filter]] を
filter に設定する。
これは、発見アルゴリズムのより詳細な記述のためのプレースホルダーです。 実装は、 [WOT-DISCOVERY] および [WOT-PROTOCOL-BINDINGS] 仕様で説明される手順に従うべきです。 いくつかの規範的手順を以下に示します。
NotSupportedError で
rejectし、
これらの手順を終了する。
undefined または null でない場合、
promise を
NotSupportedError で
rejectし、停止する。
この時点以降、エラーは
error にのみ記録され、
もはや promise には影響しません。
WebIDLpartial namespace WOT {
Promise<ThingDescription> requestThingDescription(USVString url);
};
Promise promise を返し、
次の手順を
並列に実行する。
SecurityError
でrejectし、
停止する。
NotSupportedError で
rejectし、停止する。
NotFoundError
でrejectし、
停止する。
Web of Things (WoT) Thing Description 1.1
仕様で指定されているように、WoT interactions は
DataSchema を拡張し、
相互作用のために 1 つが選択される複数の可能な
Form を含みます。
Form には、データを説明するための contentType が含まれます。
特定の content types については、JSON
Schema に基づいて
DataSchema が定義され、これらの内容を JavaScript 型として表現し、
最終的にデータに範囲制約を設定することが可能になります。
WebIDLtypedef any DataSchemaValue;
typedef (ReadableStream or DataSchemaValue) InteractionInput;
WoT Consumer 適合クラスに属し、 アプリケーションスクリプトから UA に提供される WoT Interaction データを表します。
DataSchemaValue は、[WoT-TD]
で定義される DataSchema に対して受け入れられる
ECMAScript 値です。
取り得る値は、
null,
boolean,
number,
string, array,
または object
型でなければなりません(MUST)。
ReadableStream
は、Thing
Description 内に DataSchema を持たず、ストリームで表現できる
Form の
contentType のみを持つ
WoT Interactions に使用されることを意図しています。
実際には、Thing Description 内に定義された
DataSchema を持つ
WoT
Interactions、または
実装によって Thing
Description 内で定義された
Form の
contentType にマッピングできる WoT Interactions には、任意の
ECMAScript 値を使用できます。
この文書のアルゴリズムは、 WoT Interactions で入力データが正確にどのように使用されるかを指定します。
WoT
Consumer 適合クラスに属します。
InteractionOutput
オブジェクトは常に実装によって作成され、
WoT Interactions から返されたデータを
アプリケーションスクリプトに公開します。
このインターフェイスは、IoT ユースケースの大部分をカバーするはずの便利な関数、
すなわち value() 関数を公開します。
その実装はデータを検査し、DataSchema に従う場合はそれを解析し、
そうでない場合は早期に失敗して、基盤となるストリームを乱さないままにします。
これにより、アプリケーションスクリプトが自分でストリームの読み取りを試みたり、
データを ArrayBuffer として処理したりできます。
WebIDL[SecureContext, Exposed=(Window,Worker)]
interface InteractionOutput {
readonly attribute ReadableStream? data;
readonly attribute boolean dataUsed;
readonly attribute Form? form;
readonly attribute DataSchema? schema;
Promise<ArrayBuffer> arrayBuffer();
Promise<DataSchemaValue> value();
};
data
プロパティは、
WoT
Interactions における生のペイロードを
ReadableStream
として表します。初期値は null です。
dataUsed プロパティは、
データストリームが
disturbed されたかどうかを示します。初期値は false です。
form 属性は、
この WoT
Interaction のために
Thing Description から選択された
Form
を表します。初期値は null です。
schema 属性は、ペイロードの
DataSchema([WoT-TD]
で定義)を
JSON
オブジェクトとして表します。初期値は null です。
[[value]] 内部スロットは、解析済みの
WoT Interaction
の値を表します。初期値は undefined です(null
は有効な値であることに注意してください)。
contentType によって記述される型の値を返します。このメソッドは
次の手順を実行しなければなりません(MUST):
Promise promise を返し、
次の手順を
並列に実行する。
undefined でない場合、
promise をその値で
resolveし、
停止する。
ReadableStream でない場合、または dataUsed が
true である場合、または form が
object
でない場合、または schema もしくはその type が
null または undefined である場合、
promise を
NotReadableError で
rejectし、停止する。
application/json でなく、かつ
form.contentType から
[JSON-SCHEMA]
へのマッピングが
Protocol Bindings
で利用できない場合、
promise を
NotSupportedError で
rejectし、停止する。
true に設定する。application/json でなく、かつ
form.contentType から
[JSON-SCHEMA]
へのマッピングが
Protocol
Bindings で利用できる場合、
そのマッピングで bytes を変換する。
Promise promise を返し、
次の手順を
並列に実行する。
ReadableStream でない場合、または dataUsed が
true である場合、
promise を
NotReadableError で
rejectし、停止する。
true に設定する。
ArrayBuffer とする。それが throw した場合、
promise をその例外で
rejectし、
停止する。
"null" であり、
payload が null でない場合、
TypeError を throw して停止する。そうでなければ
null を返す。
"boolean" であり、
payload が falsy 値であるか、その byte length が
0 である場合は false を返し、そうでなければ
true を返す。
"integer" または
"number" である場合、
TypeError を throw して停止する。
RangeError を throw して停止する。
"string" である場合、
payload を返す。
"array" である場合、次の
サブ手順を実行する:
TypeError を throw して停止する。
RangeError を throw して停止する。
"object" である場合、
次のサブ手順を実行する:
object
でない場合、
TypeError を throw して停止する。
SyntaxError を throw して停止する。
ConsumedThing
オブジェクト thing について、
source、form および schema が与えられたときに
create
interaction request を行うため、次の手順を実行する:
InteractionOutput
オブジェクトとする。
null に設定し、
idata.[[value]] を
undefined に設定する。
ReadableStream オブジェクトである場合、
idata.data を source とし、
idata を返して停止する。
null でない場合、次の
サブ手順を実行する:
"null" であり、
source が
"null" でない場合、
TypeError を throw して停止する。
"boolean" であり、
source が
falsy 値である場合、
idata.[[value]] を
false に設定し、そうでない場合は
true に設定する。
"integer" または
"number" であり、
source が number でない場合、または
form.minimum が定義されており
source がそれより小さい場合、または
form.maximum が定義されており
source がそれより大きい場合、
RangeError を throw して停止する。
"string" であり、
source が
string でない場合、idata.[[value]] を、
source が与えられたときに
JSON を bytes にシリアライズするを実行した結果とする。それが
failure である場合、
SyntaxError を throw して停止する。
"array" である場合、
次のサブ手順を実行する:
TypeError を throw して停止する。
RangeError を throw して停止する。
[[value]]
を source に設定する。
"object" である場合、
次のサブ手順を実行する:
TypeError を throw して停止する。
TypeError を throw して停止する。
SyntaxError を throw して停止する。
[[value]]
を source に設定する。
[[value]]
internal slot をその
underlying
source として作成された新しい
ReadableStream に設定する。
ConsumedThing
オブジェクト thing について、
response,
form および schema が与えられたときに
parse
interaction response を行うため、次の手順を実行する:
InteractionOutput
オブジェクトとする。
ReadableStream とする。
false とする。
InteractionInput
および InteractionOutput
の使用
次の図に示されているように、
InteractionOutput
インターフェイスは、実装がスクリプトにデータを提供するたびに使用され、
一方で InteractionInput
は、スクリプトが実装にデータを渡すときに使用されます。
ConsumedThing
がデータを読み取るとき、実装から
InteractionOutput
オブジェクトとしてデータを受け取ります。
ExposedThing
の read handler
は、読み取られるデータを
InteractionInput
として実装に提供します。
ConsumedThing
がデータを書き込むとき、それを
InteractionInput
として実装に提供します。
ExposedThing
の write
handler は、実装から
InteractionOutput
オブジェクトとしてデータを受け取ります。
ConsumedThing
が Action
を呼び出すとき、パラメーターを
InteractionInput
として提供し、Action の出力を
InteractionOutput
オブジェクトとして受け取ります。
ExposedThing
の action handler
は、実装から引数を
InteractionOutput
オブジェクトとして受け取り、
Action
の出力を
InteractionInput
として実装に提供します。
この API のアルゴリズムは、アプリケーションスクリプトに報告されるエラーを定義します。
他方の通信エンドに報告されるエラーは、 Protocol Bindings によってマッピングされ、カプセル化されます。
このトピックは Issue #200 でまだ議論されています。スクリプトエラーからプロトコルエラーへ、またその逆への マッピングの一貫性を確保するためには、標準化されたエラーマッピングが必要です。 特に、アルゴリズムが「Protocol Bindings から受け取ったエラー」と述べる場合、それは明示的なエラーマッピング アルゴリズムとして切り出される予定です。現時点では、それは実装によって カプセル化されています。
Thing を操作するためのクライアント API を表します。WoT Consumer 適合 クラスに属します。
WebIDL[SecureContext, Exposed=(Window,Worker)]
interface ConsumedThing {
constructor(ThingDescription td);
Promise<InteractionOutput> readProperty(DOMString propertyName,
optional InteractionOptions options = {});
Promise<PropertyReadMap> readAllProperties(
optional InteractionOptions options = {});
Promise<PropertyReadMap> readMultipleProperties(
sequence<DOMString> propertyNames,
optional InteractionOptions options = {});
Promise<undefined> writeProperty(DOMString propertyName,
InteractionInput value,
optional InteractionOptions options = {});
Promise<undefined> writeMultipleProperties(
PropertyWriteMap valueMap,
optional InteractionOptions options = {});
/*Promise<undefined> writeAllProperties(
PropertyWriteMap valueMap,
optional InteractionOptions options = {});*/
Promise<InteractionOutput> invokeAction(DOMString actionName,
optional InteractionInput params = {},
optional InteractionOptions options = {});
Promise<Subscription> observeProperty(DOMString name,
InteractionListener listener,
optional ErrorListener onerror,
optional InteractionOptions options = {});
Promise<Subscription> subscribeEvent(DOMString name,
InteractionListener listener,
optional ErrorListener onerror,
optional InteractionOptions options = {});
ThingDescription getThingDescription();
};
dictionary InteractionOptions {
unsigned long formIndex;
object uriVariables;
any data;
};
[SecureContext, Exposed=(Window,Worker)]
interface Subscription {
readonly attribute boolean active;
Promise<undefined> stop(optional InteractionOptions options = {});
};
[SecureContext, Exposed=(Window,Worker)]
interface PropertyReadMap {
readonly maplike<DOMString, InteractionOutput>;
};
[SecureContext, Exposed=(Window,Worker)]
interface PropertyWriteMap {
readonly maplike<DOMString, InteractionInput>;
};
callback InteractionListener = undefined(InteractionOutput data);
callback ErrorListener = undefined(Error error);
writeAllProperties() メソッドは
まだ議論中です。当面は、代わりに
writeMultipleProperties() メソッドを使用してください。
ConsumedThing の内部スロットConsumedThing
オブジェクトは、次の
internal slots を持ちます:
| 内部スロット | 初期値 | 説明(非規範的) |
|---|---|---|
| [[td]] | null |
ConsumedThing の
Thing
Description。
|
| [[activeSubscriptions]] | {} |
Event を表す
string
name で keyed された
ordered
map であり、
value は
Subscription
オブジェクトです。
|
| [[activeObservations]] | {} |
Property を表す
string
name で keyed された
ordered
map であり、
value は
Subscription
オブジェクトです。
|
フェッチした
Thing Description を
JSON オブジェクトとして取得した後、
ConsumedThing
オブジェクトを作成できます。
ThingDescription
td を用いて
ConsumedThing
を作成するには、次の手順を実行します:
SyntaxError
をthrow
して停止する。
ConsumedThing
オブジェクトとする。
[[td]] を
td に設定する。
ConsumedThing の
Thing Description を表す
ConsumedThing
オブジェクトの
[[td]] を返します。
アプリケーションは、相互作用する前にその機能を内省するため、
[[td]] に格納された
Thing
metadata を参照できます。
InteractionOutput
オブジェクトとして表したもので解決される、またはエラーで拒否される
Promise を返します。このメソッドは次の手順を実行しなければなりません(MUST):
Promise promise を返し、
次の手順を
並列に実行する。
SecurityError
でrejectし、
停止する。
[[td]].properties.propertyName とする。
undefined の場合、
promise を
NotFoundError
でrejectし、
停止する。
readproperty である
Form
とし、実装によって選択されるものとする。
SyntaxError
でrejectし、
停止する。
SyntaxError
でrejectし、
停止する。
PropertyReadMap
オブジェクトで解決される
Promise を返します。このメソッドは次の手順を
実行しなければなりません(MUST):
Promise promise を返し、
次の手順を
並列に実行する。
SecurityError
でrejectし、
停止する。
[[td]].forms
array 内の formIndex に関連付けられた
Form
とする。そうでない場合、
form を
[[td]].forms
array 内で op が
readmultipleproperties である
Form
とし、
実装によって選択されるものとする。
SyntaxError
でrejectし、
停止する。
null
である property を追加する。
NotSupportedError で
rejectし、停止する。
[[td]].properties[key]
とする。
PropertyReadMap
オブジェクトで解決される
Promise を返します。このメソッドは次の手順を実行しなければなりません(MUST):
Promise promise を返し、
次の手順を
並列に実行する。
SecurityError
でrejectし、
停止する。
[[interaction]].forms
とする。
undefined の場合、
promise を
SyntaxError
でrejectし、
停止する。
undefined でなく、かつ
forms.length より小さい場合、
subscription.[[form]] を
forms.[formIndex] に設定する。
[[form]] を、
forms 内で op が
"readallproperties" である
Form
に設定し、実装によって選択されるものとする。
[[form]] が
failure の場合、
promise を
SyntaxError
でrejectし、
停止する。
NotSupportedError で
rejectし、停止する。
[[td]].properties[key]
とする。
Promise を返します。
このメソッドは次の手順を実行しなければなりません(MUST):
Promise promise を返し、
次の手順を
並列に実行する。
SecurityError
でrejectし、
停止する。
[[td]].properties[propertyName] とする。
undefined の場合、
promise を
NotFoundError
でrejectし、
停止する。
undefined でない場合、form を
interaction.forms array 内の
formIndex に関連付けられた
Form
とする。そうでない場合、form を
interaction.forms 内で
op が writeproperty である
Form
とし、
実装によって選択されるものとする。
SyntaxError
でrejectし、
停止する。
promise をその例外で
rejectし、停止する。
Issue #193 で議論されているように、設計上の判断として、write interactions は成功またはエラーのみを返し、書き込まれた値は(任意でも)返しません。 TD は、精度や代替形式を含め、 Property 値の schema を 捕捉するべきです。相互作用から戻り値が期待される場合は、 Property の代わりに Action を使用するべきです。
Promise を返します。このメソッドは次の手順を実行しなければなりません(MUST):
Promise promise を返し、
次の手順を
並列に実行する。
SecurityError
でrejectし、
停止する。
[[td]].forms
array 内の formIndex に関連付けられた
Form
とする。そうでない場合、
form を
[[td]].forms
array 内で op が
writemultipleproperties である
Form
とし、
実装によって選択されるものとする。
SyntaxError
でrejectし、
停止する。
[[td]].properties[name]
とする。
null または
undefined である場合、または writeable
でない場合、
promise を
NotSupportedError で
rejectし、停止する。
null である property を追加する。
[[td]].properties[name]
である property を追加する。
promise をその例外で
reject
して停止する。
NotSupportedError で
rejectし、停止する。
Promise を返します。
このアルゴリズムは、各
Property ごとに有効な
Subscription
を 1 つだけ許可します。既存の
Subscription
が有効な間に新しい
Subscription
が作成されると、runtime は
NotAllowedError
を throw します。
ConsumedThing
オブジェクトの参照とする。
Promise promise を返し、
次の手順を
並列に実行する。
SecurityError
でrejectし、
停止する。
Function
でない場合、
promise を
TypeError で
rejectし、
停止する。
null でなく、かつ
Function
でない場合、
promise を
TypeError で
rejectし、
停止する。
[[activeObservations]][propertyName]
[=map/exists] の場合、
promise を
NotAllowedError で
rejectし、停止する。
Subscription
オブジェクトとする:
[[type]] を
"property" とする。
[[name]] を
propertyName とする。
[[interaction]]
を [[td]].properties[propertyName] とする。
[[thing]] を
thing とする。
[[interaction]].forms
とする。
undefined の場合、
promise を
SyntaxError で
rejectし、停止する。
undefined でなく、かつ
forms.length より小さい場合、
subscription.[[form]] を
forms.[formIndex] に設定する。
[[form]] を
forms 内で op が
"observeproperty" である
Form に設定し、実装によって選択されるものとする。
[[form]] が
failure の場合、
promise を
SyntaxError で
rejectし、停止する。
[[interaction]]
が undefined の場合、
promise を
NotFoundError で
rejectし、停止する。
[[activeObservations]][|propertyName]
を subscription に
Set
し、
promise を
resolveする。
[[form]] および
subscription.[[interaction]] を用いて
parse
interaction response を実行した結果とする。
それが throw した場合、
promise をその例外で
rejectし、停止する。
false に設定し、それ以降の
通知を抑制する。
NetworkError とし、その
message を基盤となるエラー条件を反映するように設定する。
Function
である場合、error が与えられたそれを呼び出す。
InteractionOutput
オブジェクトとして表したもので解決される、またはエラーで拒否される
Promise を返します。このメソッドは次の手順を実行しなければなりません(MUST):
Promise promise を返し、
次の手順を
並列に実行する。
SecurityError
でrejectし、
停止する。
[[td]].actions[actionName] とする。
object
でない場合、
promise を
NotFoundError
でrejectし、
停止する。
[[interaction]].forms
とする。
undefined の場合、
promise を
SyntaxError
でrejectし、
停止する。
undefined でなく、かつ
forms.length より小さい場合、
subscription.[[form]] を
forms.[formIndex] に設定する。
[[form]] を、
forms 内で op が
"invokeaction" である
Form
に設定し、実装によって選択されるものとする。
[[form]] が
failure の場合、
promise を
SyntaxError
でrejectし、
停止する。
promise をその例外で
rejectし、停止する。
Promise を返します。
このアルゴリズムは、各
Event ごとに有効な
Subscription
を 1 つだけ許可します。既存の
Subscription
が有効な間に新しい
Subscription
が作成されると、runtime は
NotAllowedError
を throw します。
ConsumedThing
オブジェクトの参照とする。
Promise promise を返し、
次の手順を
並列に実行する。
SecurityError
でrejectし、
停止する。
Function
でない場合、
promise を
TypeError で
rejectし、
停止する。
null でなく、かつ
Function
でない場合、
promise を
TypeError で
rejectし、
停止する。
[[activeSubscriptions]][eventName]
が存在しない場合、
promise を
NotAllowedError で
rejectし、停止する。
Subscription
オブジェクトとする:
[[type]] を
"event" とする。
[[name]] を
eventName とする。
[[interaction]]
を thing. [[td]].events[eventName] とする。
[[interaction]]
が undefined の場合、
promise を
NotFoundError で
rejectし、停止する。
[[thing]] を
thing とする。
[[form]] を
thing.[[interaction]].forms[formIndex]
とする。
[[form]] を、
subscription.[[interaction]].forms
array からの、op が
"subscribeevent" である
実装定義の Form とする。
[[form]]
が存在しない場合、
promise を
SyntaxError で
rejectし、停止する。
[[form]]、
options.uriVariables
に与えられた任意の URI templates、および
options.data
に与えられた任意の subscription data を用いて、
eventName で識別される
Event を購読するため、
Protocol Bindings
経由で基盤となるプラットフォームへリクエストを行う。
[[activeSubscriptions]][eventName]
から subscription へ
Setする。
[[form]] および
subscription.[[interaction]]
に対して parse
interaction response を実行した結果を与えて、
listener を呼び出す。
false に設定し、それ以降の
通知を抑制する。
NetworkError とし、その
message を基盤となるエラー条件を反映するように設定する。
Function
である場合、error が与えられたそれを呼び出す。
Thing Description に従ってアプリケーションスクリプトに公開する必要がある interaction options を保持します。
formIndex プロパティは、定義されている場合、
与えられた WoT interaction に対して使用する
TD の
Form 定義のうち、この index によって識別されるものについての
アプリケーション hint を表します。実装は interaction を行うために
この index の Form を使用するべきですが(SHOULD)、
index が見つからないか有効でない場合、この値を上書きしてもよいです(MAY)。
定義されていない場合、実装は、与えられた Wot Interaction について
TD に列挙されている出現順に
Form 定義を使用するよう試みるべきです(SHOULD)。
uriVariables プロパティは、定義されている場合、
[WOT-TD]
で定義される
解析済み JSON オブジェクトとして表される、WoT Interaction で使用される
URI template variables を表します。
URI variables のサポートは、 Web of Things (WoT) Thing Description 1.1 仕様によって明らかにされた、それらを使用する既存の RESTful endpoints を記述できるようにする必要性に由来します。しかし、この種類の interactions を表現するために Action を使用し、 URI variables を action parameters としてモデル化する Thing Description を 書くことも可能であるべきです。その場合、実装は parameters を URI variables としてシリアライズできるため、 options parameter は不要にできます。
data
プロパティは、定義されている場合、interaction に渡す必要がある追加の opaque data を表します。
Property names から、
Property が取り得る値を表す
InteractionOutput
オブジェクトへの map を表します。複数の
Properties が同時に関与する
interactions の property bag として使用されます。
Property names から、
Property が取り得る値を表す
InteractionInput
への map を表します。複数の
Properties が同時に関与する
interactions の property bag として使用されます。
ユーザーが提供する callback であり、型
InteractionOutput
の引数が与えられ、
Property changes の監視および
Event
notifications の処理に使用されます。
Events
への購読は WoT interactions であり、
options や data さえ取る可能性があるため、software events としてモデル化されません。
ユーザーが提供する callback であり、型
Error
の引数が与えられ、
Protocol Bindings から
アプリケーションへ重大および非重大なエラーを伝達するために使用されます。
Property change および Event interactions への subscription を表します。
active
boolean プロパティは、subscription が active であるかどうか、すなわち
エラーや stop() メソッドの呼び出しによって停止されていないかどうかを示します。
Subscription の内部スロット
Subscription
オブジェクトは、次の
internal slots を持ちます:
| 内部スロット | 初期値 | 説明(非規範的) |
|---|---|---|
| [[type]] | null |
Subscription
がどの
WoT
Interaction を参照するかを示します。値は
"property"、"event"、または
null のいずれかです。
|
| [[name]] | null |
Property または Event name。 |
| [[interaction]] | null |
WoT interaction を記述する Thing Description fragment。 |
| [[form]] | null |
subscription に関連付けられた Form。 |
| [[thing]] | null |
subscription に関連付けられた
ConsumedThing。
|
subscription への通知の配信を停止します。
任意 parameter options を取り、
を返します。呼び出されたとき、このメソッドは
次の手順を実行しなければなりません(MUST):
Promise
Promise promise を返し、
次の手順を
並列に実行する。
SecurityError
でrejectし、
停止する。
[[interaction]]'s
forms array 内の formIndex に関連付けられた
Form
とする。
[[form]] が与えられたときに
find a
matching unsubscribe form アルゴリズムを実行した結果とする。
SyntaxError
でrejectし、
停止する。
[[type]] が
"property" である場合、
unsubscribeForm と
options' の
uriVariables に与えられた任意の URI templates を用いて、
[[name]] で識別される
Property
の監視を停止するため、
Protocol
Bindings 経由で基盤となるプラットフォームへリクエストを行う。
[[type]] が
"event" である場合、
unsubscribeForm、
options' の
uriVariables に与えられた任意の URI templates、および
options.data
に与えられた任意の unsubscribe data を用いて、
[[name]] で識別される
Event の購読を解除するため、
Protocol
Bindings 経由で基盤となるプラットフォームへリクエストを行う。
false に設定する。
[[type]] が
"event" である場合、
[[thing]].[[activeSubscriptions]]
から
[[name]]
を削除する。
[[type]] が
"property" である場合、
[[thing]].[[activeObservations]]
から
[[name]]
を削除する。
このアルゴリズムは開発中であり、
非規範的です。実装は、与えられた
subscribe Form に一致する
unsubscribe Form を検索するために、
別のアルゴリズムを選択してもよいです(MAY)。
Subscription
オブジェクトのコンテキストで subscribeForm が与えられたときに、
一致する unsubscribe form を検索するには、
次の手順を実行します:
[[interaction]].forms
内の各 form について、
0 に設定する。
[[type]] が
"property" の場合に
form.op が
"unobserveproperty" である場合、または
[[type]]
が"event" の場合に
form.op が
"unsubscribeevent" である場合、
null を返し、これらの手順を終了する。
次の例は、URL によって TD
をフェッチし、
ConsumedThing
を作成し、metadata(title)を読み取り、property 値を読み取り、property change に購読し、
WoT event に購読し、購読解除する方法を示します。
try {
let res = await fetch("https://tds.mythings.org/sensor11");
let td = res.json();
let thing = new ConsumedThing(td);
console.log("Thing " + thing.getThingDescription().title + " consumed.");
} catch (e) {
console.log("TD fetch error: " + e.message);
};
try {
// subscribe to property change for “temperature”
await thing.observeProperty("temperature", async (data) => {
try {
console.log("Temperature changed to: " + await data.value());
} catch (error) {
console.error("Cannot read the observed property temperature");
console.error(error);
}
});
// subscribe to the “ready” event defined in the TD
await thing.subscribeEvent("ready", async (eventData) => {
try {
console.log("Ready; index: " + await eventData.value());
// run the “startMeasurement” action defined by TD
await thing.invokeAction("startMeasurement", { units: "Celsius" });
console.log("Measurement started.");
} catch (error) {
console.error("Cannot read the ready event or startMeasurement failed");
console.error(error)
}
});
} catch (e) {
console.log("Error starting measurement.");
}
setTimeout(async () => {
try {
const temperatureData = await thing.readProperty("temperature")
const temperature = await temperatureData.value();
console.log("Temperature: " + temperature);
await thing.unsubscribe("ready");
console.log("Unsubscribed from the ‘ready’ event.");
} catch (error) {
console.log("Error in the cleanup function");
}
}, 10000);
次に示すのは、
DataSchema
なしで property を読み取るための
InteractionOutput
の高度な使用法です。
/*
* takePicture affordance form:
* "form": {
* "op": "invokeaction",
* "href" : "http://camera.example.com:5683/takePicture",
* "response": {
* "contentType": "image/jpeg",
* "contentCoding": "gzip"
* }
*}
* See https://www.w3.org/TR/wot-thing-description/#example-23
*/
let response;
let image;
try {
response = await thing.invokeAction(“takePicture”));
image = await response.value() // throws NotReadableError --> schema not defined
} catch(ex) {
image = await response.arrayBuffer();
// image: ArrayBuffer [0x1 0x2 0x3 0x5 0x15 0x23 ...]
}
最後に、次の 2 つの例は、
InteractionOutput
からの
ReadableStream
の使用法を示します。
/*{
"video": {
"description" : "the video stream of this camera",
"forms": [
{
"op": "readproperty",
"href": "http://camera.example.com/live",
"subprotocol": "hls"
"contentType": "video/mp4"
}
]
}}*/
const video = await thing.readProperty("video")
const reader = video.data.getReader()
reader.read().then(function processVideo({ done, value }) {
if (done) {
console.log("live video stoped");
return;
}
const decoded = decode(value)
UI.show(decoded)
// Read some more, and call this function again
return reader.read().then(processText);
});
ここでは、JSON オブジェクトが大きすぎてメモリ内で全体を読み取れないと考えます。 したがって、リモート Web Thing によって記録された events の総数を取得するために、 streaming processing を使用します。
/*
* "eventHistory":
* {
* "description" : "A long list of the events recorded by this thing",
* "type": "array",
* "forms": [
* {
* "op": "readproperty",
* "href": "http://recorder.example.com/eventHistory",
* }
* ]
* }
*/
// Example of streaming processing: counting json objects
let objectCounter = 0
const parser = new Parser() //User library for json streaming parsing (i.e. https://github.com/uhop/stream-json/wiki/Parser)
parser.on('data', data => data.name === 'startObject' && ++objectCounter);
parser.on('end', () => console.log(`Found ${objectCounter} objects.`));
const response = await thing.readProperty(“eventHistory”)
await response.data.pipeTo(parser);
// Found N objects
ExposedThing
インターフェイスは、request
handlers、Property、Action、および Event interactions の定義を可能にする
Thing
を操作するためのサーバー API です。
WebIDL[SecureContext, Exposed=(Window,Worker)]
interface ExposedThing {
ExposedThing setPropertyReadHandler(DOMString name,
PropertyReadHandler handler);
ExposedThing setPropertyWriteHandler(DOMString name,
PropertyWriteHandler handler);
ExposedThing setPropertyObserveHandler(DOMString name,
PropertyReadHandler handler);
ExposedThing setPropertyUnobserveHandler(DOMString name,
PropertyReadHandler handler);
Promise<undefined> emitPropertyChange(DOMString name,
optional InteractionInput data);
ExposedThing setActionHandler(DOMString name, ActionHandler action);
ExposedThing setEventSubscribeHandler(DOMString name,
EventSubscriptionHandler handler);
ExposedThing setEventUnsubscribeHandler(DOMString name,
EventSubscriptionHandler handler);
Promise<undefined> emitEvent(DOMString name,
optional InteractionInput data);
Promise<undefined> expose();
Promise<undefined> destroy();
ThingDescription getThingDescription();
};
callback PropertyReadHandler = Promise<InteractionInput>(
optional InteractionOptions options = {});
callback PropertyWriteHandler = Promise<undefined>(
InteractionOutput value,
optional InteractionOptions options = {});
callback ActionHandler = Promise<InteractionInput>(
InteractionOutput params,
optional InteractionOptions options = {});
callback EventSubscriptionHandler = Promise<undefined>(
optional InteractionOptions options = {});
ExposedThing
オブジェクトは、次の
internal slots を持ちます:
| 内部スロット | 初期値 | 説明(非規範的) |
|---|---|---|
| [[td]] | null |
ExposedThing の
Thing
Description。
|
| [[readHandlers]] | {} |
property names をキーとし、
PropertyReadHandlers
を値とする
Map
|
| [[writeHandlers]] | {} |
property names をキーとし、
PropertyWriteHandlers
を値とする
Map
|
| [[observeHandlers]] | {} |
property names をキーとし、
PropertyReadHandlers
を値とする
Map
|
| [[unobserveHandlers]] | {} |
property names をキーとし、
Functions
を値とする
Map
|
| [[actionHandlers]] | {} |
action names をキーとし、
ActionHandlers
を値とする
Map
|
| [[subscribeHandlers]] | {} |
event names をキーとし、
EventSubscriptionHandlers
を値とする
Map
|
| [[unsubscribeHandlers]] | {} |
event names をキーとし、
EventSubscriptionHandlers
を値とする
Map
|
| [[propertyObservers]] | {} |
property names をキーとし、listeners の
Array を値とする
Map
|
| [[eventListeners]] | {} |
event names をキーとし、listeners の
Array を値とする
Map
|
ExposedThing の構築ExposedThing
インターフェイスは ConsumedThing を拡張します。
これは完全または部分的な ThingDescription
オブジェクトから構築されます。
既存の ThingDescription
オブジェクトは任意で変更できることに注意してください(たとえば、その properties、
actions、および events 内部
properties に要素を追加または削除することによって)。その結果のオブジェクトを
ExposedThing
オブジェクトの構築に使用できます。これは、Property、Action、および Event
定義を追加および削除する現在の方法であり、
例で示されています。
expose()
を呼び出す前は、
ExposedThing
オブジェクトは一切のリクエストを処理しないことに注意してください。これにより、まず
ExposedThing
を構築し、次に requests の処理を開始する前にその
Properties と service
handlers を初期化できます。
ExposedThingInit
init を用いて
ExposedThing
を構築するには、次の手順を実行します:
SecurityError
をthrow
して停止する。
ExposedThing
オブジェクトとする。
[[td]] を
td に設定する。
Thing の
Thing Description を表す
ExposedThing
オブジェクトの
[[td]] を返します。
アプリケーションは、それと相互作用する前にその機能を内省するため、
[[td]] に格納された
Thing
metadata を参照できます。
Property を読み取る外部リクエストを受信したときに呼び出され、
そのような requests に対して何を行うかを定義する関数です。
を返し、
PromiseReadableStream
オブジェクト、または DataSchema に適合する
ECMAScript value で解決されるか、error で拒否されます。
引数として name と handler を取ります。 name に一致する指定された Property の読み取りリクエストを 受信したときに何を行うかを定義する service handler を設定します。 error 時に throw します。chaining をサポートするために this オブジェクトへの参照を返します。
複数またはすべての
Properties の読み取り requests を処理するために
handlers を登録する必要はないことに注意してください。request
と reply は単一の network request で送信されますが、
ExposedThing
は単一 read handler への複数回の呼び出しを使用してそれらを実装できます。
handler callback function は Property の読み取りを実装するべきであり(SHOULD)、 基盤となるプラットフォームから Property を読み取る request が受信されたとき、 実装によって呼び出されるべきです。
任意の与えられた Property について handler は最大 1 つで
なければならないため(MUST)、新しく追加された
handlers は以前の handlers を置き換えなければなりません(MUST)。
任意の与えられた Property について handler が
初期化されていない場合、実装は
[[td]]
internal slot に提供された
Thing Description
に基づく default property read handler を実装するべきです(SHOULD)。
SecurityError
をthrow
して停止する。
[[td]].properties[name]
が存在しない場合、
NotFoundError
をthrow
して停止する。
[[readHandlers]][name]
を handler に設定する。
NotSupportedError を返送して停止する。
NotAllowedError を返送して停止する。
[[td]].properties.name とする。
NotFoundError を throw して停止する。
null とする。
[[readHandlers]]
internal slot 内に、ユーザー提供の
PropertyReadHandler
が存在する場合、
handler をそれとする。
null の場合、
NotSupportedError を throw して停止する。
ここで返される value は、
DataSchema に適合するべきであるか(SHOULD)、
または handler によって作成された
ReadableStream オブジェクトであるべきです(SHOULD)。
NotSupportedError を返送して停止する。
NotAllowedError を返送して停止する。
NotSupportedError を返送して停止する。
NotAllowedError を返送して停止する。
null に設定された object とする。
引数として name と handler を取ります。 name に一致する指定された Property の観測 request を 受信したときに何を行うかを定義する service handler を設定します。 error 時に throw します。chaining をサポートするために this オブジェクトへの参照を返します。
handler
callback function は Property の読み取りを実装し、
InteractionOutput
オブジェクトでresolveするか、
error でrejectするべきです。
任意の与えられた Property について handler は最大 1 つで なければならないため(MUST)、新しく追加された handlers は以前の handlers を置き換えなければなりません(MUST)。 任意の与えられた Property について handler が 初期化されていない場合、実装は Thing Description に基づく default property read handler を実装するべきです(SHOULD)。
SecurityError
をthrow
して停止する。
[[td]].properties[name]
が存在しない場合、
NotFoundError
をthrow
して停止する。
[[observeHandlers]][name]
を handler に設定する。
NotSupportedError を返送して停止する。
NotAllowedError を返送して停止する。
[[td]].properties[name]
が存在しない場合、
reply 内に NotFoundError
を返送して停止する。
[[propertyObservers]][name]
とともに内部的に保存する。
property の値が変化するたびに、
emitPropertyChange()
は application script によって明示的に呼び出される必要があります。
引数として name と handler を取ります。 name に一致する指定された Property の unobserving request を 受信したときに何を行うかを定義する service handler を設定します。 error 時に throw します。chaining をサポートするために this オブジェクトへの参照を返します。
handler callback function は、unobserve request が実装によって受信されたときに 何を行うかを実装するべきです。
任意の与えられた Property について handler は最大 1 つで なければならないため(MUST)、新しく追加された handlers は以前の handlers を置き換えなければなりません(MUST)。 任意の与えられた Property について handler が 初期化されていない場合、実装は Thing Description に基づく default handler を 実装するべきです(SHOULD)。
SecurityError
をthrow
して停止する。
[[td]].properties[name]
が存在しない場合、
NotFoundError
をthrow
して停止する。
[[unobserveHandlers]][name]
を handler に設定する。
NotSupportedError を返送して停止する。
NotAllowedError を返送して停止する。
[[td]].properties[name]
が存在しない場合、
reply 内に NotFoundError
を返送して停止する。
[[unobserveHandlers]][name] とする。
Function
である場合、options が与えられたそれを呼び出し、
Protocol Bindings
に従って reply を返送して停止する。
[[propertyObservers]][name]
が存在する場合、
this.[[propertyObservers]]
からそれを削除し、
Protocol
Bindings で定義される reply を返送して停止する。
NotFoundError
を返送して停止する。
Promise とする。
SecurityError
でrejectし、
停止する。
[[td]].properties[name] とする。
undefined の場合、
promise を
NotFoundError
でrejectし、
停止する。
undefined の場合、次のサブ手順を実行する:
null. とする。
[[readHandlers]] に
存在しない場合、
promise を
reject
して停止する。
[[readHandlers]][name]
とする。
null または undefined の場合、
promise を
reject
して停止する。
null が与えられた
handler を呼び出した結果とする。
[[propertyObservers]][name] 内の各 observer について、
次のサブ手順を実行する:
この節は拡張が必要であり、および/または [WOT-PROTOCOL-BINDINGS] のアルゴリズムを参照する必要があります。
Property を書き込む外部リクエストを受信したときに呼び出され、
そのような requests に対して何を行うかを定義する関数です。
引数として
value を取り、
を返します。これは、
handler の設定時に提供された name によって識別される
Property の値が更新されたときに
解決され、property が見つからない場合または値を更新できない場合には
error で拒否されます。
Promise
この callback function 内の code は、必要に応じて古い値を把握するために、 更新前に property を読み取ることができることに注意してください。 したがって、この function には古い値は提供されません。
値は、streams のような
DataSchema によって記述されていない値を
表現できるようにするため、実装によって
InteractionOutput
オブジェクトとして提供されます。
引数として name と handler を取ります。 handler の設定時に与えられた name に一致する Property を書き込む request を 受信したときに何を行うかを定義する service handler を設定します。 error 時に throw します。chaining をサポートするために this オブジェクトへの参照を返します。
Issue 199 で説明されているように、readonly Properties であっても write handler を指定することが可能であることに注意してください。この場合、 write handler は、request を失敗させる方法をアプリケーション固有の方法で定義してもよいです。
任意の与えられた Property について write handler は最大 1 つでなければならないため(MUST)、 新しく追加された handlers は以前の handlers を置き換えなければなりません(MUST)。 任意の与えられた Property について write handler が 初期化されていない場合、実装は Thing Description に基づいて、 Property が writeable であれば default property update を実装し、 Property が observable であれば change について observers に通知するべきです(SHOULD)。
SecurityError
をthrow
して停止する。
[[td]].properties[name]
が存在しない場合、
NotFoundError
をthrow
して停止する。
[[writeHandlers]][name]
を handler に設定する。
"single" に設定された
次の property
を更新する
手順を実行しなければなりません(MUST):
NotSupportedError を返送して停止する。
NotAllowedError を返送して停止する。
[[td]].properties[name] とする。
undefined の場合、
reply 内に NotFoundError
を返して停止する。
[[writeHandlers]][name] とする。
undefined であり、かつ実装によって提供される default write
handler が存在する場合、
handler をそれとする。
undefined の場合、reply とともに
NotSupportedError を返送して停止する。
"single" の場合、
Protocol
Bindings
に従って、成功を報告して request に応答し、停止する。
NotSupportedError を返送して停止する。
NotAllowedError を返送して停止する。
"multiple" に設定された
property を更新する
手順を実行する。それが失敗した場合、その error で
request に応答し、停止する。
Action
を呼び出す外部 request を
受信したときに呼び出され、そのような requests に対して何を行うかを定義する関数です。
params が与えられて呼び出され、
任意で options object とともに呼び出されます。
error で拒否されるか、
Action
によって返された値を
InteractionInput として解決する
を返します。
Promise
Application scripts は
ActionHandler
から ReadableStream
オブジェクトを返してもよいです(MAY)。
実装はその場合、stream を使用して
Action の response を構築します。
引数として name と action を取ります。 name に一致する Action を呼び出す request を受信したときに何を行うかを定義する handler function を設定します。error 時に throw します。 chaining をサポートするために this オブジェクトへの参照を返します。
action callback function は Action を実装し、 基盤となるプラットフォームから Action を呼び出す request を 受信したとき、実装によって呼び出されるべきです(SHOULD)。
任意の与えられた Action について handler は最大 1 つでなければならないため(MUST)、 新しく追加された handlers は以前の handlers を置き換えなければなりません(MUST)。
SecurityError
をthrow
して停止する。
[[td]].actions[name] とする。
undefined の場合、
NotFoundError
をthrow
して停止する。
[[actionHandlers]][name]
を action に設定する。
NotSupportedError を返送して停止する。
NotAllowedError を返送して停止する。
[[td]].properties[name] とする。
undefined の場合、
reply 内に NotFoundError
を返して停止する。
[[actionHandlers]][name] とする。
undefined の場合、
Protocol
Bindings に従って作成された reply とともに
NotSupportedError を返して停止する。
Event
に購読する外部 request を
受信したときに呼び出され、そのような requests に対して何を行うかを定義する関数です。
実装によって提供され、subscribers から来る
options object が与えられて呼び出されます。
error で拒否されるか、subscription が受け入れられたときに解決する
を返します。
Promise
引数として name と handler を取ります。 name に一致する指定された Event に対する subscription request を受信したときに何を行うかを定義する handler function を設定します。error 時に throw します。 chaining をサポートするために this オブジェクトへの参照を返します。
handler callback function は、 subscribe request が受信されたときに何を行うか、たとえば必要な initializations を実装するべきです(SHOULD)。 Events を発行するための handler は 別個に設定されることに注意してください。
任意の与えられた Event について event subscribe handler は最大 1 つでなければならないため(MUST)、 新しく追加された handlers は以前の handlers を置き換えなければなりません(MUST)。
SecurityError
をthrow
して停止する。
[[td]].events[name] とする。
undefined の場合、
NotFoundError
をthrow
して停止する。
[[subscribeHandlers]][name]
を handler に設定する。
this を返す。
NotSupportedError を返送して停止する。
NotAllowedError を返送して停止する。
[[td]].events[name]
とする。
undefined の場合、
NotFoundError
を返送して停止する。
[[subscribeHandlers]][name]
が Function
である場合、
options が与えられたそれを呼び出し、停止する。
[[eventListeners]][name]
を subscriber に設定する。
引数として name と handler を取ります。 name に一致する指定された Event が購読解除されたときに何を行うかを定義する handler function を設定します。error 時に throw します。 chaining をサポートするために this オブジェクトへの参照を返します。
handler callback function は、 unsubscribe request が受信されたときに何を行うかを 実装するべきです(SHOULD)。
任意の与えられた Event について handler は最大 1 つで なければならないため(MUST)、 新しく追加された handlers は以前の handlers を置き換えなければなりません(MUST)。
SecurityError
をthrow
して停止する。
[[td]].events[name] とする。
undefined の場合、
NotFoundError
をthrow
して停止する。
[[unsubscribeHandlers]][name]
を handler に設定する。
this を返す。
NotSupportedError を返送して停止する。
NotAllowedError を返送して停止する。
[[td]].events[name]
とする。
undefined の場合、
NotFoundError
を返送して停止する。
[[unsubscribeHandlers]][name]
が存在し、
かつ Function
である場合、
options が与えられたそれを呼び出し、停止する。
[[eventListeners]]
内に [=map/exists] する場合、
name を
remove
する。
this を返す。[[eventListeners]].name
とする。
undefined の場合、notification
response は
Protocol
Bindings によって指定されるとおり、空の data payload を含むと仮定する。
error reporting は protocol specific であり、実装によってカプセル化されます。client 側では、 client UA が error を検出した場合、subscription とともに渡された error listener が呼び出されます。
Promise promise を返し、
次の手順を
並列に実行する。
SecurityError
でrejectし、
停止する。
[[td]].events.name とする。
NotFoundError
でrejectし、
停止する。
Promise promise を返し、
次の手順を
並列に実行する。
SecurityError
でrejectし、
停止する。
[[td]] に対して
expand a TD 手順を実行する。
[[td]] に対して
validate a TD を実行する。
それが失敗した場合、
promise を
TypeError で
rejectし、
停止する。
[[td]].properties
内の各 key について、
value changes について observers に通知するために必要な observe
request data を格納するため、
this.[[propertyObservers]].key
を空の
Array に初期化する。
[[td]].events
内の各 key について、
event emission について subscribers に通知するために必要な subscribe
request data を格納するため、
this.[[eventListeners]].key
を空の
Array に初期化する。
[[td]]
を内省することに基づいて
WoT Interactions
を設定する。基盤となるプラットフォームに
Protocol
Bindings を初期化するよう要求し、次に
Protocol
Bindings に基づいて、
WoT Interactions
(Properties の read、write、observe、
Actions の invoke、および
Event subscriptions の管理)
に対する外部 requests の処理を開始する。
実装は任意の理由でこの手順を reject してもよいです(MAY)
(例: interaction forms に対して追加の checks と
constraints を強制したい場合)。
Error object error で
rejectし、
error.message を
Protocol
Bindings によって見られた error code に設定して停止する。
Promise promise を返し、
次の手順を
並列に実行する。
SecurityError
でrejectし、
停止する。
Error object error で
rejectし、
その
message を
Protocol
Bindings によって見られた error code に設定して停止する。
次の例は、事前に構築された部分的な
TD object に基づいて
ExposedThing
を作成する方法を示します。
try {
let temperaturePropertyDefinition = {
type: "number",
minimum: -50,
maximum: 10000
};
let tdFragment = {
properties: {
temperature: temperaturePropertyDefinition
},
actions: {
reset: {
description: "Reset the temperature sensor",
input: {
temperature: temperatureValueDefinition
},
output: null,
forms: []
},
},
events: {
onchange: temperatureValueDefinition
}
};
let thing1 = await WOT.produce(tdFragment);
// initialize Properties
await thing1.writeProperty("temperature", 0);
// add service handlers
thing1.setPropertyReadHandler("temperature", () => {
return readLocalTemperatureSensor(); // Promise
});
// start serving requests
await thing1.expose();
} catch (err) {
console.log("Error creating ExposedThing: " + err);
}
次の例は、既存の
ExposedThing
上で
Property 定義を追加または変更する方法を示します:
その td property を取得し、追加または変更してから、
それを用いて別の
ExposedThing
を作成します。
try {
// create a deep copy of thing1's TD
let instance = JSON.parse(JSON.stringify(thing1.td));
const statusValueDefinition = {
type: "object",
properties: {
brightness: {
type: "number",
minimum: 0.0,
maximum: 100.0,
required: true
},
rgb: {
type: "array",
"minItems": 3,
"maxItems": 3,
items : {
"type" : "number",
"minimum": 0,
"maximum": 255
}
}
};
instance["name"] = "mySensor";
instance.properties["brightness"] = {
type: "number",
minimum: 0.0,
maximum: 100.0,
required: true,
};
instance.properties["status"] = statusValueDefinition;
instance.actions["getStatus"] = {
description: "Get status object",
input: null,
output: {
status : statusValueDefinition;
},
forms: [...]
};
instance.events["onstatuschange"] = statusValueDefinition;
instance.forms = [...]; // update
var thing2 = new ExposedThing(instance);
// TODO: add service handlers
await thing2.expose();
});
} catch (err) {
console.log("Error creating ExposedThing: " + err);
}
以下では、
expand an
ExposedThingInit 手順を使用して、
ExposedThingInit
から
Thing Description
を生成する一連の例を扱います。仮定として、runtime は
HTTP および COAP protocol bindings をサポートし、192.168.0.1 でホストされています。
次の例は、
ExposedThingInit
を活用して、default values を持つ 1 つの
Property を備えた単純な
Thing Description
を作成する方法を示します。
TODO: ExposedThingInit
が、algorithm によって置き換えられる suggested values を含む例をさらに追加する。
Discovery は、参加する network nodes (clients、servers、directory services)からの provisioning と support を必要とする分散アプリケーションです。この API は、さまざまな IoT deployments によってサポートされる典型的な discovery schemes の client 側をモデル化します。
ThingDiscoveryProcess
オブジェクトは、discovery process を制御し、結果を返す
properties と methods を提供します。
WebIDL[SecureContext, Exposed=(Window,Worker)]
interface ThingDiscoveryProcess {
constructor(optional ThingFilter filter = {});
readonly attribute boolean done;
readonly attribute Error? error;
undefined stop();
async iterable<ThingDescription>;
};
ThingDiscoveryProcess
オブジェクトは、次の
internal slots を持ちます。
| 内部スロット | 初期値 | 説明(非規範的) |
|---|---|---|
| [[filter]] | undefined |
discovery で使用される
ThingFilter
オブジェクト。
|
| [[url]] | undefined |
discovery における TD Directory を表す
URL。
|
done
property は、discovery が停止されているか、報告すべき結果が
もうなく完了している場合に true です。
error
property は、discovery process 中に発生した最後の
error を表します。通常、discovery を停止する重大な errors に
使用されます。
ThingDiscoveryProcess
オブジェクトは async
iterator 概念を実装します。
ThingDiscoveryProcess
の構築
ThingDiscoveryProcess
を作成するには、次の手順を実行します:
null でない場合、
TypeError をthrowして
停止する。
ThingDiscoveryProcess
オブジェクトとする。
[[filter]] を
filter に設定する。
done
を false に設定する。
error
を null に設定する。
Things を発見するための制約を key-value pairs として含む object を表します。
WebIDLdictionary ThingFilter {
object? fragment;
};
fragment property は、発見された
Things
に対して property ごとに照合するために
使用される template object を表します。
query
property は、WoT Discovery task force で標準化されるまで、
ThingFilter
から一時的に削除されました。これは、実装によって受け入れられる
query string、たとえば SPARQL または JSON query を表していました。
Support は WoT Runtime 内でローカルに、
または TD Directory 内の service として
リモートに実装される予定でした。
url property は削除されました。これは、discovery request を処理する target entity、たとえば TD Directory の URL、または直接対象とされた Thing の URL を 表していましたが、現在これらは専用の methods によって実装されています。
error
property を
SyntaxError に設定し、td を破棄して
discovery process を続行する。
この時点で実装は、discovery process の flow を制御してもよいです(MAY) (たとえば memory constraints に応じて、結果を queue に入れる、 queue が大きくなりすぎた場合に discovery を一時的に停止する、 または queue が十分に空になったときに discovery を再開するなど)。 これらの手順は、発見/取得された各 td に対して実行されます。
[[filter]].fragment
とする。
object
である場合、その中で定義された各 key について:
asyncIterator を使用して
td を yield する。
適切な asyncIterator terminology を使用して この手順を改善する。
最後の error が保持されます。 実装は、それを報告すべきだと判断した場合、 discovery process を停止することを選択してもよいです(MAY)。
Error object とする。
error.name を
"DiscoveryError" に設定する。
error
を error に設定する。
done
を true に設定し、これらの手順を終了する。
SecurityError
をthrow
して停止する。
done
property を true に設定する。
次の例は、local hardware によって公開される
Things の
ThingDescription
objects を、実行されている WoT
Runtime の instances の数にかかわらず見つけます。Discovery
object によって提供される
asyncIterator を使用して、結果を非同期に反復し、
得られた
ThingDescription
objects で operations を実行できます。
let url = "https://mythings.com/thing1";
let td = await WOT.requestThingDescription(url);
console.log("Found Thing Description for " + td.title);
次の例は、TD
Directory service に listed された
Things の
ThingDescription
objects を見つけます。安全のため timeout を設定します。
let discovery = await WOT.exploreDirectory("http://directory.wotservice.org");
setTimeout( () => {
discovery.stop();
console.log("Discovery stopped after timeout.");
},
3000);
for await (const td of discovery) {
console.log("Found Thing Description for " + td.title);
let thing = new ConsumedThing(td);
console.log("Thing name: " + thing.getThingDescription().title);
};
if (discovery.error) {
console.log("Discovery stopped because of an error: " + error.message);
}
次の例は、WOT runtime に provisioned された任意の手段による generic discovery のためのもので、利用可能な場合は local Things も含みます。
let discovery = await WOT.discover();
setTimeout( () => {
discovery.stop();
console.log("Stopped open-ended discovery");
},
10000);
for await (const td of discovery) {
console.log("Found Thing Description for " + td.title);
};
if (discovery.error) {
console.log("Discovery stopped because of an error: " + error.message);
}
さまざまな状況に適応できる threat model を含む、 Web of Things の security and privacy considerations についての詳細な議論は、 参考情報文書 [WOT-SECURITY] で提示されています。この section では、scripts および WoT Scripting API に直接関連する security and privacy risks と possible mitigations のみを議論します。
WoT devices and services の security を改善するための best practices の推奨セットは [WOT-SECURITY] に文書化されています。その文書は security measures の進化に応じて更新される可能性があります。 これらの practices に従っても security が保証されるわけではありませんが、 一般に知られている vulnerabilities を回避する助けになる可能性があります。
この section は規範的であり、WoT Scripting Runtime に関連する specific risks を含みます。
任意の process を侵害する典型的な方法は、公開された interfaces のいずれかを介して corrupted input を送信することです。これは、script instance が公開する WoT interface を使用して行うことができます。
script が侵害されたり不正に動作したりした場合、script が直接公開された native device interfaces を使用できると、基盤となる physical device (および潜在的には周囲の environment)が損傷する可能性があります。 そのような interfaces が inputs に対する safety checks を欠く場合、 基盤となる physical device(または environment)を unsafe state(すなわち device が過熱して爆発する)にする可能性があります。
WoT Scripting Runtime が、製造後の scripts、WoT Scripting Runtime または関連 data(security credentials を含む)の provisioning や updates をサポートする場合、 それは major attack vector になり得ます。attacker は update または provisioning process 中に上記の要素のいずれかを変更しようとしたり、 単に attacker の code と data を直接 provision したりできます。
通常、WoT Scripting Runtime は、WoT network で動作するために WoT device に provisioned された security credentials を保存する必要があります。 attacker がこれらの credentials の confidentiality または integrity を侵害できる場合、 WoT assets への access を取得し、WoT things または devices になりすまし、 または Denial-Of-Service (DoS) attacks を作成できます。
この section は非規範的です。
この section は、script developers に関連する specific risks を記述します。
script instance は、TD によって定義された data formats、または applications によって定義された data formats を受信する可能性があります。WoT Scripting Runtime は TD によって定義された すべての input fields に対して validation を実行するべきですが(SHOULD)、 scripts は依然として input data によって exploited される可能性があります。
script が、request が認証される前に受信 requests に対して重い functional processing を行う場合、Denial-Of-Service (DOS) attacks に対して大きな risk となります。
API rationale は通常、別の文書に属しますが、WoT の場合、 context の複雑さにより、基本的な rationale をここに含めることが正当化されます。
WoT Interest Group と Working Group は、WoT における application development への さまざまなアプローチを検討してきており、それらはすべて実装およびテストされています。
WoT network interface のみを使用する WoT applications を開発することは可能です。 これは通常、clients に対して RESTful API を提示し、サポートされた IoT deployments と通信する IoT protocol plugins を実装する WoT gateway によって公開されます。 そのような実装の 1 つが Mozilla WebThings platform です。
WoT Things は software objects と良好な synergy を示すため、 Thing は software object として表現でき、 Properties は object properties として、Actions は methods として、 Events は events として表現できます。さらに、metadata は special properties に格納されます。 Consuming と exposing は、remote Thing とその interactions を直接表す software object を生成する factory methods で行われます。 そのような実装の 1 つが Arena Web Hub project です。
次の例では、lock との interactions を表す
Thing
は
次のようになります:
status property と open()
method が object 上で直接公開されます。
let lock = await WoT.consume(‘https://td.my.com/lock-00123’);
console.log(lock.status);
lock.open('withThisKey');
Things から software objects への直接 mapping には いくつかの課題があったため、この仕様では、software objects を公開して Thing metadata を data property として、WoT interactions を methods として表す別の approach を採ります。実装の 1 つが node-wot であり、これは Eclipse ThingWeb project に含まれ、この文書で指定される API の現在の reference implementation です。
同じ例は現在、次のようになります:
status property と open()
method は間接的に表現されます。
let res = await fetch(‘https://td.my.com/lock-00123’);
let td = await res.json();
let lock = new ConsumedThing(td);
console.log(lock.readProperty(‘status’));
lock.invokeAction(‘open’, 'withThisKey');
結論として、WoT WG は Web of Things (WoT) Thing Description 1.1 仕様に密接に従う第 3 の option を検討することを決定しました。 これに基づいて、simple API も実装できます。Scripting は WoT における optional module であるため、WoT network interface のみを使用する applications の余地が残されます。 したがって、上記 3 つの approaches はすべて Web of Things (WoT) Thing Description 1.1 仕様によってサポートされます。
さらに、WoT network interface は、多くの languages と runtimes で実装できます。 この API は、WoT のための Scripting API を設計する際に考慮する必要があることの example と考えてください。
fetch(url) method は、この API の以前の versions に含まれていました。
しかし現在、URL が与えられた TD の取得は、
Fetch API や
HTTP client library などの外部 method で行うべきです。これらは、fetch details の指定に関する
すでに標準化された options を提供します。その理由は、simple
fetch operations(ほとんどの use cases をカバーする)はこの API で行えたとしても、
さまざまな fetch options が必要になった場合に、既存の work を重複して
この API でそれらの options を再公開する意味がなかったためです。
TD の取得は scoped out されており、 TD validation も Web of Things (WoT) Thing Description 1.1 仕様で外部的に定義されるため、これも scoped out されています。この仕様は、 Web of Things (WoT) Thing Description 1.1 仕様に従って検証された parsed JSON object としての TD を 期待します。
Things を
consume および expose するための
factory methods は非同期であり、input
TD を完全に検証します。さらに、
parsed かつ validated された
TD を提供することで、
ConsumedThing
および ExposedThing
も構築できます。Platform initialization は、その後 WoT interactions 中に必要に応じて行われます。
以前の drafts では Observer construct が使用されていましたが、標準になっていないため、embedded implementations に十分軽量な新しい design が必要でした。したがって、 Property changes の observing と WoT Events の処理は callback registrations で行われます。
generic polymorphic な read() function ではなく、
readProperty()、
readMultipleProperties() などの function names を使用する理由は、
現在の names が
Web of Things (WoT) Thing Description 1.1
仕様の
Form 定義に由来する "op" vocabulary に正確に対応するためです。
formIndex、
streams を含む InteractionData のサポートを追加。
変更の完全な一覧については、github change log を参照してください。 最近 close された issues も確認できます。
WebIDLtypedef object ThingDescription;
[SecureContext, Exposed=(Window,Worker)]
namespace WOT {
// methods defined in UA conformance classes
};
partial namespace WOT {
Promise<ConsumedThing> consume(ThingDescription td);
};
typedef object ExposedThingInit;
partial namespace WOT {
Promise<ExposedThing> produce(ExposedThingInit init);
};
partial namespace WOT {
Promise<ThingDiscoveryProcess> discover(optional ThingFilter filter = {});
};
partial namespace WOT {
Promise<ThingDiscoveryProcess> exploreDirectory(USVString url,
optional ThingFilter filter = {});
};
partial namespace WOT {
Promise<ThingDescription> requestThingDescription(USVString url);
};
typedef any DataSchemaValue;
typedef (ReadableStream or DataSchemaValue) InteractionInput;
[SecureContext, Exposed=(Window,Worker)]
interface InteractionOutput {
readonly attribute ReadableStream? data;
readonly attribute boolean dataUsed;
readonly attribute Form? form;
readonly attribute DataSchema? schema;
Promise<ArrayBuffer> arrayBuffer();
Promise<DataSchemaValue> value();
};
[SecureContext, Exposed=(Window,Worker)]
interface ConsumedThing {
constructor(ThingDescription td);
Promise<InteractionOutput> readProperty(DOMString propertyName,
optional InteractionOptions options = {});
Promise<PropertyReadMap> readAllProperties(
optional InteractionOptions options = {});
Promise<PropertyReadMap> readMultipleProperties(
sequence<DOMString> propertyNames,
optional InteractionOptions options = {});
Promise<undefined> writeProperty(DOMString propertyName,
InteractionInput value,
optional InteractionOptions options = {});
Promise<undefined> writeMultipleProperties(
PropertyWriteMap valueMap,
optional InteractionOptions options = {});
/*Promise<undefined> writeAllProperties(
PropertyWriteMap valueMap,
optional InteractionOptions options = {});*/
Promise<InteractionOutput> invokeAction(DOMString actionName,
optional InteractionInput params = {},
optional InteractionOptions options = {});
Promise<Subscription> observeProperty(DOMString name,
InteractionListener listener,
optional ErrorListener onerror,
optional InteractionOptions options = {});
Promise<Subscription> subscribeEvent(DOMString name,
InteractionListener listener,
optional ErrorListener onerror,
optional InteractionOptions options = {});
ThingDescription getThingDescription();
};
dictionary InteractionOptions {
unsigned long formIndex;
object uriVariables;
any data;
};
[SecureContext, Exposed=(Window,Worker)]
interface Subscription {
readonly attribute boolean active;
Promise<undefined> stop(optional InteractionOptions options = {});
};
[SecureContext, Exposed=(Window,Worker)]
interface PropertyReadMap {
readonly maplike<DOMString, InteractionOutput>;
};
[SecureContext, Exposed=(Window,Worker)]
interface PropertyWriteMap {
readonly maplike<DOMString, InteractionInput>;
};
callback InteractionListener = undefined(InteractionOutput data);
callback ErrorListener = undefined(Error error);
[SecureContext, Exposed=(Window,Worker)]
interface ExposedThing {
ExposedThing setPropertyReadHandler(DOMString name,
PropertyReadHandler handler);
ExposedThing setPropertyWriteHandler(DOMString name,
PropertyWriteHandler handler);
ExposedThing setPropertyObserveHandler(DOMString name,
PropertyReadHandler handler);
ExposedThing setPropertyUnobserveHandler(DOMString name,
PropertyReadHandler handler);
Promise<undefined> emitPropertyChange(DOMString name,
optional InteractionInput data);
ExposedThing setActionHandler(DOMString name, ActionHandler action);
ExposedThing setEventSubscribeHandler(DOMString name,
EventSubscriptionHandler handler);
ExposedThing setEventUnsubscribeHandler(DOMString name,
EventSubscriptionHandler handler);
Promise<undefined> emitEvent(DOMString name,
optional InteractionInput data);
Promise<undefined> expose();
Promise<undefined> destroy();
ThingDescription getThingDescription();
};
callback PropertyReadHandler = Promise<InteractionInput>(
optional InteractionOptions options = {});
callback PropertyWriteHandler = Promise<undefined>(
InteractionOutput value,
optional InteractionOptions options = {});
callback ActionHandler = Promise<InteractionInput>(
InteractionOutput params,
optional InteractionOptions options = {});
callback EventSubscriptionHandler = Promise<undefined>(
optional InteractionOptions options = {});
[SecureContext, Exposed=(Window,Worker)]
interface ThingDiscoveryProcess {
constructor(optional ThingFilter filter = {});
readonly attribute boolean done;
readonly attribute Error? error;
undefined stop();
async iterable<ThingDescription>;
};
dictionary ThingFilter {
object? fragment;
};
この仕様を開発した元 editor の Johannes Hund(2017 年 8 月まで、 Siemens AG 在籍時)および Kazuaki Nimura(2018 年 12 月まで)に 特別な感謝を表します。また、editors は Dave Raggett、Matthias Kovatsch、 Michael Koster、Elena Reshetova、Michael McCool、およびその他の WoT WG members に対し、comments、contributions、guidance に感謝します。
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: