stalwartlabs / mail-auth

DKIM, ARC, SPF and DMARC library for Rust
https://docs.rs/mail-auth/
Apache License 2.0
82 stars 13 forks source link

wasm support #18

Open asimpletune opened 1 year ago

asimpletune commented 1 year ago

Hello, thanks for taking time to make these great libraries. Is wasm support something that's possible?

I was able to use mail-parser in a wasm environment, but haven't had the same luck for mail-auth.

Thank you!

mdecimus commented 1 year ago

Hi, the default crypto backend of mail-auth uses the ring crate which might not compile to WASM as it includes some Assembler code. You can try disabling the default features and enabling the rust-crypto feature which uses a different library in pure Rust so you'll probably have better luck.

asimpletune commented 1 year ago

Ok, thank you for the suggestion. I will try it out.

asimpletune commented 1 year ago

Do you have any suggestions for

error: failed to run custom build command for `zstd-sys v2.0.8+zstd.1.5.5`
asimpletune commented 1 year ago

Actually, the above error only happens intermittently, but that part succeeds most of them time. Where I get blocked, even with rust-crypto feature specified and default features turned off is a bunch of error messages mostly around sys.

error[E0432]: unresolved import `crate::sys::IoSourceState`
  --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/io_source.rs:12:5
   |
12 | use crate::sys::IoSourceState;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^ no `IoSourceState` in `sys`

error[E0432]: unresolved import `crate::sys::tcp`
  --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/tcp/listener.rs:15:17
   |
15 | use crate::sys::tcp::{bind, listen, new_for_addr};
   |                 ^^^ could not find `tcp` in `sys`

error[E0432]: unresolved import `crate::sys::tcp`
  --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/tcp/stream.rs:13:17
   |
13 | use crate::sys::tcp::{connect, new_for_addr};
   |                 ^^^ could not find `tcp` in `sys`

error[E0433]: failed to resolve: could not find `Selector` in `sys`
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/poll.rs:300:18
    |
300 |             sys::Selector::new().map(|selector| Poll {
    |                  ^^^^^^^^ could not find `Selector` in `sys`

error[E0433]: failed to resolve: could not find `event` in `sys`
  --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/event.rs:24:14
   |
24 |         sys::event::token(&self.inner)
   |              ^^^^^ could not find `event` in `sys`

error[E0433]: failed to resolve: could not find `event` in `sys`
  --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/event.rs:38:14
   |
38 |         sys::event::is_readable(&self.inner)
   |              ^^^^^ could not find `event` in `sys`

error[E0433]: failed to resolve: could not find `event` in `sys`
  --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/event.rs:43:14
   |
43 |         sys::event::is_writable(&self.inner)
   |              ^^^^^ could not find `event` in `sys`

error[E0433]: failed to resolve: could not find `event` in `sys`
  --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/event.rs:68:14
   |
68 |         sys::event::is_error(&self.inner)
   |              ^^^^^ could not find `event` in `sys`

error[E0433]: failed to resolve: could not find `event` in `sys`
  --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/event.rs:99:14
   |
99 |         sys::event::is_read_closed(&self.inner)
   |              ^^^^^ could not find `event` in `sys`

error[E0433]: failed to resolve: could not find `event` in `sys`
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/event.rs:129:14
    |
129 |         sys::event::is_write_closed(&self.inner)
    |              ^^^^^ could not find `event` in `sys`

error[E0433]: failed to resolve: could not find `event` in `sys`
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/event.rs:151:14
    |
151 |         sys::event::is_priority(&self.inner)
    |              ^^^^^ could not find `event` in `sys`

error[E0433]: failed to resolve: could not find `event` in `sys`
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/event.rs:173:14
    |
173 |         sys::event::is_aio(&self.inner)
    |              ^^^^^ could not find `event` in `sys`

error[E0433]: failed to resolve: could not find `event` in `sys`
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/event.rs:183:14
    |
183 |         sys::event::is_lio(&self.inner)
    |              ^^^^^ could not find `event` in `sys`

error[E0433]: failed to resolve: could not find `event` in `sys`
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/event.rs:221:26
    |
221 |                     sys::event::debug_details(f, self.0)
    |                          ^^^^^ could not find `event` in `sys`

error[E0433]: failed to resolve: could not find `tcp` in `sys`
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/tcp/listener.rs:103:18
    |
103 |             sys::tcp::accept(inner).map(|(stream, addr)| (TcpStream::from_std(stream), addr))
    |                  ^^^ could not find `tcp` in `sys`

error[E0433]: failed to resolve: could not find `udp` in `sys`
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/udp.rs:122:14
    |
122 |         sys::udp::bind(addr).map(UdpSocket::from_std)
    |              ^^^ could not find `udp` in `sys`

error[E0433]: failed to resolve: could not find `udp` in `sys`
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/udp.rs:544:14
    |
544 |         sys::udp::only_v6(&self.inner)
    |              ^^^ could not find `udp` in `sys`

error[E0412]: cannot find type `Selector` in module `sys`
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/poll.rs:254:20
    |
254 |     selector: sys::Selector,
    |                    ^^^^^^^^ not found in `sys`

error[E0412]: cannot find type `Selector` in module `sys`
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/poll.rs:688:44
    |
688 |     pub(crate) fn selector(&self) -> &sys::Selector {
    |                                            ^^^^^^^^ not found in `sys`

error[E0412]: cannot find type `Waker` in module `sys`
  --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/waker.rs:79:17
   |
79 |     inner: sys::Waker,
   |                 ^^^^^ not found in `sys`
   |
help: consider importing one of these items
   |
1  | use core::task::Waker;
   |
1  | use crate::Waker;
   |
1  | use std::task::Waker;
   |
help: if you import `Waker`, refer to it directly
   |
79 -     inner: sys::Waker,
79 +     inner: Waker,
   |

error[E0433]: failed to resolve: could not find `Waker` in `sys`
  --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/waker.rs:87:14
   |
87 |         sys::Waker::new(registry.selector(), token).map(|inner| Waker { inner })
   |              ^^^^^ could not find `Waker` in `sys`
   |
help: consider importing one of these items
   |
1  | use core::task::Waker;
   |
1  | use crate::Waker;
   |
1  | use std::task::Waker;
   |
help: if you import `Waker`, refer to it directly
   |
87 -         sys::Waker::new(registry.selector(), token).map(|inner| Waker { inner })
87 +         Waker::new(registry.selector(), token).map(|inner| Waker { inner })
   |

error[E0412]: cannot find type `Event` in module `sys`
  --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/event.rs:18:17
   |
18 |     inner: sys::Event,
   |                 ^^^^^ not found in `sys`
   |
help: consider importing this struct
   |
1  | use crate::event::Event;
   |
help: if you import `Event`, refer to it directly
   |
18 -     inner: sys::Event,
18 +     inner: Event,
   |

error[E0412]: cannot find type `Event` in module `sys`
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/event.rs:187:55
    |
187 |     pub(crate) fn from_sys_event_ref(sys_event: &sys::Event) -> &Event {
    |                                                       ^^^^^ not found in `sys`
    |
help: consider importing this struct
    |
1   | use crate::event::Event;
    |
help: if you import `Event`, refer to it directly
    |
187 -     pub(crate) fn from_sys_event_ref(sys_event: &sys::Event) -> &Event {
187 +     pub(crate) fn from_sys_event_ref(sys_event: &Event) -> &Event {
    |

error[E0412]: cannot find type `Event` in module `sys`
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/event.rs:191:41
    |
191 |             &*(sys_event as *const sys::Event as *const Event)
    |                                         ^^^^^ not found in `sys`
    |
help: consider importing this struct
    |
1   | use crate::event::Event;
    |
help: if you import `Event`, refer to it directly
    |
191 -             &*(sys_event as *const sys::Event as *const Event)
191 +             &*(sys_event as *const Event as *const Event)
    |

error[E0412]: cannot find type `Event` in module `sys`
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/event.rs:217:46
    |
217 |             struct EventDetails<'a>(&'a sys::Event);
    |                                              ^^^^^ not found in `sys`
    |
help: consider importing this struct
    |
1   | use crate::event::Event;
    |
help: if you import `Event`, refer to it directly
    |
217 -             struct EventDetails<'a>(&'a sys::Event);
217 +             struct EventDetails<'a>(&'a Event);
    |

error[E0412]: cannot find type `Events` in module `sys`
  --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/events.rs:43:17
   |
43 |     inner: sys::Events,
   |                 ^^^^^^ not found in `sys`
   |
help: consider importing this struct
   |
1  | use crate::Events;
   |
help: if you import `Events`, refer to it directly
   |
43 -     inner: sys::Events,
43 +     inner: Events,
   |

error[E0433]: failed to resolve: could not find `Events` in `sys`
  --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/events.rs:94:25
   |
94 |             inner: sys::Events::with_capacity(capacity),
   |                         ^^^^^^ could not find `Events` in `sys`
   |
help: consider importing this struct
   |
1  | use crate::Events;
   |
help: if you import `Events`, refer to it directly
   |
94 -             inner: sys::Events::with_capacity(capacity),
94 +             inner: Events::with_capacity(capacity),
   |

error[E0412]: cannot find type `Events` in module `sys`
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/events.rs:189:47
    |
189 |     pub(crate) fn sys(&mut self) -> &mut sys::Events {
    |                                               ^^^^^^ not found in `sys`
    |
help: consider importing this struct
    |
1   | use crate::Events;
    |
help: if you import `Events`, refer to it directly
    |
189 -     pub(crate) fn sys(&mut self) -> &mut sys::Events {
189 +     pub(crate) fn sys(&mut self) -> &mut Events {
    |

error[E0425]: cannot find value `listener` in this scope
  --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/tcp/listener.rs:74:24
   |
74 |         set_reuseaddr(&listener.inner, true)?;
   |                        ^^^^^^^^ not found in this scope

error[E0425]: cannot find value `listener` in this scope
  --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/tcp/listener.rs:76:15
   |
76 |         bind(&listener.inner, addr)?;
   |               ^^^^^^^^ not found in this scope

error[E0425]: cannot find value `listener` in this scope
  --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/tcp/listener.rs:77:17
   |
77 |         listen(&listener.inner, 1024)?;
   |                 ^^^^^^^^ not found in this scope

error[E0425]: cannot find value `listener` in this scope
  --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/tcp/listener.rs:78:12
   |
78 |         Ok(listener)
   |            ^^^^^^^^ not found in this scope

error[E0425]: cannot find value `stream` in this scope
  --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/tcp/stream.rs:90:18
   |
90 |         connect(&stream.inner, addr)?;
   |                  ^^^^^^ not found in this scope

error[E0425]: cannot find value `stream` in this scope
  --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/tcp/stream.rs:91:12
   |
91 |         Ok(stream)
   |            ^^^^^^ not found in this scope

error[E0425]: cannot find function `set_reuseaddr` in this scope
  --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/tcp/listener.rs:74:9
   |
74 |         set_reuseaddr(&listener.inner, true)?;
   |         ^^^^^^^^^^^^^ not found in this scope

error[E0599]: no method named `register` found for struct `IoSource<TcpListener>` in the current scope
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/tcp/listener.rs:146:20
    |
146 |         self.inner.register(registry, token, interests)
    |                    ^^^^^^^^ method not found in `IoSource<TcpListener>`
    |
   ::: /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/io_source.rs:62:1
    |
62  | pub struct IoSource<T> {
    | ---------------------- method `register` not found for this struct
    |
    = help: items from traits can only be used if the trait is implemented and in scope
note: `Source` defines an item `register`, perhaps you need to implement it
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/source.rs:75:1
    |
75  | pub trait Source {
    | ^^^^^^^^^^^^^^^^

error[E0599]: no method named `reregister` found for struct `IoSource<TcpListener>` in the current scope
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/tcp/listener.rs:155:20
    |
155 |         self.inner.reregister(registry, token, interests)
    |                    ^^^^^^^^^^ method not found in `IoSource<TcpListener>`
    |
   ::: /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/io_source.rs:62:1
    |
62  | pub struct IoSource<T> {
    | ---------------------- method `reregister` not found for this struct
    |
    = help: items from traits can only be used if the trait is implemented and in scope
note: `Source` defines an item `reregister`, perhaps you need to implement it
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/source.rs:75:1
    |
75  | pub trait Source {
    | ^^^^^^^^^^^^^^^^

error[E0599]: no method named `deregister` found for struct `IoSource<TcpListener>` in the current scope
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/tcp/listener.rs:159:20
    |
159 |         self.inner.deregister(registry)
    |                    ^^^^^^^^^^ method not found in `IoSource<TcpListener>`
    |
   ::: /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/io_source.rs:62:1
    |
62  | pub struct IoSource<T> {
    | ---------------------- method `deregister` not found for this struct
    |
    = help: items from traits can only be used if the trait is implemented and in scope
note: `Source` defines an item `deregister`, perhaps you need to implement it
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/source.rs:75:1
    |
75  | pub trait Source {
    | ^^^^^^^^^^^^^^^^

error[E0599]: no method named `register` found for struct `IoSource<TcpStream>` in the current scope
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/tcp/stream.rs:325:20
    |
325 |         self.inner.register(registry, token, interests)
    |                    ^^^^^^^^ method not found in `IoSource<TcpStream>`
    |
   ::: /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/io_source.rs:62:1
    |
62  | pub struct IoSource<T> {
    | ---------------------- method `register` not found for this struct
    |
    = help: items from traits can only be used if the trait is implemented and in scope
note: `Source` defines an item `register`, perhaps you need to implement it
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/source.rs:75:1
    |
75  | pub trait Source {
    | ^^^^^^^^^^^^^^^^

error[E0599]: no method named `reregister` found for struct `IoSource<TcpStream>` in the current scope
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/tcp/stream.rs:334:20
    |
334 |         self.inner.reregister(registry, token, interests)
    |                    ^^^^^^^^^^ method not found in `IoSource<TcpStream>`
    |
   ::: /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/io_source.rs:62:1
    |
62  | pub struct IoSource<T> {
    | ---------------------- method `reregister` not found for this struct
    |
    = help: items from traits can only be used if the trait is implemented and in scope
note: `Source` defines an item `reregister`, perhaps you need to implement it
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/source.rs:75:1
    |
75  | pub trait Source {
    | ^^^^^^^^^^^^^^^^

error[E0599]: no method named `deregister` found for struct `IoSource<TcpStream>` in the current scope
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/tcp/stream.rs:338:20
    |
338 |         self.inner.deregister(registry)
    |                    ^^^^^^^^^^ method not found in `IoSource<TcpStream>`
    |
   ::: /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/io_source.rs:62:1
    |
62  | pub struct IoSource<T> {
    | ---------------------- method `deregister` not found for this struct
    |
    = help: items from traits can only be used if the trait is implemented and in scope
note: `Source` defines an item `deregister`, perhaps you need to implement it
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/source.rs:75:1
    |
75  | pub trait Source {
    | ^^^^^^^^^^^^^^^^

error[E0599]: no method named `register` found for struct `IoSource<UdpSocket>` in the current scope
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/udp.rs:622:20
    |
622 |         self.inner.register(registry, token, interests)
    |                    ^^^^^^^^ method not found in `IoSource<UdpSocket>`
    |
   ::: /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/io_source.rs:62:1
    |
62  | pub struct IoSource<T> {
    | ---------------------- method `register` not found for this struct
    |
    = help: items from traits can only be used if the trait is implemented and in scope
note: `Source` defines an item `register`, perhaps you need to implement it
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/source.rs:75:1
    |
75  | pub trait Source {
    | ^^^^^^^^^^^^^^^^

error[E0599]: no method named `reregister` found for struct `IoSource<UdpSocket>` in the current scope
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/udp.rs:631:20
    |
631 |         self.inner.reregister(registry, token, interests)
    |                    ^^^^^^^^^^ method not found in `IoSource<UdpSocket>`
    |
   ::: /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/io_source.rs:62:1
    |
62  | pub struct IoSource<T> {
    | ---------------------- method `reregister` not found for this struct
    |
    = help: items from traits can only be used if the trait is implemented and in scope
note: `Source` defines an item `reregister`, perhaps you need to implement it
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/source.rs:75:1
    |
75  | pub trait Source {
    | ^^^^^^^^^^^^^^^^

error[E0599]: no method named `deregister` found for struct `IoSource<UdpSocket>` in the current scope
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/net/udp.rs:635:20
    |
635 |         self.inner.deregister(registry)
    |                    ^^^^^^^^^^ method not found in `IoSource<UdpSocket>`
    |
   ::: /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/io_source.rs:62:1
    |
62  | pub struct IoSource<T> {
    | ---------------------- method `deregister` not found for this struct
    |
    = help: items from traits can only be used if the trait is implemented and in scope
note: `Source` defines an item `deregister`, perhaps you need to implement it
   --> /Users/spence/.cargo/registry/src/github.com-1ecc6299db9ec823/mio-0.8.8/src/event/source.rs:75:1
    |
75  | pub trait Source {
mdecimus commented 1 year ago

Do you have any suggestions for

error: failed to run custom build command for `zstd-sys v2.0.8+zstd.1.5.5`

Not really, you should ask the developers of zstd to see if there is a way to compile their library for WASM.