room.createdEmitido depois da criação bem-sucedida de uma sala pela conta. Dados: room_id e name.
Referência técnica para criar applets no ambiente isolado e receber eventos assinados do Lallek em sistemas externos.
As ferramentas exigem uma conta autenticada e um perfil de desenvolvedor ativo. O pedido de perfil é feito dentro do Lallek e passa pela análise da equipe antes da ativação.
Use sua conta na versão web ou desktop.
Informe experiência, proposta e áreas de interesse.
Após a ativação, use Estúdio e Webhooks Manager.
O Estúdio mantém cada projeto na sua conta, incrementa sua revisão a cada salvamento e oferece um preview em iframe isolado, sem acesso à rede ou à sessão do Lallek.
window.LallekPlugin = {
id: 'meu-applet',
mount(ctx) {
ctx.root.innerHTML = `<button id="acao">Executar</button>`;
ctx.root.querySelector('#acao').onclick = () => {
ctx.emit('acao.executada', { origem: 'painel' });
};
},
update(ctx) {
console.log('Configuração atualizada', ctx.config);
},
unmount(ctx) {
ctx.root.innerHTML = '';
}
};O manifesto descreve a identidade, a versão e os recursos solicitados pelo applet. O identificador deve permanecer estável entre versões.
{
"id": "meu-applet",
"name": "Meu Applet",
"version": "0.1.0",
"author": "Sua organização",
"category": "classroom",
"runtime": "sandboxed",
"entry": "main.js",
"permissions": ["ui:panel"],
"capabilities": {
"panel": true,
"toolbar": false,
"backgroundTask": false
}
}| Campo | Regra atual |
|---|---|
id | Letras minúsculas, números e hífens; até 80 caracteres. |
name | Entre 2 e 80 caracteres. |
version | Versão semântica no formato 1.0.0. |
category | classroom, coding, music, media ou external-tool. |
runtime | Rascunhos reconhecem os runtimes disponíveis; o pacote seguro v1 aceita somente sandboxed. |
permissions | ui:panel, room:read, room:write, media:embed e audio:playback. |
| Propriedade | Disponibilidade no preview |
|---|---|
ctx.root | Elemento exclusivo onde a interface deve ser montada. |
ctx.config | Objeto de configuração atual do applet. |
ctx.room | Exposto somente quando room:read foi declarado. |
ctx.roomActions | Exposto somente com room:write; envia uma solicitação ao host, sem acesso direto ao estado. |
ctx.manifest | Manifesto completo do projeto em execução. |
ctx.emit(name, data) | Emite um evento para o host do preview e o registra no console. |
O preview usa um iframe de origem opaca e aplica uma política de conteúdo que bloqueia conexões de rede. Imagens e mídia são limitadas a dados incorporados ou blobs locais.
.lallek-applet assinadoO botão Gerar pacote assinado salva o projeto, valida o manifesto no servidor e cria um documento v1 assinado com Ed25519. Cada arquivo e o payload completo recebem SHA-256 antes da assinatura.
O backend relê o projeto pertencente à conta e não aceita código enviado diretamente pela ação de empacotamento.
Cada desenvolvedor possui uma chave Ed25519. A chave privada permanece cifrada no servidor e nunca é entregue ao navegador.
O Estúdio recalcula hashes, consulta a chave registrada e confirma assinatura e perfil ativo antes de importar.
| Propriedade | Garantia |
|---|---|
formatVersion: 1 | Contrato determinístico do pacote Lallek. |
integrity | SHA-256 de main.js, icon.svg e do payload canônico. |
signature | Ed25519, identificador da chave e impressão digital pública. |
developer | Identidade comparada com um perfil de desenvolvedor ativo no servidor. |
Um perfil de desenvolvedor ativo pode usar Submeter à Loja. A ação salva o projeto, gera ou reutiliza exatamente a versão assinada e envia esse pacote à fila de curadoria.
Somente um pacote pertencente à conta, íntegro e assinado por uma chave ativa entra na fila.
A equipe pode iniciar a análise, solicitar alterações com parecer, rejeitar ou aprovar. Uma correção exige nova versão e novo pacote.
A aprovação registra a versão no histórico imutável e atualiza a versão atual do catálogo em uma única operação.
| Status | Significado |
|---|---|
pending | Aguardando a equipe iniciar a curadoria. |
in_review | Pacote em análise. |
changes_requested | O parecer solicita uma nova versão corrigida. |
rejected | Versão não aprovada. |
published | Versão disponível na Loja e carregada por pacote assinado nas reuniões. |
O Webhooks Manager envia requisições HTTP POST para uma URL HTTPS pública cadastrada pelo desenvolvedor. O segredo de assinatura aparece somente durante a criação ou rotação.
Use um domínio HTTPS público, sem redirecionamento.
Assine apenas os eventos necessários à integração.
Confira status HTTP, HMAC, duração e retentativas.
| Cabeçalho | Conteúdo |
|---|---|
X-Lallek-Event | Nome do evento entregue. |
X-Lallek-Delivery | UUID único da tentativa de entrega. |
X-Lallek-Signature | t=timestamp,v1=assinatura_hex. |
Content-Type | application/json. |
{
"id": "uuid-do-evento",
"event": "room.created",
"created_at": "2026-08-18T18:00:00.000Z",
"data": { "room_id": "...", "name": "..." }
}room.createdEmitido depois da criação bem-sucedida de uma sala pela conta. Dados: room_id e name.
participant.invitedEmitido depois da criação de um convite. Dados: participant_id, email, name e room_id.
applet.project.savedEmitido depois que um projeto é persistido. Dados: project_id, applet_id, name e revision.
webhook.testDisparo manual do Manager. Dados: message e endpoint_id.
A assinatura é um HMAC SHA-256 de timestamp.corpo_bruto. Faça a verificação antes de interpretar o JSON e compare os hashes em tempo constante.
import { createHmac, timingSafeEqual } from 'node:crypto';
export function verifyLallekWebhook(rawBody, header, secret) {
const parts = Object.fromEntries(
header.split(',').map(part => part.split('=', 2))
);
const timestamp = Number(parts.t);
if (!timestamp || Math.abs(Date.now() / 1000 - timestamp) > 300) {
return false;
}
const expected = createHmac('sha256', secret)
.update(`${parts.t}.${rawBody}`)
.digest();
const received = Buffer.from(parts.v1 || '', 'hex');
return expected.length === received.length &&
timingSafeEqual(expected, received);
}JSON.stringify() antes da validação pode produzir uma assinatura diferente.O Estúdio e o Webhooks Manager usam estes endpoints do backend Lallek. Todos exigem a sessão do usuário; operações sensíveis também validam perfil ativo, posse e permissão no servidor.
| Método e rota | Função atual |
|---|---|
GET/POST /developer/profile-request | Consulta ou envia a solicitação de perfil. |
GET /developer/profile | Retorna o perfil ativo vinculado à sessão. |
GET /developer/projectsPUT/DELETE /developer/projects/:id | Lista, salva com revisão e remove projetos pertencentes ao usuário. |
POST /developer/projects/:id/package | Valida no servidor e gera ou reutiliza a versão assinada imutável. |
POST /developer/packages/verify | Confere estrutura, hashes, assinatura, chave e identidade do desenvolvedor. |
POST /developer/packages/:id/submitGET /developer/submissions | Envia à curadoria e acompanha o status da submissão. |
GET/POST/PATCH/DELETE /developer/webhooks | Gerencia endpoints, eventos, segredo e estado do proprietário. |
GET /developer/webhook-deliveries | Consulta histórico auditável e permite reenvio de falhas. |