Skip to content

fix(tauri): Extract IPC types to shared module for Windows compatibility#16

Merged
wilcorrea merged 1 commit into
mainfrom
fix/windows-build
Feb 23, 2026
Merged

fix(tauri): Extract IPC types to shared module for Windows compatibility#16
wilcorrea merged 1 commit into
mainfrom
fix/windows-build

Conversation

@wilcorrea

@wilcorrea wilcorrea commented Feb 23, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes the Windows build failure in release v0.5.1.

The Windows build was failing with:

error[E0432]: unresolved import `crate::ipc`
error: could not compile `arandu` (lib) due to 1 previous error

Root Cause

The tcp_ipc module was trying to import types from the ipc module, which is Unix-only (#[cfg(unix)]). On Windows, this module doesn't exist, causing the import to fail.

Solution

  • Created ipc_common.rs module with shared types and logic:
    • IpcCommand struct
    • IpcResponse struct
    • process_command() function
  • This module compiles on all platforms (no cfg restrictions)
  • Both ipc.rs (Unix socket) and tcp_ipc.rs (TCP) now import from ipc_common
  • Removed duplicate code from ipc.rs

Test Plan

  • ✅ Verified compilation on macOS: cargo check
  • Verify Windows build succeeds in CI
  • Verify Linux builds succeed in CI
  • Verify macOS builds succeed in CI
  • Check that release v0.5.1 completes successfully

Related

Summary by CodeRabbit

  • Chores
    • Reorganized internal IPC command handling to consolidate shared functionality into a common module for improved code reusability and maintainability.

The Windows build was failing because tcp_ipc was trying to import types
from the ipc module, which is Unix-only (#[cfg(unix)]). This caused:
  error[E0432]: unresolved import `crate::ipc`

Solution:
- Created ipc_common.rs with IpcCommand, IpcResponse, and process_command
- This module compiles on all platforms (no cfg restrictions)
- Both ipc.rs (Unix socket) and tcp_ipc.rs (TCP) now import from ipc_common
- Removed duplicate code from ipc.rs

This fixes the Windows release build failure in v0.5.1.
@coderabbitai

coderabbitai Bot commented Feb 23, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

Extract and consolidate IPC command types and processing logic into a shared ipc_common module. Public types IpcCommand and IpcResponse, along with process_command function, are moved from ipc.rs to the new module. ipc.rs and tcp_ipc.rs updated to import from shared definitions.

Changes

Cohort / File(s) Summary
Code Reorganization
ipc.rs
Removed local definitions of IpcCommand, IpcResponse types and process_command function; added imports from shared ipc_common module. Handle client flow remains unchanged, now delegating to shared command processor.
Shared IPC Module
ipc_common.rs
New module containing IpcCommand (with deserialize support), IpcResponse (with serialize support), and process_command function. Handles "open", "ping", "show" commands with window management and event emission.
Module Declaration & Import Updates
lib.rs, tcp_ipc.rs
Module declaration added for ipc_common under macOS configuration. Import path in tcp_ipc.rs updated from crate::ipc to crate::ipc_common.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~8 minutes

Possibly related PRs

Poem

🐰 A little hop and a skip, I see,
The IPC commands now live in harmony!
Shared wisdom in ipc_common so fine,
No more duplication—just code that's divine! 🎯

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main objective: extracting IPC types to a shared module to resolve Windows compatibility issues.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/windows-build

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
apps/tauri/src-tauri/src/ipc_common.rs (1)

8-9: #[serde(default)] on Option<String> is redundant.

Serde already deserializes a missing JSON field as None for any Option<T> without needing the attribute. The annotation is harmless but adds noise.

♻️ Suggested cleanup
-    #[serde(default)]
     pub path: Option<String>,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/tauri/src-tauri/src/ipc_common.rs` around lines 8 - 9, The
#[serde(default)] attribute on the struct field `path: Option<String>` is
redundant; remove the #[serde(default)] attribute applied to `path` (the
`Option<String>` field) so Serde will naturally treat a missing field as
None—update the declaration that contains `path` to simply be `pub path:
Option<String>` and ensure no other serde attributes are needed for that field.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@apps/tauri/src-tauri/src/ipc_common.rs`:
- Around line 25-27: std::fs::canonicalize produces Windows extended-length
paths prefixed with "\\?\" which breaks downstream consumers (e.g., Node.js);
update the canonicalization in ipc_common.rs where canonicalize(&path) and
path_str are produced to remove the "\\?\" prefix on Windows (e.g., check if
path_str starts with r"\\?\" and strip that prefix) or replace the call with
dunce::canonicalize (add dunce = "1" to Cargo.toml) so the returned path string
is safe for the frontend "open-file" handler; ensure the adjusted path_str is
used in the existing code paths that emit the IPC event.

---

Nitpick comments:
In `@apps/tauri/src-tauri/src/ipc_common.rs`:
- Around line 8-9: The #[serde(default)] attribute on the struct field `path:
Option<String>` is redundant; remove the #[serde(default)] attribute applied to
`path` (the `Option<String>` field) so Serde will naturally treat a missing
field as None—update the declaration that contains `path` to simply be `pub
path: Option<String>` and ensure no other serde attributes are needed for that
field.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 31f187b and 5e7824c.

📒 Files selected for processing (4)
  • apps/tauri/src-tauri/src/ipc.rs
  • apps/tauri/src-tauri/src/ipc_common.rs
  • apps/tauri/src-tauri/src/lib.rs
  • apps/tauri/src-tauri/src/tcp_ipc.rs

Comment on lines +25 to +27
match std::fs::canonicalize(&path) {
Ok(abs_path) => {
let path_str = abs_path.to_string_lossy().to_string();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

std::fs::canonicalize emits \\?\-prefixed UNC paths on Windows.

On Windows, canonicalize converts the path to use extended-length path syntax (\\?\...), which may be incompatible with other applications. Node.js crashes when given such a \\?\-prefixed UNC path, meaning the frontend "open-file" event handler will receive a broken path string on Windows — the primary platform this PR adds support for.

Consider stripping the prefix after canonicalization, or using the dunce crate, which is frequently used as a wrapper over std::fs::canonicalize to strip the \\?\ prefix.

🛡️ Suggested fix (manual prefix strip, no extra dep)
-                    Ok(abs_path) => {
-                        let path_str = abs_path.to_string_lossy().to_string();
+                    Ok(abs_path) => {
+                        // Strip Windows extended-length prefix so the frontend
+                        // receives a plain path like C:\... instead of \\?\C:\...
+                        let path_str = abs_path.to_string_lossy()
+                            .strip_prefix(r"\\?\")
+                            .map(str::to_string)
+                            .unwrap_or_else(|| abs_path.to_string_lossy().to_string());

Alternatively, add dunce = "1" to Cargo.toml and use:

let abs_path = dunce::canonicalize(&path).map_err(...)?;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
match std::fs::canonicalize(&path) {
Ok(abs_path) => {
let path_str = abs_path.to_string_lossy().to_string();
match std::fs::canonicalize(&path) {
Ok(abs_path) => {
// Strip Windows extended-length prefix so the frontend
// receives a plain path like C:\... instead of \\?\C:\...
let path_str = abs_path.to_string_lossy()
.strip_prefix(r"\\?\")
.map(str::to_string)
.unwrap_or_else(|| abs_path.to_string_lossy().to_string());
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/tauri/src-tauri/src/ipc_common.rs` around lines 25 - 27,
std::fs::canonicalize produces Windows extended-length paths prefixed with
"\\?\" which breaks downstream consumers (e.g., Node.js); update the
canonicalization in ipc_common.rs where canonicalize(&path) and path_str are
produced to remove the "\\?\" prefix on Windows (e.g., check if path_str starts
with r"\\?\" and strip that prefix) or replace the call with dunce::canonicalize
(add dunce = "1" to Cargo.toml) so the returned path string is safe for the
frontend "open-file" handler; ensure the adjusted path_str is used in the
existing code paths that emit the IPC event.

@wilcorrea wilcorrea merged commit 711222c into main Feb 23, 2026
1 check passed
@wilcorrea wilcorrea deleted the fix/windows-build branch February 23, 2026 21:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant