Documentazione

Applicazioni: comandi CLI

Impacchetta, carica, aggiorna ed elimina applicazioni web e leggi o scrivi il loro archivio chiave/valore e i relativi webhook.

Ogni comando funziona come descritto nel riferimento CLI: flag globali, output JSON, codici uscita, revisioni e ritentativi.

Applicazioni

Un’app è una directory statica già costruita con una root index.html. Il packer inietta l’SDK browser a _screenrig/runtime.js e aggiunge il suo tag script, così l’app raggiunge window.screenrig senza passaggi di build e senza aggiunte alle dipendenze. Nulla nella directory viene mai costruito o eseguito durante il packing.

app pack#

Impacchetta una cartella statica in un archivio deterministico senza caricarla.

app pack <directory> [--output FILE]
ParametroTipoObbligatorioPredefinitoNote
<directory>pathsìnessunoLa directory statica costruita. Richiede una root index.html.
--output FILEpathnonulla è scrittoScrivi anche l’archivio in questo percorso. Senza di esso il comando riporta l’archivio e lo mantiene in memoria.
screenrig app pack ./lobby-board --output ./lobby-board.tgz

La busta riporta sha256, compressed_bytes, expanded_bytes, file_count, la lista delle voci e se il runtime SDK è stato iniettato. app upload impacchetta la cartella stessa, quindi usa questo comando solo se vuoi ispezionare prima l’archivio. Viene eseguito in locale e non richiede l’accesso.

Un pacchetto contiene al massimo 5000 file, 250 MiB decompressi e 100 MiB compressi, ogni file al massimo 32 MiB, con percorsi di al massimo 16 livelli e 255 byte. Il packing esclude i nomi che iniziano con ., node_modules/, bower_components/, jspm_packages/, vendor/, venv/, __pycache__/, CVS/, le source map *.map, i file di chiavi e credenziali (*.pem, *.key, *.p12, *.pfx, *.crt, *.cer, id_rsa, id_dsa, id_ecdsa, id_ed25519, credentials.json, secrets.json), i file temporanei e di backup degli editor, Thumbs.db e desktop.ini. Un file .screenrigignore nella radice della cartella aggiunge pattern in stile gitignore, uno per riga, e non può ripristinare un’esclusione integrata. Link simbolici, hardlink, file sparsi, dispositivi, percorsi duplicati (confrontati anche senza distinguere maiuscole e minuscole), file che cambiano durante il packing e una cartella senza index.html nella radice vengono rifiutati indicando il percorso: il comando termina con il codice 2 e non invia nulla.

Le applicazioni funzionano sotto una content security policy che blocca il codice inline. Il packing sposta gli stili e script inline in file _screenrig-inline-* accanto a ogni documento HTML e li collega. I gestori di eventi inline come onclick= e URL javascript: non possono essere spostati; il packing li rifiuta e indica file e riga.

app types#

Scrivi i tipi TypeScript di window.screenrig in una directory.

app types [directory]
ParametroTipoObbligatorioPredefinitoNote
[directory]pathnola directory correnteLa directory in cui scrivere screenrig.d.ts. Deve esistere.
screenrig app types ./src

La busta riporta path, bytes, sha256 e written, che vale false quando il file conteneva già i tipi attuali. Il file corrisponde al runtime che app pack e app upload iniettano, quindi esegui di nuovo il comando dopo aver aggiornato la CLI. Un screenrig.d.ts esistente viene sostituito per intero; una directory o un collegamento simbolico in quel percorso viene rifiutato e il comando termina con il codice 2. Viene eseguito in locale e non richiede l’accesso. TypeScript spiega cosa dichiarano i tipi.

app dev#

Servi una directory in un harness Player locale per provare un’applicazione prima di caricarla.

app dev <directory> [--port PORT] [--open] [--no-reload] [--kv FILE | --kv-from APP_ID]
ParametroTipoObbligatorioPredefinitoNote
<directory>pathsìnessunoLa directory statica costruita. Richiede una root index.html.
--port PORTintegerno18890La porta su cui ascolta l’ambiente di prova. Il runtime si fida dell’ambiente di prova solo su 18890, quindi qualsiasi altra porta viene rifiutata.
--openbooleannospentoApri l’harness nel tuo browser.
--no-reloadbooleannospentoMantieni la pagina com’è quando un file cambia. Senza di esso la pagina si ricarica a ogni modifica.
--kv FILEpathno.screenrig-dev/kv.jsonIl file JSON che contiene il key/value store dell’esecuzione.
--kv-from APP_IDstringnonessunoLeggi il key/value store di questa applicazione caricata, in sola lettura, invece di un file.
screenrig app dev ./lobby-board --open

Il comando serve l’harness su http://play.screenrig.localhost:18890 e resta in esecuzione finché non lo fermi. Inietta il runtime come fa app pack, e segnala ciò che il packaging rifiuta, indicando file e riga, mentre modifichi. L’harness simula le capacità, la viewport, il nome dello schermo, il fuso orario e i parametri, il timer della pagina, la pausa, il display e l’uscita, gli eventi del dispositivo, e porte seriali, linee GPIO, periferiche Bluetooth LE e stampanti. Le righe emit e log vengono stampate nel terminale. Sviluppa in locale descrive i controlli.

app upload#

Impacchetta una cartella, pubblicala come nuova release dell’applicazione e attendi il successo della pubblicazione.

app upload <directory> [--name NAME] [--no-wait] [--poll-ms MS] [--timeout MS]
ParametroTipoObbligatorioPredefinitoNote
<directory>pathsìnessunoLa directory statica costruita.
--name NAMEstringnoun nome generatoNome dell’app, da 1 a 120 caratteri dopo la rimozione degli spazi iniziali e finali, senza caratteri di controllo.
--no-waitbooleannospentoRestituisci prima che l’operazione di pubblicazione finisca. Esegui operations wait prima di fissare la release in una playlist.
--poll-ms MSintegerno1000Intervallo tra i poll di operazione in attesa.
--timeout MSintegerno120000Scadenza per l’attesa. Limita anche ogni richiesta sottostante.
screenrig app upload ./lobby-board --name "Lobby board"

Leggi tre campi: data.operation.state è succeeded, data.application.release_id è l’ID rel_ un primitivo application pin, e data.application.id è l’ID app_ che i comandi kv usano. Un’operazione riuscita, non un ID di rilascio da solo, indica che il rilascio è utilizzabile.

Ogni app upload crea una nuova applicazione e una prima release immutabile. Per pubblicare una release successiva della stessa app, usa app update. Una playlist continua a servire la release già fissata finché non modifichi quel primitivo.

Un trasferimento verso l’archiviazione interrotto viene ritentato fino a 4 volte finché il suo URL di caricamento è valido. Se continua a non riuscire, esegui di nuovo lo stesso comando per riprendere lo stesso caricamento.

app update#

Pubblica una nuova versione di un'applicazione esistente, preservando identità, nome e K/V dell'applicazione.

app update <id> <directory> [--expect-rev REVISION] [--no-wait] [--poll-ms MS] [--timeout MS]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID applicazione app_.
<directory>pathsìnessunoLa directory statica costruita.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
--no-waitbooleannospentoRestituisci prima che l’operazione di pubblicazione finisca. Esegui operations wait prima di fissare la release in una playlist.
--poll-ms MSintegerno1000Intervallo tra i poll di operazione in attesa.
--timeout MSintegerno120000Scadenza per l’attesa. Limita anche ogni richiesta sottostante.
screenrig app update app_01EXAMPLEAPP00000000000 ./lobby-board

Il nome resta invariato; modificalo con app rename. Attendere data.operation.state: "succeeded", quindi usare playlist replace-release per rivedere la pagina esatta, il primitivo, la nuova versione e gli schermi interessati. Applicare con il token di impatto restituito e una facoltativa protezione di revisione come descritto nel flusso di lavoro della playlist. I pin esistenti della playlist rimangono invariati fino all’applicazione. In caso di conflitto di revisione, leggere nuovamente l’app prima di decidere se riprovare; non creare un’applicazione sostitutiva solo per bypassare il conflitto.

app list#

Elenca le applicazioni del progetto

app list

Nessun parametro.

screenrig app list

app rename#

Cambia il nome visualizzato di un’app.

app rename <id> --name NAME [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID applicazione app_.
--name NAMEstringsìnessunoIl nuovo nome, da 1 a 120 caratteri dopo la rimozione degli spazi iniziali e finali, senza caratteri di controllo.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig app rename app_01EXAMPLEAPP00000000000 --name "Lobby welcome"

Cambia solo il nome visualizzato. L’ID dell’app, le sue release, i suoi dati chiave/valore e le playlist che fissano le sue release restano invariati e non viene caricata alcuna cartella. Rinominare con il nome attuale lascia invariata la revisione. I nomi possono ripetersi; indirizza un’app tramite il suo ID.

app show#

Leggi un’applicazione.

app show <id>
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID applicazione app_.
screenrig app show app_01EXAMPLEAPP00000000000

latest_ready_release è assente fino a quando una prima pubblicazione non raggiunge lo stato pronto. Lo stato di pubblicazione vive sull’operazione e sulla release, non sull’app. last_used_at è assente fino a quando uno schermo riproduce l’app per la prima volta.

app delete#

Elimina un’app e tutte le sue release.

app delete <id> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
<id>stringsìnessunoL’ID applicazione app_.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig app delete app_01EXAMPLEAPP00000000000

Non esiste un’eliminazione per release. Mentre uno schermo mostra una delle release dell’applicazione, l’eliminazione risponde application_in_use: assegna prima altri contenuti a quegli schermi. L’eliminazione non controlla playlist che fissano una release senza mostrarla, quindi aggiorna o elimina anche quelle playlist.

Chiave/valore applicazione

L’archiviazione chiave/valore appartiene a un’applicazione e supporta dati binari. Ogni comando prende --app-id con l’id app_ da app upload, mai un id di release. Usa esattamente una modalità valore per scrittura.

kv list#

Elenca le chiavi archiviate per un’applicazione

kv list --app-id ID
ParametroTipoObbligatorioPredefinitoNote
--app-id IDstringsìnessunoL’ID applicazione app_.
screenrig kv list --app-id app_01EXAMPLEAPP00000000000

kv get#

Leggi una chiave.

kv get --app-id ID <key>
ParametroTipoObbligatorioPredefinitoNote
--app-id IDstringsìnessunoL’ID applicazione app_.
<key>stringsìnessunoLa chiave da leggere.
screenrig kv get --app-id app_01EXAMPLEAPP00000000000 menu

La risposta contiene il valore in data.value_base64, compresi i valori JSON: decodificalo e interpreta JSON solo quando data.content_type indica JSON. kv list omette i valori.

kv set#

Scrivi una chiave da JSON, un file o byte 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]
ParametroTipoObbligatorioPredefinitoNote
--app-id IDstringsìnessunoL’ID applicazione app_.
<key>stringsìnessunoLa chiave da scrivere.
--json-value JSONstringuna modalitànessunoUn valore JSON, canonicalizzato prima dell’invio, sempre memorizzato come application/json. È accettato anche un tipo di contenuto application/json esplicito.
--file FILEpathuna modalitànessunoLegge i byte del valore da un file, al massimo 1 MiB, o da stdin con -. Predefinito a application/octet-stream.
--value-base64 BASE64stringuna modalitànessunoBase64 standard canonica con padding senza spazi bianchi, al massimo 1.398.104 caratteri; un valore vuoto è valido. Predefinito a application/octet-stream.
--content-type TYPEstringnoapplication/octet-stream per byteDa uno a 127 caratteri.
--expect-rev REVISIONstringnonessunoScrivi solo se la voce memorizzata è ancora a questa revisione.
screenrig kv set --app-id app_01EXAMPLEAPP00000000000 menu --json-value '{"soup":"lentil"}'

kv delete#

Elimina una chiave.

kv delete --app-id ID <key> [--expect-rev REVISION]
ParametroTipoObbligatorioPredefinitoNote
--app-id IDstringsìnessunoL’ID applicazione app_.
<key>stringsìnessunoLa chiave da eliminare.
--expect-rev REVISIONstringnonessunoPrecondizione opzionale di revisione. Ometti per scrivere la risorsa corrente. Un valore obsoleto fornito è revision_conflict: rifetch, reapply, retry.
screenrig kv delete --app-id app_01EXAMPLEAPP00000000000 menu

Webhook chiave/valore

Un webhook chiave/valore è un URL che scrive una chiave di un’applicazione, così qualsiasi sistema esterno, come un punto vendita, uno script di foglio di calcolo o un cron job, invia dati agli schermi con una singola richiesta HTTP POST. Un’applicazione che si iscrive con kv.onChange si aggiorna in pochi secondi su ogni schermo che la esegue. Un’applicazione può avere al massimo 20 webhook.

Il mittente si autentica con il segreto del webhook, srkw_…, come Authorization: Bearer <secret>, oppure con HTTP Basic usando l’ID del webhook come nome utente e il segreto come password; un segreto nell’URL o nella query string non viene mai accettato. Il corpo grezzo, al massimo 1 MiB, diventa il valore della chiave e Content-Type il suo tipo di contenuto. Ogni invio non conta nel limite di richieste agente, conta per l’archiviazione come kv set, aumenta la revisione e risponde con i nuovi metadati della chiave, mai il suo valore. Un’intestazione Idempotency-Key facoltativa deduplica i nuovi tentativi di un mittente per 24 ore. Un webhook accetta al massimo 120 invii al minuto, e un segreto mancante o errato o un webhook sconosciuto riceve 401. Invia dati da un altro sistema contiene esempi curl.

Il segreto è mostrato solo da kv webhook create e kv webhook rotate-secret. L’URL non è segreto. Creare, ruotare ed eliminare un webhook aggiunge kv_webhook.created, kv_webhook.secret_rotated e kv_webhook.deleted al log eventi del progetto, e ogni post aggiunge kv.updated come qualsiasi scrittura.

Codice problemaEsciSignificato
kv_webhook_limit_reached5L’applicazione o la scheda ha già 20 webhook. Non è stato creato nulla. Elimina prima uno.
not_found4L’applicazione non è in questo progetto, o nessun webhook ha questo id su di essa.
card_not_found4La scheda non è in questo progetto.

kv webhook create#

Crea un webhook che scrive una chiave di un’applicazione o, con --card, il documento dati di una scheda, e ricevi il suo URL e segreto una sola volta.

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]
ParametroTipoObbligatorioPredefinitoNote
<key>stringcon --app-idnessunoLa chiave che ogni invio scrive, da 1 a 256 caratteri: una lettera o cifra prima, poi lettere, cifre, ., _, :, / o -. La chiave può non esistere ancora. Un webhook di scheda non ha chiave.
--app-id IDstringuno tranessunoL’ID applicazione app_. Indica esattamente uno tra --app-id e --card.
--card CARD_IDstringuno tranessunoL’ID scheda crd_: il webhook scrive il documento dati della scheda. Vedi Webhook delle schede.
--description TEXTstringnonessunoCosa invia, massimo 200 byte. Non deve contenere credenziali.
--map FILEpathnonessunoLa mappatura che costruisce il documento dal corpo inviato: un oggetto JSON di al massimo 64 KiB letto da un file, oppure - per stdin. Senza di essa, l’oggetto inviato è il documento.
--key-template TEMPLATEstringnonessunoScrive documenti per chiave sotto una chiave riempita con token {screen.field.NAME}, come room-{screen.field.room}.
--signingbooleannospentoRichiede anche ScreenRig-Signature a ogni invio e mostra il segreto di firma una sola volta. Non insieme a --verify.
--verify VENDORstringnonessunoAccetta gli invii che portano la firma propria di questo fornitore al posto del segreto srkw_ del webhook, che continua a funzionare accanto: github, stripe, shopify, slack, linear, vercel, asana o generic_hmac.
--verify-secret-file FILEpathcon --verifynessunoLegge il segreto del fornitore da un file, oppure - per stdin (mai come argomento): il segreto mostrato da GitHub, Stripe, Shopify, Slack, Linear o Vercel, o quello di un mittente generic_hmac. asana non ne accetta: lo consegna il suo handshake. Una sola opzione legge stdin.
--verify-header NAMEstringcon generic_hmacnessunoL’intestazione che porta la firma, da 1 a 100 lettere, cifre, - o _.
--verify-encoding ENCODINGstringnohexCon generic_hmac: come viene scritta la firma, hex o base64; può iniziare con sha256=.
--verify-timestamp-header NAMEstringnonessunoCon generic_hmac: un’intestazione che porta l’ora Unix in secondi o in millisecondi con 13 cifre. Il testo firmato è allora il timestamp, un punto e il corpo.
--verify-tolerance SECONDSintegerno300Con --verify-timestamp-header: quanto il timestamp può discostarsi dall’orologio del server, da 1 a 86400.
--handshake VENDORstringnonessunoRisponde alla verifica di configurazione di microsoft_graph, monday, trello o azure_event_grid. Slack e Asana rispondono alle proprie tramite --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 con le sue opzioni e --handshake valgono solo per un webhook di scheda.

La busta è il webhook: data.id (kvw_…), data.key oppure, per una scheda, data.card_id, data.url (https://api.screenrig.ai/api/applications/<app_id>/kv-webhooks/<id>/write o https://api.screenrig.ai/api/cards/<card_id>/kv-webhooks/<id>/write) e data.secret (srkw_…). Un webhook di scheda che firma contiene anche data.signing_secret (whsec_…). Inserisci ora l’URL e i segreti nel sistema mittente. Nessun comando successivo li mostra di nuovo. Dopo una creazione interrotta o ambigua, riesegui lo stesso comando entro 24 ore: riutilizza la chiave di idempotenza salvata e il server restituisce lo stesso webhook e gli stessi segreti invece di crearne un altro.

kv webhook list#

Elenca i webhook di un’applicazione o di una scheda, i più vecchi per primi.

kv webhook list (--app-id ID | --card CARD_ID)
ParametroTipoObbligatorioPredefinitoNote
--app-id IDstringuno tranessunoL’ID applicazione app_. Indica esattamente uno tra --app-id e --card.
--card CARD_IDstringuno tranessunoL'ID scheda crd_.
screenrig kv webhook list --app-id app_01EXAMPLEAPP00000000000
screenrig kv webhook list --card crd_01EXAMPLEBOARD0000000000

Ogni elemento ha id, key, description, url, created_at e, una volta scritto, last_used_at. L’elemento di un webhook di scheda ha card_id al posto di key, più mapping (null quando l’oggetto inviato è il documento), enabled, signing e, se impostati, key_template, verify e handshake. Una lista non contiene mai un segreto.

kv webhook delete#

Elimina un webhook. Il suo URL smette di funzionare immediatamente e la chiave o il documento della scheda mantiene il suo valore.

kv webhook delete <webhook_id> (--app-id ID | --card CARD_ID)
ParametroTipoObbligatorioPredefinitoNote
<webhook_id>stringsìnessunoL’ID webhook kvw_.
--app-id IDstringuno tranessunoL’ID applicazione app_. Indica esattamente uno tra --app-id e --card.
--card CARD_IDstringuno tranessunoL'ID scheda crd_.
screenrig kv webhook delete kvw_01EXAMPLEWEBHOOK00000 --app-id app_01EXAMPLEAPP00000000000
screenrig kv webhook delete kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000

kv webhook rotate-secret#

Sostituisci il segreto di un webhook e ricevi quello nuovo una volta sola.

kv webhook rotate-secret <webhook_id> (--app-id ID | --card CARD_ID) [--signing]
ParametroTipoObbligatorioPredefinitoNote
<webhook_id>stringsìnessunoL’ID webhook kvw_.
--app-id IDstringuno tranessunoL’ID applicazione app_. Indica esattamente uno tra --app-id e --card.
--card CARD_IDstringuno tranessunoL'ID scheda crd_.
--signingbooleannospentoCon --card: sostituisce il segreto di firma invece del segreto del webhook.
screenrig kv webhook rotate-secret kvw_01EXAMPLEWEBHOOK00000 --app-id app_01EXAMPLEAPP00000000000
screenrig kv webhook rotate-secret kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000 --signing

La busta contiene il nuovo segreto in data.secret. Il vecchio segreto smette di funzionare subito, quindi inserisci il nuovo nel sistema mittente. Con --signing, la busta contiene invece il nuovo segreto di firma in data.signing_secret, e il segreto srkw_ del webhook resta. Dopo una rotazione interrotta o ambigua, riesegui lo stesso comando: riutilizza la chiave di idempotenza salvata e il server restituisce la rotazione già avvenuta invece di ruotare di nuovo.

Altri gruppi di comandi