ドキュメント

アプリケーション CLI コマンド

Web アプリケーションのパック、アップロード、更新、削除と、そのキー/バリューストアおよび webhook の読み書き。

ここにあるコマンドはすべて CLI リファレンスの説明どおりに動作します。グローバルフラグ、JSON 出力、終了コード、リビジョン、再試行。

アプリケーション

アプリケーションはすでに構築済みの静的ディレクトリで、ルートは index.html です。パッカーはブラウザ SDK を _screenrig/runtime.js に注入し、スクリプトタグを追加するため、ビルドステップなしで window.screenrig に到達し、依存関係に何も追加しません。ディレクトリ内のファイルはパッキング中にビルドや実行されません。

app pack#

静的ディレクトリをアップロードせずに決定論的アーカイブにパックします。

app pack <directory> [--output FILE]
パラメータータイプ必須デフォルトメモ
<directory>パスはいなしビルド済み静的ディレクトリ。ルート index.html が必要です。
--output FILEパスいいえ何も書かれていませんアーカイブをこのパスに書き出します。指定しない場合、コマンドはアーカイブを報告しメモリに保持します。
screenrig app pack ./lobby-board --output ./lobby-board.tgz

エンベロープはsha256、compressed_bytes、expanded_bytes、file_count、エントリーリスト、SDKランタイムが注入されたかを報告します。app uploadはディレクトリ自体をパックするため、アーカイブを先に調べたい場合にこのコマンドを使用してください。ローカルで実行され、サインインは不要です。

パッケージは、最大 5000 ファイル、展開後 250 MiB、圧縮後 100 MiB、1 ファイル最大 32 MiB で、パスは最大 16 階層・255 バイトです。パッキングでは、. で始まる名前、node_modules/、bower_components/、jspm_packages/、vendor/、venv/、__pycache__/、CVS/、ソースマップ *.map、鍵と認証情報のファイル(*.pem, *.key, *.p12, *.pfx, *.crt, *.cer, id_rsa, id_dsa, id_ecdsa, id_ed25519, credentials.json, secrets.json)、エディターのスワップ・バックアップファイル、Thumbs.db、desktop.ini が除外されます。ディレクトリのルートにある .screenrigignore ファイルは gitignore 形式のパターンを 1 行に 1 つ追加しますが、組み込みの除外を取り消すことはできません。シンボリックリンク、ハードリンク、スパースファイル、デバイス、重複するパス(大文字小文字を区別せず比較)、パッキング中に変化するファイル、ルートに index.html がないディレクトリは、パスを示して拒否されます。コマンドは終了コード 2 で終了し、何も送信しません。

アプリケーションはインラインコードをブロックするコンテンツセキュリティポリシーの下で実行されます。パッキングはインラインスタイルとスクリプトブロックを、各 HTML ドキュメントの隣にある _screenrig-inline-* ファイルに移動しリンクします。onclick= や javascript: のようなインラインイベントハンドラーや URL は移動できず、パッキングは拒否しファイル名と行を示します。

app types#

window.screenrig の TypeScript 型をディレクトリに書き込みます。

app types [directory]
パラメータータイプ必須デフォルトメモ
[directory]パスいいえカレントディレクトリscreenrig.d.ts を書き込むディレクトリ。存在している必要があります。
screenrig app types ./src

エンベロープは path、bytes、sha256、および、ファイルがすでに最新の型を含んでいた場合に false となる written を報告します。ファイルは app pack と app upload が注入するランタイムと一致するため、CLI を更新したらコマンドをもう一度実行してください。既存の screenrig.d.ts は丸ごと置き換えられ、そのパスにあるディレクトリやシンボリックリンクは拒否され、コマンドは終了コード 2 で終わります。ローカルで実行され、サインインは不要です。型が宣言する内容は TypeScript を参照してください。

app dev#

アップロードする前にアプリケーションを試せるよう、ディレクトリをローカルの Player ハーネスで提供します。

app dev <directory> [--port PORT] [--open] [--no-reload] [--kv FILE | --kv-from APP_ID]
パラメータータイプ必須デフォルトメモ
<directory>パスはいなしビルド済み静的ディレクトリ。ルート index.html が必要です。
--port PORTintegerいいえ18890ハーネスが待ち受けるポート。ランタイムがハーネスを信頼するのは 18890 だけなので、ほかのポートは拒否されます。
--openbooleanいいえオフハーネスをブラウザーで開きます。
--no-reloadbooleanいいえオフファイルが変更されてもページをそのままにします。指定しない場合は、変更のたびにページが再読み込みされます。
--kv FILEパスいいえ.screenrig-dev/kv.jsonこの実行のキー/バリューストアを保持する JSON ファイル。
--kv-from APP_IDstringいいえなしファイルの代わりに、このアップロード済みアプリケーションのキー/バリューストアを読み取り専用で読みます。
screenrig app dev ./lobby-board --open

このコマンドは http://play.screenrig.localhost:18890 でハーネスを提供し、停止するまで実行され続けます。app pack と同様にランタイムを注入し、編集するたびに、パックが拒否する内容をファイル名と行を示して報告します。ハーネスは、機能、ビューポート、スクリーンの名前、タイムゾーン、パラメーター、ページタイマー、一時停止、ディスプレイ、離脱、デバイスイベント、そしてシリアルポート、GPIO ライン、Bluetooth LE ペリフェラル、プリンターをシミュレートします。emit と log の行はターミナルに出力されます。操作部分は ローカルで開発するで説明しています。

app upload#

ディレクトリをパックし、新しいアプリケーションリリースとして公開し、公開の成功を待ちます。

app upload <directory> [--name NAME] [--no-wait] [--poll-ms MS] [--timeout MS]
パラメータータイプ必須デフォルトメモ
<directory>パスはいなしビルド済み静的ディレクトリ。
--name NAMEstringいいえ生成された名前アプリケーション名。前後の空白を除いて 1~120 文字、制御文字は使えません。
--no-waitbooleanいいえオフ公開操作が完了する前に返します。リリースをplaylistにピン留めする前にoperations waitを実行してください。
--poll-ms MSintegerいいえ1000待機中の操作ポーリングの間隔。
--timeout MSintegerいいえ120000待機の期限です。各基底リクエストの制限にもなります。
screenrig app upload ./lobby-board --name "Lobby board"

3つのフィールドを読み取ります:data.operation.stateはsucceeded、data.application.release_idはrel_のIDでapplicationのプリミティブピン、data.application.idはapp_のIDでkvコマンドが使用します。成功した操作はリリースが使用可能であることを意味し、リリースID単独ではありません。

すべてのapp uploadは新しいアプリケーションと最初の不変リリースを作成します。同じアプリの後続リリースを公開するにはapp updateを使います。プレイリストは編集するまで既にピン留めされたリリースを提供し続けます。

中断したストレージへの転送は、アップロード URL が有効な間、最大 4 回試行されます。それでも失敗する場合は、同じコマンドをもう一度実行して同じアップロードを再開してください。

app update#

既存アプリケーションの新リリースを公開し、ID、名前、アプリケーションK/Vを保持します。

app update <id> <directory> [--expect-rev REVISION] [--no-wait] [--poll-ms MS] [--timeout MS]
パラメータータイプ必須デフォルトメモ
<id>stringはいなしapp_アプリケーションID
<directory>パスはいなしビルド済み静的ディレクトリ。
--expect-rev REVISIONstringいいえなしオプションのリビジョン前提条件。現在のリソースを書き込む場合は省略します。提供された古い値はrevision_conflictです:再取得、再適用、再試行。
--no-waitbooleanいいえオフ公開操作が完了する前に返します。リリースをplaylistにピン留めする前にoperations waitを実行してください。
--poll-ms MSintegerいいえ1000待機中の操作ポーリングの間隔。
--timeout MSintegerいいえ120000待機の期限です。各基底リクエストの制限にもなります。
screenrig app update app_01EXAMPLEAPP00000000000 ./lobby-board

名前はそのまま残ります。変更するにはapp renameを使います。data.operation.state: "succeeded"を待ってから、playlist replace-releaseを使って正確なページ、プリミティブ、新しいリリース、および影響を受けるスクリーンを確認してください。返されたインパクトトークンと、playlist workflowで説明されているオプションのリビジョンガードを使って適用します。既存のplaylistピンは適用まで変更されません。リビジョンの競合があった場合は、再試行するかどうかを決める前にアプリを再度読み込み、競合を回避するためだけに置き換えアプリケーションを作成しないでください。

app list#

プロジェクトのアプリケーション一覧

app list

パラメーターなし。

screenrig app list

app rename#

アプリケーションの表示名を変更します。

app rename <id> --name NAME [--expect-rev REVISION]
パラメータータイプ必須デフォルトメモ
<id>stringはいなしapp_アプリケーションID
--name NAMEstringはいなし新しい名前。前後の空白を除いて 1~120 文字、制御文字は使えません。
--expect-rev REVISIONstringいいえなしオプションのリビジョン前提条件。現在のリソースを書き込む場合は省略します。提供された古い値はrevision_conflictです:再取得、再適用、再試行。
screenrig app rename app_01EXAMPLEAPP00000000000 --name "Lobby welcome"

変更されるのは表示名だけです。アプリケーション ID、リリース、キー/値データ、リリースを固定しているプレイリストはそのままで、ディレクトリのアップロードも不要です。現在の名前に変更してもリビジョンは変わりません。名前は重複できます。アプリケーションは ID で指定してください。

app show#

1件のアプリケーションを読み込みます。

app show <id>
パラメータータイプ必須デフォルトメモ
<id>stringはいなしapp_アプリケーションID
screenrig app show app_01EXAMPLEAPP00000000000

latest_ready_release は初回公開が ready に到達するまで存在しません。公開状態はオペレーションとリリースに紐づき、アプリケーションにはありません。last_used_at は、スクリーンが初めてアプリケーションを再生するまで存在しません。

app delete#

アプリケーションとそのすべてのリリースを削除します。

app delete <id> [--expect-rev REVISION]
パラメータータイプ必須デフォルトメモ
<id>stringはいなしapp_アプリケーションID
--expect-rev REVISIONstringいいえなしオプションのリビジョン前提条件。現在のリソースを書き込む場合は省略します。提供された古い値はrevision_conflictです:再取得、再適用、再試行。
screenrig app delete app_01EXAMPLEAPP00000000000

リリースごとの削除はありません。スクリーンがアプリケーションのリリースを表示している間、削除はapplication_in_useで応答します:先にそれらのスクリーンに別のコンテンツを与えてください。削除はリリースをピン留めして表示しないプレイリストはチェックしないため、それらのプレイリストも更新または削除してください。

アプリケーション キー/バリュー

キー/バリューのストレージは1つのアプリケーションに属し、バイナリセーフです。すべてのコマンドは--app-idをapp uploadからのapp_IDで受け取り、リリースIDは使用しません。書き込みごとに正確に1つの値モードを使用します。

kv list#

アプリケーションに保存されたキー一覧

kv list --app-id ID
パラメータータイプ必須デフォルトメモ
--app-id IDstringはいなしapp_アプリケーションID
screenrig kv list --app-id app_01EXAMPLEAPP00000000000

kv get#

1件のキーを読み込みます。

kv get --app-id ID <key>
パラメータータイプ必須デフォルトメモ
--app-id IDstringはいなしapp_アプリケーションID
<key>stringはいなし読み取るキー。
screenrig kv get --app-id app_01EXAMPLEAPP00000000000 menu

応答には値が data.value_base64 として含まれ、JSON の値もこの形式です。デコードし、data.content_type が JSON を示す場合にのみ JSON として解析してください。kv list は値を含みません。

kv set#

JSON、ファイル、またはbase64バイトから1つのキーを書く。

kv set --app-id ID <key> --json-value JSON [--expect-rev REVISION]
kv set --app-id ID <key> --file FILE [--content-type TYPE] [--expect-rev REVISION]
kv set --app-id ID <key> --value-base64 BASE64 [--content-type TYPE] [--expect-rev REVISION]
パラメータータイプ必須デフォルトメモ
--app-id IDstringはいなしapp_アプリケーションID
<key>stringはいなし書き込むキー。
--json-value JSONstringワンモードなしJSON 値は送信前に正規化され、常に application/json として保存されます。明示的な application/json コンテンツタイプも受け付けます。
--file FILEパスワンモードなし値のバイト列をファイルから読み込みます(最大 1 MiB)。stdin から読む場合は - を指定します。デフォルトは application/octet-stream。
--value-base64 BASE64stringワンモードなし空白なしの正規化パディング付き標準 base64、最大 1,398,104 文字。空の値も有効です。デフォルトは application/octet-stream。
--content-type TYPEstringいいえバイト用 application/octet-stream1〜127文字。
--expect-rev REVISIONstringいいえなし保存済みエントリがまだこのリビジョンの場合のみ書き込みます。
screenrig kv set --app-id app_01EXAMPLEAPP00000000000 menu --json-value '{"soup":"lentil"}'

kv delete#

キーを1つ削除します。

kv delete --app-id ID <key> [--expect-rev REVISION]
パラメータータイプ必須デフォルトメモ
--app-id IDstringはいなしapp_アプリケーションID
<key>stringはいなし削除するキー。
--expect-rev REVISIONstringいいえなしオプションのリビジョン前提条件。現在のリソースを書き込む場合は省略します。提供された古い値はrevision_conflictです:再取得、再適用、再試行。
screenrig kv delete --app-id app_01EXAMPLEAPP00000000000 menu

キー/バリューwebhook

キー/バリューWebhookは1つのアプリケーションの1つのキーを書き込むURLです。POS、スプレッドシートスクリプト、cronジョブなどの外部システムがHTTP POSTでデータをスクリーンに送信します。kv.onChangeで購読するアプリは、実行中のすべてのスクリーンで数秒以内に更新されます。アプリは最大20のWebhookを持てます。

送信側はWebhookのシークレット srkw_… を Authorization: Bearer <secret> として、またはWebhook IDをユーザー名、シークレットをパスワードとするHTTP Basicで認証します。URLやクエリ文字列に含まれるシークレットは受け付けられません。最大1 MiBの生の本文がキーの値になり、Content-Type がそのコンテンツタイプになります。各投稿はエージェントリクエストの上限に数えられず、kv set と同じようにストレージに数えられ、リビジョンを上げて、キーの新しいメタデータを返します(値は返しません)。任意の Idempotency-Key ヘッダーは、送信側の再試行を24時間重複排除します。1つのWebhookは1分あたり最大120件の投稿を受け付け、シークレットがない、誤っている、または不明なWebhookには 401 を返します。別のシステムからデータを送るには curl の例があります。

シークレットは kv webhook create と kv webhook rotate-secret のみで表示されます。URL はシークレットではありません。Webhook の作成、ローテーション、削除はそれぞれプロジェクトイベントログに kv_webhook.created、kv_webhook.secret_rotated、kv_webhook.deleted を追加し、各投稿は書き込みと同様に kv.updated を追加します。

問題コード終了意味
kv_webhook_limit_reached5アプリケーションまたはカードはすでに20のWebhookを持っています。何も作成されませんでした。まず1つ削除してください。
not_found4アプリケーションはこのプロジェクトに属していないか、その ID の webhook がありません。
card_not_found4このプロジェクトにカードがありません。

kv webhook create#

アプリケーションの 1 つのキー、または --card を付けるとカードのデータドキュメントを書き込むWebhookを作成し、そのURLとシークレットを一度だけ受け取ります。

kv webhook create <key> --app-id ID [--description TEXT]
kv webhook create --card CARD_ID [--description TEXT] [--map FILE|-] [--key-template TEMPLATE] [--signing]
                  [--verify VENDOR [--verify-secret-file FILE|-] [--verify-header NAME] [--verify-encoding hex|base64]
                   [--verify-timestamp-header NAME] [--verify-tolerance SECONDS]] [--handshake VENDOR]
パラメータータイプ必須デフォルトメモ
<key>string--app-id とともになしすべての送信が書き込むキーは1~256文字:最初は文字か数字、その後は文字、数字、.、_、:、/または-。キーはまだ存在しなくてもかまいません。カードWebhookにはキーがありません。
--app-id IDstringいずれか 1 つなしapp_ アプリケーションID。--app-id と --card のうち、ちょうど 1 つを指定します。
--card CARD_IDstringいずれか 1 つなしcrd_ のカードID。Webhookはカードのデータドキュメントを書き込みます。カードWebhookを参照してください。
--description TEXTstringいいえなしこれに送信するもの、最大200バイト。認証情報を含んではいけません。
--map FILEパスいいえなし送信された本文からドキュメントを組み立てるマッピング。ファイルから読み込む最大 64 KiB の JSON オブジェクトで、stdin の場合は - です。省略すると、送信されたオブジェクトがそのままドキュメントになります。
--key-template TEMPLATEstringいいえなし{screen.field.NAME} トークンで埋めたキーのもとに、キー別のドキュメントを書き込みます(たとえば room-{screen.field.room})。
--signingbooleanいいえオフすべての送信に ScreenRig-Signature も必須とし、署名シークレットを一度だけ表示します。--verify とは併用できません。
--verify VENDORstringいいえなしWebhook 自身の srkw_ シークレットの代わりに、このベンダー独自の署名を持つ送信を受け付けます。元のシークレットも並行して使えます: github、stripe、shopify、slack、linear、vercel、asana、generic_hmac のいずれか。
--verify-secret-file FILEパス--verify とともになしベンダーのシークレットをファイルから読み込みます(stdin の場合は -、引数では渡せません)。GitHub、Stripe、Shopify、Slack、Linear、Vercel が示すシークレット、または generic_hmac の送信元のシークレットです。asana は不要で、ハンドシェイクが届けます。stdin から読めるオプションは 1 つだけです。
--verify-header NAMEstringgeneric_hmac とともになし署名を運ぶヘッダー。1 から 100 文字の英数字、-、_ です。
--verify-encoding ENCODINGstringいいえhexgeneric_hmac の場合: 署名の表記方法で、hex または base64。先頭に sha256= が付いていてもかまいません。
--verify-timestamp-header NAMEstringいいえなしgeneric_hmac の場合: Unix 時刻を秒、または 13 桁のミリ秒で運ぶヘッダー。署名対象のテキストは、タイムスタンプ、ドット、本文になります。
--verify-tolerance SECONDSintegerいいえ300--verify-timestamp-header の場合: タイムスタンプがサーバーの時計からずれてよい範囲。1 から 86400 です。
--handshake VENDORstringいいえなしmicrosoft_graph、monday、trello、azure_event_grid のセットアップ時のチャレンジに応答します。Slack と Asana は --verify を通じて自分たちのチャレンジに応答します。
screenrig kv webhook create menu --app-id app_01EXAMPLEAPP00000000000 --description "Point of sale menu feed"
screenrig kv webhook create --card crd_01EXAMPLEBOARD0000000000 --map alert-map.json --description "CMS alerts"

--map、--key-template、--signing、--verify(そのオプションを含む)、--handshake は、カード Webhook にのみ適用されます。

エンベロープはWebhookで、data.id (kvw_…)、data.key(カードでは data.card_id)、data.url (https://api.screenrig.ai/api/applications/<app_id>/kv-webhooks/<id>/write、またはカードでは https://api.screenrig.ai/api/cards/<card_id>/kv-webhooks/<id>/write)、data.secret (srkw_…) を含みます。署名するカードWebhookには data.signing_secret (whsec_…) も含まれます。URL とシークレットは今すぐ送信側のシステムに設定してください。後からどのコマンドでも再表示されません。作成が中断またはあいまいになった場合は、24 時間以内に同じコマンドを再実行してください。保存済みの冪等キーが再利用され、サーバーは新たに作成せず同じWebhookと同じシークレットを返します。

kv webhook list#

アプリケーションまたはカードのWebhookを古い順に一覧表示します。

kv webhook list (--app-id ID | --card CARD_ID)
パラメータータイプ必須デフォルトメモ
--app-id IDstringいずれか 1 つなしapp_ アプリケーションID。--app-id と --card のうち、ちょうど 1 つを指定します。
--card CARD_IDstringいずれか 1 つなしcrd_ のカードID。
screenrig kv webhook list --app-id app_01EXAMPLEAPP00000000000
screenrig kv webhook list --card crd_01EXAMPLEBOARD0000000000

各項目には id、key、description、url、created_at があり、書き込み後は last_used_at もあります。カードWebhookの項目には key の代わりに card_id があり、さらに mapping(送信されたオブジェクトがそのままドキュメントの場合は null)、enabled、signing、設定されていれば key_template、verify、handshake があります。リストにシークレットは含まれません。

kv webhook delete#

Webhookを削除します。URLは即座に無効になり、キーまたはカードのドキュメントは値を保持します。

kv webhook delete <webhook_id> (--app-id ID | --card CARD_ID)
パラメータータイプ必須デフォルトメモ
<webhook_id>stringはいなしkvw_Webhook ID
--app-id IDstringいずれか 1 つなしapp_ アプリケーションID。--app-id と --card のうち、ちょうど 1 つを指定します。
--card CARD_IDstringいずれか 1 つなしcrd_ のカードID。
screenrig kv webhook delete kvw_01EXAMPLEWEBHOOK00000 --app-id app_01EXAMPLEAPP00000000000
screenrig kv webhook delete kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000

kv webhook rotate-secret#

Webhookのシークレットを置き換え、一度だけ新しいものを受け取ります。

kv webhook rotate-secret <webhook_id> (--app-id ID | --card CARD_ID) [--signing]
パラメータータイプ必須デフォルトメモ
<webhook_id>stringはいなしkvw_Webhook ID
--app-id IDstringいずれか 1 つなしapp_ アプリケーションID。--app-id と --card のうち、ちょうど 1 つを指定します。
--card CARD_IDstringいずれか 1 つなしcrd_ のカードID。
--signingbooleanいいえオフ--card の場合: Webhook のシークレットではなく署名シークレットを置き換えます。
screenrig kv webhook rotate-secret kvw_01EXAMPLEWEBHOOK00000 --app-id app_01EXAMPLEAPP00000000000
screenrig kv webhook rotate-secret kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000 --signing

エンベロープには新しいシークレットが data.secret に入ります。古いシークレットは即座に使えなくなるので、新しいシークレットを送信側のシステムに設定してください。--signing を付けた場合は、エンベロープに新しい署名シークレットが data.signing_secret として入り、Webhook の srkw_ シークレットはそのままです。ローテーションが中断またはあいまいになった場合は、同じコマンドを再実行してください。保存済みの冪等キーが再利用され、サーバーは再度ローテーションせず、すでに行われたローテーションの結果を返します。

ほかのコマンドグループ