Użyłem ngrok do tunelowania lokalnego adresu IP (tak naprawdę nie jest tak, ponieważ znajduje się w Google Colab) do publicznego.
Przechodząc do konsoli ngrok , widzę wszystkie utworzone tunele. Utworzyłem tylko jeden tunel dla localhost: port, ale tutaj są 2, jeden dla HTTP i drugi dla HTTPS (czyż nie jest to miłe?).
Jeśli przejdę do adresu https mojej aplikacji internetowej, na konsoli widzę
Ale jeśli przejdę pod adres http, na konsoli otrzymam
P: Czy możesz pracować z pracownikami usług, którzy potrzebują protokołu HTTP przez tunele do zdalnego komputera?
O: Najwyraźniej tak!
Kod stojący za tą rejestracją to (ważne, aby wiedzieć, gdzie się nie udaje):
IndexController.prototype._registerServiceWorker = function() {
console.log("1.Starting SW function.");
if (!navigator.serviceWorker) {
console.log("2.Browser is NOT compatible with SW or something is not working.");
return; }
console.log("2.Browser is compatible with SW.");
navigator.serviceWorker.register('/sw.js').then(function() {
console.log('3.Registration worked!');
}).catch(function() {
console.log('3.Registration failed!');
});
};
Aby było to bardziej skomplikowane, moja aplikacja internetowa korzystająca z Service Workers działa w Colab ( Google Colab ). Aplikacja internetowa działa na Node.js wewnątrz Colab.
Jeśli pracujesz z localhost, powinno być to dla Ciebie łatwiejsze, ponieważ wymóg https nie jest wymuszany podczas łączenia się z localhost (zgodnie z teorią). [A] i [B]
To nie to samo, że przeglądarka będzie dobrze współpracować z Twoją aplikacją tylko dlatego, że działa na hoście lokalnym.
Uwaga: mój eksperyment powyżej ...
- Firefox: działał z poniższymi ustawieniami i bez nich.
- Chrome: bez dodawania adresów URL do białej listy i ponownego uruchamiania otrzymałem
Przechodząc do aplikacji internetowej https, dostałem:
IndexController.js:49 Mixed Content: The page at 'https://0a4e1e0095b0.ngrok.io/' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://0a4e1e0095b0.ngrok.io/updates?since=1602934673264&'. This request has been blocked; this endpoint must be available over WSS.
IndexController._openSocket @ IndexController.js:49
IndexController @ IndexController.js:10
(anonymous) @ index.js:16
loadScripts @ loadScripts.js:5
46.../utils/loadScripts @ index.js:15
s @ _prelude.js:1
e @ _prelude.js:1
(anonymous) @ _prelude.js:1
IndexController.js:49 Uncaught DOMException: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.
at IndexController._openSocket (https:
Przechodząc do aplikacji internetowej http, dostałem:
Navigated to http:
IndexController.js:17 1.Starting SW function.
IndexController.js:19 2.Browser is NOT compatible with SW or something is not working.
Jeśli nie jesteś na hoście lokalnym ORAZ nie możesz używać protokołu HTTPS, może być konieczna zmiana tych ustawień w przeglądarce.
Niektórzy już to wyjaśnili, ale to znowu się dzieje.
Chrom:
- Wejdź na chrome: // flags / # unsafely-treat-insecure-origin-as-secure
- Dodaj adresy URL, które chcesz umieścić na białej liście.
- Uruchom ponownie Chrome
Pamiętaj, że spowoduje to ponowne uruchomienie wszystkich okien Chrome. Nie jest to dla mnie rozwiązanie, ponieważ moje tunele zmieniają nazwę za każdym razem, gdy są tworzone i nie mogę za każdym razem ponownie uruchamiać wielu okien.
Firefox / Waterfox
- Otwórz narzędzia programistyczne
- Otwórz ustawienia
- Zaznacz „Włącz pracowników usług przez HTTP (gdy przybornik jest otwarty)”
Firefox / Waterfox
Prawdopodobnie nie musisz wprowadzać poniższych zmian, ale to zrobiłem (moja przeglądarka może być trochę stara). Więcej informacji tutaj .
W about: config
Włączyłem
dom.serviceWorkers.testing.enabled
dom.serviceWorkers.enabled
Gorąco polecam przejrzenie tej https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers i powiązanych stron w tej samej witrynie.
Jeśli ktoś jest zainteresowany konfiguracją ngrok, jest to bardzo proste (wersja dla Pythona).
# Install pyngrok python package on your Google Colab Session
!pip install pyngrok
# Set up your ngrok Authtoken (requires free registration)
!ngrok authtoken YOUR_TOKEN_HERE
# Invoke ngrok from Python and start tunneling/connecting
from pyngrok import ngrok
# Open a HTTP tunnel on the default port 80 if not specified
ngrok_tunnel = ngrok.connect('8888')
# You can print it, or go to the ngrok console on https:
print (ngrok_tunnel.public_url)