startupPlan.js 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /**
  2. * 外壳的**可注入启动计划**(票 14;规格 09 / 决策票 04 的核心裁定)。
  3. *
  4. * 规格 09 原句:「外壳的启动逻辑抽出可注入的启动计划:输入 dataSource 与配置,
  5. * 输出启动动作清单;real 与 mock 产出**同一套动作**,仅 transport 不同。」
  6. *
  7. * 为什么必须是纯函数而不是散在 `CockpitShell.vue` 里的 if/else:
  8. * · 「real 与 mock 同构启动」是一条**可断言的契约**——动作清单同构这件事,
  9. * 只有把"清单"变成纯函数的输出,脱浏览器的逻辑闸门才能逐项对齐(规格 09 的主接缝);
  10. * · 此前 real 分支只加载配置、什么都不取(旧壳的 `if (dataSource === MOCK)` 门),
  11. * 那正是规格 09 的 Problem Statement 第 1 条「real 模式是空壳」——本函数落地后,
  12. * 外壳按清单执行,mock 与 real 走**同一条**执行路径,差别只剩 `registerMocks` 一项。
  13. *
  14. * 本文件是纯函数:不 import service、不碰 Vue、不发请求(t18 H5 同一条纪律)。
  15. */
  16. /** 启动动作词表(外壳据此执行;词是"做什么",不含"怎么做")。 */
  17. export const STARTUP_ACTION = {
  18. REGISTER_MOCKS: 'register-mocks',
  19. LOAD_MAP_SUMMARY: 'load-map-summary',
  20. LOAD_SHARED_SECTIONS: 'load-shared-sections',
  21. LOAD_INFRASTRUCTURE_PANELS: 'load-infrastructure-panels',
  22. LOAD_MONITORING_PANELS: 'load-monitoring-panels',
  23. LOAD_EVENT_PANELS: 'load-event-panels',
  24. LOAD_OVERVIEW_PANELS: 'load-overview-panels',
  25. START_WEBSOCKET: 'start-websocket',
  26. START_FRESHNESS: 'start-freshness',
  27. }
  28. /**
  29. * 配置 + 数据源 → 启动动作清单(纯函数)。
  30. *
  31. * 契约(规格 09 的 Implementation Decisions 逐条对应):
  32. * · **完全同构**:real 与 mock 的动作清单**完全相同**(同序同项);
  33. * · **real 不注册契约化 mock**:`register-mocks` 只出现在 mock 分支;
  34. * · **启动顺序保持「先把筛选交给地图,再取第 1 页」的既有纪律**——清单顺序即执行顺序,
  35. * `load-map-summary`(装载器 setup,含筛选)排在 `load-shared-sections`(取第 1 页)之前;
  36. * · **WS 只定生命周期**、新鲜度 tick 全套(地图 + 当前模式面板)都归运行期,
  37. * 清单只表达"要启动",不表达周期内做什么。
  38. *
  39. * 配置缺失或数据源认不出时按 mock 处理(与 `cockpitConfig` 的「非法 dataSource 退回 mock」
  40. * 同一条兜底;调用方(外壳)只会在配置落地后调它)。
  41. *
  42. * @param {object} [config] 归一化后的驾驶舱配置(至少 `dataSource`)
  43. * @returns {{mode: string, actions: string[], registerMocks: boolean}}
  44. */
  45. export function planCockpitStartup(config = {}) {
  46. const mode = config && config.dataSource === 'real' ? 'real' : 'mock'
  47. const registerMocks = mode !== 'real'
  48. const actions = [
  49. ...(registerMocks ? [STARTUP_ACTION.REGISTER_MOCKS] : []),
  50. STARTUP_ACTION.LOAD_MAP_SUMMARY,
  51. STARTUP_ACTION.LOAD_SHARED_SECTIONS,
  52. STARTUP_ACTION.LOAD_INFRASTRUCTURE_PANELS,
  53. STARTUP_ACTION.LOAD_MONITORING_PANELS,
  54. STARTUP_ACTION.LOAD_EVENT_PANELS,
  55. STARTUP_ACTION.LOAD_OVERVIEW_PANELS,
  56. STARTUP_ACTION.START_WEBSOCKET,
  57. STARTUP_ACTION.START_FRESHNESS,
  58. ]
  59. return { mode, actions, registerMocks }
  60. }