diff --git a/flake.nix b/flake.nix index 1cdb4fa..f9e445f 100644 --- a/flake.nix +++ b/flake.nix @@ -74,7 +74,7 @@ # Simple package definition for the backend packages.default = pkgs.python312Packages.buildPythonPackage { pname = "reticulum-meshchatx"; - version = "4.1.0"; + version = "4.2.0"; src = ./.; format = "pyproject"; diff --git a/meshchatx/__init__.py b/meshchatx/__init__.py index 5112b65..9afac4d 100644 --- a/meshchatx/__init__.py +++ b/meshchatx/__init__.py @@ -1,3 +1,3 @@ """Reticulum MeshChatX - A mesh network communications app.""" -__version__ = "4.1.0" +__version__ = "4.2.0" diff --git a/meshchatx/meshchat.py b/meshchatx/meshchat.py index f166972..cbbbcde 100644 --- a/meshchatx/meshchat.py +++ b/meshchatx/meshchat.py @@ -7604,11 +7604,10 @@ class ReticulumMeshChat: count = request.query.get("count") after_id = request.query.get("after_id") - # get source hash from local lxmf destination local_hash = self.local_lxmf_destination.hash.hex() - # fetch messages from database - results = self.message_handler.get_conversation_messages( + results = await asyncio.to_thread( + self.message_handler.get_conversation_messages, local_hash, destination_hash, limit=int(count) if count else 100, @@ -7770,8 +7769,8 @@ class ReticulumMeshChat: local_hash = self.local_lxmf_destination.hexhash - # fetch conversations from database with optimized query - db_conversations = self.message_handler.get_conversations( + db_conversations = await asyncio.to_thread( + self.message_handler.get_conversations, local_hash, search=search_query, filter_unread=filter_unread, diff --git a/meshchatx/src/version.py b/meshchatx/src/version.py index fc3ecfd..0bb8450 100644 --- a/meshchatx/src/version.py +++ b/meshchatx/src/version.py @@ -2,4 +2,4 @@ share the same version string. """ -__version__ = "4.1.0" +__version__ = "4.2.0" diff --git a/packaging/arch/PKGBUILD b/packaging/arch/PKGBUILD index eb40fd9..e7545e7 100644 --- a/packaging/arch/PKGBUILD +++ b/packaging/arch/PKGBUILD @@ -1,7 +1,7 @@ # Maintainer: Ivan pkgname=reticulum-meshchatx-git _pkgname=reticulum-meshchatx -pkgver=4.1.0.r7.g9cfbf94 +pkgver=4.2.0 pkgrel=1 pkgdesc="A simple mesh network communications app powered by the Reticulum Network Stack" arch=('x86_64' 'aarch64') @@ -19,7 +19,7 @@ sha256sums=('SKIP' pkgver() { cd "$_pkgname" git describe --long --tags 2>/dev/null | sed 's/^v//;s/\([^-]*-g\)/r\1/;s/-/./g' || \ - printf "4.1.0.r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)" + printf "4.2.0.r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)" } prepare() { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9924c5f..edae3b5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,7 +27,7 @@ importers: version: 0.5.11(tailwindcss@3.4.19) '@vitejs/plugin-vue': specifier: ^5.2.4 - version: 5.2.4(vite@6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0))(vue@3.5.29(typescript@5.9.3)) + version: 5.2.4(vite@6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0))(vue@3.5.29(typescript@5.9.3)) axios: specifier: ^1.13.6 version: 1.13.6 @@ -69,10 +69,10 @@ importers: version: 9.1.13(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)(keycharm@0.4.0)(uuid@11.1.0)(vis-data@7.1.10(uuid@11.1.0)(vis-util@5.0.7(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)))(vis-util@5.0.7(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)) vite: specifier: ^6.4.1 - version: 6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0) + version: 6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0) vite-plugin-vuetify: specifier: ^2.1.3 - version: 2.1.3(vite@6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0))(vue@3.5.29(typescript@5.9.3))(vuetify@3.12.2) + version: 2.1.3(vite@6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0))(vue@3.5.29(typescript@5.9.3))(vuetify@3.12.2) vue: specifier: ^3.5.29 version: 3.5.29(typescript@5.9.3) @@ -181,7 +181,7 @@ importers: version: 5.46.0 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@25.3.3)(@vitest/ui@4.0.18)(jiti@1.21.7)(jsdom@26.1.0)(terser@5.46.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@25.3.5)(@vitest/ui@4.0.18)(jiti@1.21.7)(jsdom@26.1.0)(terser@5.46.0) packages: @@ -1011,11 +1011,11 @@ packages: '@types/mute-stream@0.0.4': resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} - '@types/node@22.19.13': - resolution: {integrity: sha512-akNQMv0wW5uyRpD2v2IEyRSZiR+BeGuoB6L310EgGObO44HSMNT8z1xzio28V8qOrgYaopIDNA18YgdXd+qTiw==} + '@types/node@22.19.15': + resolution: {integrity: sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==} - '@types/node@25.3.3': - resolution: {integrity: sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==} + '@types/node@25.3.5': + resolution: {integrity: sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA==} '@types/plist@3.0.5': resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} @@ -4647,7 +4647,7 @@ snapshots: '@inquirer/figures': 1.0.15 '@inquirer/type': 2.0.0 '@types/mute-stream': 0.0.4 - '@types/node': 22.19.13 + '@types/node': 22.19.15 '@types/wrap-ansi': 3.0.0 ansi-escapes: 4.3.2 cli-width: 4.1.0 @@ -4981,7 +4981,7 @@ snapshots: dependencies: '@types/http-cache-semantics': 4.2.0 '@types/keyv': 3.1.4 - '@types/node': 25.3.3 + '@types/node': 25.3.5 '@types/responselike': 1.0.3 '@types/chai@5.2.3': @@ -5009,7 +5009,7 @@ snapshots: '@types/fs-extra@9.0.13': dependencies: - '@types/node': 25.3.3 + '@types/node': 25.3.5 '@types/hammerjs@2.0.46': {} @@ -5019,25 +5019,25 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 25.3.3 + '@types/node': 25.3.5 '@types/ms@2.1.0': {} '@types/mute-stream@0.0.4': dependencies: - '@types/node': 22.19.13 + '@types/node': 22.19.15 - '@types/node@22.19.13': + '@types/node@22.19.15': dependencies: undici-types: 6.21.0 - '@types/node@25.3.3': + '@types/node@25.3.5': dependencies: undici-types: 7.18.2 '@types/plist@3.0.5': dependencies: - '@types/node': 25.3.3 + '@types/node': 25.3.5 xmlbuilder: 15.1.1 optional: true @@ -5045,7 +5045,7 @@ snapshots: '@types/responselike@1.0.3': dependencies: - '@types/node': 25.3.3 + '@types/node': 25.3.5 '@types/trusted-types@2.0.7': optional: true @@ -5057,12 +5057,12 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.19.13 + '@types/node': 22.19.15 optional: true - '@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0))(vue@3.5.29(typescript@5.9.3))': + '@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0))(vue@3.5.29(typescript@5.9.3))': dependencies: - vite: 6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0) + vite: 6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0) vue: 3.5.29(typescript@5.9.3) '@vitest/expect@3.2.4': @@ -5073,13 +5073,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0))': + '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0) + vite: 6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -5114,7 +5114,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.3.3)(@vitest/ui@4.0.18)(jiti@1.21.7)(jsdom@26.1.0)(terser@5.46.0) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.3.5)(@vitest/ui@4.0.18)(jiti@1.21.7)(jsdom@26.1.0)(terser@5.46.0) '@vitest/utils@3.2.4': dependencies: @@ -5996,7 +5996,7 @@ snapshots: electron@39.8.0: dependencies: '@electron/get': 2.0.3 - '@types/node': 22.19.13 + '@types/node': 22.19.15 extract-zip: 2.0.1 transitivePeerDependencies: - supports-color @@ -6688,7 +6688,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 25.3.3 + '@types/node': 25.3.5 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -7357,7 +7357,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 25.3.3 + '@types/node': 25.3.5 long: 5.3.2 protocol-buffers-schema@3.6.0: {} @@ -7978,13 +7978,13 @@ snapshots: '@egjs/hammerjs': 2.0.17 component-emitter: 2.0.0 - vite-node@3.2.4(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0): + vite-node@3.2.4(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0) + vite: 6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0) transitivePeerDependencies: - '@types/node' - jiti @@ -7999,18 +7999,18 @@ snapshots: - tsx - yaml - vite-plugin-vuetify@2.1.3(vite@6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0))(vue@3.5.29(typescript@5.9.3))(vuetify@3.12.2): + vite-plugin-vuetify@2.1.3(vite@6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0))(vue@3.5.29(typescript@5.9.3))(vuetify@3.12.2): dependencies: '@vuetify/loader-shared': 2.1.2(vue@3.5.29(typescript@5.9.3))(vuetify@3.12.2) debug: 4.4.3 upath: 2.0.1 - vite: 6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0) + vite: 6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0) vue: 3.5.29(typescript@5.9.3) vuetify: 3.12.2(typescript@5.9.3)(vite-plugin-vuetify@2.1.3)(vue@3.5.29(typescript@5.9.3)) transitivePeerDependencies: - supports-color - vite@6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0): + vite@6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -8019,16 +8019,16 @@ snapshots: rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 25.3.3 + '@types/node': 25.3.5 fsevents: 2.3.3 jiti: 1.21.7 terser: 5.46.0 - vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.3.3)(@vitest/ui@4.0.18)(jiti@1.21.7)(jsdom@26.1.0)(terser@5.46.0): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.3.5)(@vitest/ui@4.0.18)(jiti@1.21.7)(jsdom@26.1.0)(terser@5.46.0): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0)) + '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -8046,12 +8046,12 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0) - vite-node: 3.2.4(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0) + vite: 6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0) + vite-node: 3.2.4(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 25.3.3 + '@types/node': 25.3.5 '@vitest/ui': 4.0.18(vitest@3.2.4) jsdom: 26.1.0 transitivePeerDependencies: @@ -8109,7 +8109,7 @@ snapshots: vue: 3.5.29(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - vite-plugin-vuetify: 2.1.3(vite@6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0))(vue@3.5.29(typescript@5.9.3))(vuetify@3.12.2) + vite-plugin-vuetify: 2.1.3(vite@6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0))(vue@3.5.29(typescript@5.9.3))(vuetify@3.12.2) w3c-xmlserializer@5.0.0: dependencies: diff --git a/pyproject.toml b/pyproject.toml index 7d5e092..f7ea52d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "reticulum-meshchatx" -version = "4.1.0" +version = "4.2.0" description = "A simple mesh network communications app powered by the Reticulum Network Stack" authors = [ {name = "Sudo-Ivan"} diff --git a/tests/backend/test_app_status_tracking.py b/tests/backend/test_app_status_tracking.py index 3bcb231..71e56bc 100644 --- a/tests/backend/test_app_status_tracking.py +++ b/tests/backend/test_app_status_tracking.py @@ -94,8 +94,8 @@ async def test_app_status_endpoints(mock_rns_minimal, temp_dir): app_instance.config.set("tutorial_seen", True) assert app_instance.config.get("tutorial_seen") == "true" - app_instance.config.set("changelog_seen_version", "4.1.0") - assert app_instance.config.get("changelog_seen_version") == "4.1.0" + app_instance.config.set("changelog_seen_version", "4.2.0") + assert app_instance.config.get("changelog_seen_version") == "4.2.0" # Test app_info returns these values with ExitStack() as info_stack: @@ -111,4 +111,4 @@ async def test_app_status_endpoints(mock_rns_minimal, temp_dir): assert val == "true" val = app_instance.config.get("changelog_seen_version") - assert val == "4.1.0" + assert val == "4.2.0" diff --git a/tests/frontend/AppModals.test.js b/tests/frontend/AppModals.test.js index b0dce1d..9a55e56 100644 --- a/tests/frontend/AppModals.test.js +++ b/tests/frontend/AppModals.test.js @@ -62,9 +62,9 @@ describe("App.vue Modals", () => { return Promise.resolve({ data: { app_info: { - version: "4.1.0", + version: "4.2.0", tutorial_seen: true, - changelog_seen_version: "4.1.0", + changelog_seen_version: "4.2.0", }, }, }); @@ -94,7 +94,7 @@ describe("App.vue Modals", () => { return Promise.resolve({ data: { app_info: { - version: "4.1.0", + version: "4.2.0", tutorial_seen: false, changelog_seen_version: "0.0.0", }, @@ -153,7 +153,7 @@ describe("App.vue Modals", () => { return Promise.resolve({ data: { app_info: { - version: "4.1.0", + version: "4.2.0", tutorial_seen: true, changelog_seen_version: "3.9.0", }, @@ -161,7 +161,7 @@ describe("App.vue Modals", () => { }); } if (url === "/api/v1/app/changelog") { - return Promise.resolve({ data: { html: "

New Features

", version: "4.1.0" } }); + return Promise.resolve({ data: { html: "

New Features

", version: "4.2.0" } }); } if (url === "/api/v1/config") return Promise.resolve({ data: { config: { theme: "dark" } } }); if (url === "/api/v1/auth/status") return Promise.resolve({ data: { auth_enabled: false } }); diff --git a/tests/frontend/ChangelogModal.test.js b/tests/frontend/ChangelogModal.test.js index 9cab131..cc0f346 100644 --- a/tests/frontend/ChangelogModal.test.js +++ b/tests/frontend/ChangelogModal.test.js @@ -78,7 +78,7 @@ describe("ChangelogModal.vue", () => { axiosMock.get.mockResolvedValue({ data: { html: "

Test

", - version: "4.1.0", + version: "4.2.0", }, }); @@ -95,7 +95,7 @@ describe("ChangelogModal.vue", () => { axiosMock.get.mockResolvedValue({ data: { html: "

Test

", - version: "4.1.0", + version: "4.2.0", }, }); @@ -114,7 +114,7 @@ describe("ChangelogModal.vue", () => { axiosMock.get.mockResolvedValue({ data: { html: "

Test

", - version: "4.1.0", + version: "4.2.0", }, });