C'e' un problema che si presenta identico in tre mestieri diversi: la pizzeria che deve stampare la comanda in cucina, il magazzino che deve stampare l'etichetta sul bancale, il negozio che deve mandare lo scontrino al registratore di cassa.
In tutti e tre i casi la web app gira su un server remoto. La stampante sta dentro il locale, dietro il router, con un indirizzo privato tipo 192.168.1.50 che dall'esterno non esiste. Il server non puo' raggiungerla. Sembra un vicolo cieco, e infatti e' il punto in cui la maggior parte dei progetti ripiega su un software da installare su un computer del negozio.
Perche' le soluzioni consuete non convincono
La VPN funziona, ma sposta il problema su qualcun altro. Va installata, configurata, e quando cade la connessione qualcuno deve saperla rialzare. In un ristorante alle nove di sera quel qualcuno non c'e'.
L'agente da installare e' un programma che gira sul computer del negozio e riceve i comandi. Funziona finche' quel computer non viene spento, sostituito, aggiornato o portato a casa. Ogni cliente diventa un'installazione da mantenere.
Aprire la stampante su internet non va nemmeno discusso.
Il pezzo che manca e' gia' li'
C'e' una cosa che sta contemporaneamente dentro la rete del locale e in contatto col server remoto: il browser. E' aperto sulla pagina della web app, quindi parla col server; e gira su un computer collegato alla stessa rete della stampante, quindi puo' parlare anche con lei.
Da solo pero' non ce la fa, per due motivi che sono difese del browser, non difetti. La prima e' la politica sulle origini: una pagina servita da un dominio non puo' fare richieste verso un altro indirizzo se quello non lo autorizza esplicitamente, e una stampante di rete non autorizza niente. La seconda e' il contenuto misto: una pagina caricata in HTTPS non puo' fare richieste in HTTP semplice, e la stampante parla solo HTTP.
Un'estensione del browser, tre file
Un'estensione ha permessi che una pagina normale non ha, e questo risolve entrambi i problemi in una volta. Sono tre file.
Il manifesto dichiara verso quali indirizzi l'estensione puo' parlare. E' l'unico punto in cui si nomina la stampante, e ha un effetto collaterale utile: l'elenco dei permessi e' scritto in chiaro e ispezionabile.
Lo script di contenuto viene iniettato nella pagina della web app e resta in ascolto dei messaggi che la pagina gli manda. La pagina non parla mai direttamente con la stampante: prepara il comando di stampa e lo passa all'estensione.
Il service worker riceve il messaggio e fa la richiesta vera verso l'indirizzo locale. Sta fuori dal contesto della pagina, quindi la politica sulle origini non lo blocca e il contenuto misto non lo riguarda.
Per una stampante di etichette il comando e' linguaggio ZPL mandato in POST all'endpoint del dispositivo. Per una stampante di comande cambia il formato, non l'impianto.
Cosa si guadagna
Niente da installare sui computer del negozio oltre a un'estensione che si aggiunge in trenta secondi. Nessuna rete privata da mantenere. La stampante resta invisibile da internet: chi la comanda e' un browser che sta gia' dentro casa. E se il computer cambia, si reinstalla l'estensione e basta.
Il limite, detto chiaramente
Un'estensione parla HTTP, non socket TCP grezzi. I dispositivi che accettano solo una connessione TCP su una porta — diversi registratori di cassa fiscali funzionano cosi' — restano fuori da questa strada e vanno affrontati in un altro modo.
Vale la pena saperlo prima di promettere qualcosa a un cliente, perche' e' il tipo di dettaglio che si scopre il giorno dell'installazione.