Caputchin
リファレンス

ウィジェットのメソッドとイベント

Caputchin のウィジェットは 2 つのカスタム要素を出荷し、あなたのページは 2 つの方向でそれらと相互作用します。要素の メソッドを呼んで それを駆動し、それが発する イベントを待ち受けて 反応します。このページは、両方の面の網羅的なリファレンスです。

すべてのイベントは bubbles: truecomposed: true で送出される CustomEvent なので、ウィジェットのシャドウ DOM を抜け出し、要素(またはどの祖先)でも直接それを待ち受けられます。データは常に event.detail にあります。

2 つの要素を一目で

要素目的メソッド
<caputchin-widget>検証のみ(proof-of-work / チェックボックス)。start()
<caputchin-game>ゲームホスト、任意の検証つき。pass()fail()

チェックボックスウィジェットは start() だけを持ちます。pass() / fail()公開しません。ゲームホストには start() がありません(そのラウンドは、インラインではマウント時に、modal / fullscreen では最初のダイアログを開いたときにライブになります)。両方の要素が startpasserrordegraded を発します。ゲームホストは加えて dialog-showndialog-hidden を発します。カバー範囲は下の イベントの表 にあります。

メソッド

start()<caputchin-widget> のみ

検証を即座に始めます。その目的は 手動トリガー です。要素が trigger="manual" を持つとき、組み込みのチェックボックスの代わりに、あなた自身のジェスチャー(たとえばフォームの送信時)から proof-of-work の解を発火するために start() を呼びます。既定の auto / click トリガーでは、要素が自身の起動を配線するので、これを呼びません。

const widget = document.querySelector("caputchin-widget");
widget.start();

ゲームホストには start() がありません。自分で駆動する完全な手順は 手動モード を参照してください。

pass(payload)<caputchin-game> のみ

検証ゲートを解放します。訪問者が成功しました。trigger="manual" のときだけ有効。手動でないゲームでそれを呼ぶと、コード invalid-callerror を発します。最初の pass() が判定を引き換えて ロック します。後の呼び出しは黙って無視されます(セッションにつき 1 ラウンド)。

const widget = document.querySelector("caputchin-game");
widget.pass({ trace: roundRecord });
payload フィールド意味
tracestringあなたのゲームが生む不透明なラウンドの記録。ゲートされたラウンドでは、サーバーが権威ある判定を導くためにそれをリプレイします。ゲートされていない、またはゲームのみのキーでは、そのまま受け付けられます。あなたのインタラクションにリプレイする記録がなければ、空の文字列を渡してください。

このメソッドに score フィールドはありません。ゲートはクライアントが申告するスコアではなく、trace のサーバーのリプレイです。(scorepass イベント には現れます。それは、あなたからウィジェットへではなく、ウィジェットからあなたへの報告です。)

ラウンドが始まる前(modal / fullscreen、まだダイアログが開いていない)に pass() を呼ぶと、コード invalid-callerror を発します。ゲームのみのキー(sitekey なし)では、解放するゲートがないので、pass() は単に token: nullpass イベントを発します。

fail(payload?)<caputchin-game> のみ

ラウンドを中止します。決定的な敗北です。trigger="manual" のときだけ有効(さもなければ invalid-call)。任意で、終わっていないラウンドはいずれにせよ非 pass として扱われます。それは進行中の検証(proof-of-work と計測のチェック)を中止し、コード game-error-relayederror イベントを表に出します。

widget.fail({ code: "out-of-moves", message: "no moves left" });
payload フィールド意味
codestring(任意)あなたの診断コード。error イベントの originalCode として表に出ます。既定は game-failed
messagestring(任意)人間が読める理由。

イベント

addEventListener(type, handler) で待ち受けます。すべてのペイロードは event.detail にあります。

イベント発する要素event.detailいつ発火するか
start両方{ gameId: string | null }検証が始まる(マウント時に自動、起動時、または start() 経由)。gameId はゲームのラウンドでは設定され、素のウィジェットでは null
pass両方{ token: string | null, score: number | null, durationMs: number | null }検証が解放される。token はあなたのバックエンドに送る包まれたトークン。ゲームのみのキー(sitekey なし)では null
error両方{ code, message, severity, originalCode? }無害な設定の警告から、厳しい失敗まで何でも。error イベント を参照。
degraded両方{ reason: "timeout" | "network" | "http" | "malformed" }ウィジェットが、設定したサイズ / スキン / ロケールを間に合うように解決できず、同梱の既定値でレンダリングしました。エラーではありません。degraded イベント を参照。
dialog-shown<caputchin-game>{ layout: "modal" | "fullscreen" }オーバーレイのゲームのダイアログが開く(プログラム的、または最初のクリック)。
dialog-hidden<caputchin-game>{ layout: "modal" | "fullscreen" }オーバーレイのゲームのダイアログが閉じる(プログラム的、Escape、または背景のクリック)。

pass イベントとトークン

pass イベントは検証が成功したというあなたへの合図ですが、それは信頼の判断では ありません。信頼の判断は、あなたのバックエンドが detail.token を確認することです。常に バックエンドでトークンを検証 してください。フロントエンドのイベントだけでアクセスを許可しては決していけません。フォームの中では、ウィジェットはトークンを caputchin-token フィールドとしても注入するので、通常のフォーム POST がそれを運びます。このイベントの scoredurationMs は、クライアントが報告する分析で、null になり得ます。決してそれらを信頼のシグナルとして扱わないでください。

error イベント

error イベントは、安定した code、人間向けの messageseverity、そして時には originalCode を運びます。各コードは固定の既定の severity を持つので、コードと severity の表をハードコードする ことなく、「走り続けた」警告を「本当に壊れた」失敗から絞り込めます。detail.severity を読むだけです。コードの完全なセット:

codeseverity意味
invalid-configwarnウィジェットが拒否した属性か組み合わせ。優雅に劣化し、走り続けます。
invalid-callwarn有効でないときに呼ばれたメソッド(たとえば手動でないゲームでの pass()、またはラウンドが始まる前)。
verification-failederrorproof-of-work か計測のチェック(またはトークンの引き換え)が失敗。トークンは発行されません。
game-load-failederrorゲームのバンドルを解決、読み込み、登録できませんでした。
gate-unavailableerrorサーバーがブートストラップで権威ある拒否を返しました(ゲートされたキーが有効なゲームを供給できませんでした)。
game-error-relayederrorゲームの中から表に出たエラー(iframe から、または手動の fail() から中継)。

detail.originalCode は、公開の code がより具体的な内部の理由の一般化であるときに存在します(たとえば、game-load-failed として中継された iframe の読み込み失敗は、生の iframe-load-failed / iframe-script-blocked / game-not-registeredoriginalCode に運びます)。分岐には code を、診断にだけ originalCode を使ってください。

degraded イベント

マウント時、ウィジェットは Caputchin に短い呼び出しを 1 回行い、あなたが設定したサイズ、スキン、ロケール(そしてマーケットプレイスのゲームなら、その好みのフットプリント)を解決します。その呼び出しが失敗したり遅すぎたりしても、ウィジェットはブロックも破綻もしません。バンドルに焼き込まれた値でレンダリングし、degraded を発するので、フォールバックが静かに起こることは決してありません。degraded イベントの後もウィジェットは完全に機能し続け、解決された見た目だけが、あなたが設定したものと異なる場合があります(ゲームが既定のサイズで現れたり、チェックボックスが既定のテーマで現れたりします)。ウィジェットはフォールバックする前に遅い解決を再試行するので、degraded は試行が尽きたことを意味し、1 回の試行が遅かったことではありません。

detail.reason は、解決がなぜフォールバックしたかを教えるので、あなた自身のテレメトリに表せます:

reason意味
timeout解決が時間の予算内に答えませんでした(サービスが遅いか到達不能)。
networkリクエスト自体が失敗しました(オフライン、DNS、ブロック、または接続リセット)。
httpサービスがエラーのステータスで答えました。
malformedサービスは答えましたが、ボディが有効ではありませんでした。

degraded は通知であって失敗ではないので、意図的に error イベントでは ありません。遅い解決が、本当の失敗のために配線したハンドラを発火させるべきではないからです。劣化したレンダリングを観察したい場合だけ、たとえば訪問者がフォールバックの見た目を見ているときに警報を出すために、これを待ち受けてください。

実践での待ち受け

const widget = document.querySelector("caputchin-game");

const onPass = (e) => {
  // send e.detail.token to your backend to verify
};
const onError = (e) => {
  if (e.detail.severity === "error") {
    console.error(e.detail.code, e.detail.message);
  }
};

widget.addEventListener("pass", onPass);
widget.addEventListener("error", onError);

// Clean up when you tear down your view:
widget.removeEventListener("pass", onPass);
widget.removeEventListener("error", onError);

これらはネイティブの DOM CustomEvent なので、React では refaddEventListener でそれらを取り付けます(JSX の onPass プロップではなく)。フロントエンドの例 が、フレームワーク固有の配線を示します。すべてのイベントはバブルし composed なので、各ウィジェットを個別にバインドするのではなく、コンテナ要素から委譲もできます。

あわせて読む

このページの内容