From 8628263f4df4710ecce7eaa416052ce2364d8748 Mon Sep 17 00:00:00 2001 From: Scott Marchant Date: Wed, 22 Oct 2025 12:05:02 -0600 Subject: [PATCH] chore: Use fatalError in all .wait() calls for WASI builds only. The existing blocking call in wait() will cause wasm executables to trap with an ambiguous message. This improves the message to help developers understand and correct the issue. --- Sources/NIOCore/EventLoopFuture.swift | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Sources/NIOCore/EventLoopFuture.swift b/Sources/NIOCore/EventLoopFuture.swift index 3132e1a103..9cc6543111 100644 --- a/Sources/NIOCore/EventLoopFuture.swift +++ b/Sources/NIOCore/EventLoopFuture.swift @@ -1091,6 +1091,26 @@ extension EventLoopFuture { @preconcurrency @inlinable public func wait(file: StaticString = #file, line: UInt = #line) throws -> Value where Value: Sendable { + #if os(WASI) + // NOTE: As of July 22, 2025 `wait()` calling wait() is not supported on WASI platforms. + // + // This may change down the road if and when true multi-threading evolves. But right now + // calling wait here results in the following runtime crash: + // + // ``` + // SomeExecutable.wasm:0x123456 Uncaught (in promise) RuntimeError: Atomics.wait cannot be called in this context + // ``` + // + // Using the following fatal error here gives wasm runtime users a much more clear error message + // to identify the issue. + // + // If you're running into this error on WASI, refactoring to `get()` instead of `wait()` will + // likely solve the issue. + fatalError( + "NIO's wait() function should not be called on WASI platforms. It will freeze or crash. Use get() instead." + ) + #endif // os(WASI) + try self._blockingWaitForFutureCompletion(file: file, line: line) }