Zulip 服务器和 Web 应用程序。开源团队聊天可帮助团队保持高效和专注。
Go to file
Ryan Rehman 3b5ba6b2c1 message list: Change locally echoed message ids synchronously.
There is a bug and race issue that occurs when a message is selected
while we are in the process of reifying a locally echoed message,
raising the "Selected message id not in MessageList" error.
The code flow to get the exception is as follows:

* A user sends a message to the current narrow we are in.
* Before the new message event is received, we sent a message to
  the same message list which renders it with a locally echoed id.
* One of the ways of getting the exception is to already have the
  locally sent message selected, before receiving an acknowledgment
  from the server.
* Thus the Message List Data's `selected_id` now points to the new
  message id. The exception is raised on entering the `was_selected`
  if block inside `message_list_view` which tries to re-select the
  message.

Updating the `_rerender_message` code for this special case won't fix
the entire bug because, as mentioned above there are other ways of
getting the exception:

Ideally, after all our synchronous work (`echo.process_from_server`)
has completed we would expect the re-order and re-render work of the
`change_message_id` would occur first, due to the timer of the
setTimeout being set to 0.

However as evident from the race condition existing, this isn't always
the case. `change_message_id` function is responsible for 3 things:
updation, re-ordering and re-rendering.
The first one which is responsible for updating the message list's
local cache, occurs synchronously while for the latter two, they both
occur asynchronously.

Before the setTimeout which is responsible for the latter two actions,
is encountered the user might select the message by clicking or more
commonly by scrolling, which causes this message selection event to be
ahead of the setTimeout in the callback queue.
During this time frame, our race condition takes place.

And even though the message id is updated it's Message List is not
in the correct sort order, which leads to `closest_id` !== `id` in
`MessageList_select_id` being true and raising the exception.

Now, we only asynchronously call the re_render function, to guarantee
the data is always correct and UI updates should be done at the end.

Extended by tabbott to comment the setTimeout call.

Fixes #15346.
2020-07-06 15:36:33 -07:00
.circleci ci: Test upgrading PostgreSQL 10 -> 12. 2020-06-29 17:18:47 -07:00
.github github: Enable new codeql-analysis feature. 2020-06-26 16:59:28 -07:00
.tx cleanup: Delete trailing newlines. 2019-08-06 23:29:11 -07:00
analytics support: Ensure that only one form is posted at a time. 2020-07-01 16:45:38 -07:00
confirmation python: Convert more percent formatting to Python 3.6 f-strings. 2020-06-14 23:27:22 -07:00
corporate pointer: Remove pointer from UserProfile. 2020-07-03 13:08:40 +00:00
docs docs: Add missing mypy annotation. 2020-07-06 11:25:48 -07:00
frontend_tests message list: Change locally echoed message ids synchronously. 2020-07-06 15:36:33 -07:00
locale i18n: Update translation data from Transifex. 2020-07-01 17:47:24 -07:00
pgroonga migrations: Escape more pedantically in pgroonga.0003_v2_api_upgrade. 2020-06-13 21:50:37 -07:00
puppet puppet: Add an exec rule to reload the whole supervisor config. 2020-07-01 10:40:54 -07:00
requirements requirements: Upgrade Python requirements. 2020-07-03 19:47:18 -07:00
scripts install: Create zulip user only if required. 2020-07-02 14:55:04 -07:00
static message list: Change locally echoed message ids synchronously. 2020-07-06 15:36:33 -07:00
stubs pysa: Introduce sanitizers, models, and inline marking safe. 2020-06-11 12:57:49 -07:00
templates js_examples: Migrate and test get_streams example. 2020-07-01 17:23:30 -07:00
tools html_branches: Fix strict_optional errors. 2020-07-06 11:25:48 -07:00
zerver refactor: Rename convert to markdown_convert. 2020-07-06 12:39:59 -07:00
zilencer add_new_realm: Fix strict_optional errors. 2020-07-06 11:25:48 -07:00
zproject emails: Improve handling of timeouts when sending. 2020-07-03 16:52:50 -07:00
zthumbor zthumbor: Fix strict_optional errors. 2020-07-06 11:25:48 -07:00
.browserslistrc webpack: Transpile JS code with Babel. 2019-07-22 17:55:32 -07:00
.codecov.yml codecov: Change threshold to use percentage syntax. 2019-07-20 14:37:04 -07:00
.editorconfig .editorconfig: Add .scss, .hbs; drop weirder rules. 2020-04-22 15:03:08 -07:00
.eslintignore blueslip: Apply ESLint. 2019-11-01 12:13:59 -07:00
.eslintrc.json eslint: Enable comma-dangle for functions. 2020-07-03 16:55:51 -07:00
.gitattributes Revert "gitattributes: Mark yarn.lock as "binary", i.e. suppress diffs." 2019-05-20 19:31:14 -07:00
.gitignore tools: Move CI docker images files into tools/ci. 2020-06-29 16:31:43 -07:00
.gitlint lint: Allow revert commit messages in gitlint. 2018-02-13 09:21:01 -08:00
.isort.cfg requirements: Upgrade isort. 2020-06-26 22:50:01 -07:00
.mailmap mailmap: Add mailmap entry for Aman Agrawal. 2020-05-15 17:11:19 -07:00
.npmignore Add proxy notes to new README.dev.md troubleshooting section. 2016-03-29 21:54:05 -07:00
.pyre_configuration pysa: Add basic .pyre_configuration and taint.config for pysa. 2020-06-11 12:57:49 -07:00
.sonarcloud.properties tools: Configure Zulip to be scannable by SonarCloud. 2020-06-24 12:41:17 -07:00
.stylelintrc lint: Ban color names in CSS. 2019-01-22 15:33:18 -08:00
.yarnrc .yarnrc: Set ignore-scripts true. 2019-08-28 16:15:54 -07:00
babel.config.js babel: Enable loose mode. 2020-02-05 11:52:52 -08:00
CODE_OF_CONDUCT.md docs: Convert many http URLs to https. 2020-03-26 21:35:32 -07:00
CONTRIBUTING.md docs: Update most remaining references to zulipchat.com. 2020-06-08 18:10:45 -07:00
Dockerfile-postgresql base Zulip PostgreSQL Docker container on PGroonga official one 2019-12-30 10:20:25 -08:00
LICENSE docs: Bump copyright year. 2020-04-23 16:04:54 -07:00
manage.py python: Sort imports with isort. 2020-06-11 16:45:32 -07:00
mypy.ini zthumbor: Fix strict_optional errors. 2020-07-06 11:25:48 -07:00
NOTICE license: Move license application notice from LICENSE to NOTICE. 2018-10-02 12:04:44 -07:00
package.json dependencies: Upgrade JavaScript dependencies. 2020-06-07 11:06:57 -07:00
postcss.config.js webpack: Move CSS minification to optimization stage. 2019-09-02 21:58:13 -07:00
README.md docs: Update URLs to use https://zulip.com. 2020-06-08 18:10:45 -07:00
SECURITY.md docs: Create GitHub SECURITY.md file. 2020-06-25 15:23:22 -07:00
tsconfig.json tsconfig: Enable resolveJsonModule. 2020-05-26 23:33:40 -07:00
Vagrantfile vagrant: Remove uartmode1 woarkound. 2020-06-22 14:56:38 -07:00
version.py requirements: Upgrade Python requirements. 2020-07-03 19:47:18 -07:00
yarn.lock dependencies: Upgrade JavaScript dependencies. 2020-06-07 11:06:57 -07:00

Zulip overview

Zulip is a powerful, open source group chat application that combines the immediacy of real-time chat with the productivity benefits of threaded conversations. Zulip is used by open source projects, Fortune 500 companies, large standards bodies, and others who need a real-time chat system that allows users to easily process hundreds or thousands of messages a day. With over 500 contributors merging over 500 commits a month, Zulip is also the largest and fastest growing open source group chat project.

CircleCI branch Coverage Status Mypy coverage GitHub release docs Zulip chat Twitter

Getting started

Click on the appropriate link below. If nothing seems to apply, join us on the Zulip community server and tell us what's up!

You might be interested in:

You may also be interested in reading our blog or following us on twitter. Zulip is distributed under the Apache 2.0 license.