Od niedawna zacząłem "wchodzić" w temat WebAssembly z wykorzystaniem Emscripten, porobiłem pierwsze eksperymenty z bardzo dobrymi efektami.
Bez owijania w bawełnę, przy korzystaniu ze standardowych rozwiązań przy tworzeniu aplikacji przeglądarkowych, jest następujący problem, między innymi:
- nie jest możliwy odczyt pliku po podanej nazwie, nie jest możliwy odczyt listy pliku w folderze o podanej ścieżce.
- nie jest możliwy bezpośredni zapis pliku. Jedynie jest możliwe wywołanie pobrania pliku.
- nie jest możliwe wykonywanie dowolnych połączeń TCP i UDP.
Nawet tu jest napisane https://emscripten.org/docs/porting/files/index.html że Emscripten tworzy fikcyjny system plików z tego względu, że dostęp do tego prawdziwego, nie jest możliwy.
Spotkałem się z dwoma rozwiązaniami powyższego problemu:
- Napisanie prostej aplikacji desktopowej, w ktorym będzie osadzony "środek" przeglądarki, zwany WebBrowser, WebView itp. W większości przypadków, taki komponent pozwala wywołać kod aplikacji osadzającej z Javascript uruchomionego wewnątrz WebView, a także, odwołując się do komponentu, można wywołać dowolną funkcję Javascript. Sam odczyt i zapis plików, a także utrzymywanie połączeń zapewniała by ta aplikacja desktopowa z osadzoną przeglądarką.
- Napisanie prostego serwera zgodnego z WebSocket. Aplikacja HTML+JS+WASM wykonałaby połączenie do tego serwera poprzez WebSocket, natomiast serwer by odczytywał, zapisywał pliki.
Pytanie nie jest o to, jak to zrobić, bo wiem, że da się to zrobić i w razie czego poszukam na google.
Pytanie jest o to, jak robi to większość programistów. Myślę, że jestem nie pierwszy i nie ostatni z takim problemem i być może jest wypracowany jakiś standard. Czy faktycznie istnieje standardowy sposób? Czy może istnieje już gotowa aplikacja desktopowa z przeglądarką bądź serwer WebSocket na każdy komputer, na każdy telefon z przeznaczeniem do ominięcia ograniczeń przeglądarki i wystarczy skorzystać zamiast tworzyć to samo na nowo?
Trochę rozpoznałem temat i znalazłem:
https://cordova.apache.org/
https://capacitorjs.com/
https://tauri.app/
https://www.electronjs.org/
To jest prawie to, czego szukałem, realizujące podejście opisane w punkcie 1, ale główna różnica jest taka, że wymienione programy przerabiają HTML+CSS+JS na zwykłą apkę desktopową. Jak jest potrzeba coś zmienić, to znowu trzeba zapakować. Mi chodziło raczej o to, że jest gotowa aplikacja przypominająca przeglądarkę, a właściwie to będąca przeglądarką, do której zaczytuje się plik HTML lub podaje jakiś adres HTTP i mam dostęp do całego systemu poprzez dodatkowe API, które zapewnia ta aplikacja. Testowałem to podejście na przykładzie C# z WPF i da się tak zrobić, tylko z przenośnością na inny system może być problem.
Drugi sposób to, jak wspomniałem, jest Websocket, do którego podłącza się mój HTML+JS odpalony w dowolnej zwyczajnej przeglądarce takiej, jak Chrome, Firefox. Robiłem eksperymenty z takim działaniem na własny użytek i faktycznie, to da się zrobić, to działa, a serwer byłby bardzo prostą aplikacją w konsoli lub desktopową, którą można zbudować praktycznie w każdym istniejącym języku, czy to na komputer, czy to na telefon. Prościej się już chyba nie da, ale jakoś nikt przede mną nie wypuścił takiego gotowca, a przynajmniej nie jest to używane na duża skalę. Próbowałem w C# lub w Java i w obu przypadkach nawet da się uruchamiać na różnych komputerach bez przekompilowywania, a mając w Java, to zapewne dałoby się przerobić na Androida. Czy na IOS da się przerobić, to nie wiem, nie mam możliwości sprawdzić. Przy takim podejściu można mieć z jednego pliku aplikację typowo webową, pracującą bez serwera i taką pracującą z serwerem. Po prostu w przypadku pracy bez serwera Websocket, niektóre funkcje nie będą działać lub będą działać inaczej. W pradawnych czasach coś takiego można było zrealizować za pomocą apletu Java lub Flash, a jeszcze wcześniej były biblioteki ActiveX, które działały tylko w Internet Explorer.
Kiedyś czytałem o jakiś "File API" dla standardu webowego, ale to chyba nie jest szeroko używane, a jeśli w ogóle, to ma spore ograniczenia w działaniu.