Frontmatter
| id | 9550 |
| title | Refactor(data): Implement Store-to-Pipeline Legacy Bridge |
| state | Closed |
| labels | airefactoringarchitecturecorefeature |
| assignees | tobiu |
| createdAt | Mar 25, 2026, 4:23 PM |
| updatedAt | Mar 25, 2026, 4:28 PM |
| githubUrl | https://github.com/neomjs/neo/issues/9550 |
| author | tobiu |
| commentsCount | 1 |
| parentIssue | 9449 |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Mar 25, 2026, 4:28 PM |
Refactor(data): Implement Store-to-Pipeline Legacy Bridge
tobiu added parent issue #9449 on Mar 25, 2026, 4:24 PM
tobiu cross-referenced by #9502 on Mar 25, 2026, 4:25 PM
tobiu assigned to @tobiu on Mar 25, 2026, 4:26 PM

tobiu
Mar 25, 2026, 4:27 PM
Input from Gemini 3.1 Pro:
✦ I have successfully implemented the Store-to-Pipeline legacy bridge.
Summary of changes:
- Reactive Legacy Bridge: Modified
beforeSetPipelineinStore.mjsto automatically create aconnection-xhrpipeline ifurlis defined without a pipeline or api.- Race Condition Prevention: Added
me.urlPipelinePromiseto handle the asynchronous gap when importing the XHR connection, ensuringload()andautoLoadawait the bridge completion.- Robust Load Flow: Enhanced
load()to handle diverse pipeline responses, correctly extracting data based onresponseRootand providing safety checks for null/undefined results.- Legacy Cleanup: Removed the broken
Neo.Xhr.promiseJsonfallback fromStore.load().The portal app's store-driven views are now back online.
Task complete. (#9550)
tobiu closed this issue on Mar 25, 2026, 4:28 PM
Goal
Implement a clean, reactive bridge in
Neo.data.Storeto automatically transition "simple" stores using theurlconfig to the newPipelinearchitecture without breaking existing applications.Context
Following the removal of the implicit legacy bridge in
Store.mjs(#9502), many existing stores that relied on theurlconfig without an explicit pipeline began failing. To maintain a lean App Worker dependency graph while preserving backward compatibility, we need a mechanism that dynamically creates a pipeline only when needed.Changes
beforeSetPipelineinStore.mjsto detect when aurlis provided without an explicitpipelineorapi. In this case, it triggers a dynamic import ofNeo.data.connection.Xhrand generates a "dummy" pipeline configuration.me.urlPipelinePromiseto handle the asynchronous gap between the dynamic import and the initialload()orautoLoadexecution.load()now awaitsurlPipelinePromiseif it exists.responseRootand nested JSON structures.undefinedornullresponses from the pipeline to prevent runtime errors.Neo.Xhr.promiseJsonfallback at the bottom of theload()method, leaving only the Node.jsfs/promisesfallback for non-browser environments.Acceptance Criteria
urlconfig (likePortal.store.Releases) function correctly via a dynamically created pipeline.autoLoadare prevented via theurlPipelinePromise.Store.load()is more robust and correctly extracts data from diverse pipeline responses.connection.Xhron-demand.