Documentation

Applications : commandes CLI

Empaquetez, téléversez, mettez à jour et supprimez des applications web, puis lisez ou écrivez leur stockage clé/valeur et ses webhooks.

Chaque commande s’exécute comme décrit dans la référence CLI : drapeaux globaux, sortie JSON, codes de sortie, révisions et réessais.

Applications

Une application est un répertoire statique déjà construit avec une racine index.html. Le packer injecte le SDK navigateur à _screenrig/runtime.js et ajoute sa balise script, donc l’app atteint window.screenrig sans étape de construction ni ajout à ses dépendances. Rien dans le répertoire n’est jamais construit ni exécuté pendant le packing.

app pack#

Emballez un répertoire statique dans une archive déterministe sans la téléverser.

app pack <directory> [--output FILE]
ParamètreTypeRequisPar défautNotes
<directory>cheminouiaucunLe répertoire statique construit. Il nécessite une racine index.html.
--output FILEcheminnonrien n’est écritÉcrit aussi l’archive à ce chemin. Sans cela, la commande rapporte l’archive et la conserve en mémoire.
screenrig app pack ./lobby-board --output ./lobby-board.tgz

L’enveloppe rapporte sha256, compressed_bytes, expanded_bytes, file_count, la liste des entrées, et si le runtime SDK a été injecté. app upload emballe le répertoire lui-même, donc utilisez cette commande seulement si vous voulez inspecter d’abord l’archive. Elle s’exécute localement et ne demande aucune connexion.

Un paquet contient au plus 5000 fichiers, 250 Mio décompressés et 100 Mio compressés, chaque fichier d’au plus 32 Mio, avec des chemins d’au plus 16 niveaux et 255 octets. L’empaquetage écarte les noms qui commencent par ., node_modules/, bower_components/, jspm_packages/, vendor/, venv/, __pycache__/, CVS/, les cartes sources *.map, les fichiers de clés et d’identifiants (*.pem, *.key, *.p12, *.pfx, *.crt, *.cer, id_rsa, id_dsa, id_ecdsa, id_ed25519, credentials.json, secrets.json), les fichiers temporaires et de sauvegarde d’éditeur, Thumbs.db et desktop.ini. Un fichier .screenrigignore à la racine du répertoire ajoute des motifs de style gitignore, un par ligne, et ne peut pas rétablir une exclusion intégrée. Les liens symboliques, les liens physiques, les fichiers creux, les périphériques, les chemins en double (comparés aussi sans tenir compte de la casse), les fichiers qui changent pendant l’empaquetage et un répertoire sans index.html à la racine sont refusés avec le chemin indiqué : la commande se termine avec le code 2 et n’envoie rien.

Les applications s’exécutent sous une politique de sécurité de contenu qui bloque le code en ligne. L’empaquetage déplace les blocs de style et script en ligne dans des fichiers _screenrig-inline-* placés à côté de chaque document HTML et les lie. Les gestionnaires d’événements en ligne tels que onclick= et javascript: URLs ne peuvent pas être déplacés ; l’empaquetage les refuse et nomme le fichier et la ligne.

app types#

Écrivez les types TypeScript de window.screenrig dans un répertoire.

app types [directory]
ParamètreTypeRequisPar défautNotes
[directory]cheminnonle répertoire courantLe répertoire dans lequel écrire screenrig.d.ts. Il doit exister.
screenrig app types ./src

L’enveloppe rapporte path, bytes, sha256 et written, qui vaut false lorsque le fichier contenait déjà les types actuels. Le fichier correspond au runtime qu’injectent app pack et app upload; relancez donc la commande après avoir mis à jour la CLI. Un screenrig.d.ts existant est remplacé en entier; un répertoire ou un lien symbolique à cet emplacement est refusé, et la commande se termine avec le code 2. Elle s’exécute localement et ne demande aucune connexion. TypeScript couvre ce que déclarent les types.

app dev#

Servez un répertoire dans un banc d’essai Player local pour essayer une application avant de la téléverser.

app dev <directory> [--port PORT] [--open] [--no-reload] [--kv FILE | --kv-from APP_ID]
ParamètreTypeRequisPar défautNotes
<directory>cheminouiaucunLe répertoire statique construit. Il nécessite une racine index.html.
--port PORTintegernon18890Le port sur lequel écoute le banc d’essai. L’environnement d’exécution ne fait confiance au banc d’essai que sur 18890; tout autre port est refusé.
--openbooleannondésactivéOuvrez le banc d’essai dans votre navigateur.
--no-reloadbooleannondésactivéGardez la page telle quelle lorsqu’un fichier change. Sans cela, la page se recharge à chaque changement.
--kv FILEcheminnon.screenrig-dev/kv.jsonLe fichier JSON qui contient le magasin clé/valeur de l’exécution.
--kv-from APP_IDstringnonaucunLisez le magasin clé/valeur de cette application téléversée, en lecture seule, au lieu d’un fichier.
screenrig app dev ./lobby-board --open

La commande sert le banc d’essai à http://play.screenrig.localhost:18890 et s’exécute jusqu’à ce que vous l’arrêtiez. Elle injecte le runtime comme le fait app pack, et signale ce que l’empaquetage refuse, en nommant le fichier et la ligne, pendant que vous modifiez. Le banc d’essai simule les capacités, la fenêtre d’affichage, le nom, le fuseau horaire et les params de l’écran, le minuteur de page, la pause, l’affichage et la sortie, les événements de l’appareil, ainsi que des ports série, lignes GPIO, périphériques Bluetooth LE et imprimantes. Les lignes emit et log s’affichent dans le terminal. Développer en local décrit les contrôles.

app upload#

Emballez un répertoire, publiez-le comme nouvelle version d’application, et attendez que la publication réussisse.

app upload <directory> [--name NAME] [--no-wait] [--poll-ms MS] [--timeout MS]
ParamètreTypeRequisPar défautNotes
<directory>cheminouiaucunLe répertoire statique construit.
--name NAMEstringnonun nom généréNom de l’application, de 1 à 120 caractères après suppression des espaces, sans caractères de contrôle.
--no-waitbooleannondésactivéRetourner avant que l’opération de publication ne se termine. Exécutez operations wait avant d’épingler la version dans une liste de lecture.
--poll-ms MSintegernon1000Intervalle entre les sondages d’opération en attente.
--timeout MSintegernon120000Date limite d’attente. Elle limite aussi chaque requête sous-jacente.
screenrig app upload ./lobby-board --name "Lobby board"

Lire trois champs : data.operation.state est succeeded, data.application.release_id est l’ID rel_ un application primitif pins, et data.application.id est l’ID app_ que les commandes kv utilisent. Une opération réussie, pas un ID de version seul, signifie que la version est utilisable.

Chaque app upload crée une nouvelle application et une première version immuable. Pour publier une version ultérieure de la même application, utilisez app update. Une playlist continue de servir la version qu’elle épingle déjà jusqu’à ce que vous modifiiez ce primitif.

Un transfert vers le stockage interrompu est tenté jusqu’à 4 fois tant que son URL de téléversement est valide. S’il échoue encore, relancez la même commande pour reprendre le même téléversement.

app update#

Publier une nouvelle version d’une application existante, en conservant l’identité, le nom et les K/V de l’application.

app update <id> <directory> [--expect-rev REVISION] [--no-wait] [--poll-ms MS] [--timeout MS]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’application app_.
<directory>cheminouiaucunLe répertoire statique construit.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
--no-waitbooleannondésactivéRetourner avant que l’opération de publication ne se termine. Exécutez operations wait avant d’épingler la version dans une liste de lecture.
--poll-ms MSintegernon1000Intervalle entre les sondages d’opération en attente.
--timeout MSintegernon120000Date limite d’attente. Elle limite aussi chaque requête sous-jacente.
screenrig app update app_01EXAMPLEAPP00000000000 ./lobby-board

Le nom reste tel quel ; changez-le avec app rename. Attendre data.operation.state: "succeeded", puis utiliser playlist replace-release pour examiner la page exacte, le primitif, la nouvelle version et les écrans affectés. Appliquer avec le jeton d’impact retourné et une garde de révision optionnelle comme décrit dans le flux de travail de la liste de lecture. Les épingles existantes de la liste de lecture restent inchangées jusqu’à l’application. En cas de conflit de révision, relire l’application avant de décider de réessayer ; ne pas créer une application de remplacement juste pour contourner le conflit.

app list#

Lister les applications du projet.

app list

Aucun paramètre.

screenrig app list

app rename#

Changer le nom d’affichage d’une application.

app rename <id> --name NAME [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’application app_.
--name NAMEstringouiaucunLe nouveau nom, de 1 à 120 caractères après suppression des espaces, sans caractères de contrôle.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig app rename app_01EXAMPLEAPP00000000000 --name "Lobby welcome"

Seul le nom d’affichage change. L’identifiant de l’application, ses versions, ses données clé/valeur et les listes de lecture qui épinglent ses versions restent tels quels, et aucun répertoire n’est téléversé. Renommer vers le nom actuel laisse la révision inchangée. Les noms peuvent se répéter ; adressez une application par son identifiant.

app show#

Lire une application.

app show <id>
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’application app_.
screenrig app show app_01EXAMPLEAPP00000000000

latest_ready_release est absent jusqu’à ce qu’une première publication soit prête. L’état de publication vit sur l’opération et la version, pas sur l’application. last_used_at est absent jusqu’à ce qu’un écran joue l’application pour la première fois.

app delete#

Supprimer une application et chacune de ses versions.

app delete <id> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
<id>stringouiaucunL’identifiant d’application app_.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig app delete app_01EXAMPLEAPP00000000000

Il n’y a pas de suppression par version. Tant qu’un écran affiche une des versions de l’application, la suppression répond application_in_use : donnez d’abord un autre contenu à ces écrans. La suppression ne vérifie pas les playlists qui épinglent une version sans l’afficher, donc mettez à jour ou supprimez aussi ces playlists.

Clé/valeur d’application

Le stockage clé/valeur appartient à une application et est binaire-sûr. Chaque commande prend --app-id avec l’identifiant app_ de app upload, jamais un identifiant de version. Utiliser exactement un mode valeur par écriture.

kv list#

Lister les clés stockées pour une application.

kv list --app-id ID
ParamètreTypeRequisPar défautNotes
--app-id IDstringouiaucunL’identifiant d’application app_.
screenrig kv list --app-id app_01EXAMPLEAPP00000000000

kv get#

Lire une clé.

kv get --app-id ID <key>
ParamètreTypeRequisPar défautNotes
--app-id IDstringouiaucunL’identifiant d’application app_.
<key>stringouiaucunLa clé à lire.
screenrig kv get --app-id app_01EXAMPLEAPP00000000000 menu

La réponse contient la valeur dans data.value_base64, y compris les valeurs JSON : décodez-la, et analysez le JSON seulement quand data.content_type indique du JSON. kv list omet les valeurs.

kv set#

Écrivez une clé depuis JSON, un fichier ou des octets base64.

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]
ParamètreTypeRequisPar défautNotes
--app-id IDstringouiaucunL’identifiant d’application app_.
<key>stringouiaucunLa clé à écrire.
--json-value JSONstringun modeaucunUne valeur JSON, canoniquement formatée avant envoi, toujours stockée comme application/json. Un type de contenu application/json explicite est aussi accepté.
--file FILEcheminun modeaucunLit les octets de la valeur depuis un fichier, au plus 1 Mio, ou depuis stdin avec -. Par défaut application/octet-stream.
--value-base64 BASE64stringun modeaucunBase64 standard canonique rembourrée sans espaces, au maximum 1 398 104 caractères ; une valeur vide est valide. Par défaut à application/octet-stream.
--content-type TYPEstringnonapplication/octet-stream pour les octetsDe un à 127 caractères.
--expect-rev REVISIONstringnonaucunÉcrivez seulement si l’entrée stockée est toujours à cette révision.
screenrig kv set --app-id app_01EXAMPLEAPP00000000000 menu --json-value '{"soup":"lentil"}'

kv delete#

Supprimer une clé.

kv delete --app-id ID <key> [--expect-rev REVISION]
ParamètreTypeRequisPar défautNotes
--app-id IDstringouiaucunL’identifiant d’application app_.
<key>stringouiaucunLa clé à supprimer.
--expect-rev REVISIONstringnonaucunPrécondition optionnelle de révision. Omettre pour écrire la ressource actuelle. Une valeur périmée fournie est revision_conflict : refetch, reapply, retry.
screenrig kv delete --app-id app_01EXAMPLEAPP00000000000 menu

Webhooks clé/valeur

Un webhook clé/valeur est une URL qui écrit une clé d’une application, donc tout système externe, comme un point de vente, un script de feuille de calcul ou un cron, pousse des données vers les écrans avec un POST HTTP. Une application qui s’abonne avec kv.onChange met à jour en quelques secondes chaque écran qui l’exécute. Une application peut avoir au maximum 20 webhooks.

L’expéditeur s’authentifie avec le secret du webhook, srkw_…, sous la forme Authorization: Bearer <secret>, ou avec HTTP Basic en utilisant l’ID du webhook comme nom d’utilisateur et le secret comme mot de passe; un secret dans l’URL ou la chaîne de requête n’est jamais accepté. Le corps brut, d’au plus 1 Mio, devient la valeur de la clé et Content-Type son type de contenu. Chaque envoi ne compte pas dans le plafond de requêtes d’agent, compte dans le stockage comme kv set, augmente la révision et répond avec les nouvelles métadonnées de la clé, jamais sa valeur. Un en-tête Idempotency-Key facultatif déduplique les nouvelles tentatives d’un expéditeur pendant 24 heures. Un webhook accepte au plus 120 envois par minute, et un secret absent ou erroné ou un webhook inconnu reçoit 401. Pousser des données depuis un autre système contient des exemples curl.

Le secret est montré uniquement par kv webhook create et kv webhook rotate-secret. L’URL n’est pas secrète. La création, la rotation et la suppression d’un webhook ajoutent kv_webhook.created, kv_webhook.secret_rotated et kv_webhook.deleted au journal d’événements du projet, et chaque publication ajoute kv.updated comme toute écriture.

Code de problèmeSortieSens
kv_webhook_limit_reached5L’application ou la carte a déjà 20 webhooks. Rien n’a été créé. Supprimez-en un d’abord.
not_found4L’application n’est pas dans ce projet, ou aucun webhook n’a cet identifiant.
card_not_found4La carte n’est pas dans ce projet.

kv webhook create#

Créer un webhook qui écrit une clé d’une application, ou, avec --card, le document de données d’une carte, et recevoir son URL et son secret une seule fois.

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]
ParamètreTypeRequisPar défautNotes
<key>stringavec --app-idaucunLa clé que chaque envoi écrit, de 1 à 256 caractères : une lettre ou un chiffre en premier, puis des lettres, chiffres, ., _, :, / ou -. La clé n’a pas besoin d’exister encore. Un webhook de carte n’a pas de clé.
--app-id IDstringun parmiaucunL’identifiant d’application app_. Donnez exactement un de --app-id et --card.
--card CARD_IDstringun parmiaucunL’identifiant de carte crd_ : le webhook écrit le document de données de la carte. Voir Webhooks de carte.
--description TEXTstringnonaucunCe qui y envoie, au maximum 200 octets. Il ne doit pas contenir de justificatif.
--map FILEcheminnonaucunLe mappage qui construit le document à partir du corps envoyé : un objet JSON d’au plus 64 Kio lu depuis un fichier, ou - pour stdin. Sans lui, l’objet envoyé est le document.
--key-template TEMPLATEstringnonaucunÉcrit des documents par clé sous une clé remplie à partir de jetons {screen.field.NAME}, comme room-{screen.field.room}.
--signingbooleannondésactivéExige aussi ScreenRig-Signature sur chaque envoi et affiche une seule fois le secret de signature. Incompatible avec --verify.
--verify VENDORstringnonaucunAccepte les envois qui portent la signature propre à ce fournisseur à la place du secret srkw_ du webhook, qui continue de fonctionner à côté : github, stripe, shopify, slack, linear, vercel, asana ou generic_hmac.
--verify-secret-file FILEcheminavec --verifyaucunLit le secret du fournisseur depuis un fichier, ou - pour stdin (jamais en argument) : le secret qu’affiche GitHub, Stripe, Shopify, Slack, Linear ou Vercel, ou celui d’un expéditeur generic_hmac. asana n’en prend aucun : sa poignée de main le livre. Une seule option lit stdin.
--verify-header NAMEstringavec generic_hmacaucunL’en-tête qui porte la signature, de 1 à 100 lettres, chiffres, - ou _.
--verify-encoding ENCODINGstringnonhexAvec generic_hmac : comment la signature est écrite, hex ou base64 ; elle peut commencer par sha256=.
--verify-timestamp-header NAMEstringnonaucunAvec generic_hmac : un en-tête qui porte l’heure Unix en secondes, ou en millisecondes sur 13 chiffres. Le texte signé est alors l’horodatage, un point et le corps.
--verify-tolerance SECONDSintegernon300Avec --verify-timestamp-header : de combien l’horodatage peut s’écarter de l’horloge du serveur, de 1 à 86400.
--handshake VENDORstringnonaucunRépond au défi de configuration de microsoft_graph, monday, trello ou azure_event_grid. Slack et Asana répondent aux leurs par --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 avec ses options et --handshake s’appliquent uniquement à un webhook de carte.

L’enveloppe est le webhook : data.id (kvw_…), data.key ou, pour une carte, data.card_id, data.url (https://api.screenrig.ai/api/applications/<app_id>/kv-webhooks/<id>/write, ou https://api.screenrig.ai/api/cards/<card_id>/kv-webhooks/<id>/write) et data.secret (srkw_…). Un webhook de carte qui signe contient aussi data.signing_secret (whsec_…). Saisissez maintenant l’URL et les secrets dans le système expéditeur. Aucune commande ultérieure ne les affiche à nouveau. Après une création interrompue ou ambiguë, relancez la même commande dans les 24 heures : elle réutilise la clé d’idempotence enregistrée, et le serveur renvoie le même webhook et les mêmes secrets au lieu d’en créer un autre.

kv webhook list#

Lister les webhooks d’une application ou d’une carte, les plus anciens d’abord.

kv webhook list (--app-id ID | --card CARD_ID)
ParamètreTypeRequisPar défautNotes
--app-id IDstringun parmiaucunL’identifiant d’application app_. Donnez exactement un de --app-id et --card.
--card CARD_IDstringun parmiaucunL'identifiant de carte crd_.
screenrig kv webhook list --app-id app_01EXAMPLEAPP00000000000
screenrig kv webhook list --card crd_01EXAMPLEBOARD0000000000

Chaque élément possède id, key, description, url, created_at et, une fois écrit, last_used_at. L’élément d’un webhook de carte a card_id à la place de key, plus mapping (null quand l’objet posté est le document), enabled, signing et, s’ils sont définis, key_template, verify et handshake. Une liste ne contient jamais de secret.

kv webhook delete#

Supprimer un webhook. Son URL cesse de fonctionner immédiatement, et la clé ou le document de la carte conserve sa valeur.

kv webhook delete <webhook_id> (--app-id ID | --card CARD_ID)
ParamètreTypeRequisPar défautNotes
<webhook_id>stringouiaucunL’identifiant de webhook kvw_.
--app-id IDstringun parmiaucunL’identifiant d’application app_. Donnez exactement un de --app-id et --card.
--card CARD_IDstringun parmiaucunL'identifiant de carte crd_.
screenrig kv webhook delete kvw_01EXAMPLEWEBHOOK00000 --app-id app_01EXAMPLEAPP00000000000
screenrig kv webhook delete kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000

kv webhook rotate-secret#

Remplacer le secret d’un webhook et recevoir le nouveau une fois.

kv webhook rotate-secret <webhook_id> (--app-id ID | --card CARD_ID) [--signing]
ParamètreTypeRequisPar défautNotes
<webhook_id>stringouiaucunL’identifiant de webhook kvw_.
--app-id IDstringun parmiaucunL’identifiant d’application app_. Donnez exactement un de --app-id et --card.
--card CARD_IDstringun parmiaucunL'identifiant de carte crd_.
--signingbooleannondésactivéAvec --card : remplace le secret de signature plutôt que le secret du webhook.
screenrig kv webhook rotate-secret kvw_01EXAMPLEWEBHOOK00000 --app-id app_01EXAMPLEAPP00000000000
screenrig kv webhook rotate-secret kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000 --signing

L’enveloppe contient le nouveau secret dans data.secret. L’ancien secret cesse de fonctionner immédiatement : saisissez donc le nouveau dans le système expéditeur. Avec --signing, l’enveloppe contient à la place le nouveau secret de signature dans data.signing_secret, et le secret srkw_ du webhook reste. Après une rotation interrompue ou ambiguë, relancez la même commande : elle réutilise la clé d’idempotence enregistrée, et le serveur renvoie la rotation déjà effectuée au lieu d’en refaire une.

Autres groupes de commandes