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/.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 3f191d9..5fd6c03 100644 --- a/Makefile +++ b/Makefile @@ -34,19 +34,19 @@ 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 $(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/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/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/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/nim_chat_poc.nimble b/logos_chat.nimble similarity index 86% rename from nim_chat_poc.nimble rename to logos_chat.nimble index 33510e6..c281355 100644 --- a/nim_chat_poc.nimble +++ b/logos_chat.nimble @@ -1,11 +1,11 @@ # 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 = @["nim_chat_poc"] +bin = @["logos_chat"] # Dependencies @@ -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" @@ -74,8 +75,8 @@ 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)": +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" 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()