Commit Graph

99 Commits

Author SHA1 Message Date
Eric Mastro 66912fd811 feat: introduce Task Manager threadpool
The `TaskManager` threadpool is a memory-safe replacement for the `spawnAndSend` operations that are currently causing memory issues in status-desktop.

From a fundamental memory management point of view, `libstatus/settings`, `libstatus/contracts`, and `libstatus/tokens` (custom tokens) have all been converted to `{.threadvar.}`s and `Atomic[bool]`s to maintain the cache and `dirty` flag across threads, respectively, eliminating the need for thread locks and incorrect `{.gcsafe.}` compiler overrides.

The successful [recyclable threadpool experiment from `nim-task-runner`](https://github.com/status-im/nim-task-runner/blob/test/use-cases/test/use_cases/test_sync.nim) using `AsyncChannel[ThreadSafeString]`s was brought over to `status-desktop` and implemented in somewhat of a hardcoded manner, as we knew this would save some time instead of trying to create a fully fleshed out `nim-task-runner` API and build a miraculous macro that may or may not be able to generate the needed API.

The threadpool is started by the `TaskManager` and both the `TaskManager` and the `TaskManager`'s threadpool are started as early as possible in the application lifecycle (in `nim_status_client.nim`). The `TaskManager` creates a thread to run the threadpool. During its initialization, the threadpool then spools up all the threads it will manage and puts them in an idle thread sequence. This is to prevent expensive thread creation and teardown happening during the app's lifetime as it is quite expensive and blocks the main thread. When tasks comes in to the pool, the task is sent to an idle thread, or put in a queue if all threads are busy. The idle thread is moved to the busy thread sequence. When a task is completed, the thread is taken out of the busy threads sequence and moved back in to the sequence of idle threads, effectively recycling it.

The first `spawnAndSend` we were able to change over to the new threadpool was `estimate`, which estimates the gas of a sticker purchase transaction.

From the consumer point of view, the existing `spawnAndSend` to achieve this looks like:
```nim
  proc estimate*(self: StickersView, packId: int, address: string, price: string, uuid: string) {.slot.} =
    let status_stickers = self.status.stickers
    spawnAndSend(self, "setGasEstimate") do:
      var success: bool
      var estimate = status_stickers.estimateGas(packId, address, price, success)
      if not success:
        estimate = 325000
      let result: tuple[estimate: int, uuid: string] = (estimate, uuid)
      Json.encode(result)
```
And the new syntax looks like this:
```nim
  proc estimate*(self: StickersView, packId: int, address: string, price: string, uuid: string) {.slot.} =
    self.status.taskManager.threadPool.stickers.stickerPackPurchaseGasEstimate(cast[pointer](self.vptr), "setGasEstimate", packId, address, price, uuid)
```
The logic inside the `spawnAndSend` body was moved to [src/status/tasks/stickers.nim](https://github.com/status-im/status-desktop/compare/experiment/tasks-3?expand=1#diff-09e57eef00b0cee5c4abdb9039f948d8372e7003e09e934a9b4c7e9167d47658).

This is just the first migration of `spawnAndSend`, however moving the majority of the remaining `spawnAndSend`s will likely just be an exercise in copy/pasta. There will be one or two that may require a bit more thinking, depending how they rely on data from the model.

Once the `spawnAndSend`s have been converted to the threadpool, we can start implementing the [long-running process from the task runner use case experiments](https://github.com/status-im/nim-task-runner/blob/test/use-cases/test/use_cases/test_long_running.nim).

And finally, we can then implement the [async tasks](https://github.com/status-im/nim-task-runner/blob/test/use-cases/test/use_cases/test_async.nim) if needed.

@michaelsbradleyjr and I spent many hours digging in to the depths of nim's memory management in an attempt to understand it. We have created [a presentation with our task runner experiment findings](https://docs.google.com/presentation/d/1ItCxAfsVTcIoH_E4bgvmHljhbU-tC3T6K2A6ahwAedk/edit?usp=sharing), and @michaelsbradleyjr has spent time [answering questions off the back of that presentation.](https://gist.github.com/michaelsbradleyjr/1eaa9937b3fbb4ffff3fb814f0dd82a9).

We have created a fork of `edn.nim` at `status-im/edn.nim` and we need the PR to be merged and the commit hash updated before we can merge this PR in to `status-desktop`.
2021-03-18 13:15:05 -04:00
Michael Bradley, Jr 016dd3081b refactor: nim_status -> status_go
Also, `status_go.startWallet` proc should be called with a boolean argument.
2021-03-16 16:37:27 -04:00
Michael Bradley, Jr c4e786bae3 build: add vendor/nim-status-go submodule 2021-03-16 16:37:27 -04:00
Michael Bradley, Jr 470d2e5a17 build: remove vendor/nim-status submodule 2021-03-16 16:37:27 -04:00
Richard Ramos e4cdb29a0b Update nimbus-build-system version 2021-03-11 10:36:18 -05:00
Jonathan Rainville f9817d4f52 feat: add community requests, permissions, ENS and more 2021-03-03 16:45:23 -05:00
Jonathan Rainville 98b3e64573 chore: update status-go version and update mailservers api 2021-02-22 10:01:19 -05:00
Jonathan Rainville c8a1de695c fix: update status-go to latest version including migration fix 2021-01-12 12:40:51 -05:00
Jonathan Rainville ce3252fb8f wip community 2021-01-11 13:57:35 -05:00
emizzle 7e1d7be314 feat: load installed stickers while offline
When the network connection is changed, the sticker packs are cleared and then re-loaded (either loading the offline (installed) sticker packs, or all the sticker packs from the network).

Stickers can be sent while offline, though the sticker images do not load once offline (this is likely a side effect of the bug described below).

There is a known bug in QNetworkAccessManager (https://bugreports.qt.io/browse/QTBUG-55180) that was re-introduced in 5.14.1 that does not allow us to download resources if we go offline then come back online. The workaround employed in this PR manually sets the NetworkAccessible property of QNetworkAccessManager once we have been connected back online. The NetworkAccessible property is marked as obsolete and will be removed in Qt6, so it is something that we need to be aware of when we upgrade. However the hope is that the bug has been fixed.

Close StickersPopup when disconnected from network (so that re-loading of sticker packs doesn't look out of place).

fix: set network status correctly at load

feat: stickers gas estimate async

feat: When network re-connected, any http images that were not properly loaded in an ImageLoader component will automatically be reloaded.

fix: Sticker button loading icon

chore: Bump nimqml and dotherside

NOTE: This PR uses an updated nimqml and dotherside. The respective changes should be merged first, and the commit hash should be bumped in this PR prior to merging. Relevant PRs:

[https://github.com/status-im/dotherside/pull/20](https://github.com/status-im/dotherside/pull/20)

[https://github.com/status-im/nimqml/pull/17](https://github.com/status-im/nimqml/pull/17)
2020-12-28 14:29:38 -05:00
emizzle b82540fcb7 chore: bump nimqml and dotherside 2020-12-22 16:08:09 -05:00
emizzle 6a0a75888b feat: whitelist gifs (no url extension needed)
Fixes #1377.
Fixes #1479.

Two sites have been added to the whitelist: giphy.com and tenor.com.

`imageUrls` in its entirety has been removed and instead all links are being handle through the message `linkUrls`. This prevents double-handling of urls that may or may not be images.

The logic to automatically show links previews works like this:
1. If the setting "display chat images" is enabled, all links that *contain* ".png", ".jpg", ".jpeg", ".svg", ".gif" will be automatically shown. If the URL doesn't contain the extension, we are not downloading it. This was meant to be somewhat of a security compromise as we do not want to download each and every link posted in a message just to find out its true content type.
2. If the above setting is *disabled*, then we follow the whitelist settings for tenor and giphy. This allows us to preview gifs that do not have a file extension in their url.

feat: bump status-go to the commit that supports the new whitelist (https://github.com/status-im/status-go/pull/2094), and also lets us get link preview data from urls in the whitelist. NOTE: this commit was branched off status-go `develop`, so once it is merged, and we update this PR to the new commit, we will effectively be getting status-go develop changes. We *could* base that status-go PR off of master if it makes things easier.

fix: height on settings update issue

feat: move date/time of message below links

fix: layout issues when changing setting `neverAskAboutUnfurlingAgain`

feat: Add MessageBorder component to aid in showing rounded corners with different radius
2020-12-21 14:14:32 -05:00
Jonathan Rainville eebd831c5d chore: update to the merged version of status-go 2020-12-17 16:44:25 -05:00
Jonathan Rainville d01c9fef79 feat: add profile pic support 2020-12-17 16:44:25 -05:00
emizzle 5953031bfc fix: YouTube unfurling
YouTube link unfurling was not working for a couple reasons.

There were two main parts fixed:
1. QML context for messages pertaining to linkUrls and imageUrls was changed from implicit to explicit. By this, I mean that any time we referenced linkUrls/imageUrls, we were relying on the knowledge that those values would be populated by some parent context several levels up. Now, we are referring to properties that have been explicitly defined on the components. This offers the ability to reuse components, and makes reading the code and debugging much easier.
2. Error handling has been added to getting link preview data. An unhandled "error" was thrown each time a link that wasn't whitelisted was passed in, causing the app to crash. For example, when a link to a tenor gif was posted in the chat, that URL was not whitelisted, causing the app to crash.
2020-12-10 14:45:48 -05:00
Richard Ramos d1378597b6
fix: remove event emitter 2020-12-09 16:17:20 -04:00
Richard Ramos cc9830268a fix: deploy contracts in browser 2020-12-09 14:19:35 -05:00
Jonathan Rainville 7d1e9212ca chore: bump to latest status-go 2020-12-01 14:07:31 -05:00
Jonathan Rainville a13f1f2043 feat: add basic bookmark support 2020-12-01 14:07:31 -05:00
Richard Ramos 2c42ebf923 fix: nimqml 2020-11-26 11:44:09 -05:00
Richard Ramos 4e27983047 feat: use cache for network requests 2020-11-26 11:44:09 -05:00
Jonathan Rainville a679758230 feat: show whitelistable sites in the settings and set in qt settings 2020-11-05 11:25:22 -05:00
Richard Ramos 51afc7fc54 bump up nimqml / dotherside version 2020-10-21 12:12:35 -04:00
Richard Ramos e512768dc0 fix: replace URL in address bar by ens 2020-10-20 14:42:36 -04:00
Richard Ramos e8183f3a9f feat: use base32 + status infura ipfs for ens contenthash 2020-10-20 14:42:36 -04:00
Richard Ramos ca2fef7c28 feat: resolve ens addresses pointing to IPFS 2020-10-20 14:42:36 -04:00
Richard Ramos b6066ef1dd feat: address bar, tabs support and nav buttons 2020-10-20 14:42:36 -04:00
emizzle e58f5b03eb refactor: make event emitter threadsafe 2020-10-16 10:45:24 -04:00
Iuri Matias dae2967a17 update to the latest status-go 2020-10-06 10:15:04 -04:00
emizzle 078e9758f0 refactor: use nim-web3 library
Use nim-web3 library and remove internal encoding funcs that were copied from nim-web3.

Remove all instances of EthAddress (and therefore eth/common/eth_types imports)
2020-09-29 13:28:08 -04:00
Iuri Matias 0882ba18af update to beta.1 2020-09-23 15:52:34 -04:00
Michael Bradley, Jr dc616a0742 build: bump vendor/status-go 2020-09-23 09:25:28 -04:00
Richard Ramos 06a4353dd1 fix: remove nim-confutils 2020-09-22 09:37:41 -04:00
Richard Ramos efac44057a fix: rebase gone wrong 2020-09-22 09:37:41 -04:00
Michael Bradley, Jr 3e0ca2f938 build: bump vendor/nim-status 2020-09-11 14:41:42 -04:00
Richard Ramos f2a56c70e1 fix: rebase gone wrong 2020-09-11 13:25:55 -04:00
Iuri Matias ce12ad7da5 update status go 2020-09-10 15:17:46 -04:00
Jonathan Rainville 88e76f33dd chore: update to latest nim-json-serialization 2020-09-09 15:03:45 -04:00
Iuri Matias 6c9d3ee026 update to latest status-go 2020-09-08 14:38:18 -04:00
Richard Ramos 98aaa69e9d fix: transaction history handling
- Determine if the recent transaction history is being fetched or available before obtaining the first 20 transactions
- On account change, reset the selected tab to show the asset list
- Collectibles were kinda pixelated/blurry (not anymore)

Fixes #806
2020-09-07 12:54:59 -04:00
Richard Ramos c334127179 feat: receive wallet events and bump nim-status 2020-09-07 12:54:59 -04:00
Richard Ramos 59e5044a59 refactor: move signals to status and generate events 2020-09-07 12:54:59 -04:00
Michael Bradley, Jr 60f6fd2f71 build: bump vendor/nim-stew 2020-09-04 17:16:32 -04:00
Michael Bradley, Jr 8fa2532ccb build: bump vendor/nim-serialization 2020-09-04 17:16:32 -04:00
Michael Bradley, Jr 303d50112c build: bump vendor/nimbus-build-system 2020-09-04 17:16:32 -04:00
Richard Ramos 75cb28b24d adding missing deps 2020-09-04 15:57:29 -04:00
Richard Ramos 374da83cff feat: receive wallet events and bump nim-status 2020-09-04 15:57:29 -04:00
Richard Ramos 0214b83cb6 fix: bump up dotherside and nimqml versions 2020-09-03 15:47:05 -04:00
Richard Ramos 782e89508c fix: escape html in messages 2020-09-03 15:47:05 -04:00
Jonathan Rainville c79ccaded4 update status-go version to latest containing emoji reactions and a fix 2020-08-27 16:34:35 -04:00