lighthouse_north_client 0.2.3
lighthouse_north_client: ^0.2.3 copied to clipboard
SDK Flutter oficial para integrar o app do cliente à plataforma Lighthouse North de disparo push: registro de device token com evidência de consentimento (LGPD), heartbeat e opt-out fácil e gratuito. [...]
Changelog — client-flutter (CODINOME; nome de publicação a definir) #
Formato:keep a changelog / semver. O pacote está em 0.x — a API pública pode mudar até o nome oficial + 1.0.
0.2.3 #
- Simplified example: 95 lines, only essential integration pattern
0.2.2 #
- Fix: correct API base URL to https://lighthousenorth.com.br
0.2.1 #
- Clean README: user-focused documentation, no internal jargon
- Updated import path to lighthouse_north_client
0.2.0 (3.3 — frente B) #
- Android embutido: estado local cifrado no Android Keystore
(AES-256-GCM, IV novo por write, migração e REMOÇÃO do plaintext legado
3.2, fail-closed com
storage_errortipado);onNewToken→ evento no canal → rotação automática no Dart (LighthouseNorthClientPlugin.dispatchNewTokenpara hosts com service próprio); correções de embedding reveladas pela 1ª compilação real (lifecycle-common pinado em 2.7.0 = embedding; ActivityAware com assinaturas atuais; observer no lifecycle do ACTIVITY binding). - iOS embutido: estado local na Keychain (migração e remoção do
UserDefaults legado, fail-closed);
getTokenREAL via Firebase do host detectado em runtime (NSClassFromString("FIRMessaging")— sem dependência no podspec); sem Firebase →firebase_not_configuredtipado como antes. PENDENTE: build em macOS (sem Xcode na máquina da frente B). - Dart:
handleTokenRotation(newToken)público + streamonTokenRotated- dispatcher único do canal (permissão + rotação);
DeviceSdkState.fromJsonStringagora DESCARTA versão desconhecida (contrato §5 — antes tolerava; paridade com os codecs nativos).
- dispatcher único do canal (permissão + rotação);
- Example: manifest debug ganha
usesCleartextTraffic(loopback dev viaadb reverse; release segue https-only). - Evidência: 1ª build real do example no emulador (register 201 + opt-out com revoke/unregister + audits na API real do compose); testes 76 → 87 (rotação, dispatcher de canal, version check).
0.1.0 — 2026-09-20 (fatia 3.2: SDK de referência) #
Primeira versão do SDK Flutter da plataforma Lighthouse North (push).
Adicionado #
LighthouseNorthClient.init(appKey, {apiBaseUrl, httpClient, tokenProvider, stateStore, logger, clock, scheduler, random})— todas as dependências injetáveis.registerForPush({contactRef?, policyVersion?})— fluxo completo: permissão do OS → token (Firebase do host) →POST /v1/devicescomconsent {granted, capturedAt, policyVersion?}→ persistência local mínima. Permissão negada →PushPermissionDeniedException(sem registro, sem crash).startHeartbeat/stopHeartbeat— 24h default com jitter ±10%, sobrevive a restart (retomada noinit+ refresh imediato), falhas de rede não derrubam o ciclo.optOut()— REQUISITO LEGAL BLOQUEANTE: best-effort (revoga consent ANTES do unregister), nunca lança por rede, resultado por passo; falha total preserva estado para re-tentativa.onPermissionRevoked— watcher da permissão do OS: unregister automático (cobrança honesta) + evento para UX do host; contactRef/policyVersion preservados para re-consentimento.- Transporte único: TLS-only (http só loopback), timeout 10s, retry backoff exponencial + jitter ±25% (máx 3, só idempotentes, só 408/429/5xx), User-Agent próprio, segredos sempre mascarados.
- Platform channel
lighthouse_north_client(contrato emdocs/NATIVE_CONTRACT.md): Android completo (permissão 13+, FCM do host viacompileOnly, SharedPreferences, lifecycle watcher); iOS permissão+storage+watcher (getToken nativo chega na 3.3 — até lá provider Dart do host). FakeTokenProvider,FakeClock,FakeScheduler,FixedLighthouse NorthRandom,InMemoryDeviceStateStore,InMemoryLighthouse NorthLogger— exportados para testes do host.example/— app mínimo com o fluxo legal (opt-in + opt-out obrigatório na UI) e 2 widget tests.- 70 testes (registro feliz/negado, minimização de corpo, retry/backoff/jitter limites, TLS-only, opt-out completo/parcial/total, heartbeat jitter/restart, permission watcher, storage, channel mocks).
Notas #
- Nome de publicação (pub.dev) PENDENTE do dono —
publish_to: none. - Default
apiBaseUrlé placeholder até o domínio oficial acompanhar o nome. - Minimização LGPD por construção: coleta exatamente platform/token/contactRef/consent. Plain-text por construção: não renderiza conteúdo de push.