A local-first private AI assistant for everyday use. Runs on-device models with encrypted P2P sync, and supports sharing chats publicly on ATProto.
10
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: sync exit fixes + refactoring

madclaws 470aa2b1 0b7fd449

+126 -111
+1 -1
Cargo.lock
··· 6550 6550 6551 6551 [[package]] 6552 6552 name = "tiles" 6553 - version = "0.4.6" 6553 + version = "0.4.7" 6554 6554 dependencies = [ 6555 6555 "anyhow", 6556 6556 "async-std",
-1
pkg/build.sh
··· 27 27 28 28 mkdir -p "${LIBS_PATH}" 29 29 30 - 31 30 # move cli to bin path 32 31 33 32 cp "target/${TARGET}/${BINARY_NAME}" "${CLI_BIN_PATH}"
+11 -3
scripts/bundler.sh
··· 16 16 17 17 cargo build -p tiles --${TARGET} 18 18 19 - chmod +x "${CLI_BIN_PATH}/tiles" 19 + CLI_BIN_PATH="target/${TARGET}/${BINARY_NAME}" 20 + 21 + chmod +x "${CLI_BIN_PATH}" 20 22 21 23 # Signing the tiles binary 22 24 codesign --force \ ··· 24 26 --options runtime \ 25 27 --timestamp \ 26 28 --strict \ 27 - "${CLI_BIN_PATH}/tiles" 29 + "${CLI_BIN_PATH}" 30 + 31 + # notarizing 32 + xcrun notarytool submit --force "${CLI_BIN_PATH}" \ 33 + --keychain-profile "tiles-notary-profile" \ 34 + --wait 28 35 29 36 # rm -rf "${DIST_DIR}" 30 37 31 38 mkdir -p "${DIST_DIR}/tmp" 32 - cp "target/${TARGET}/${BINARY_NAME}" "${DIST_DIR}/tmp/" 39 + 40 + cp "${CLI_BIN_PATH}" "${DIST_DIR}/tmp/" 33 41 34 42 # flushing this folder, else the final zip will have previous app-server zips too (#84) 35 43 rm -rf "${SERVER_DIR}/stack_export_prod"
+5 -5
server/stack/requirements/app-server/packages-app-server.txt
··· 5 5 anyio==4.13.0 6 6 black==25.9.0 7 7 certifi==2026.2.25 8 - click==8.3.1 8 + click==8.3.2 9 9 fastapi==0.119.0 10 10 filelock==3.25.2 11 11 fsspec==2026.3.0 12 12 h11==0.16.0 13 - hf-xet==1.4.2 13 + hf-xet==1.4.3 14 14 httpcore==1.0.9 15 15 httpx==0.28.1 16 - huggingface-hub==1.8.0 16 + huggingface-hub==1.9.0 17 17 idna==3.11 18 18 jinja2==3.1.6 19 19 markdown-it-py==4.0.0 ··· 33 33 pygments==2.20.0 34 34 pytokens==0.4.1 35 35 pyyaml==6.0.3 36 - regex==2026.3.32 36 + regex==2026.4.4 37 37 rich==14.3.3 38 38 safetensors==0.7.0 39 39 sentencepiece==0.2.1 ··· 41 41 starlette==0.48.0 42 42 tokenizers==0.22.2 43 43 tqdm==4.67.3 44 - transformers==5.4.0 44 + transformers==5.5.0 45 45 typer==0.24.1 46 46 typing-extensions==4.15.0 47 47 typing-inspection==0.4.2
+2 -2
server/stack/requirements/app-server/pylock.app-server.meta.json
··· 1 1 { 2 2 "lock_input_hash": "sha256:d7a2f2a68301eb65d01fc121715ef8b96a6af48a315d580340d976fde6e1dc47", 3 3 "lock_version": 1, 4 - "locked_at": "2026-03-29T17:39:54.163496+00:00", 4 + "locked_at": "2026-04-05T09:43:13.300458+00:00", 5 5 "other_inputs_hash": "sha256:63b3c2cfe2ec414938e81dace7aac779c7b902bae681618cd8827e9f16880985", 6 - "requirements_hash": "sha256:d848ff36972adee8df190ab839a11cd766fcdd9577ae2e24ebbe1f25f9074da3", 6 + "requirements_hash": "sha256:ee39e2bf91056148cbeebb9929b55faf49c0a46109b2f4076b7d3e22d76daac0", 7 7 "version_inputs_hash": "sha256:58db986b7cd72eeded675f7c9afd8138fe024fb51451131b5562922bbde3cf43" 8 8 }
+73 -73
server/stack/requirements/app-server/pylock.app-server.toml
··· 88 88 89 89 [[packages]] 90 90 name = "click" 91 - version = "8.3.1" 91 + version = "8.3.2" 92 92 index = "https://pypi.org/simple" 93 93 94 94 [[packages.wheels]] 95 - url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl" 96 - upload-time = 2025-11-15T20:45:41Z 97 - size = 108274 95 + url = "https://files.pythonhosted.org/packages/e4/20/71885d8b97d4f3dde17b1fdb92dbd4908b00541c5a3379787137285f602e/click-8.3.2-py3-none-any.whl" 96 + upload-time = 2026-04-03T19:14:43Z 97 + size = 108379 98 98 99 99 [packages.wheels.hashes] 100 - sha256 = "981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6" 100 + sha256 = "1924d2c27c5653561cd2cae4548d1406039cb79b858b747cfea24924bbc1616d" 101 101 102 102 [[packages]] 103 103 name = "fastapi" ··· 153 153 154 154 [[packages]] 155 155 name = "hf-xet" 156 - version = "1.4.2" 156 + version = "1.4.3" 157 157 index = "https://pypi.org/simple" 158 158 159 159 [[packages.wheels]] 160 - url = "https://files.pythonhosted.org/packages/66/d4/b73ebab01cbf60777323b7de9ef05550790451eb5172a220d6b9845385ec/hf_xet-1.4.2-cp313-cp313t-macosx_11_0_arm64.whl" 161 - upload-time = 2026-03-13T06:58:31Z 162 - size = 3555985 160 + url = "https://files.pythonhosted.org/packages/2b/d2/8bee5996b699262edb87dbb54118d287c0e1b2fc78af7cdc41857ba5e3c4/hf_xet-1.4.3-cp313-cp313t-macosx_11_0_arm64.whl" 161 + upload-time = 2026-03-31T22:39:47Z 162 + size = 3558942 163 163 164 164 [packages.wheels.hashes] 165 - sha256 = "6d2f8ee39fa9fba9af929f8c0d0482f8ee6e209179ad14a909b6ad78ffcb7c81" 165 + sha256 = "bee693ada985e7045997f05f081d0e12c4c08bd7626dc397f8a7c487e6c04f7f" 166 166 167 167 [[packages.wheels]] 168 - url = "https://files.pythonhosted.org/packages/ff/e7/ded6d1bd041c3f2bca9e913a0091adfe32371988e047dd3a68a2463c15a2/hf_xet-1.4.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl" 169 - upload-time = 2026-03-13T06:58:24Z 170 - size = 4212085 168 + url = "https://files.pythonhosted.org/packages/c3/a1/e993d09cbe251196fb60812b09a58901c468127b7259d2bf0f68bf6088eb/hf_xet-1.4.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl" 169 + upload-time = 2026-03-31T22:39:39Z 170 + size = 4207657 171 171 172 172 [packages.wheels.hashes] 173 - sha256 = "4642a6cf249c09da8c1f87fe50b24b2a3450b235bf8adb55700b52f0ea6e2eb6" 173 + sha256 = "21644b404bb0100fe3857892f752c4d09642586fd988e61501c95bbf44b393a3" 174 174 175 175 [[packages.wheels]] 176 - url = "https://files.pythonhosted.org/packages/21/a6/cbd4188b22abd80ebd0edbb2b3e87f2633e958983519980815fb8314eae5/hf_xet-1.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl" 177 - upload-time = 2026-03-13T06:58:42Z 178 - size = 4428287 176 + url = "https://files.pythonhosted.org/packages/1b/c4/39d6e136cbeea9ca5a23aad4b33024319222adbdc059ebcda5fc7d9d5ff4/hf_xet-1.4.3-cp313-cp313t-musllinux_1_2_x86_64.whl" 177 + upload-time = 2026-03-31T22:40:00Z 178 + size = 4424525 179 179 180 180 [packages.wheels.hashes] 181 - sha256 = "fca58a2ae4e6f6755cc971ac6fcdf777ea9284d7e540e350bb000813b9a3008d" 181 + sha256 = "2815a49a7a59f3e2edf0cf113ae88e8cb2ca2a221bf353fb60c609584f4884d4" 182 182 183 183 [[packages.wheels]] 184 - url = "https://files.pythonhosted.org/packages/64/2e/af4475c32b4378b0e92a587adb1aa3ec53e3450fd3e5fe0372a874531c00/hf_xet-1.4.2-cp37-abi3-macosx_11_0_arm64.whl" 185 - upload-time = 2026-03-13T06:58:34Z 186 - size = 3559664 184 + url = "https://files.pythonhosted.org/packages/0b/f8/7aacb8e5f4a7899d39c787b5984e912e6c18b11be136ef13947d7a66d265/hf_xet-1.4.3-cp37-abi3-macosx_11_0_arm64.whl" 185 + upload-time = 2026-03-31T22:39:51Z 186 + size = 3562178 187 187 188 188 [packages.wheels.hashes] 189 - sha256 = "e9b38d876e94d4bdcf650778d6ebbaa791dd28de08db9736c43faff06ede1b5a" 189 + sha256 = "e23717ce4186b265f69afa66e6f0069fe7efbf331546f5c313d00e123dc84583" 190 190 191 191 [[packages.wheels]] 192 - url = "https://files.pythonhosted.org/packages/3c/4c/781267da3188db679e601de18112021a5cb16506fe86b246e22c5401a9c4/hf_xet-1.4.2-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl" 193 - upload-time = 2026-03-13T06:58:27Z 194 - size = 4217422 192 + url = "https://files.pythonhosted.org/packages/df/9a/a24b26dc8a65f0ecc0fe5be981a19e61e7ca963b85e062c083f3a9100529/hf_xet-1.4.3-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl" 193 + upload-time = 2026-03-31T22:39:42Z 194 + size = 4212320 195 195 196 196 [packages.wheels.hashes] 197 - sha256 = "77e8c180b7ef12d8a96739a4e1e558847002afe9ea63b6f6358b2271a8bdda1c" 197 + sha256 = "fc360b70c815bf340ed56c7b8c63aacf11762a4b099b2fe2c9bd6d6068668c08" 198 198 199 199 [[packages.wheels]] 200 - url = "https://files.pythonhosted.org/packages/54/75/07f6aa680575d9646c4167db6407c41340cbe2357f5654c4e72a1b01ca14/hf_xet-1.4.2-cp37-abi3-musllinux_1_2_x86_64.whl" 201 - upload-time = 2026-03-13T06:58:46Z 202 - size = 4432751 200 + url = "https://files.pythonhosted.org/packages/42/4b/53951592882d9c23080c7644542fda34a3813104e9e11fa1a7d82d419cb8/hf_xet-1.4.3-cp37-abi3-musllinux_1_2_x86_64.whl" 201 + upload-time = 2026-03-31T22:40:03Z 202 + size = 4429392 203 203 204 204 [packages.wheels.hashes] 205 - sha256 = "6b0932eb8b10317ea78b7da6bab172b17be03bbcd7809383d8d5abd6a2233e04" 205 + sha256 = "7716d62015477a70ea272d2d68cd7cad140f61c52ee452e133e139abfe2c17ba" 206 206 207 207 [[packages]] 208 208 name = "httpcore" ··· 232 232 233 233 [[packages]] 234 234 name = "huggingface-hub" 235 - version = "1.8.0" 235 + version = "1.9.0" 236 236 index = "https://pypi.org/simple" 237 237 238 238 [[packages.wheels]] 239 - url = "https://files.pythonhosted.org/packages/a9/ae/8a3a16ea4d202cb641b51d2681bdd3d482c1c592d7570b3fa264730829ce/huggingface_hub-1.8.0-py3-none-any.whl" 240 - upload-time = 2026-03-25T16:01:26Z 241 - size = 625208 239 + url = "https://files.pythonhosted.org/packages/73/37/0d15d16150e1829f3e90962c99f28257f6de9e526a680b4c6f5acdb54fd2/huggingface_hub-1.9.0-py3-none-any.whl" 240 + upload-time = 2026-04-03T08:35:53Z 241 + size = 637355 242 242 243 243 [packages.wheels.hashes] 244 - sha256 = "d3eb5047bd4e33c987429de6020d4810d38a5bef95b3b40df9b17346b7f353f2" 244 + sha256 = "2999328c058d39fd19ab748dd09bd4da2fbaa4f4c1ddea823eab103051e14a1f" 245 245 246 246 [[packages]] 247 247 name = "idna" ··· 686 686 687 687 [[packages]] 688 688 name = "regex" 689 - version = "2026.3.32" 689 + version = "2026.4.4" 690 690 index = "https://pypi.org/simple" 691 691 692 692 [[packages.wheels]] 693 - url = "https://files.pythonhosted.org/packages/bd/ba/9c1819f302b42b5fbd4139ead6280e9ec37d19bbe33379df0039b2a57bb4/regex-2026.3.32-cp313-cp313-macosx_10_13_universal2.whl" 694 - upload-time = 2026-03-28T21:46:58Z 695 - size = 490394 693 + url = "https://files.pythonhosted.org/packages/9d/83/c4373bc5f31f2cf4b66f9b7c31005bd87fe66f0dce17701f7db4ee79ee29/regex-2026.4.4-cp313-cp313-macosx_10_13_universal2.whl" 694 + upload-time = 2026-04-03T20:54:11Z 695 + size = 490273 696 696 697 697 [packages.wheels.hashes] 698 - sha256 = "c6d9c6e783b348f719b6118bb3f187b2e138e3112576c9679eb458cc8b2e164b" 698 + sha256 = "62f5519042c101762509b1d717b45a69c0139d60414b3c604b81328c01bd1943" 699 699 700 700 [[packages.wheels]] 701 - url = "https://files.pythonhosted.org/packages/e7/d8/ba0f8f81f88cd20c0b27acc123561ac5495ea33f800f0b8ebed2038b23eb/regex-2026.3.32-cp313-cp313-macosx_11_0_arm64.whl" 702 - upload-time = 2026-03-28T21:47:02Z 703 - size = 289618 701 + url = "https://files.pythonhosted.org/packages/5a/92/4712b9fe6a33d232eeb1c189484b80c6c4b8422b90e766e1195d6e758207/regex-2026.4.4-cp313-cp313-macosx_11_0_arm64.whl" 702 + upload-time = 2026-04-03T20:54:15Z 703 + size = 289487 704 704 705 705 [packages.wheels.hashes] 706 - sha256 = "844d88509c968dd44b30daeefac72b038b1bf31ac372d5106358ab01d393c48b" 706 + sha256 = "8fae3c6e795d7678963f2170152b0d892cf6aee9ee8afc8c45e6be38d5107fe7" 707 707 708 708 [[packages.wheels]] 709 - url = "https://files.pythonhosted.org/packages/0f/f8/acf1eb80f58852e85bd39a6ddfa78ce2243ddc8de8da7582e6ba657da593/regex-2026.3.32-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" 710 - upload-time = 2026-03-28T21:47:10Z 711 - size = 801536 709 + url = "https://files.pythonhosted.org/packages/26/47/2ee5c613ab546f0eddebf9905d23e07beb933416b1246c2d8791d01979b4/regex-2026.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" 710 + upload-time = 2026-04-03T20:54:24Z 711 + size = 801126 712 712 713 713 [packages.wheels.hashes] 714 - sha256 = "a5d88fa37ba5e8a80ca8d956b9ea03805cfa460223ac94b7d4854ee5e30f3173" 714 + sha256 = "ffa81f81b80047ba89a3c69ae6a0f78d06f4a42ce5126b0eb2a0a10ad44e0b2e" 715 715 716 716 [[packages.wheels]] 717 - url = "https://files.pythonhosted.org/packages/f4/8e/03d392b26679914ccf21f83d18ad4443232d2f8c3e2c30a962d4e3918d9c/regex-2026.3.32-cp313-cp313-musllinux_1_2_x86_64.whl" 718 - upload-time = 2026-03-28T21:47:22Z 719 - size = 788447 717 + url = "https://files.pythonhosted.org/packages/f7/0d/c813f0af7c6cc7ed7b9558bac2e5120b60ad0fa48f813e4d4bd55446f214/regex-2026.4.4-cp313-cp313-musllinux_1_2_x86_64.whl" 718 + upload-time = 2026-04-03T20:54:36Z 719 + size = 789181 720 720 721 721 [packages.wheels.hashes] 722 - sha256 = "847087abe98b3c1ebf1eb49d6ef320dbba75a83ee4f83c94704580f1df007dd4" 722 + sha256 = "c882cd92ec68585e9c1cf36c447ec846c0d94edd706fe59e0c198e65822fd23b" 723 723 724 724 [[packages.wheels]] 725 - url = "https://files.pythonhosted.org/packages/58/08/e38372da599dc1c39c599907ec535016d110034bd3701ce36554f59767ef/regex-2026.3.32-cp313-cp313t-macosx_10_13_universal2.whl" 726 - upload-time = 2026-03-28T21:47:30Z 727 - size = 494495 725 + url = "https://files.pythonhosted.org/packages/f1/1e/3a2b9672433bef02f5d39aa1143ca2c08f311c1d041c464a42be9ae648dc/regex-2026.4.4-cp313-cp313t-macosx_10_13_universal2.whl" 726 + upload-time = 2026-04-03T20:54:43Z 727 + size = 494126 728 728 729 729 [packages.wheels.hashes] 730 - sha256 = "5d86e3fb08c94f084a625c8dc2132a79a3a111c8bf6e2bc59351fa61753c2f6e" 730 + sha256 = "f94a11a9d05afcfcfa640e096319720a19cc0c9f7768e1a61fceee6a3afc6c7c" 731 731 732 732 [[packages.wheels]] 733 - url = "https://files.pythonhosted.org/packages/e1/98/8752e18bb87a2fe728b73b0f83c082eb162a470766063f8028759fb26844/regex-2026.3.32-cp313-cp313t-macosx_11_0_arm64.whl" 734 - upload-time = 2026-03-28T21:47:34Z 735 - size = 292634 733 + url = "https://files.pythonhosted.org/packages/f4/5f/eaa38092ce7a023656280f2341dbbd4ad5f05d780a70abba7bb4f4bea54c/regex-2026.4.4-cp313-cp313t-macosx_11_0_arm64.whl" 734 + upload-time = 2026-04-03T20:54:47Z 735 + size = 292334 736 736 737 737 [packages.wheels.hashes] 738 - sha256 = "b8fca73e16c49dd972ce3a88278dfa5b93bf91ddef332a46e9443abe21ca2f7c" 738 + sha256 = "261c015b3e2ed0919157046d768774ecde57f03d8fa4ba78d29793447f70e717" 739 739 740 740 [[packages.wheels]] 741 - url = "https://files.pythonhosted.org/packages/c8/c0/6379d7f5b59ff0656ba49cf666d5013ecee55e83245275b310b0ffc79143/regex-2026.3.32-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" 742 - upload-time = 2026-03-28T21:47:43Z 743 - size = 814988 741 + url = "https://files.pythonhosted.org/packages/5c/71/8b260897f22996b666edd9402861668f45a2ca259f665ac029e6104a2d7d/regex-2026.4.4-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" 742 + upload-time = 2026-04-03T20:54:54Z 743 + size = 816358 744 744 745 745 [packages.wheels.hashes] 746 - sha256 = "7cdd508664430dd51b8888deb6c5b416d8de046b2e11837254378d31febe4a98" 746 + sha256 = "0734f63afe785138549fbe822a8cfeaccd1bae814c5057cc0ed5b9f2de4fc883" 747 747 748 748 [[packages.wheels]] 749 - url = "https://files.pythonhosted.org/packages/37/e8/ee0e7d14de1fc6582d5782f072db6c61465a38a4142f88e175dda494b536/regex-2026.3.32-cp313-cp313t-musllinux_1_2_x86_64.whl" 750 - upload-time = 2026-03-28T21:47:57Z 751 - size = 801875 749 + url = "https://files.pythonhosted.org/packages/4d/b4/c671db3556be2473ae3e4bb7a297c518d281452871501221251ea4ecba57/regex-2026.4.4-cp313-cp313t-musllinux_1_2_x86_64.whl" 750 + upload-time = 2026-04-03T20:55:07Z 751 + size = 803241 752 752 753 753 [packages.wheels.hashes] 754 - sha256 = "ef250a3f5e93182193f5c927c5e9575b2cb14b80d03e258bc0b89cc5de076b60" 754 + sha256 = "f4f83781191007b6ef43b03debc35435f10cad9b96e16d147efe84a1d48bdde4" 755 755 756 756 [[packages]] 757 757 name = "rich" ··· 918 918 919 919 [[packages]] 920 920 name = "transformers" 921 - version = "5.4.0" 921 + version = "5.5.0" 922 922 index = "https://pypi.org/simple" 923 923 924 924 [[packages.wheels]] 925 - url = "https://files.pythonhosted.org/packages/0b/a0/0a87883e564e364baab32adcacb4bec2e200b28a568423c8cf7fde316461/transformers-5.4.0-py3-none-any.whl" 926 - upload-time = 2026-03-27T00:24:21Z 927 - size = 10105556 925 + url = "https://files.pythonhosted.org/packages/e7/28/35f7411ff80a3640c1f4fc907dcbb6a65061ebb82f66950e38bfc9f7f740/transformers-5.5.0-py3-none-any.whl" 926 + upload-time = 2026-04-02T16:13:03Z 927 + size = 10245591 928 928 929 929 [packages.wheels.hashes] 930 - sha256 = "9fbe50602d2a4e6d0aa8a35a605433dfac72d595ee2192eae192590a6cc2df86" 930 + sha256 = "821a9ff0961abbb29eb1eb686d78df1c85929fdf213a3fe49dc6bd94f9efa944" 931 931 932 932 [[packages]] 933 933 name = "typer"
+1 -1
tiles/Cargo.toml
··· 1 1 [package] 2 2 name = "tiles" 3 - version = "0.4.6" 3 + version = "0.4.7" 4 4 edition = "2024" 5 5 6 6 [dependencies]
+33 -25
tiles/src/core/network/mod.rs
··· 35 35 oneshot::{self}, 36 36 }, 37 37 task::spawn_blocking, 38 + time::sleep, 38 39 }; 39 40 use uuid::Uuid; 40 41 ··· 54 55 const MAX_DOWNLOADED_BYTES: usize = 50 * 1024 * 1024; 55 56 56 57 const DEVICE_LINK_LOCAL_TOPIC: &str = "com.tilesprivacy.tiles.link"; 57 - #[derive(serde::Serialize, serde::Deserialize)] 58 + #[derive(serde::Serialize, serde::Deserialize, Debug)] 58 59 struct NetworkMessage { 59 60 from_did: String, 60 61 from_nickname: String, ··· 233 234 link_main_sender: tokio::sync::mpsc::Sender<u8>, 234 235 ) -> Result<()> { 235 236 while let Some(event) = receiver.try_next().await? { 236 - if cfg!(debug_assertions) { 237 - println!("In {}:, some event {:?}", user.username, event); 238 - } 237 + info!("from{}:", user.username); 239 238 // TODO: Damn refactor the loop, its getting bigger 240 239 if let Event::Received(msg) = event { 241 240 let pub_key = msg.delivered_from; ··· 286 285 { 287 286 println!("Failed to add the peer locally due to {:?}", err); 288 287 289 - continue; 288 + sleep(Duration::from_secs(5)).await; 289 + link_main_sender.send(0).await?; 290 290 } 291 291 292 292 println!( 293 - "Device {}({}) is now linked\nYou can exit now by ctrl-c", 293 + "Device {}({}) is now linked\n", 294 294 msg.from_nickname, msg.from_did 295 295 ); 296 296 NetworkMessage::new(&user, msg.is_online, MessageBody::LinkAccepted) ··· 306 306 input.lock().unwrap().clear(); 307 307 308 308 sender.broadcast(link_res_resp.to_bytes().into()).await?; 309 + // Adding a delay to prevent the risk od closing the endpoint 310 + // before we send the msg 311 + sleep(Duration::from_secs(5)).await; 309 312 link_main_sender.send(0).await?; 310 313 } 311 314 MessageBody::LinkAccepted => { ··· 315 318 save_peer_account_db(&db_conn, &msg.from_did, &msg.from_nickname) 316 319 { 317 320 println!("Failed to add the peer locally due to {:?}", err); 318 - return Ok(()); 319 321 } 320 - 322 + sleep(Duration::from_secs(5)).await; 321 323 link_main_sender.send(0).await?; 322 - break; 323 324 } 325 + 324 326 MessageBody::LinkRejected { reason } => { 325 327 println!( 326 328 "Oops looks like your link request has been rejected by {}({}),\nreason: {},\n Try again", 327 329 msg.from_nickname, msg.from_did, reason 328 330 ); 331 + sleep(Duration::from_secs(5)).await; 329 332 link_main_sender.send(0).await?; 330 333 } 331 334 msg_body => { ··· 343 346 user: accounts::User, 344 347 store: MemStore, 345 348 endpoint: Endpoint, 346 - sync_channel_sender: tokio::sync::mpsc::Sender<SyncOp>, 349 + sync_db_channel_sender: tokio::sync::mpsc::Sender<SyncOp>, 347 350 sync_main_sender: tokio::sync::mpsc::Sender<u8>, 348 351 ) -> Result<()> { 349 352 while let Some(event) = receiver.try_next().await? { ··· 372 375 &msg, 373 376 pub_key, 374 377 &user, 375 - &sync_channel_sender, 378 + &sync_db_channel_sender, 376 379 ) 377 380 .await?; 378 381 } ··· 380 383 blob_ticket: _, 381 384 last_row_counter: _, 382 385 } => { 386 + let senders: ( 387 + &tokio::sync::mpsc::Sender<SyncOp>, 388 + &tokio::sync::mpsc::Sender<u8>, 389 + ) = (&sync_db_channel_sender, &sync_main_sender); 383 390 on_sync_send_delta_info( 384 - &sender, 385 - &store, 386 - &msg, 387 - pub_key, 388 - &user, 389 - &endpoint, 390 - &sync_channel_sender, 391 + &sender, &store, &msg, pub_key, &user, &endpoint, senders, 391 392 ) 392 393 .await?; 393 394 } 394 395 MessageBody::SyncEnd => { 395 396 println!("Sync completed..., exiting.."); 397 + sleep(Duration::from_secs(5)).await; 396 398 sync_main_sender.send(0).await?; 397 399 } 398 400 msg_body => { ··· 696 698 msg: &NetworkMessage, 697 699 delivered_from: PublicKey, 698 700 user: &accounts::User, 699 - sync_channel_sender: &tokio::sync::mpsc::Sender<SyncOp>, 701 + sync_db_channel_sender: &tokio::sync::mpsc::Sender<SyncOp>, 700 702 ) -> Result<()> { 701 703 if let MessageBody::SyncStart { 702 704 last_row_counter: lrc, ··· 705 707 let sender_did = get_did_from_public_key(delivered_from.as_bytes())?; 706 708 let ticket = fetch_encoded_delta_ticket( 707 709 &user.user_id, 708 - sync_channel_sender, 710 + sync_db_channel_sender, 709 711 lrc.expect("lrc failed"), 710 712 store, 711 713 delivered_from, ··· 713 715 .await?; 714 716 715 717 let receiver_last_row_counter = 716 - fetch_last_row_counter(&sender_did, sync_channel_sender).await?; 718 + fetch_last_row_counter(&sender_did, sync_db_channel_sender).await?; 717 719 718 720 let delta_info = NetworkMessage::new( 719 721 user, ··· 736 738 delivered_from: PublicKey, 737 739 user: &accounts::User, 738 740 endpoint: &Endpoint, 739 - sync_channel_sender: &tokio::sync::mpsc::Sender<SyncOp>, 741 + senders: ( 742 + &tokio::sync::mpsc::Sender<SyncOp>, 743 + &tokio::sync::mpsc::Sender<u8>, 744 + ), 740 745 ) -> Result<()> { 746 + let (sync_db_channel_sender, sync_main_sender) = senders; 741 747 if let MessageBody::SyncSendDeltaInfo { 742 748 blob_ticket, 743 749 last_row_counter, ··· 765 771 delta: data.to_vec(), 766 772 resp: sendx, 767 773 }; 768 - sync_channel_sender.send(sync_op_msg).await?; 774 + sync_db_channel_sender.send(sync_op_msg).await?; 769 775 770 776 recvx.await??; 771 777 info!("Diff applied successfully"); ··· 774 780 if let Some(row_counter) = last_row_counter { 775 781 let ticket = fetch_encoded_delta_ticket( 776 782 &user.user_id, 777 - sync_channel_sender, 783 + sync_db_channel_sender, 778 784 *row_counter, 779 785 store, 780 786 delivered_from, ··· 794 800 let stop_req = NetworkMessage::new(user, msg.is_online, MessageBody::SyncEnd); 795 801 sender.broadcast(stop_req.to_bytes().into()).await?; 796 802 info!("sync ended"); 797 - println!("\nSync completed..., you can exit now"); 803 + println!("\nSync completed..., exiting now.."); 804 + sleep(Duration::from_secs(5)).await; 805 + sync_main_sender.send(0).await?; 798 806 } 799 807 } 800 808 Ok(())