From 1d727c1fcf6725cdcf0c62c39f11bf1c4e197378 Mon Sep 17 00:00:00 2001 From: osmaczko <33099791+osmaczko@users.noreply.github.com> Date: Fri, 13 Feb 2026 20:44:50 +0100 Subject: [PATCH 1/4] chore: add smoke test and redesign CI workflow (#62) Add a smoke test that validates the binary links all dependencies at runtime by instantiating a client without networking. Redesign CI into separate build and test jobs, with test gated on build. --- .github/workflows/ci.yml | 106 +++++++++++++++++++++++++++++ .github/workflows/test-windows.yml | 76 --------------------- .github/workflows/test.yml | 23 ------- Makefile | 2 +- library/declare_lib.nim | 2 +- nim_chat_poc.nimble | 11 +-- tests/smoke_test.nim | 21 ++++++ 7 files changed, 135 insertions(+), 106 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 .github/workflows/test-windows.yml delete mode 100644 .github/workflows/test.yml create mode 100644 tests/smoke_test.nim diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..c17caac --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,106 @@ +name: ci + +on: + pull_request: + branches: + - main + paths-ignore: + - "**README.md" + - ".gitignore" + - "LICENSE" + +jobs: + build: + strategy: + matrix: + os: [ubuntu-latest, macOS-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v6 + with: + submodules: recursive + # Cache the Nim compiler built by nimbus-build-system (NBS). + # Building Nim from source is the slowest part of `make update`. + # Keyed on the NBS submodule commit — auto-invalidates when NBS is bumped. + - id: nbs + run: echo "hash=$(git rev-parse HEAD:vendor/nimbus-build-system)" >> $GITHUB_OUTPUT + - uses: actions/cache@v4 + with: + path: vendor/nimbus-build-system/vendor/Nim + key: ${{ runner.os }}-nbs-${{ steps.nbs.outputs.hash }} + - run: make update + - run: make all + + test: + needs: build + strategy: + matrix: + os: [ubuntu-latest, macOS-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v6 + with: + submodules: recursive + - id: nbs + run: echo "hash=$(git rev-parse HEAD:vendor/nimbus-build-system)" >> $GITHUB_OUTPUT + - uses: actions/cache@v4 + with: + path: vendor/nimbus-build-system/vendor/Nim + key: ${{ runner.os }}-nbs-${{ steps.nbs.outputs.hash }} + - run: make update + - run: make tests + + test-windows: + needs: build + runs-on: windows-latest + defaults: + run: + shell: msys2 {0} + env: + MSYSTEM: MINGW64 + steps: + - uses: actions/checkout@v6 + with: + submodules: recursive + - uses: msys2/setup-msys2@v2 + with: + update: true + install: >- + git + base-devel + mingw-w64-x86_64-toolchain + make + cmake + upx + mingw-w64-x86_64-rust + mingw-w64-x86_64-postgresql + mingw-w64-x86_64-gcc + mingw-w64-x86_64-gcc-libs + mingw-w64-x86_64-libwinpthread-git + mingw-w64-x86_64-zlib + mingw-w64-x86_64-openssl + mingw-w64-x86_64-python + mingw-w64-x86_64-cmake + mingw-w64-x86_64-llvm + mingw-w64-x86_64-clang + - run: | + echo "/usr/bin:$PATH" >> $GITHUB_PATH + echo "/mingw64/bin:$PATH" >> $GITHUB_PATH + echo "/usr/lib:$PATH" >> $GITHUB_PATH + echo "/mingw64/lib:$PATH" >> $GITHUB_PATH + - run: which upx gcc g++ make cmake cargo rustc python make mingw32-make + - id: nbs + run: echo "hash=$(git rev-parse HEAD:vendor/nimbus-build-system)" >> $GITHUB_OUTPUT + shell: bash + - uses: actions/cache@v4 + with: + path: vendor/nimbus-build-system/vendor/Nim + key: ${{ runner.os }}-nbs-${{ steps.nbs.outputs.hash }} + - run: make update + - run: | + cd vendor/nwaku/vendor/nim-nat-traversal/vendor/miniupnp/miniupnpc + make -f Makefile.mingw CC=gcc CXX=g++ libminiupnpc.a V=1 + - run: | + cd vendor/nwaku/vendor/nim-nat-traversal/vendor/libnatpmp-upstream + make CC="gcc -fPIC -D_WIN32_WINNT=0x0600 -DNATPMP_STATICLIB" libnatpmp.a V=1 + - run: make tests diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml deleted file mode 100644 index bfc142c..0000000 --- a/.github/workflows/test-windows.yml +++ /dev/null @@ -1,76 +0,0 @@ -name: test-windows - -on: - pull_request: - branches: - - main - paths-ignore: - - '**README.md' - - '.gitignore' - - 'LICENSE' -jobs: - tests-tasks: - runs-on: windows-latest - - defaults: - run: - shell: msys2 {0} - - env: - MSYSTEM: MINGW64 - - steps: - - name: Checkout - uses: actions/checkout@v6 - - - name: Setup MSYS2 - uses: msys2/setup-msys2@v2 - with: - update: true - install: >- - git - base-devel - mingw-w64-x86_64-toolchain - make - cmake - upx - mingw-w64-x86_64-rust - mingw-w64-x86_64-postgresql - mingw-w64-x86_64-gcc - mingw-w64-x86_64-gcc-libs - mingw-w64-x86_64-libwinpthread-git - mingw-w64-x86_64-zlib - mingw-w64-x86_64-openssl - mingw-w64-x86_64-python - mingw-w64-x86_64-cmake - mingw-w64-x86_64-llvm - mingw-w64-x86_64-clang - - - name: Add UPX to PATH - run: | - echo "/usr/bin:$PATH" >> $GITHUB_PATH - echo "/mingw64/bin:$PATH" >> $GITHUB_PATH - echo "/usr/lib:$PATH" >> $GITHUB_PATH - echo "/mingw64/lib:$PATH" >> $GITHUB_PATH - - - name: Verify dependencies - run: | - which upx gcc g++ make cmake cargo rustc python make mingw32-make - - - name: Update - run: make update - - - name: Building miniupnpc - run: | - cd vendor/nwaku/vendor/nim-nat-traversal/vendor/miniupnp/miniupnpc - make -f Makefile.mingw CC=gcc CXX=g++ libminiupnpc.a V=1 - cd ../../../../../../.. - - - name: Building libnatpmp - run: | - cd vendor/nwaku/vendor/nim-nat-traversal/vendor/libnatpmp-upstream - make CC="gcc -fPIC -D_WIN32_WINNT=0x0600 -DNATPMP_STATICLIB" libnatpmp.a V=1 - cd ../../../../../../ - - - name: Tests - run: make tests diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 46f55d1..0000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: test - -on: - pull_request: - branches: - - main - paths-ignore: - - '**README.md' - - '.gitignore' - - 'LICENSE' -jobs: - tests-tasks: - strategy: - matrix: - os: [ubuntu-latest, macOS-latest] - runs-on: ${{ matrix.os }} - steps: - - name: Checkout - uses: actions/checkout@v6 - - name: Update - run: make update - - name: Tests - run: make tests diff --git a/Makefile b/Makefile index 3f191d9..d243276 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ endif .PHONY: all update clean # default target, because it's the first one that doesn't start with '.' -all: | bot_echo pingpong +all: | bot_echo pingpong liblogoschat test_file := $(word 2,$(MAKECMDGOALS)) define test_name diff --git a/library/declare_lib.nim b/library/declare_lib.nim index 2051f37..3d8573d 100644 --- a/library/declare_lib.nim +++ b/library/declare_lib.nim @@ -1,7 +1,7 @@ import ffi import src/chat/client -declareLibrary("chat") +declareLibrary("logoschat") proc set_event_callback( ctx: ptr FFIContext[ChatClient], diff --git a/nim_chat_poc.nimble b/nim_chat_poc.nimble index 33510e6..04eaf01 100644 --- a/nim_chat_poc.nimble +++ b/nim_chat_poc.nimble @@ -39,17 +39,17 @@ proc buildLibrary(name: string, srcDir = "library/", params = "", lang = "c") = ## Build a shared library (.so on Linux, .dylib on macOS, .dll on Windows) if not dirExists "build": mkDir "build" - + # Determine library extension based on OS let libExt = when defined(macosx): "dylib" elif defined(windows): "dll" else: "so" - + var extra_params = params for i in 2 ..< paramCount(): extra_params &= " " & paramStr(i) - - exec "nim " & lang & " --app:lib --out:build/lib" & name & "." & libExt & + + exec "nim " & lang & " --app:lib --out:build/lib" & name & "." & libExt & " --mm:refc --nimMainPrefix:lib" & name & " " & extra_params & " " & srcDir & "lib" & name & ".nim" @@ -59,6 +59,7 @@ proc test(name: string, params = "-d:chronicles_log_level=DEBUG", lang = "c") = task tests, "Build & run tests": test "all_tests", "-d:chronicles_log_level=ERROR -d:chronosStrictException" + test "smoke_test", "-d:chronicles_log_level=ERROR" task waku_example, "Build Waku based simple example": let name = "waku_example" @@ -77,5 +78,5 @@ task pingpong, "Build the Pingpong example": buildBinary name, "examples/", "-d:chronicles_log_level='INFO' -d:chronicles_disabled_topics='waku node' " task liblogoschat, "Build the Chat SDK shared library (C bindings)": - buildLibrary "logoschat", "library/", + buildLibrary "logoschat", "library/", "-d:chronicles_log_level='INFO' -d:chronicles_enabled=on --path:src --path:vendor/nim-ffi" diff --git a/tests/smoke_test.nim b/tests/smoke_test.nim new file mode 100644 index 0000000..288df6a --- /dev/null +++ b/tests/smoke_test.nim @@ -0,0 +1,21 @@ +# Smoke test: validates that the binary links all dependencies at runtime. +# No networking, no start(), no message exchange — just instantiation. + +import ../src/chat + +proc main() = + try: + let waku = initWakuClient(DefaultConfig()) + let ident = createIdentity("SmokeTest") + var client = newClient(waku, ident) + if client.isNil: + raise newException(CatchableError, "newClient returned nil") + let id = client.getId() + echo "smoke_test: OK (client id: " & id & ")" + quit(QuitSuccess) + except CatchableError as e: + echo "smoke_test: FAILED — " & e.msg + quit(QuitFailure) + +when isMainModule: + main() From 412909c5d94372f6fe4d2575f9be00b5d811636c Mon Sep 17 00:00:00 2001 From: Jazz Turner-Baggs <473256+jazzz@users.noreply.github.com> Date: Thu, 12 Feb 2026 18:10:13 -0800 Subject: [PATCH 2/4] Remove Nim-Chat-POC references --- .gitignore | 4 ++-- DEVELOPING.md | 12 ++++++------ Makefile | 20 ++++++++++---------- nim_chat_poc.nimble => logos_chat.nimble | 4 ++-- 4 files changed, 20 insertions(+), 20 deletions(-) rename nim_chat_poc.nimble => logos_chat.nimble (95%) diff --git a/.gitignore b/.gitignore index 7fe05ef..d81d275 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ /waku_vibe_template /waku_vibe_template.dSYM -/nim_chat_poc +/logos_chat *.dSYM nimble.develop nimble.paths @@ -21,7 +21,7 @@ nimble.paths /tags # a symlink that can't be added to the repo because of Windows -/nim_chat_poc.nims +/logos_chat.nims # Ignore dynamic, static libs and libtool archive files *.so diff --git a/DEVELOPING.md b/DEVELOPING.md index 32fe621..e707d70 100644 --- a/DEVELOPING.md +++ b/DEVELOPING.md @@ -5,9 +5,9 @@ ```mermaid flowchart TD - NIM("nim-chat-poc
c-bingings, process control, networking
") + NIM("Logos-Chat
c-bingings, process control, networking
") LIB("libchat
encryption, encoding
") - PROTO("chat_proto
protobufs, language specific types
") + PROTO("chat-proto
protobufs, language specific types
") LMN("logos-messaging-nim
p2p networking
") @@ -22,13 +22,13 @@ style LMN fill:#fff ## Repositories -### nim-chat-poc +### logos-chat Root of the Logos chat SDK, written in Nim. Handles async operations and bridges network operations with the cryptographic backend. **Responsibilities:** -- C bindings to libchat +- C bindings to Libchat - Async execution (Chronos) - Network integration @@ -42,12 +42,12 @@ Operates as a pipeline: accepts either encrypted payloads or plaintext content, - Encoding/decoding -### logos-messaging-nim +### logos-message-delivery P2P networking layer using logos-messaging protocol. Provides decentralized message transport. This is an external dependency. -### chat_proto +### chat-proto Protobuf definitions. Defines the protobufs used in the logos-chat protocol and provides generated types for various languages. \ No newline at end of file diff --git a/Makefile b/Makefile index d243276..5fd6c03 100644 --- a/Makefile +++ b/Makefile @@ -41,12 +41,12 @@ define test_name $(shell echo '$(MAKECMDGOALS)' | cut -d' ' -f3-) endef -nim_chat_poc.nims: - ln -s nim_chat_poc.nimble $@ +logos_chat.nims: + ln -s logos_chat.nimble $@ update: | update-common - rm -rf nim_chat_poc.nims && \ - $(MAKE) nim_chat_poc.nims $(HANDLE_OUTPUT) + rm -rf logos_chat.nims && \ + $(MAKE) logos_chat.nims $(HANDLE_OUTPUT) clean: rm -rf build @@ -88,9 +88,9 @@ build-waku-nat: @echo "Completed building nat-libs" .PHONY: tests -tests: | build-waku-librln build-waku-nat nim_chat_poc.nims +tests: | build-waku-librln build-waku-nat logos_chat.nims echo -e $(BUILD_MSG) "build/$@" && \ - $(ENV_SCRIPT) nim tests $(NIM_PARAMS) nim_chat_poc.nims + $(ENV_SCRIPT) nim tests $(NIM_PARAMS) logos_chat.nims ########## @@ -98,9 +98,9 @@ tests: | build-waku-librln build-waku-nat nim_chat_poc.nims ########## # Ensure there is a nimble task with a name that matches the target -tui bot_echo pingpong: | build-waku-librln build-waku-nat nim_chat_poc.nims +tui bot_echo pingpong: | build-waku-librln build-waku-nat logos_chat.nims echo -e $(BUILD_MSG) "build/$@" && \ - $(ENV_SCRIPT) nim $@ $(NIM_PARAMS) --path:src nim_chat_poc.nims + $(ENV_SCRIPT) nim $@ $(NIM_PARAMS) --path:src logos_chat.nims ########### ## Library ## @@ -118,9 +118,9 @@ endif LIBLOGOSCHAT := build/liblogoschat.$(LIBLOGOSCHAT_EXT) .PHONY: liblogoschat -liblogoschat: | build-waku-librln build-waku-nat nim_chat_poc.nims +liblogoschat: | build-waku-librln build-waku-nat logos_chat.nims echo -e $(BUILD_MSG) "$(LIBLOGOSCHAT)" && \ - $(ENV_SCRIPT) nim liblogoschat $(NIM_PARAMS) --path:src nim_chat_poc.nims && \ + $(ENV_SCRIPT) nim liblogoschat $(NIM_PARAMS) --path:src logos_chat.nims && \ echo -e "\n\x1B[92mLibrary built successfully:\x1B[39m" && \ echo " $(shell pwd)/$(LIBLOGOSCHAT)" diff --git a/nim_chat_poc.nimble b/logos_chat.nimble similarity index 95% rename from nim_chat_poc.nimble rename to logos_chat.nimble index 04eaf01..7099837 100644 --- a/nim_chat_poc.nimble +++ b/logos_chat.nimble @@ -5,7 +5,7 @@ author = "jazzz" description = "An example of the chat sdk in Nim" license = "MIT" srcDir = "src" -bin = @["nim_chat_poc"] +bin = @["logos_chat"] # Dependencies @@ -75,7 +75,7 @@ task bot_echo, "Build the EchoBot example": task pingpong, "Build the Pingpong example": let name = "pingpong" - buildBinary name, "examples/", "-d:chronicles_log_level='INFO' -d:chronicles_disabled_topics='waku node' " + buildBinary name, "./", "-d:chronicles_log_level='INFO' -d:chronicles_disabled_topics='waku node' " task liblogoschat, "Build the Chat SDK shared library (C bindings)": buildLibrary "logoschat", "library/", From d0f3632bea7e8b6e1e40fe330e39eee296277f5e Mon Sep 17 00:00:00 2001 From: Jazz Turner-Baggs <473256+jazzz@users.noreply.github.com> Date: Thu, 12 Feb 2026 18:14:09 -0800 Subject: [PATCH 3/4] Update nimble file. --- logos_chat.nimble | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/logos_chat.nimble b/logos_chat.nimble index 7099837..3bb2f09 100644 --- a/logos_chat.nimble +++ b/logos_chat.nimble @@ -1,8 +1,8 @@ # Package version = "0.1.0" -author = "jazzz" -description = "An example of the chat sdk in Nim" +author = "Logos.co" +description = "LogosChat is a decentralized permissionless messaging protocol." license = "MIT" srcDir = "src" bin = @["logos_chat"] From 733772c5e574737cb24d0eb04407b96d4a8f8d5e Mon Sep 17 00:00:00 2001 From: Jazz Turner-Baggs <473256+jazzz@users.noreply.github.com> Date: Thu, 12 Feb 2026 18:20:18 -0800 Subject: [PATCH 4/4] Remove references to ChatSDK as a product --- README.md | 2 +- library/liblogoschat.nim | 4 ++-- logos_chat.nimble | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 746e9b2..0129dc9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Nim Chat POC +# Logos Chat This is the technical proof of a modular e2ee chat protocol using Waku. You can find discussion and details [here](https://github.com/waku-org/specs/pull/73) diff --git a/library/liblogoschat.nim b/library/liblogoschat.nim index 5d86a6e..f0f87f3 100644 --- a/library/liblogoschat.nim +++ b/library/liblogoschat.nim @@ -1,7 +1,7 @@ -## liblogoschat - C bindings for the Chat SDK +## liblogoschat - C bindings for Logos-Chat ## Main entry point for the shared library ## -## This library exposes the Chat SDK functionality through a C-compatible FFI interface. +## This library exposes the chat functionality through a C-compatible FFI interface. ## It uses nim-ffi for thread-safe async request handling. import std/[json, options] diff --git a/logos_chat.nimble b/logos_chat.nimble index 3bb2f09..c281355 100644 --- a/logos_chat.nimble +++ b/logos_chat.nimble @@ -77,6 +77,6 @@ task pingpong, "Build the Pingpong example": let name = "pingpong" buildBinary name, "./", "-d:chronicles_log_level='INFO' -d:chronicles_disabled_topics='waku node' " -task liblogoschat, "Build the Chat SDK shared library (C bindings)": - buildLibrary "logoschat", "library/", +task liblogoschat, "Build the Logos-Chat shared library (C bindings)": + buildLibrary "logoschat", "library/", "-d:chronicles_log_level='INFO' -d:chronicles_enabled=on --path:src --path:vendor/nim-ffi"