From 040b460449f1aa2950763c526635c63cb2065d17 Mon Sep 17 00:00:00 2001 From: Daniel Cazzulino Date: Sat, 22 Aug 2026 01:59:12 -0300 Subject: [PATCH] Move native Go sidecar into src/WhatsBox.Native. Drop cmd/whatsbox and internal/ so the WhatsBox-specific Go impl lives next to the C# host as a single-module tree. Update MSBuild and CI to build with `go build .` from the new root. --- .github/workflows/build.yml | 4 ++-- .github/workflows/publish.yml | 8 ++++---- .../internal => src/WhatsBox.Native}/app/app.go | 9 ++++++--- .../WhatsBox.Native}/app/daemon.go | 16 ++++++++-------- .../WhatsBox.Native}/app/events.go | 8 ++++---- .../WhatsBox.Native}/app/handlers.go | 10 +++++----- .../WhatsBox.Native}/app/protocol_test.go | 16 ++++++++-------- .../WhatsBox.Native}/app/resolve.go | 6 +++--- .../internal => src/WhatsBox.Native}/bus/bus.go | 0 .../WhatsBox.Native}/dirstore/dirstore.go | 2 +- .../WhatsBox.Native}/dirstore/dirstore_test.go | 0 .../WhatsBox.Native}/files/files.go | 4 ++-- {native => src/WhatsBox.Native}/go.mod | 0 {native => src/WhatsBox.Native}/go.sum | 0 .../WhatsBox.Native}/lock/lock.go | 0 .../WhatsBox.Native}/lock/lock_unix.go | 0 .../WhatsBox.Native}/lock/lock_windows.go | 0 .../cmd/whatsbox => src/WhatsBox.Native}/main.go | 2 +- .../internal => src/WhatsBox.Native}/rpc/rpc.go | 0 .../WhatsBox.Native}/sqliteutil/uri.go | 0 .../WhatsBox.Native}/topic/topic.go | 8 ++++---- .../WhatsBox.Native}/wa/client.go | 0 .../WhatsBox.Native}/wa/device.go | 0 .../WhatsBox.Native}/wa/device_test.go | 0 .../internal => src/WhatsBox.Native}/wa/fake.go | 0 .../internal => src/WhatsBox.Native}/wa/real.go | 2 +- .../WhatsBox.Native}/wa/real_event_test.go | 0 .../WhatsBox.Native}/wa/reply_test.go | 0 src/WhatsBox/WhatsBox.csproj | 10 +++++----- 29 files changed, 54 insertions(+), 51 deletions(-) rename {native/internal => src/WhatsBox.Native}/app/app.go (94%) rename {native/internal => src/WhatsBox.Native}/app/daemon.go (97%) rename {native/internal => src/WhatsBox.Native}/app/events.go (98%) rename {native/internal => src/WhatsBox.Native}/app/handlers.go (98%) rename {native/internal => src/WhatsBox.Native}/app/protocol_test.go (99%) rename {native/internal => src/WhatsBox.Native}/app/resolve.go (97%) rename {native/internal => src/WhatsBox.Native}/bus/bus.go (100%) rename {native/internal => src/WhatsBox.Native}/dirstore/dirstore.go (99%) rename {native/internal => src/WhatsBox.Native}/dirstore/dirstore_test.go (100%) rename {native/internal => src/WhatsBox.Native}/files/files.go (97%) rename {native => src/WhatsBox.Native}/go.mod (100%) rename {native => src/WhatsBox.Native}/go.sum (100%) rename {native/internal => src/WhatsBox.Native}/lock/lock.go (100%) rename {native/internal => src/WhatsBox.Native}/lock/lock_unix.go (100%) rename {native/internal => src/WhatsBox.Native}/lock/lock_windows.go (100%) rename {native/cmd/whatsbox => src/WhatsBox.Native}/main.go (70%) rename {native/internal => src/WhatsBox.Native}/rpc/rpc.go (100%) rename {native/internal => src/WhatsBox.Native}/sqliteutil/uri.go (100%) rename {native/internal => src/WhatsBox.Native}/topic/topic.go (98%) rename {native/internal => src/WhatsBox.Native}/wa/client.go (100%) rename {native/internal => src/WhatsBox.Native}/wa/device.go (100%) rename {native/internal => src/WhatsBox.Native}/wa/device_test.go (100%) rename {native/internal => src/WhatsBox.Native}/wa/fake.go (100%) rename {native/internal => src/WhatsBox.Native}/wa/real.go (99%) rename {native/internal => src/WhatsBox.Native}/wa/real_event_test.go (100%) rename {native/internal => src/WhatsBox.Native}/wa/reply_test.go (100%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e072b4b..6e7a487 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -71,8 +71,8 @@ jobs: - name: ⚙ go uses: actions/setup-go@v5 with: - go-version-file: native/go.mod - cache-dependency-path: native/go.sum + go-version-file: src/WhatsBox.Native/go.mod + cache-dependency-path: src/WhatsBox.Native/go.sum - name: 📦 pack rid id: rid diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index eb304e1..3ae4cf2 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -49,8 +49,8 @@ jobs: - name: ⚙ go uses: actions/setup-go@v5 with: - go-version-file: native/go.mod - cache-dependency-path: native/go.sum + go-version-file: src/WhatsBox.Native/go.mod + cache-dependency-path: src/WhatsBox.Native/go.sum - name: 📦 pack run: | @@ -96,8 +96,8 @@ jobs: - name: ⚙ go uses: actions/setup-go@v5 with: - go-version-file: native/go.mod - cache-dependency-path: native/go.sum + go-version-file: src/WhatsBox.Native/go.mod + cache-dependency-path: src/WhatsBox.Native/go.sum - name: 📦 whatsbox run: | diff --git a/native/internal/app/app.go b/src/WhatsBox.Native/app/app.go similarity index 94% rename from native/internal/app/app.go rename to src/WhatsBox.Native/app/app.go index ab7ab45..4488480 100644 --- a/native/internal/app/app.go +++ b/src/WhatsBox.Native/app/app.go @@ -10,8 +10,8 @@ import ( "runtime" "strings" - "github.com/devlooped/whatsbox/internal/rpc" - "github.com/devlooped/whatsbox/internal/wa" + "github.com/devlooped/whatsbox/rpc" + "github.com/devlooped/whatsbox/wa" ) const ( @@ -101,7 +101,10 @@ func mustAbs(p string) string { return abs } -func writeLine(w io.Writer, mu interface{ Lock(); Unlock() }, line []byte) error { +func writeLine(w io.Writer, mu interface { + Lock() + Unlock() +}, line []byte) error { mu.Lock() defer mu.Unlock() if _, err := w.Write(line); err != nil { diff --git a/native/internal/app/daemon.go b/src/WhatsBox.Native/app/daemon.go similarity index 97% rename from native/internal/app/daemon.go rename to src/WhatsBox.Native/app/daemon.go index d28de74..12ca50d 100644 --- a/native/internal/app/daemon.go +++ b/src/WhatsBox.Native/app/daemon.go @@ -9,14 +9,14 @@ import ( "sync" "time" - "github.com/devlooped/whatsbox/internal/bus" - "github.com/devlooped/whatsbox/internal/dirstore" - "github.com/devlooped/whatsbox/internal/files" - "github.com/devlooped/whatsbox/internal/lock" - "github.com/devlooped/whatsbox/internal/rpc" - "github.com/devlooped/whatsbox/internal/sqliteutil" - "github.com/devlooped/whatsbox/internal/topic" - "github.com/devlooped/whatsbox/internal/wa" + "github.com/devlooped/whatsbox/bus" + "github.com/devlooped/whatsbox/dirstore" + "github.com/devlooped/whatsbox/files" + "github.com/devlooped/whatsbox/lock" + "github.com/devlooped/whatsbox/rpc" + "github.com/devlooped/whatsbox/sqliteutil" + "github.com/devlooped/whatsbox/topic" + "github.com/devlooped/whatsbox/wa" ) type Options struct { diff --git a/native/internal/app/events.go b/src/WhatsBox.Native/app/events.go similarity index 98% rename from native/internal/app/events.go rename to src/WhatsBox.Native/app/events.go index dec7aa4..543a2e4 100644 --- a/native/internal/app/events.go +++ b/src/WhatsBox.Native/app/events.go @@ -4,10 +4,10 @@ import ( "context" "strings" - "github.com/devlooped/whatsbox/internal/dirstore" - "github.com/devlooped/whatsbox/internal/files" - "github.com/devlooped/whatsbox/internal/topic" - "github.com/devlooped/whatsbox/internal/wa" + "github.com/devlooped/whatsbox/dirstore" + "github.com/devlooped/whatsbox/files" + "github.com/devlooped/whatsbox/topic" + "github.com/devlooped/whatsbox/wa" ) func (d *Daemon) onWA(ev wa.Event) { diff --git a/native/internal/app/handlers.go b/src/WhatsBox.Native/app/handlers.go similarity index 98% rename from native/internal/app/handlers.go rename to src/WhatsBox.Native/app/handlers.go index 5d290ad..3302f6a 100644 --- a/native/internal/app/handlers.go +++ b/src/WhatsBox.Native/app/handlers.go @@ -7,11 +7,11 @@ import ( "path/filepath" "strings" - "github.com/devlooped/whatsbox/internal/dirstore" - "github.com/devlooped/whatsbox/internal/files" - "github.com/devlooped/whatsbox/internal/rpc" - "github.com/devlooped/whatsbox/internal/topic" - "github.com/devlooped/whatsbox/internal/wa" + "github.com/devlooped/whatsbox/dirstore" + "github.com/devlooped/whatsbox/files" + "github.com/devlooped/whatsbox/rpc" + "github.com/devlooped/whatsbox/topic" + "github.com/devlooped/whatsbox/wa" ) type topicsParams struct { diff --git a/native/internal/app/protocol_test.go b/src/WhatsBox.Native/app/protocol_test.go similarity index 99% rename from native/internal/app/protocol_test.go rename to src/WhatsBox.Native/app/protocol_test.go index 1acfb5c..437ba11 100644 --- a/native/internal/app/protocol_test.go +++ b/src/WhatsBox.Native/app/protocol_test.go @@ -14,10 +14,10 @@ import ( "testing" "time" - "github.com/devlooped/whatsbox/internal/app" - "github.com/devlooped/whatsbox/internal/dirstore" - "github.com/devlooped/whatsbox/internal/rpc" - "github.com/devlooped/whatsbox/internal/wa" + "github.com/devlooped/whatsbox/app" + "github.com/devlooped/whatsbox/dirstore" + "github.com/devlooped/whatsbox/rpc" + "github.com/devlooped/whatsbox/wa" ) // testClient drives the shipped NDJSON Run loop with a fake WhatsApp client. @@ -1010,7 +1010,7 @@ func TestChatEventsDiscardOverflowSendRead(t *testing.T) { t.Fatalf("empty send: %#v", err) } reac := c.mustCall("messages.send", map[string]any{ - "to": "999@lid", + "to": "999@lid", "contents": []map[string]any{{"type": "reaction", "target": "t1", "by": "999@lid", "emoji": ""}}, }) if reac["id"] == "" { @@ -1025,14 +1025,14 @@ func TestChatEventsDiscardOverflowSendRead(t *testing.T) { t.Fatal(err) } media := c.mustCall("messages.send", map[string]any{ - "to": "999@lid", + "to": "999@lid", "contents": []map[string]any{{"type": "image", "path": "out/photo.jpg"}}, }) if media["topic"] != "999@lid" { t.Fatalf("path send=%v", media) } _, err = c.call("messages.send", map[string]any{ - "to": "999@lid", + "to": "999@lid", "contents": []map[string]any{{"type": "image", "path": "../secret.jpg"}}, }) if err == nil || err.Message != rpc.TokPathEscape { @@ -1138,7 +1138,7 @@ func TestFilesRequiredOnSendPath(t *testing.T) { c := startDaemon(t, fake, 0) _ = c.mustInit(map[string]any{"connect": true}) _, err := c.call("messages.send", map[string]any{ - "to": "999@lid", + "to": "999@lid", "contents": []map[string]any{{"type": "image", "path": "out/a.jpg"}}, }) if err == nil || err.Message != rpc.TokFilesRequired { diff --git a/native/internal/app/resolve.go b/src/WhatsBox.Native/app/resolve.go similarity index 97% rename from native/internal/app/resolve.go rename to src/WhatsBox.Native/app/resolve.go index 5b0f6e5..68f3d3e 100644 --- a/native/internal/app/resolve.go +++ b/src/WhatsBox.Native/app/resolve.go @@ -4,9 +4,9 @@ import ( "context" "strings" - "github.com/devlooped/whatsbox/internal/rpc" - "github.com/devlooped/whatsbox/internal/topic" - "github.com/devlooped/whatsbox/internal/wa" + "github.com/devlooped/whatsbox/rpc" + "github.com/devlooped/whatsbox/topic" + "github.com/devlooped/whatsbox/wa" ) func (d *Daemon) resolveTopic(ctx context.Context, raw string, allowSystem bool) (string, *rpc.Error) { diff --git a/native/internal/bus/bus.go b/src/WhatsBox.Native/bus/bus.go similarity index 100% rename from native/internal/bus/bus.go rename to src/WhatsBox.Native/bus/bus.go diff --git a/native/internal/dirstore/dirstore.go b/src/WhatsBox.Native/dirstore/dirstore.go similarity index 99% rename from native/internal/dirstore/dirstore.go rename to src/WhatsBox.Native/dirstore/dirstore.go index c4f143f..f181033 100644 --- a/native/internal/dirstore/dirstore.go +++ b/src/WhatsBox.Native/dirstore/dirstore.go @@ -12,7 +12,7 @@ import ( _ "modernc.org/sqlite" - "github.com/devlooped/whatsbox/internal/sqliteutil" + "github.com/devlooped/whatsbox/sqliteutil" ) type Store struct { diff --git a/native/internal/dirstore/dirstore_test.go b/src/WhatsBox.Native/dirstore/dirstore_test.go similarity index 100% rename from native/internal/dirstore/dirstore_test.go rename to src/WhatsBox.Native/dirstore/dirstore_test.go diff --git a/native/internal/files/files.go b/src/WhatsBox.Native/files/files.go similarity index 97% rename from native/internal/files/files.go rename to src/WhatsBox.Native/files/files.go index 8be0b5d..302f12a 100644 --- a/native/internal/files/files.go +++ b/src/WhatsBox.Native/files/files.go @@ -6,8 +6,8 @@ import ( "path/filepath" "strings" - "github.com/devlooped/whatsbox/internal/rpc" - "github.com/devlooped/whatsbox/internal/topic" + "github.com/devlooped/whatsbox/rpc" + "github.com/devlooped/whatsbox/topic" ) type Dir struct { diff --git a/native/go.mod b/src/WhatsBox.Native/go.mod similarity index 100% rename from native/go.mod rename to src/WhatsBox.Native/go.mod diff --git a/native/go.sum b/src/WhatsBox.Native/go.sum similarity index 100% rename from native/go.sum rename to src/WhatsBox.Native/go.sum diff --git a/native/internal/lock/lock.go b/src/WhatsBox.Native/lock/lock.go similarity index 100% rename from native/internal/lock/lock.go rename to src/WhatsBox.Native/lock/lock.go diff --git a/native/internal/lock/lock_unix.go b/src/WhatsBox.Native/lock/lock_unix.go similarity index 100% rename from native/internal/lock/lock_unix.go rename to src/WhatsBox.Native/lock/lock_unix.go diff --git a/native/internal/lock/lock_windows.go b/src/WhatsBox.Native/lock/lock_windows.go similarity index 100% rename from native/internal/lock/lock_windows.go rename to src/WhatsBox.Native/lock/lock_windows.go diff --git a/native/cmd/whatsbox/main.go b/src/WhatsBox.Native/main.go similarity index 70% rename from native/cmd/whatsbox/main.go rename to src/WhatsBox.Native/main.go index 6e2f0b9..9df95ee 100644 --- a/native/cmd/whatsbox/main.go +++ b/src/WhatsBox.Native/main.go @@ -3,7 +3,7 @@ package main import ( "os" - "github.com/devlooped/whatsbox/internal/app" + "github.com/devlooped/whatsbox/app" ) func main() { diff --git a/native/internal/rpc/rpc.go b/src/WhatsBox.Native/rpc/rpc.go similarity index 100% rename from native/internal/rpc/rpc.go rename to src/WhatsBox.Native/rpc/rpc.go diff --git a/native/internal/sqliteutil/uri.go b/src/WhatsBox.Native/sqliteutil/uri.go similarity index 100% rename from native/internal/sqliteutil/uri.go rename to src/WhatsBox.Native/sqliteutil/uri.go diff --git a/native/internal/topic/topic.go b/src/WhatsBox.Native/topic/topic.go similarity index 98% rename from native/internal/topic/topic.go rename to src/WhatsBox.Native/topic/topic.go index 98c7ff6..43633e3 100644 --- a/native/internal/topic/topic.go +++ b/src/WhatsBox.Native/topic/topic.go @@ -61,10 +61,10 @@ const ( ) type Parsed struct { - Raw string - Kind Kind - JID types.JID - Phone string + Raw string + Kind Kind + JID types.JID + Phone string Canonical string } diff --git a/native/internal/wa/client.go b/src/WhatsBox.Native/wa/client.go similarity index 100% rename from native/internal/wa/client.go rename to src/WhatsBox.Native/wa/client.go diff --git a/native/internal/wa/device.go b/src/WhatsBox.Native/wa/device.go similarity index 100% rename from native/internal/wa/device.go rename to src/WhatsBox.Native/wa/device.go diff --git a/native/internal/wa/device_test.go b/src/WhatsBox.Native/wa/device_test.go similarity index 100% rename from native/internal/wa/device_test.go rename to src/WhatsBox.Native/wa/device_test.go diff --git a/native/internal/wa/fake.go b/src/WhatsBox.Native/wa/fake.go similarity index 100% rename from native/internal/wa/fake.go rename to src/WhatsBox.Native/wa/fake.go diff --git a/native/internal/wa/real.go b/src/WhatsBox.Native/wa/real.go similarity index 99% rename from native/internal/wa/real.go rename to src/WhatsBox.Native/wa/real.go index c5600cd..c00e2b9 100644 --- a/native/internal/wa/real.go +++ b/src/WhatsBox.Native/wa/real.go @@ -19,7 +19,7 @@ import ( waLog "go.mau.fi/whatsmeow/util/log" "google.golang.org/protobuf/proto" - "github.com/devlooped/whatsbox/internal/sqliteutil" + "github.com/devlooped/whatsbox/sqliteutil" _ "modernc.org/sqlite" ) diff --git a/native/internal/wa/real_event_test.go b/src/WhatsBox.Native/wa/real_event_test.go similarity index 100% rename from native/internal/wa/real_event_test.go rename to src/WhatsBox.Native/wa/real_event_test.go diff --git a/native/internal/wa/reply_test.go b/src/WhatsBox.Native/wa/reply_test.go similarity index 100% rename from native/internal/wa/reply_test.go rename to src/WhatsBox.Native/wa/reply_test.go diff --git a/src/WhatsBox/WhatsBox.csproj b/src/WhatsBox/WhatsBox.csproj index 78ef1d9..4f3a699 100644 --- a/src/WhatsBox/WhatsBox.csproj +++ b/src/WhatsBox/WhatsBox.csproj @@ -15,7 +15,7 @@ $(NoWarn);NU5128 whatsbox.exe whatsbox - $([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\..\native')) + $([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)..\WhatsBox.Native')) $([System.IO.Path]::GetFullPath('$(MSBuildThisFileDirectory)$(BaseIntermediateOutputPath)native\$(NativeWhatsBoxName)')) @@ -62,9 +62,9 @@ - + - + @@ -109,12 +109,12 @@ -