chore: Buffer first eval action to fix race condition with setup worker (#34891)

## Description
Check the issue description for the actual problem.

Solution:
To mitigate the race condition; instead of using `take` post setup
worker an `actionChannel` is used to create a queue to detect any first
eval action dispatched while the code path completes the worker setup.
This queue is then picked by and the action is processed and the
`actionChannel` is closed.

The baseline theory of the solution is to create a queue of any first
eval action dispatch throughout the lifecycle of the setup process but
act only when the setup is complete

The problem is not that evident in applications but in packages it's
highly reproducible as there are less api fetches to start eval

Fixes https://github.com/appsmithorg/appsmith/issues/34890

## Automation

/ok-to-test tags="@tag.All"

### 🔍 Cypress test results
<!-- This is an auto-generated comment: Cypress test results  -->
> [!TIP]
> 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉
> Workflow run:
<https://github.com/appsmithorg/appsmith/actions/runs/9903341349>
> Commit: 999f677e9af9c1d90201fcf124d1246ecfd79ef2
> <a
href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=9903341349&attempt=1"
target="_blank">Cypress dashboard</a>.
> Tags: `@tag.All`
> Spec:
> <hr>Fri, 12 Jul 2024 07:07:30 UTC
<!-- end of auto-generated comment: Cypress test results  -->


## Communication
Should the DevRel and Marketing teams inform users about this change?
- [ ] Yes
- [ ] No


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

- **Bug Fixes**
- Improved reliability and performance of evaluation change listener by
optimizing action handling.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
Ashit Rath 2024-07-15 22:34:27 +05:30 committed by GitHub
parent 70f8777afd
commit 81d738d1de
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -646,6 +646,7 @@ function* evalAndLintingHandler(
}
function* evaluationChangeListenerSaga(): any {
const firstEvalActionChannel = yield actionChannel(FIRST_EVAL_REDUX_ACTIONS);
// Explicitly shutdown old worker if present
yield all([call(evalWorker.shutdown), call(lintWorker.shutdown)]);
const [evalWorkerListenerChannel] = yield all([
@ -669,8 +670,9 @@ function* evaluationChangeListenerSaga(): any {
yield spawn(handleEvalWorkerRequestSaga, evalWorkerListenerChannel);
const initAction: EvaluationReduxAction<unknown> = yield take(
FIRST_EVAL_REDUX_ACTIONS,
firstEvalActionChannel,
);
firstEvalActionChannel.close();
// Wait for widget config build to complete before starting evaluation only if the current editor is not a workflow
const isCurrentEditorWorkflowType = yield select(