tinygo now has a "wasi" target that you can try.


On Fri, Dec 16, 2022 at 2:10 PM 'Kevin Chowski' via golang-nuts <
golang-nuts@googlegroups.com> wrote:

> I recently learned that WASI (
> https://github.com/bytecodealliance/wasmtime/blob/main/docs/WASI-intro.md)
> supports filesystem abstractions directly for WASM code.
>
> Is there an plan to integrate this into Go?
>
> On Saturday, November 5, 2022 at 5:59:08 AM UTC-6 Konstantin Khomoutov
> wrote:
>
>> On Fri, Nov 04, 2022 at 02:08:08PM -0700, 'Kevin Chowski' via golang-nuts
>> wrote:
>>
>> [...]
>> > I am on a project which primarily ships a Go command line interface
>> (CLI),
>> > but we have aspirations of using the wasm compilation mode to also
>> > distribute a simple webapp version of it, while sharing most of the
>> code.
>> [...]
>> > The next big hurdle is the fact that we cache things on disk
>> > for later reuse, so things are failing out-of-the-box any time we
>> attempt
>> > to touch the filesystem. Luckily, in our case, the fact that we are
>> > touching the filesystem is a bit incidental (its used as a cache for
>> making
>> > consecutive CLI invocations faster), and as long as the system was
>> > consistent for the lifetime of the main Go process things will work
>> just
>> > fine.
>> >
>> > We /could/ pass a filesystem object across the codebase, and maybe we
>> will
>> > one day we will anyway for some other reasons, but I'd rather not have
>> to
>> > do that just to get further with this webapp prototype: it's a lot of
>> > tedious plumbing, and there is a nontrivial amount of code to touch.
>> >
>> > So instead I decided to try some global-mutable-at-startup variables
>> for
>> > things like os.OpenFile, os.Remove, etc, that should be easy to cleanup
>> if
>> > we decide not to move forward with the prototype; but even then, there
>> are
>> > plenty of random things I have to do to get this to work. I've spent
>> about
>> > 2 hours on this direction so far and I keep hitting unexpected
>> roadblocks -
>> > thus this email seeking out a new strategy.
>> >
>> > Are there any plans to automatically support filesystems on
>> wasm-compiled
>> > Go applications? Even an ephemeral, in-memory filesystem would
>> basically
>> > solve all of my problems without having to change any code on my end,
>> which
>> > would be nice.
>>
>> I'm not a Go developer, but I'd say it is unlikely due to the combination
>> of
>> these two facts:
>>
>> - The os package was implemented as a sort-of grab bag of many features
>> one expects on a typical OS (hence the name). The fact the filesystem
>> operations were implemented in that package directly and not elsewhere
>> is the direct manifestation of that approach.
>> An environment in which WASM runs in a browser is too different from that
>> provided by a typical OS, so I cannot see how one could sensibly
>> implement
>> in GOOS=js.
>>
>> - Even if some sort of FS emulation were to be implemented for GOOS=js,
>> the question is: which one exactly? Keeping stuff in memory in just one
>> way of doing things. While I'm not a web developer, I know of at least
>> session storage and local storage which provide for two levels of
>> persistence beyond keeping stuff in memory. Which one to pick for
>> implementing stuff from the os package?
>>
>> > In lieu of that, does anyone have any tips about how I could go about
>> doing
>> > this in a better way?
>>
>> If you need a hard-and-fast solution, I'd propose you're trying to
>> abstract
>> your stuff away on a wrong level. I think it would be cleaner to factor
>> out
>> your persistence code into a set of functions "store this stuff" and
>> "load
>> that stuff"; the default implementations would call out to the os
>> package, and
>> the wasm implementation would use either approach you select: keeping
>> things
>> in memory, using local storage etc.
>>
>> I mean, trying to implement and pass around through the whole codebase
>> something like a "filesystem accessor" switchable at runtime is only
>> worth it
>> if your code makes heavy use of the filesystem in nontrivial way. I'd say
>> that
>> it's better to abstract away high-level store/load operations.
>>
>> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/dd8306ab-75bf-4bb6-a9ac-3c9f778665a7n%40googlegroups.com
> <https://groups.google.com/d/msgid/golang-nuts/dd8306ab-75bf-4bb6-a9ac-3c9f778665a7n%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CANKfucZOghu5O%2BCdERtZ0QhZfnK2u4-OU-7pm%3DrHZdSYjSPy-Q%40mail.gmail.com.

Reply via email to