Facade Frontend
Use wippy/facade para servir o Wippy Web Host a partir de uma aplicação backend. A facade carrega o bundle frontend de uma CDN e o configura por um endpoint JSON da aplicação, sem build frontend. Parâmetros da dependência controlam identidade, temas e feature flags.
Classificação: receita de integração parcial. Ela configura e verifica completamente o shell e o endpoint de configuração, mas não cria um sistema de autenticação nem as APIs consumidas pelo Web Host.
O Que Você Criará
Uma aplicação backend que serve a UI Wippy:
- Um servidor HTTP e router público.
- Uma dependência
wippy/facadeconectada a ambos, com identidade personalizada. - O shell em
/e sua configuração em/api/public/facade/config.
Pré-requisitos
-
Runtime Wippy
v0.3.32ae projeto criado comwippy initou o template de aplicação Wippy. -
Para renderizar no navegador, um login na mesma origem que obtenha um token real do backend e grave
{"token":"..."}na chave localStorage@wippy_token_info. A facade não emite nem valida esse token. -
A facade instalada:
wippy add wippy/facade@0.6.37 wippy install
Como Funciona
- O shell é renderizado a partir do template do facade e servido em
/pelo seu servidor HTTP; seus assets e o fallback de deep link vêm de um mount estático no mesmo servidor. - Ao carregar, ele busca
GET /api/public/facade/config. - Lê
@wippy_token_infodelocalStoragee redireciona paralogin_pathsomente quando o item está ausente ou não é JSON válido. - Importa o bundle da CDN (
facade_url + '/module.js') e chamainitWippyApp(...)com a configuração.
A aplicação serve o shell e sua configuração; o bundle da UI vem da CDN.
Dependências
A facade exige um http.service para o shell e um http.router para seu endpoint de configuração. Outros parâmetros personalizam identidade e comportamento.
version: "1.0"
namespace: app
entries:
- name: gateway
kind: http.service
addr: ":8087"
lifecycle:
auto_start: true
- name: api.public
kind: http.router
meta:
server: app:gateway
prefix: /api/public
- name: facade
kind: ns.dependency
component: wippy/facade
version: "*"
parameters:
- name: server
value: app:gateway
- name: router
value: app:api.public
- name: app_title
value: Verify App
O shell requisita sua configuração, script de tema e variáveis CSS sob
/api/public/facade/, então o prefixo do router público deve ser /api/public.
Executar
wippy run
O shell fica na raiz do servidor, e o endpoint retorna a configuração de runtime:
curl http://localhost:8087/api/public/facade/config
Campos selecionados da resposta:
{
"facade_url": "https://web-host.wippy.ai/webcomponents-1.0.58",
"iframe_origin": "https://web-host.wippy.ai",
"iframe_url": "https://web-host.wippy.ai/webcomponents-1.0.58/iframe.html?waitForCustomConfig",
"module_file": "/module.js",
"mode": "compat",
"login_path": "/login.html",
"themeMode": "auto",
"themePersist": "none",
"themeStorageKey": "@wippy-theme-mode",
"env": { "APP_API_URL": "", "APP_AUTH_API_URL": "", "APP_WEBSOCKET_URL": "" },
"themeMode": "auto",
"themePersist": "none",
"themeStorageKey": "@wippy-theme-mode",
"theming": {
"host": { "i18n": { "app": { "title": "Verify App", "icon": "wippy:logo", "appName": "Wippy AI" } } }
},
"hostConfig": {
"showAdmin": true, "allowSelectModel": false, "hideNavBar": false,
"disableRightPanel": false, "startNavOpen": false, "hideSessionSelector": false,
"renderEngine": "iframe", "session": { "type": "non-persistent" }, "history": "hash"
}
}
O parâmetro app_title aparece como theming.host.i18n.app.title.
Busque também o documento raiz:
curl http://localhost:8087/
Ele deve retornar um shell HTML que busca a configuração e verifica @wippy_token_info. Esses dois checks validam a receita sem contornar autenticação.
Autenticação e Renderização no Navegador
O contrato de localStorage é limitado à origem. Uma página de login em outra porta ou hostname não consegue preencher o token para http://localhost:8087. Após uma troca de token bem-sucedida na mesma origem, o login grava o token real e retorna ao shell:
localStorage.setItem('@wippy_token_info', JSON.stringify({token: result.token}));
window.location.assign('/');
O shell lê o token, importa https://web-host.wippy.ai/webcomponents-1.0.56/module.js e o passa ao Host. A renderização só está completa quando o navegador mostra o Host sem redirecionar e suas requisições autenticam com sucesso. Não use um token placeholder apenas para evitar o redirect: o shell não o valida, e a falha apenas passa para a primeira API protegida.
Configuração
Parâmetros são enviados em parameters; valores JSON são strings JSON codificadas.
| Parâmetro | Finalidade |
|---|---|
server / router |
Servidor HTTP e router público obrigatórios |
app_title / app_name / app_icon |
Identidade; o ícone é uma referência Iconify |
show_admin / hide_nav_bar |
Feature flags ("true" / "false") |
login_path |
Destino quando não há token |
session_type |
non-persistent ou cookie |
history_mode |
hash ou browser |
css_variables |
String JSON de propriedades CSS, como '{"--p-primary":"#6366f1"}' |
fe_facade_url |
URL do bundle CDN; deixe o padrão salvo ao sobrescrever deliberadamente |
Dois valores são derivados em runtime a partir de PUBLIC_API_URL em vez de parâmetros: a
URL base da API e a URL do WebSocket (http→ws, https→wss). O facade a lê através do
registry de ambiente, então declare-a como uma env.variable na sua aplicação. Se não
definida, o navegador recorre a window.location.origin.
Limitações
- A facade não fornece autenticação. Ela espera um fluxo que grave um token em
localStorage; sem ele, redireciona paralogin_path. Combine-a comuserspace/usersou autenticação própria. - O bundle vem de
fe_facade_url, que deve estar acessível ao navegador do usuário.
Solução de Problemas
- Um loop para
/login.htmlsignifica que a origem não contém@wippy_token_infoválido. Um objeto semtokenevita o redirect, mas falha na API protegida. - HTTP 404 em
/api/public/facade/configindica prefixo diferente ou parâmetrorouterapontando para outra entrada. - Configuração correta com shell vazio geralmente significa que o navegador não carregou
facade_url + module_file. - Erros de API autenticada após o Host renderizar pertencem à API e validação de token da aplicação, não ao shell.
Próximos Passos
- Hello World — Estrutura mínima do projeto
- Autenticação — Adicione o login esperado pelo shell
- Endpoints HTTP — Routers, arquivos estáticos e handlers