Aplicativos
Uma aplicação é um diretório estático já construído com uma raiz index.html. O empacotador injeta o SDK do navegador em _screenrig/runtime.js e adiciona sua tag de script, então o app alcança window.screenrig sem etapa de build e nada a adicionar às suas dependências. Nada no diretório é construído ou executado durante o empacotamento.
app pack#
Empacote um diretório estático em um arquivo determinístico sem enviá-lo.
app pack <directory> [--output FILE]| Parâmetro | Tipo | Obrigatório | Padrão | Notas |
|---|---|---|---|---|
<directory> | caminho | sim | nenhum | O diretório estático construído. Precisa de uma raiz index.html. |
--output FILE | caminho | não | nada está escrito | Também escreva o arquivo neste caminho. Sem ele, o comando relata o arquivo e o mantém na memória. |
screenrig app pack ./lobby-board --output ./lobby-board.tgzO envelope informa sha256, compressed_bytes, expanded_bytes, file_count, a lista de entradas, e se o tempo de execução do SDK foi injetado. app upload empacota o diretório em si, então use este comando apenas quando quiser inspecionar o arquivo primeiro. Ele roda localmente e não exige login.
Um pacote tem no máximo 5000 arquivos, 250 MiB descompactados e 100 MiB compactados, cada arquivo com no máximo 32 MiB, com caminhos de no máximo 16 níveis e 255 bytes. O empacotamento deixa de fora nomes que começam com ., node_modules/, bower_components/, jspm_packages/, vendor/, venv/, __pycache__/, CVS/, source maps *.map, arquivos de chaves e credenciais (*.pem, *.key, *.p12, *.pfx, *.crt, *.cer, id_rsa, id_dsa, id_ecdsa, id_ed25519, credentials.json, secrets.json), arquivos temporários e de backup de editores, Thumbs.db e desktop.ini. Um arquivo .screenrigignore na raiz do diretório acrescenta padrões no estilo gitignore, um por linha, e não pode restaurar uma exclusão embutida. Links simbólicos, hardlinks, arquivos esparsos, dispositivos, caminhos duplicados (comparados também sem diferenciar maiúsculas de minúsculas), arquivos que mudam durante o empacotamento e um diretório sem index.html na raiz são recusados com o caminho indicado: o comando termina com o código 2 e não envia nada.
Aplicativos rodam sob política de segurança de conteúdo que bloqueia código inline. Empacotamento move blocos de estilo e script inline para arquivos _screenrig-inline-* ao lado de cada documento HTML e os vincula. Handlers de evento inline como onclick= e URLs javascript: não podem ser movidos; empacotamento os recusa e nomeia arquivo e linha.
app types#
Grave os tipos TypeScript de window.screenrig em um diretório.
app types [directory]| Parâmetro | Tipo | Obrigatório | Padrão | Notas |
|---|---|---|---|---|
[directory] | caminho | não | o diretório atual | O diretório em que screenrig.d.ts é gravado. Ele precisa existir. |
screenrig app types ./srcO envelope informa path, bytes, sha256 e written, que é false quando o arquivo já continha os tipos atuais. O arquivo corresponde ao tempo de execução que app pack e app upload injetam, então execute o comando de novo depois de atualizar a CLI. Um screenrig.d.ts existente é substituído por inteiro; um diretório ou um link simbólico nesse caminho é recusado, e o comando termina com o código 2. Ele roda localmente e não exige login. TypeScript descreve o que os tipos declaram.
app dev#
Sirva um diretório em um ambiente de teste local do Player para experimentar um aplicativo antes de enviá-lo.
app dev <directory> [--port PORT] [--open] [--no-reload] [--kv FILE | --kv-from APP_ID]| Parâmetro | Tipo | Obrigatório | Padrão | Notas |
|---|---|---|---|---|
<directory> | caminho | sim | nenhum | O diretório estático construído. Precisa de uma raiz index.html. |
--port PORT | integer | não | 18890 | A porta em que o ambiente de teste escuta. O runtime confia no ambiente de teste apenas em 18890, por isso qualquer outra porta é recusada. |
--open | boolean | não | desligado | Abra o ambiente de teste no navegador. |
--no-reload | boolean | não | desligado | Mantenha a página como está quando um arquivo muda. Sem isso, a página recarrega a cada mudança. |
--kv FILE | caminho | não | .screenrig-dev/kv.json | O arquivo JSON que contém o armazenamento de chave/valor da execução. |
--kv-from APP_ID | string | não | nenhum | Leia o armazenamento de chave/valor deste aplicativo enviado, somente leitura, em vez de um arquivo. |
screenrig app dev ./lobby-board --openO comando serve o ambiente de teste em http://play.screenrig.localhost:18890 e roda até você interrompê-lo. Ele injeta o runtime como app pack faz e informa o que o empacotamento recusa, indicando o arquivo e a linha, conforme você edita. O ambiente de teste simula as capacidades, a viewport, o nome da tela, o fuso horário e os params, o temporizador da página, a pausa, a tela e a saída, os eventos do dispositivo, e portas seriais, linhas GPIO, periféricos Bluetooth LE e impressoras. As linhas emit e log são impressas no terminal. Desenvolver localmente descreve os controles.
app upload#
Empacote um diretório, publique-o como uma nova versão do aplicativo e aguarde a publicação ser bem-sucedida.
app upload <directory> [--name NAME] [--no-wait] [--poll-ms MS] [--timeout MS]| Parâmetro | Tipo | Obrigatório | Padrão | Notas |
|---|---|---|---|---|
<directory> | caminho | sim | nenhum | O diretório estático construído. |
--name NAME | string | não | um nome gerado | Nome do aplicativo, de 1 a 120 caracteres após remover espaços nas extremidades, sem caracteres de controle. |
--no-wait | boolean | não | desligado | Retornar antes que a operação de publicação termine. Execute operations wait antes de fixar a versão em uma playlist. |
--poll-ms MS | integer | não | 1000 | Intervalo entre pesquisas de operação enquanto aguarda. |
--timeout MS | integer | não | 120000 | Prazo para a espera. Também limita cada solicitação subjacente. |
screenrig app upload ./lobby-board --name "Lobby board"Ler três campos: data.operation.state é succeeded, data.application.release_id é o id rel_ um primitivo application fixa, e data.application.id é o id app_ que os comandos kv usam. Uma operação bem-sucedida, não um id de release sozinho, significa que a release é utilizável.
Cada app upload cria um novo aplicativo e uma primeira versão imutável. Para publicar uma versão posterior do mesmo app, use app update. Uma playlist continua servindo a versão que já fixa até você editar esse primitivo.
Uma transferência para o armazenamento que for interrompida é tentada até 4 vezes enquanto a URL de upload for válida. Se ainda falhar, execute o mesmo comando novamente para retomar o mesmo upload.
app update#
Publicar uma nova versão de um aplicativo existente, preservando identidade, nome e K/V do aplicativo.
app update <id> <directory> [--expect-rev REVISION] [--no-wait] [--poll-ms MS] [--timeout MS]| Parâmetro | Tipo | Obrigatório | Padrão | Notas |
|---|---|---|---|---|
<id> | string | sim | nenhum | O id da aplicação app_. |
<directory> | caminho | sim | nenhum | O diretório estático construído. |
--expect-rev REVISION | string | não | nenhum | Pré-condição opcional de revisão. Omitir para escrever o recurso atual. Um valor obsoleto fornecido é revision_conflict: buscar novamente, reaplicar, tentar novamente. |
--no-wait | boolean | não | desligado | Retornar antes que a operação de publicação termine. Execute operations wait antes de fixar a versão em uma playlist. |
--poll-ms MS | integer | não | 1000 | Intervalo entre pesquisas de operação enquanto aguarda. |
--timeout MS | integer | não | 120000 | Prazo para a espera. Também limita cada solicitação subjacente. |
screenrig app update app_01EXAMPLEAPP00000000000 ./lobby-boardO nome permanece; altere-o com app rename. Aguarde data.operation.state: "succeeded", depois use playlist replace-release para revisar a página exata, primitivo, nova versão e telas afetadas. Aplique com o token de impacto retornado e um controle de revisão opcional conforme descrito no fluxo de trabalho da playlist. Os pins existentes da playlist permanecem inalterados até a aplicação. Em caso de conflito de revisão, leia o app novamente antes de decidir se deve tentar novamente; não crie um aplicativo substituto apenas para contornar o conflito.
app list#
Listar os aplicativos do projeto.
app listSem parâmetros.
screenrig app listapp rename#
Alterar o nome de exibição de um aplicativo.
app rename <id> --name NAME [--expect-rev REVISION]| Parâmetro | Tipo | Obrigatório | Padrão | Notas |
|---|---|---|---|---|
<id> | string | sim | nenhum | O id da aplicação app_. |
--name NAME | string | sim | nenhum | O novo nome, de 1 a 120 caracteres após remover espaços nas extremidades, sem caracteres de controle. |
--expect-rev REVISION | string | não | nenhum | Pré-condição opcional de revisão. Omitir para escrever o recurso atual. Um valor obsoleto fornecido é revision_conflict: buscar novamente, reaplicar, tentar novamente. |
screenrig app rename app_01EXAMPLEAPP00000000000 --name "Lobby welcome"Só o nome de exibição muda. O ID do aplicativo, seus lançamentos, seus dados chave/valor e as playlists que fixam seus lançamentos permanecem como estão, e nenhum diretório é enviado. Renomear para o nome atual deixa a revisão inalterada. Os nomes podem se repetir; identifique um aplicativo pelo ID.
app show#
Leia um aplicativo.
app show <id>| Parâmetro | Tipo | Obrigatório | Padrão | Notas |
|---|---|---|---|---|
<id> | string | sim | nenhum | O id da aplicação app_. |
screenrig app show app_01EXAMPLEAPP00000000000latest_ready_release está ausente até que uma primeira publicação fique pronta. O estado da publicação vive na operação e no lançamento, não no aplicativo. last_used_at está ausente até que uma tela reproduza o aplicativo pela primeira vez.
app delete#
Excluir um aplicativo e todas as suas versões.
app delete <id> [--expect-rev REVISION]| Parâmetro | Tipo | Obrigatório | Padrão | Notas |
|---|---|---|---|---|
<id> | string | sim | nenhum | O id da aplicação app_. |
--expect-rev REVISION | string | não | nenhum | Pré-condição opcional de revisão. Omitir para escrever o recurso atual. Um valor obsoleto fornecido é revision_conflict: buscar novamente, reaplicar, tentar novamente. |
screenrig app delete app_01EXAMPLEAPP00000000000Não há exclusão por lançamento. Enquanto uma tela mostra um dos lançamentos da aplicação, a exclusão responde application_in_use: dê a essas telas outro conteúdo primeiro. A exclusão não verifica playlists que fixam um lançamento sem mostrá-lo, então atualize ou exclua essas playlists também.
Chave/valor do aplicativo
O armazenamento chave/valor pertence a um aplicativo e é seguro para binários. Cada comando usa --app-id com o ID app_ de app upload, nunca um ID de lançamento. Use exatamente um modo de valor por gravação.
kv list#
Listar as chaves armazenadas para um aplicativo.
kv list --app-id ID| Parâmetro | Tipo | Obrigatório | Padrão | Notas |
|---|---|---|---|---|
--app-id ID | string | sim | nenhum | O id da aplicação app_. |
screenrig kv list --app-id app_01EXAMPLEAPP00000000000kv get#
Leia uma chave.
kv get --app-id ID <key>| Parâmetro | Tipo | Obrigatório | Padrão | Notas |
|---|---|---|---|---|
--app-id ID | string | sim | nenhum | O id da aplicação app_. |
<key> | string | sim | nenhum | A chave para ler. |
screenrig kv get --app-id app_01EXAMPLEAPP00000000000 menuA resposta traz o valor em data.value_base64, inclusive valores JSON: decodifique-o e interprete JSON somente quando data.content_type indicar JSON. kv list omite os valores.
kv set#
Escreva uma chave do JSON, um arquivo ou bytes 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]| Parâmetro | Tipo | Obrigatório | Padrão | Notas |
|---|---|---|---|---|
--app-id ID | string | sim | nenhum | O id da aplicação app_. |
<key> | string | sim | nenhum | A chave para escrever. |
--json-value JSON | string | um modo | nenhum | Um valor JSON, canonizado antes de ser enviado, sempre armazenado como application/json. Um tipo de conteúdo application/json explícito também é aceito. |
--file FILE | caminho | um modo | nenhum | Lê os bytes do valor de um arquivo, no máximo 1 MiB, ou de stdin com -. Padrão é application/octet-stream. |
--value-base64 BASE64 | string | um modo | nenhum | Base64 padrão canônica preenchida sem espaços em branco, no máximo 1.398.104 caracteres; um valor vazio é válido. Padrão é application/octet-stream. |
--content-type TYPE | string | não | application/octet-stream para bytes | De um a 127 caracteres. |
--expect-rev REVISION | string | não | nenhum | Escreva somente se a entrada armazenada ainda estiver nesta revisão. |
screenrig kv set --app-id app_01EXAMPLEAPP00000000000 menu --json-value '{"soup":"lentil"}'kv delete#
Excluir uma chave.
kv delete --app-id ID <key> [--expect-rev REVISION]| Parâmetro | Tipo | Obrigatório | Padrão | Notas |
|---|---|---|---|---|
--app-id ID | string | sim | nenhum | O id da aplicação app_. |
<key> | string | sim | nenhum | A chave para excluir. |
--expect-rev REVISION | string | não | nenhum | Pré-condição opcional de revisão. Omitir para escrever o recurso atual. Um valor obsoleto fornecido é revision_conflict: buscar novamente, reaplicar, tentar novamente. |
screenrig kv delete --app-id app_01EXAMPLEAPP00000000000 menuWebhooks chave/valor
Um webhook chave/valor é uma URL que grava uma chave de um aplicativo, então qualquer sistema externo, como um ponto de venda, um script de planilha ou um cron job, envia dados para telas com um único POST HTTP. Um aplicativo que se inscreve com kv.onChange atualiza em segundos em todas as telas que o executam. Um aplicativo tem no máximo 20 webhooks.
O remetente se autentica com o segredo do webhook, srkw_…, como Authorization: Bearer <secret>, ou com HTTP Basic usando o ID do webhook como nome de usuário e o segredo como senha; um segredo na URL ou na query string nunca é aceito. O corpo bruto, de no máximo 1 MiB, vira o valor da chave e Content-Type o tipo de conteúdo dela. Cada envio não conta no limite de solicitações de agente, conta no armazenamento como kv set, aumenta a revisão e responde com os novos metadados da chave, nunca com o valor. Um cabeçalho Idempotency-Key opcional deduplica as novas tentativas de um remetente por 24 horas. Um webhook aceita no máximo 120 envios por minuto, e um segredo ausente ou errado ou um webhook desconhecido recebe 401. Enviar dados de outro sistema tem exemplos de curl.
O segredo é mostrado apenas por kv webhook create e kv webhook rotate-secret. A URL não é secreta. Criar, rotacionar e excluir um webhook adiciona kv_webhook.created, kv_webhook.secret_rotated e kv_webhook.deleted ao log de eventos do projeto, e cada post adiciona kv.updated como qualquer escrita.
| Código do problema | Sair | Significado |
|---|---|---|
kv_webhook_limit_reached | 5 | O aplicativo ou o cartão já tem 20 webhooks. Nada foi criado. Exclua um primeiro. |
not_found | 4 | O aplicativo não está neste projeto, ou nenhum webhook tem esse id nele. |
card_not_found | 4 | O cartão não está neste projeto. |
kv webhook create#
Criar um webhook que grava uma chave de uma aplicação ou, com --card, o documento de dados de um cartão, e receber sua URL e segredo uma vez.
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]| Parâmetro | Tipo | Obrigatório | Padrão | Notas |
|---|---|---|---|---|
<key> | string | com --app-id | nenhum | A chave que cada postagem grava, de 1 a 256 caracteres: uma letra ou dígito primeiro, depois letras, dígitos, ., _, :, / ou -. A chave pode ainda não existir. Um webhook de cartão não usa chave. |
--app-id ID | string | um de | nenhum | O id da aplicação app_. Informe exatamente um entre --app-id e --card. |
--card CARD_ID | string | um de | nenhum | O id de cartão crd_: o webhook grava o documento de dados do cartão. Veja Webhooks de cartão. |
--description TEXT | string | não | nenhum | O que envia para ele, no máximo 200 bytes. Não deve conter credenciais. |
--map FILE | caminho | não | nenhum | O mapeamento que monta o documento a partir do corpo postado: um objeto JSON de no máximo 64 KiB lido de um arquivo, ou - para stdin. Sem ele, o objeto postado é o documento. |
--key-template TEMPLATE | string | não | nenhum | Grava documentos por chave sob uma chave preenchida com tokens {screen.field.NAME}, como room-{screen.field.room}. |
--signing | boolean | não | desligado | Exige também ScreenRig-Signature em cada postagem e mostra o segredo de assinatura uma só vez. Não se combina com --verify. |
--verify VENDOR | string | não | nenhum | Aceita postagens que trazem a assinatura própria deste fornecedor no lugar do segredo srkw_ do webhook, que continua funcionando ao lado: github, stripe, shopify, slack, linear, vercel, asana ou generic_hmac. |
--verify-secret-file FILE | caminho | com --verify | nenhum | Lê o segredo do fornecedor de um arquivo, ou - para stdin (nunca como argumento): o segredo que GitHub, Stripe, Shopify, Slack, Linear ou Vercel mostra, ou o de um remetente generic_hmac. asana não aceita nenhum: o handshake o entrega. Apenas uma opção lê stdin. |
--verify-header NAME | string | com generic_hmac | nenhum | O cabeçalho que carrega a assinatura, de 1 a 100 letras, dígitos, - ou _. |
--verify-encoding ENCODING | string | não | hex | Com generic_hmac: como a assinatura é escrita, hex ou base64; pode começar com sha256=. |
--verify-timestamp-header NAME | string | não | nenhum | Com generic_hmac: um cabeçalho que carrega a hora Unix em segundos ou em milissegundos com 13 dígitos. O texto assinado é então o carimbo de data e hora, um ponto e o corpo. |
--verify-tolerance SECONDS | integer | não | 300 | Com --verify-timestamp-header: o quanto o carimbo de data e hora pode se afastar do relógio do servidor, de 1 a 86400. |
--handshake VENDOR | string | não | nenhum | Responde ao desafio de configuração de microsoft_graph, monday, trello ou azure_event_grid. O Slack e o Asana respondem aos seus por --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 com suas opções e --handshake se aplicam apenas a um webhook de cartão.
O envelope é o webhook: data.id (kvw_…), data.key ou, para um cartão, 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) e data.secret (srkw_…). Um webhook de cartão que assina também traz data.signing_secret (whsec_…). Informe agora a URL e os segredos no sistema remetente. Nenhum comando posterior os mostra de novo. Após uma criação interrompida ou ambígua, execute novamente o comando idêntico dentro de 24 horas: ele reutiliza a chave de idempotência salva, e o servidor retorna o mesmo webhook e os mesmos segredos em vez de criar outro.
kv webhook list#
Listar os webhooks de uma aplicação ou de um cartão, os mais antigos primeiro.
kv webhook list (--app-id ID | --card CARD_ID)| Parâmetro | Tipo | Obrigatório | Padrão | Notas |
|---|---|---|---|---|
--app-id ID | string | um de | nenhum | O id da aplicação app_. Informe exatamente um entre --app-id e --card. |
--card CARD_ID | string | um de | nenhum | O ID de cartão crd_. |
screenrig kv webhook list --app-id app_01EXAMPLEAPP00000000000
screenrig kv webhook list --card crd_01EXAMPLEBOARD0000000000Cada item possui id, key, description, url, created_at e, após ser gravado, last_used_at. O item de um webhook de cartão tem card_id no lugar de key, mais mapping (null quando o objeto postado é o documento), enabled, signing e, quando definidos, key_template, verify e handshake. Uma lista nunca carrega um segredo.
kv webhook delete#
Excluir um webhook. Sua URL para de funcionar imediatamente, e a chave ou o documento do cartão mantém seu valor.
kv webhook delete <webhook_id> (--app-id ID | --card CARD_ID)| Parâmetro | Tipo | Obrigatório | Padrão | Notas |
|---|---|---|---|---|
<webhook_id> | string | sim | nenhum | O id do webhook kvw_. |
--app-id ID | string | um de | nenhum | O id da aplicação app_. Informe exatamente um entre --app-id e --card. |
--card CARD_ID | string | um de | nenhum | O ID de cartão crd_. |
screenrig kv webhook delete kvw_01EXAMPLEWEBHOOK00000 --app-id app_01EXAMPLEAPP00000000000
screenrig kv webhook delete kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000kv webhook rotate-secret#
Substituir o segredo de um webhook e receber o novo uma vez.
kv webhook rotate-secret <webhook_id> (--app-id ID | --card CARD_ID) [--signing]| Parâmetro | Tipo | Obrigatório | Padrão | Notas |
|---|---|---|---|---|
<webhook_id> | string | sim | nenhum | O id do webhook kvw_. |
--app-id ID | string | um de | nenhum | O id da aplicação app_. Informe exatamente um entre --app-id e --card. |
--card CARD_ID | string | um de | nenhum | O ID de cartão crd_. |
--signing | boolean | não | desligado | Com --card: substitui o segredo de assinatura em vez do segredo do webhook. |
screenrig kv webhook rotate-secret kvw_01EXAMPLEWEBHOOK00000 --app-id app_01EXAMPLEAPP00000000000
screenrig kv webhook rotate-secret kvw_01EXAMPLEWEBHOOK00000 --card crd_01EXAMPLEBOARD0000000000 --signingO envelope traz o novo segredo em data.secret. O segredo antigo para de funcionar imediatamente, então informe o novo no sistema remetente. Com --signing, o envelope traz no lugar o novo segredo de assinatura em data.signing_secret, e o segredo srkw_ do webhook permanece. Após uma rotação interrompida ou ambígua, execute novamente o comando idêntico: ele reutiliza a chave de idempotência salva, e o servidor retorna a rotação que já aconteceu em vez de rotacionar de novo.