From 04c9e5e0f3ec9c4f52e81647a6b0020536f7b9eb Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Wed, 3 Sep 2025 19:43:18 +0900 Subject: [PATCH 1/3] Following "Custom Main and Global Executors" Pitch 3 https://github.com/swiftlang/swift/commit/6046286b587b845c5fe74896f7fde863a5d57989 --- .../JavaScriptEventLoop+ExecutorFactory.swift | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/Sources/JavaScriptEventLoop/JavaScriptEventLoop+ExecutorFactory.swift b/Sources/JavaScriptEventLoop/JavaScriptEventLoop+ExecutorFactory.swift index ed60eae7..e92b12a6 100644 --- a/Sources/JavaScriptEventLoop/JavaScriptEventLoop+ExecutorFactory.swift +++ b/Sources/JavaScriptEventLoop/JavaScriptEventLoop+ExecutorFactory.swift @@ -27,22 +27,37 @@ extension JavaScriptEventLoop: MainExecutor { extension JavaScriptEventLoop: TaskExecutor {} @available(macOS 9999, iOS 9999, watchOS 9999, tvOS 9999, visionOS 9999, *) -extension JavaScriptEventLoop: SchedulableExecutor { +extension JavaScriptEventLoop: SchedulingExecutor { public func enqueue( _ job: consuming ExecutorJob, after delay: C.Duration, tolerance: C.Duration?, clock: C ) { - let milliseconds = Self.delayInMilliseconds(from: delay, clock: clock) + let duration: Duration + // Handle clocks we know + if let _ = clock as? ContinuousClock { + duration = delay as! ContinuousClock.Duration + } else if let _ = clock as? SuspendingClock { + duration = delay as! SuspendingClock.Duration + } else { + // Hand-off the scheduling work to Clock implementation for unknown clocks + clock.enqueue( + job, + on: self, + at: clock.now.advanced(by: delay), + tolerance: tolerance + ) + return + } + let milliseconds = Self.delayInMilliseconds(from: duration) self.enqueue( UnownedJob(job), withDelay: milliseconds ) } - private static func delayInMilliseconds(from duration: C.Duration, clock: C) -> Double { - let swiftDuration = clock.convert(from: duration)! + private static func delayInMilliseconds(from swiftDuration: Duration) -> Double { let (seconds, attoseconds) = swiftDuration.components return Double(seconds) * 1_000 + (Double(attoseconds) / 1_000_000_000_000_000) } @@ -52,7 +67,7 @@ extension JavaScriptEventLoop: SchedulableExecutor { @available(macOS 9999, iOS 9999, watchOS 9999, tvOS 9999, visionOS 9999, *) extension JavaScriptEventLoop: ExecutorFactory { // Forward all operations to the current thread's JavaScriptEventLoop instance - final class CurrentThread: TaskExecutor, SchedulableExecutor, MainExecutor, SerialExecutor { + final class CurrentThread: TaskExecutor, SchedulingExecutor, MainExecutor, SerialExecutor { func checkIsolated() {} func enqueue(_ job: consuming ExecutorJob) { From 46178aa4cc9a4347c486f817197bfc7250783e55 Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Wed, 3 Sep 2025 20:36:39 +0900 Subject: [PATCH 2/3] Update nightly toolchain on CI to 2025-08-27-a --- .github/workflows/test.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5375b3e4..58aa1cf1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -21,12 +21,12 @@ jobs: target: "wasm32-unknown-wasi" - os: ubuntu-22.04 toolchain: - download-url: https://download.swift.org/development/ubuntu2204/swift-DEVELOPMENT-SNAPSHOT-2025-06-12-a/swift-DEVELOPMENT-SNAPSHOT-2025-06-12-a-ubuntu22.04.tar.gz + download-url: https://download.swift.org/development/ubuntu2204/swift-DEVELOPMENT-SNAPSHOT-2025-08-27-a/swift-DEVELOPMENT-SNAPSHOT-2025-08-27-a-ubuntu22.04.tar.gz wasi-backend: Node target: "wasm32-unknown-wasi" - os: ubuntu-22.04 toolchain: - download-url: https://download.swift.org/development/ubuntu2204/swift-DEVELOPMENT-SNAPSHOT-2025-06-12-a/swift-DEVELOPMENT-SNAPSHOT-2025-06-12-a-ubuntu22.04.tar.gz + download-url: https://download.swift.org/development/ubuntu2204/swift-DEVELOPMENT-SNAPSHOT-2025-08-27-a/swift-DEVELOPMENT-SNAPSHOT-2025-08-27-a-ubuntu22.04.tar.gz wasi-backend: Node target: "wasm32-unknown-wasip1-threads" @@ -95,7 +95,7 @@ jobs: - uses: actions/checkout@v5 - uses: ./.github/actions/install-swift with: - download-url: https://download.swift.org/development/ubuntu2204/swift-DEVELOPMENT-SNAPSHOT-2025-06-12-a/swift-DEVELOPMENT-SNAPSHOT-2025-06-12-a-ubuntu22.04.tar.gz + download-url: https://download.swift.org/development/ubuntu2204/swift-DEVELOPMENT-SNAPSHOT-2025-08-27-a/swift-DEVELOPMENT-SNAPSHOT-2025-08-27-a-ubuntu22.04.tar.gz - run: make bootstrap - run: ./Utilities/bridge-js-generate.sh - name: Check if BridgeJS generated files are up-to-date @@ -112,7 +112,7 @@ jobs: - uses: actions/checkout@v5 - uses: ./.github/actions/install-swift with: - download-url: https://download.swift.org/development/ubuntu2204/swift-DEVELOPMENT-SNAPSHOT-2025-06-12-a/swift-DEVELOPMENT-SNAPSHOT-2025-06-12-a-ubuntu22.04.tar.gz + download-url: https://download.swift.org/development/ubuntu2204/swift-DEVELOPMENT-SNAPSHOT-2025-08-27-a/swift-DEVELOPMENT-SNAPSHOT-2025-08-27-a-ubuntu22.04.tar.gz - uses: swiftwasm/setup-swiftwasm@v2 id: setup-wasm32-unknown-wasi with: { target: wasm32-unknown-wasi } From e0e1740c330c05b542c9779f869e03b03a5daccb Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Thu, 4 Sep 2025 20:13:17 +0900 Subject: [PATCH 3/3] Update WASI target from wasm32-unknown-wasi to wasm32-unknown-wasip1 --- .github/workflows/test.yml | 8 ++++---- Examples/Basic/build.sh | 2 +- Examples/PlayBridgeJS/build.sh | 2 +- Plugins/PackageToJS/Tests/ExampleTests.swift | 9 +++++++++ 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 58aa1cf1..7b3f8900 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -23,7 +23,7 @@ jobs: toolchain: download-url: https://download.swift.org/development/ubuntu2204/swift-DEVELOPMENT-SNAPSHOT-2025-08-27-a/swift-DEVELOPMENT-SNAPSHOT-2025-08-27-a-ubuntu22.04.tar.gz wasi-backend: Node - target: "wasm32-unknown-wasi" + target: "wasm32-unknown-wasip1" - os: ubuntu-22.04 toolchain: download-url: https://download.swift.org/development/ubuntu2204/swift-DEVELOPMENT-SNAPSHOT-2025-08-27-a/swift-DEVELOPMENT-SNAPSHOT-2025-08-27-a-ubuntu22.04.tar.gz @@ -114,15 +114,15 @@ jobs: with: download-url: https://download.swift.org/development/ubuntu2204/swift-DEVELOPMENT-SNAPSHOT-2025-08-27-a/swift-DEVELOPMENT-SNAPSHOT-2025-08-27-a-ubuntu22.04.tar.gz - uses: swiftwasm/setup-swiftwasm@v2 - id: setup-wasm32-unknown-wasi - with: { target: wasm32-unknown-wasi } + id: setup-wasm32-unknown-wasip1 + with: { target: wasm32-unknown-wasip1 } - uses: swiftwasm/setup-swiftwasm@v2 id: setup-wasm32-unknown-wasip1-threads with: { target: wasm32-unknown-wasip1-threads } - run: ./Utilities/build-examples.sh env: SWIFT_SDK_ID_wasm32_unknown_wasip1_threads: ${{ steps.setup-wasm32-unknown-wasip1-threads.outputs.swift-sdk-id }} - SWIFT_SDK_ID_wasm32_unknown_wasi: ${{ steps.setup-wasm32-unknown-wasi.outputs.swift-sdk-id }} + SWIFT_SDK_ID_wasm32_unknown_wasip1: ${{ steps.setup-wasm32-unknown-wasip1.outputs.swift-sdk-id }} - name: Upload static files as artifact id: deployment uses: actions/upload-pages-artifact@v4 diff --git a/Examples/Basic/build.sh b/Examples/Basic/build.sh index e6e67d93..7b5864c4 100755 --- a/Examples/Basic/build.sh +++ b/Examples/Basic/build.sh @@ -1,3 +1,3 @@ #!/bin/bash set -euxo pipefail -swift package --swift-sdk "${SWIFT_SDK_ID_wasm32_unknown_wasi:-${SWIFT_SDK_ID:-wasm32-unknown-wasi}}" -c "${1:-debug}" js --use-cdn +swift package --swift-sdk "${SWIFT_SDK_ID_wasm32_unknown_wasip1:-${SWIFT_SDK_ID:-wasm32-unknown-wasip1}}" -c "${1:-debug}" js --use-cdn diff --git a/Examples/PlayBridgeJS/build.sh b/Examples/PlayBridgeJS/build.sh index a5900e49..97e4b0f9 100755 --- a/Examples/PlayBridgeJS/build.sh +++ b/Examples/PlayBridgeJS/build.sh @@ -1,5 +1,5 @@ #!/bin/bash set -euxo pipefail -env JAVASCRIPTKIT_EXPERIMENTAL_BRIDGEJS=1 swift package --swift-sdk "${SWIFT_SDK_ID_wasm32_unknown_wasi:-${SWIFT_SDK_ID:-wasm32-unknown-wasi}}" -c "${1:-debug}" \ +env JAVASCRIPTKIT_EXPERIMENTAL_BRIDGEJS=1 swift package --swift-sdk "${SWIFT_SDK_ID_wasm32_unknown_wasip1:-${SWIFT_SDK_ID:-wasm32-unknown-wasip1}}" -c "${1:-debug}" \ plugin --allow-writing-to-package-directory \ js --use-cdn --output ./Bundle diff --git a/Plugins/PackageToJS/Tests/ExampleTests.swift b/Plugins/PackageToJS/Tests/ExampleTests.swift index 4de602f1..8f08bdad 100644 --- a/Plugins/PackageToJS/Tests/ExampleTests.swift +++ b/Plugins/PackageToJS/Tests/ExampleTests.swift @@ -80,6 +80,14 @@ extension Trait where Self == ConditionTrait { else { return false } + guard + ["wasm32-unknown-wasi", "wasm32-unknown-wasip1"].contains(where: { + swiftSDKID.hasSuffix($0) + }) + else { + // Only non-threads SDKs are supported for embedded in Swift SDK + return false + } let embeddedSDKID = "\(swiftSDKID)-embedded" return isSwiftSDKAvailable(embeddedSDKID, swiftPath: swiftPath) }(), @@ -206,6 +214,7 @@ extension Trait where Self == ConditionTrait { Swift package should build successfully, check \(destination.appending(path: path).path) for details stdout: \(stdoutPath.path) stderr: \(stderrPath.path) + arguments: \(args) \((try? String(contentsOf: stdoutPath, encoding: .utf8)) ?? "<>") \((try? String(contentsOf: stderrPath, encoding: .utf8)) ?? "<>")