@yinuo-ngm/server 1.0.15 → 1.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/app.js +3 -15
- package/lib/common/editor.js +2 -2
- package/lib/env.d.ts +1 -0
- package/lib/env.js +1 -0
- package/lib/plugins/error-handler.plugin.d.ts +2 -2
- package/lib/plugins/error-handler.plugin.js +97 -88
- package/lib/plugins/ws/topics/nginx.ws.js +2 -1
- package/lib/plugins/ws/topics/svn.ws.d.ts +2 -1
- package/lib/plugins/ws/topics/svn.ws.js +3 -2
- package/lib/plugins/ws/topics/syslog.ws.d.ts +1 -1
- package/lib/plugins/ws/topics/task.ws.d.ts +2 -1
- package/lib/plugins/ws/topics/task.ws.js +2 -1
- package/lib/plugins/ws/ws.context.d.ts +1 -1
- package/lib/plugins/ws/ws.plugin.js +4 -3
- package/lib/plugins/ws/ws.router.d.ts +2 -2
- package/lib/plugins/ws/ws.router.js +8 -7
- package/lib/routes/api-client/collection.routes.js +8 -6
- package/lib/routes/api-client/env.routes.js +4 -3
- package/lib/routes/api-client/history.routes.js +3 -2
- package/lib/routes/api-client/hub-token.routes.js +32 -10
- package/lib/routes/api-client/request.routes.js +7 -6
- package/lib/routes/api-client/send.routes.js +3 -2
- package/lib/routes/config.routes.js +5 -5
- package/lib/routes/hub.routes.js +10 -10
- package/lib/routes/index.js +2 -0
- package/lib/routes/nginx/nginx-lifecycle.routes.js +4 -0
- package/lib/routes/nginx/nginx-route.context.js +23 -7
- package/lib/routes/nginx/nginx-server.routes.js +158 -6
- package/lib/routes/node-version.routes.d.ts +2 -0
- package/lib/routes/node-version.routes.js +56 -0
- package/lib/routes/project.routes.js +14 -9
- package/lib/routes/rss.routes.js +3 -3
- package/lib/routes/sprite-browse.routes.js +21 -6
- package/lib/routes/sprite.routes.js +18 -12
- package/lib/routes/static-files.routes.js +21 -5
- package/lib/routes/svn.routes.js +5 -3
- package/lib/routes/system.routes.js +20 -1
- package/lib/routes/task.routes.js +10 -3
- package/package.json +13 -6
- package/www/3rdpartylicenses.txt +66 -118
- package/www/browser/chunk-2L7NUOMX.js +2 -0
- package/www/browser/chunk-2NZJ7CN2.js +20 -0
- package/www/browser/chunk-3CM4SKDO.js +15 -0
- package/www/browser/chunk-3I7BQCXS.js +1 -0
- package/www/browser/chunk-3M56F2S2.js +1 -0
- package/www/browser/chunk-3OHBKMAA.js +1 -0
- package/www/browser/chunk-3XNNQFWR.js +1 -0
- package/www/browser/chunk-4BRW6LCZ.js +4 -0
- package/www/browser/chunk-4LBSLURA.js +1 -0
- package/www/browser/chunk-4X42HB6N.js +2 -0
- package/www/browser/chunk-5DYX4DUX.js +11 -0
- package/www/browser/chunk-6SYVDN5L.js +1 -0
- package/www/browser/chunk-6YYNHZ2A.js +1 -0
- package/www/browser/chunk-75W3GVSO.js +1 -0
- package/www/browser/chunk-7U44RF5F.js +63 -0
- package/www/browser/chunk-AELTP6YN.js +1 -0
- package/www/browser/chunk-AMXRL4GR.js +1 -0
- package/www/browser/chunk-AV2ZODEH.js +1 -0
- package/www/browser/chunk-AZ6SIMYH.js +1 -0
- package/www/browser/chunk-B3C35ET3.js +2 -0
- package/www/browser/chunk-BTQIUVTQ.js +1 -0
- package/www/browser/chunk-CN5J4WNO.js +1 -0
- package/www/browser/chunk-D2ODDESN.js +1 -0
- package/www/browser/chunk-DE6E23ET.js +1 -0
- package/www/browser/chunk-DIJPUYIA.js +1 -0
- package/www/browser/chunk-DLGJD6YU.js +4 -0
- package/www/browser/chunk-EEDA5U4V.js +1 -0
- package/www/browser/chunk-FK6Z4HLL.js +1 -0
- package/www/browser/chunk-FL6GDGHW.js +1 -0
- package/www/browser/chunk-FXCG34QS.js +1 -0
- package/www/browser/chunk-H2USFIYR.js +1 -0
- package/www/browser/chunk-H5HGMOE6.js +1 -0
- package/www/browser/chunk-HB3HECPD.js +1 -0
- package/www/browser/chunk-HDNG236Q.js +1 -0
- package/www/browser/chunk-HFZLJHYR.js +1 -0
- package/www/browser/chunk-HJTXXSMC.js +1 -0
- package/www/browser/chunk-HUMCWAKJ.js +3 -0
- package/www/browser/chunk-IKB3EQCP.js +2 -0
- package/www/browser/chunk-K7PESFPY.js +1 -0
- package/www/browser/chunk-KRYMOHYF.js +2 -0
- package/www/browser/chunk-M4QRBV3K.js +1 -0
- package/www/browser/chunk-N2PELLMM.js +30 -0
- package/www/browser/chunk-ONXBYGIG.js +1 -0
- package/www/browser/chunk-OSBDR36P.js +1 -0
- package/www/browser/chunk-OZCK4XVV.js +1 -0
- package/www/browser/chunk-QJP5F735.js +1 -0
- package/www/browser/chunk-RGOYDY7H.js +1 -0
- package/www/browser/chunk-UJKK4A7Y.js +1 -0
- package/www/browser/chunk-WD2EKZQC.js +1 -0
- package/www/browser/chunk-WUA5JFDD.js +1 -0
- package/www/browser/chunk-XLFHB7RS.js +3 -0
- package/www/browser/chunk-YNW4HEJO.js +37 -0
- package/www/browser/chunk-ZTDLWBW5.js +1 -0
- package/www/browser/dark.css +1 -30433
- package/www/browser/default.css +1 -30149
- package/www/browser/index.html +3 -3
- package/www/browser/main-N64WJCHX.js +34 -0
- package/www/browser/scripts-U25HCVEI.js +6 -0
- package/www/browser/styles-ROAHD7MY.css +1 -0
- package/www/browser/add-widget-drawer.component.css.map +0 -7
- package/www/browser/advanced-editor.component.css.map +0 -7
- package/www/browser/api-client.component.css.map +0 -7
- package/www/browser/api-history-drawer.component.css.map +0 -7
- package/www/browser/app.css.map +0 -7
- package/www/browser/attachment-viewer.component.css.map +0 -7
- package/www/browser/auth-editor.component.css.map +0 -7
- package/www/browser/body-editor.component.css.map +0 -7
- package/www/browser/chunk-2YSUXBGC.js +0 -627
- package/www/browser/chunk-2YSUXBGC.js.map +0 -1
- package/www/browser/chunk-3G2GEOPV.js +0 -456
- package/www/browser/chunk-3G2GEOPV.js.map +0 -1
- package/www/browser/chunk-3L72DF3R.js +0 -1683
- package/www/browser/chunk-3L72DF3R.js.map +0 -1
- package/www/browser/chunk-3MCIETCQ.js +0 -8279
- package/www/browser/chunk-3MCIETCQ.js.map +0 -1
- package/www/browser/chunk-665WC4RU.js +0 -5383
- package/www/browser/chunk-665WC4RU.js.map +0 -1
- package/www/browser/chunk-6QMSEZPT.js +0 -10044
- package/www/browser/chunk-6QMSEZPT.js.map +0 -1
- package/www/browser/chunk-6TBQERYX.js +0 -280
- package/www/browser/chunk-6TBQERYX.js.map +0 -1
- package/www/browser/chunk-6UW4MRJZ.js +0 -43
- package/www/browser/chunk-6UW4MRJZ.js.map +0 -7
- package/www/browser/chunk-6XUMIL3W.js +0 -5495
- package/www/browser/chunk-6XUMIL3W.js.map +0 -1
- package/www/browser/chunk-724YOJI3.js +0 -903
- package/www/browser/chunk-724YOJI3.js.map +0 -1
- package/www/browser/chunk-766T7YES.js +0 -437
- package/www/browser/chunk-766T7YES.js.map +0 -1
- package/www/browser/chunk-7FC7DN65.js +0 -728
- package/www/browser/chunk-7FC7DN65.js.map +0 -1
- package/www/browser/chunk-APGQRYWX.js +0 -156
- package/www/browser/chunk-APGQRYWX.js.map +0 -7
- package/www/browser/chunk-AQHSGTHS.js +0 -1960
- package/www/browser/chunk-AQHSGTHS.js.map +0 -1
- package/www/browser/chunk-CTOEAJQK.js +0 -40
- package/www/browser/chunk-CTOEAJQK.js.map +0 -7
- package/www/browser/chunk-DEGQJKKZ.js +0 -409
- package/www/browser/chunk-DEGQJKKZ.js.map +0 -1
- package/www/browser/chunk-DIJX2663.js +0 -1166
- package/www/browser/chunk-DIJX2663.js.map +0 -1
- package/www/browser/chunk-E4XD4GLT.js +0 -427
- package/www/browser/chunk-E4XD4GLT.js.map +0 -1
- package/www/browser/chunk-EQOY6A3M.js +0 -212
- package/www/browser/chunk-EQOY6A3M.js.map +0 -1
- package/www/browser/chunk-ETTBRXVA.js +0 -2643
- package/www/browser/chunk-ETTBRXVA.js.map +0 -1
- package/www/browser/chunk-FLSUSPBD.js +0 -5569
- package/www/browser/chunk-FLSUSPBD.js.map +0 -1
- package/www/browser/chunk-FZNHBEAZ.js +0 -102
- package/www/browser/chunk-FZNHBEAZ.js.map +0 -1
- package/www/browser/chunk-GJC7CZIJ.js +0 -361
- package/www/browser/chunk-GJC7CZIJ.js.map +0 -7
- package/www/browser/chunk-GMCNMOTD.js +0 -844
- package/www/browser/chunk-GMCNMOTD.js.map +0 -7
- package/www/browser/chunk-H43HGCRW.js +0 -198
- package/www/browser/chunk-H43HGCRW.js.map +0 -7
- package/www/browser/chunk-J447GBHM.js +0 -160
- package/www/browser/chunk-J447GBHM.js.map +0 -1
- package/www/browser/chunk-JN3VOWP7.js +0 -384
- package/www/browser/chunk-JN3VOWP7.js.map +0 -1
- package/www/browser/chunk-KSHAGY2M.js +0 -399
- package/www/browser/chunk-KSHAGY2M.js.map +0 -7
- package/www/browser/chunk-KV72AKOD.js +0 -59
- package/www/browser/chunk-KV72AKOD.js.map +0 -7
- package/www/browser/chunk-LAVMY2SJ.js +0 -26
- package/www/browser/chunk-LAVMY2SJ.js.map +0 -7
- package/www/browser/chunk-LLRVGHG5.js +0 -73
- package/www/browser/chunk-LLRVGHG5.js.map +0 -7
- package/www/browser/chunk-LPME4AJ3.js +0 -196
- package/www/browser/chunk-LPME4AJ3.js.map +0 -1
- package/www/browser/chunk-LVPSURVU.js +0 -4615
- package/www/browser/chunk-LVPSURVU.js.map +0 -1
- package/www/browser/chunk-MMPO7QLO.js +0 -4146
- package/www/browser/chunk-MMPO7QLO.js.map +0 -7
- package/www/browser/chunk-O7LB6VFM.js +0 -1953
- package/www/browser/chunk-O7LB6VFM.js.map +0 -1
- package/www/browser/chunk-P5CWA4FO.js +0 -685
- package/www/browser/chunk-P5CWA4FO.js.map +0 -1
- package/www/browser/chunk-RBWIWNTL.js +0 -203
- package/www/browser/chunk-RBWIWNTL.js.map +0 -7
- package/www/browser/chunk-RUXJCM3V.js +0 -26199
- package/www/browser/chunk-RUXJCM3V.js.map +0 -1
- package/www/browser/chunk-S77VVYUZ.js +0 -168
- package/www/browser/chunk-S77VVYUZ.js.map +0 -1
- package/www/browser/chunk-SCXPYFOB.js +0 -4316
- package/www/browser/chunk-SCXPYFOB.js.map +0 -1
- package/www/browser/chunk-SS73S33S.js +0 -471
- package/www/browser/chunk-SS73S33S.js.map +0 -7
- package/www/browser/chunk-T6UAOWNP.js +0 -600
- package/www/browser/chunk-T6UAOWNP.js.map +0 -1
- package/www/browser/chunk-TEW4MY4J.js +0 -148
- package/www/browser/chunk-TEW4MY4J.js.map +0 -7
- package/www/browser/chunk-TVORF3SF.js +0 -82
- package/www/browser/chunk-TVORF3SF.js.map +0 -7
- package/www/browser/chunk-UAN42EUZ.js +0 -2147
- package/www/browser/chunk-UAN42EUZ.js.map +0 -1
- package/www/browser/chunk-ULOHDK7Y.js +0 -1
- package/www/browser/chunk-ULOHDK7Y.js.map +0 -7
- package/www/browser/chunk-UYJ3FVRV.js +0 -3978
- package/www/browser/chunk-UYJ3FVRV.js.map +0 -1
- package/www/browser/chunk-VXHZMSDM.js +0 -5509
- package/www/browser/chunk-VXHZMSDM.js.map +0 -1
- package/www/browser/chunk-VYNQPZQO.js +0 -281
- package/www/browser/chunk-VYNQPZQO.js.map +0 -1
- package/www/browser/chunk-W3J23PZI.js +0 -9213
- package/www/browser/chunk-W3J23PZI.js.map +0 -1
- package/www/browser/chunk-W5HGHCQT.js +0 -1642
- package/www/browser/chunk-W5HGHCQT.js.map +0 -7
- package/www/browser/chunk-XF5H7E4L.js +0 -4723
- package/www/browser/chunk-XF5H7E4L.js.map +0 -1
- package/www/browser/chunk-XNFNEBMY.js +0 -398
- package/www/browser/chunk-XNFNEBMY.js.map +0 -7
- package/www/browser/chunk-XQY5SPGI.js +0 -30811
- package/www/browser/chunk-XQY5SPGI.js.map +0 -1
- package/www/browser/chunk-Y7JBZHNK.js +0 -514
- package/www/browser/chunk-Y7JBZHNK.js.map +0 -1
- package/www/browser/chunk-YWHRP4X3.js +0 -406
- package/www/browser/chunk-YWHRP4X3.js.map +0 -1
- package/www/browser/chunk-Z7FJIV62.js +0 -95
- package/www/browser/chunk-Z7FJIV62.js.map +0 -7
- package/www/browser/chunk-ZBZHXS46.js +0 -1674
- package/www/browser/chunk-ZBZHXS46.js.map +0 -1
- package/www/browser/chunk-ZZA5NVAI.js +0 -735
- package/www/browser/chunk-ZZA5NVAI.js.map +0 -1
- package/www/browser/collection-modal.component.css.map +0 -7
- package/www/browser/collection-tree-item.component.css.map +0 -7
- package/www/browser/collection-tree.component.css.map +0 -7
- package/www/browser/config-change-bar-component.css.map +0 -7
- package/www/browser/config-item-component.css.map +0 -7
- package/www/browser/config-nav-component.css.map +0 -7
- package/www/browser/config-section-component.css.map +0 -7
- package/www/browser/create-summary-aside.component.css.map +0 -7
- package/www/browser/curl-actions.component.css.map +0 -7
- package/www/browser/dark.css.map +0 -7
- package/www/browser/dashboard-canvas.component.css.map +0 -7
- package/www/browser/dashboard.component.css.map +0 -7
- package/www/browser/default.css.map +0 -7
- package/www/browser/detail-item-card.component.css.map +0 -7
- package/www/browser/ellipsis-text.component.css.map +0 -7
- package/www/browser/env-modal.component.css.map +0 -7
- package/www/browser/env-picker.component.css.map +0 -7
- package/www/browser/feedback.component.css.map +0 -7
- package/www/browser/fs-explorer.component.css.map +0 -7
- package/www/browser/git-import-modal.component.css.map +0 -7
- package/www/browser/hub-v2-personal-token-modal.component.css.map +0 -7
- package/www/browser/issue-action-area.component.css.map +0 -7
- package/www/browser/issue-add-participants-dialog.component.css.map +0 -7
- package/www/browser/issue-assign-dialog.component.css.map +0 -7
- package/www/browser/issue-attachment-area.component.css.map +0 -7
- package/www/browser/issue-base-info-area.component.css.map +0 -7
- package/www/browser/issue-branches.component.css.map +0 -7
- package/www/browser/issue-close-dialog.component.css.map +0 -7
- package/www/browser/issue-collaborators-panel.component.css.map +0 -7
- package/www/browser/issue-comment-editor.component.css.map +0 -7
- package/www/browser/issue-create-branch-dialog.component.css.map +0 -7
- package/www/browser/issue-description-area.component.css.map +0 -7
- package/www/browser/issue-detail.component.css.map +0 -7
- package/www/browser/issue-resolve-dialog.component.css.map +0 -7
- package/www/browser/issue-start-own-branch-dialog.component.css.map +0 -7
- package/www/browser/issues-list-table.component.css.map +0 -7
- package/www/browser/issues.component.css.map +0 -7
- package/www/browser/kill-port-widget.component.css.map +0 -7
- package/www/browser/kv-table.component.css.map +0 -7
- package/www/browser/layout-footer.component.css.map +0 -7
- package/www/browser/layout-header.component.css.map +0 -7
- package/www/browser/layout-menu.component.css.map +0 -7
- package/www/browser/layout-project-nav.component.css.map +0 -7
- package/www/browser/layout-sidebar.component.css.map +0 -7
- package/www/browser/layout.component.css.map +0 -7
- package/www/browser/less-viewport-component.css.map +0 -7
- package/www/browser/main.js +0 -1872
- package/www/browser/main.js.map +0 -1
- package/www/browser/markdown-viewer.component.css.map +0 -7
- package/www/browser/news-feed-widget.component.css.map +0 -7
- package/www/browser/ng-devtool.component.css.map +0 -7
- package/www/browser/nginx-config-editor.component.css.map +0 -7
- package/www/browser/nginx-log-viewer.component.css.map +0 -7
- package/www/browser/nginx-secondary-logs-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-perf-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-settings-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-ssl-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-test-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-traffic-tab.component.css.map +0 -7
- package/www/browser/nginx-secondary-upstream-tab.component.css.map +0 -7
- package/www/browser/nginx-section-card.component.css.map +0 -7
- package/www/browser/nginx-server-drawer.component.css.map +0 -7
- package/www/browser/nginx-server-list.component.css.map +0 -7
- package/www/browser/nginx-stat-card.component.css.map +0 -7
- package/www/browser/nginx.component.css.map +0 -7
- package/www/browser/page-layout.component.css.map +0 -7
- package/www/browser/pick-workspace-modal.component.css.map +0 -7
- package/www/browser/polyfills.js +0 -26584
- package/www/browser/polyfills.js.map +0 -7
- package/www/browser/project-conf.component.css.map +0 -7
- package/www/browser/project-create-modal.component.css.map +0 -7
- package/www/browser/project-create.component.css.map +0 -7
- package/www/browser/project-deps.component.css.map +0 -7
- package/www/browser/project-edit-modal.component.css.map +0 -7
- package/www/browser/project-import.component.css.map +0 -7
- package/www/browser/project-item-popover.component.css.map +0 -7
- package/www/browser/project-item.component.css.map +0 -7
- package/www/browser/project-list.component.css.map +0 -7
- package/www/browser/projects.component.css.map +0 -7
- package/www/browser/quick-task-widget.component.css.map +0 -7
- package/www/browser/rd-action-area.component.css.map +0 -7
- package/www/browser/rd-advance-stage-dialog.component.css.map +0 -7
- package/www/browser/rd-block-dialog.component.css.map +0 -7
- package/www/browser/rd-create-dialog.component.css.map +0 -7
- package/www/browser/rd-detail.component.css.map +0 -7
- package/www/browser/rd-item-card.component.css.map +0 -7
- package/www/browser/rd-list-board.component.css.map +0 -7
- package/www/browser/rd-list-table.component.css.map +0 -7
- package/www/browser/rd.component.css.map +0 -7
- package/www/browser/request-collections.component.css.map +0 -7
- package/www/browser/request-editor.component.css.map +0 -7
- package/www/browser/request-list-item.component.css.map +0 -7
- package/www/browser/request-list.component.css.map +0 -7
- package/www/browser/request-tabs-bar.component.css.map +0 -7
- package/www/browser/request-tabs.component.css.map +0 -7
- package/www/browser/request-urlbar.component.css.map +0 -7
- package/www/browser/response-viewer.component.css.map +0 -7
- package/www/browser/scripts.js +0 -245
- package/www/browser/scripts.js.map +0 -7
- package/www/browser/setting.component.css.map +0 -7
- package/www/browser/sprite-conf-modal.component.css.map +0 -7
- package/www/browser/sprite-icons-panel-component.css.map +0 -7
- package/www/browser/sprite-images-panel-component.css.map +0 -7
- package/www/browser/sprite-result-tabs.component.css.map +0 -7
- package/www/browser/sprite-viewport-component.css.map +0 -7
- package/www/browser/sprite.component.css.map +0 -7
- package/www/browser/step-advance.component.css.map +0 -7
- package/www/browser/step-basic.component.css.map +0 -7
- package/www/browser/step-config.component.css.map +0 -7
- package/www/browser/step-features.component.css.map +0 -7
- package/www/browser/step-preset.component.css.map +0 -7
- package/www/browser/step-summary-aside.component.css.map +0 -7
- package/www/browser/styles.css +0 -258
- package/www/browser/styles.css.map +0 -7
- package/www/browser/system-log.component.css.map +0 -7
- package/www/browser/task-actions.component.css.map +0 -7
- package/www/browser/task-console.component.css.map +0 -7
- package/www/browser/task-header.component.css.map +0 -7
- package/www/browser/task-list.component.css.map +0 -7
- package/www/browser/tasks.component.css.map +0 -7
- package/www/browser/terminal-view.component.css.map +0 -7
- package/www/browser/welcome-widget.component.css.map +0 -7
- package/www/browser/widget-base.component.css.map +0 -7
- package/www/browser/widget-host.component.css.map +0 -7
|
@@ -1,471 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
TaskRuntimeStore,
|
|
3
|
-
TasksApiService
|
|
4
|
-
} from "./chunk-RBWIWNTL.js";
|
|
5
|
-
import {
|
|
6
|
-
WsClientService
|
|
7
|
-
} from "./chunk-APGQRYWX.js";
|
|
8
|
-
import {
|
|
9
|
-
Injectable,
|
|
10
|
-
Subject,
|
|
11
|
-
__decorate,
|
|
12
|
-
__spreadProps,
|
|
13
|
-
__spreadValues,
|
|
14
|
-
computed,
|
|
15
|
-
effect,
|
|
16
|
-
firstValueFrom,
|
|
17
|
-
inject,
|
|
18
|
-
signal
|
|
19
|
-
} from "./chunk-XQY5SPGI.js";
|
|
20
|
-
|
|
21
|
-
// src/app/pages/tasks/services/task-stream.service.ts
|
|
22
|
-
var TaskStreamService = class TaskStreamService2 {
|
|
23
|
-
ws;
|
|
24
|
-
runtimeStore;
|
|
25
|
-
outputByTaskId = /* @__PURE__ */ new Map();
|
|
26
|
-
// taskId -> output stream
|
|
27
|
-
event$ = new Subject();
|
|
28
|
-
subs = /* @__PURE__ */ new Map();
|
|
29
|
-
// taskId -> tail
|
|
30
|
-
lastWsState = "idle";
|
|
31
|
-
constructor(ws, runtimeStore) {
|
|
32
|
-
this.ws = ws;
|
|
33
|
-
this.runtimeStore = runtimeStore;
|
|
34
|
-
this.ws.messages().subscribe((msg) => this.onMessage(msg));
|
|
35
|
-
this.ws.stateChanges().subscribe((s) => {
|
|
36
|
-
if (s === "open" && this.lastWsState !== "open") {
|
|
37
|
-
this.replaySubs();
|
|
38
|
-
}
|
|
39
|
-
this.lastWsState = s;
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
ensureConnected() {
|
|
43
|
-
this.ws.connect();
|
|
44
|
-
}
|
|
45
|
-
subscribeTask(taskId, tail = 200) {
|
|
46
|
-
const id = taskId.trim();
|
|
47
|
-
if (!id)
|
|
48
|
-
return;
|
|
49
|
-
const t = Math.max(0, Math.min(5e3, tail | 0));
|
|
50
|
-
if (this.subs.get(id) === t)
|
|
51
|
-
return;
|
|
52
|
-
this.subs.set(id, t);
|
|
53
|
-
if (this.ws.isOpen()) {
|
|
54
|
-
this.ws.send({ op: "sub", topic: "task", taskId: id, tail: t });
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
unsubscribeTask(taskId) {
|
|
58
|
-
const id = taskId.trim();
|
|
59
|
-
if (!this.subs.has(id))
|
|
60
|
-
return;
|
|
61
|
-
this.subs.delete(id);
|
|
62
|
-
if (this.ws.isOpen()) {
|
|
63
|
-
this.ws.send({ op: "unsub", topic: "task", taskId: id });
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
resize(taskId, cols, rows) {
|
|
67
|
-
const id = String(taskId ?? "").trim();
|
|
68
|
-
if (!id)
|
|
69
|
-
return;
|
|
70
|
-
if (!this.ws.isOpen())
|
|
71
|
-
return;
|
|
72
|
-
this.ws.send({ op: "resize", topic: "task", taskId: id, cols, rows });
|
|
73
|
-
}
|
|
74
|
-
output$(taskId) {
|
|
75
|
-
return this.ensureOutput(taskId).asObservable();
|
|
76
|
-
}
|
|
77
|
-
events$() {
|
|
78
|
-
return this.event$.asObservable();
|
|
79
|
-
}
|
|
80
|
-
status$(runId) {
|
|
81
|
-
return this.runtimeStore.status$(runId);
|
|
82
|
-
}
|
|
83
|
-
replaySubs() {
|
|
84
|
-
for (const [taskId, tail] of this.subs.entries()) {
|
|
85
|
-
this.ws.send({ op: "sub", topic: "task", taskId, tail });
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
onMessage(msg) {
|
|
89
|
-
const op = msg?.op;
|
|
90
|
-
if (op === "task.output") {
|
|
91
|
-
const payload = msg.payload;
|
|
92
|
-
const taskId = String(payload.taskId ?? "").trim();
|
|
93
|
-
if (!taskId)
|
|
94
|
-
return;
|
|
95
|
-
this.ensureOutput(taskId).next(msg);
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
if (op === "task.event") {
|
|
99
|
-
const payload = msg.payload;
|
|
100
|
-
const type = msg.type;
|
|
101
|
-
const taskId = String(payload.taskId ?? "").trim();
|
|
102
|
-
if (!taskId)
|
|
103
|
-
return;
|
|
104
|
-
this.event$.next(msg);
|
|
105
|
-
const nextRt = this.applyEventToRuntime(type, payload);
|
|
106
|
-
if (nextRt) {
|
|
107
|
-
this.runtimeStore.setRuntime(nextRt);
|
|
108
|
-
}
|
|
109
|
-
if (type === "exited" || type === "failed") {
|
|
110
|
-
setTimeout(() => this.outputByTaskId.delete(taskId), 5 * 60 * 1e3);
|
|
111
|
-
}
|
|
112
|
-
if (type === "failed") {
|
|
113
|
-
const failePayload = payload;
|
|
114
|
-
const errText = `[failed] ${failePayload?.error ?? ""}`.trim();
|
|
115
|
-
const outputPayload = {
|
|
116
|
-
runId: failePayload.runId,
|
|
117
|
-
taskId,
|
|
118
|
-
stream: "stderr",
|
|
119
|
-
text: errText + "\n"
|
|
120
|
-
};
|
|
121
|
-
this.ensureOutput(taskId).next({ op: "task.output", payload: outputPayload, ts: msg.ts });
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
ensureOutput(taskId) {
|
|
126
|
-
const id = String(taskId ?? "").trim();
|
|
127
|
-
if (!this.outputByTaskId.has(id))
|
|
128
|
-
this.outputByTaskId.set(id, new Subject());
|
|
129
|
-
return this.outputByTaskId.get(id);
|
|
130
|
-
}
|
|
131
|
-
applyEventToRuntime(type, payload) {
|
|
132
|
-
const taskId = String(payload?.taskId ?? "").trim();
|
|
133
|
-
const runId = String(payload?.runId ?? "").trim();
|
|
134
|
-
if (!taskId || !runId)
|
|
135
|
-
return null;
|
|
136
|
-
const prev = this.runtimeStore.runtimeSignal(taskId)();
|
|
137
|
-
const base = prev && prev.runId === runId ? __spreadValues({}, prev) : {
|
|
138
|
-
taskId,
|
|
139
|
-
runId,
|
|
140
|
-
projectId: String(payload?.projectId ?? prev?.projectId ?? "").trim(),
|
|
141
|
-
status: "idle"
|
|
142
|
-
};
|
|
143
|
-
switch (type) {
|
|
144
|
-
case "snapshot":
|
|
145
|
-
const snapPayload = payload;
|
|
146
|
-
base.projectId = String(snapPayload?.projectId ?? base.projectId ?? "").trim();
|
|
147
|
-
base.status = snapPayload.status;
|
|
148
|
-
base.startedAt = snapPayload.startedAt;
|
|
149
|
-
base.stoppedAt = snapPayload.stoppedAt;
|
|
150
|
-
base.pid = snapPayload.pid;
|
|
151
|
-
base.exitCode = snapPayload.exitCode;
|
|
152
|
-
base.signal = snapPayload.signal;
|
|
153
|
-
return base;
|
|
154
|
-
case "started":
|
|
155
|
-
base.projectId = String(payload?.projectId ?? base.projectId ?? "").trim();
|
|
156
|
-
base.status = "running";
|
|
157
|
-
base.pid = payload?.pid ?? base.pid;
|
|
158
|
-
base.startedAt = payload?.startedAt ?? base.startedAt ?? Date.now();
|
|
159
|
-
base.stoppedAt = void 0;
|
|
160
|
-
base.exitCode = void 0;
|
|
161
|
-
base.signal = void 0;
|
|
162
|
-
return base;
|
|
163
|
-
case "stopRequested":
|
|
164
|
-
base.status = "stopping";
|
|
165
|
-
return base;
|
|
166
|
-
case "exited":
|
|
167
|
-
base.status = "stopped";
|
|
168
|
-
base.exitCode = payload?.exitCode ?? null;
|
|
169
|
-
base.signal = payload?.signal ?? null;
|
|
170
|
-
base.stoppedAt = payload?.stoppedAt ?? Date.now();
|
|
171
|
-
return base;
|
|
172
|
-
case "failed":
|
|
173
|
-
base.status = "failed";
|
|
174
|
-
base.stoppedAt = base.stoppedAt ?? Date.now();
|
|
175
|
-
base.exitCode = base.exitCode ?? null;
|
|
176
|
-
base.signal = base.signal ?? null;
|
|
177
|
-
return base;
|
|
178
|
-
default:
|
|
179
|
-
return null;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
static ctorParameters = () => [
|
|
183
|
-
{ type: WsClientService },
|
|
184
|
-
{ type: TaskRuntimeStore }
|
|
185
|
-
];
|
|
186
|
-
};
|
|
187
|
-
TaskStreamService = __decorate([
|
|
188
|
-
Injectable({ providedIn: "root" })
|
|
189
|
-
], TaskStreamService);
|
|
190
|
-
|
|
191
|
-
// src/app/pages/tasks/services/task-catalog.service.ts
|
|
192
|
-
var TaskCatalogService = class TaskCatalogService2 {
|
|
193
|
-
api = inject(TasksApiService);
|
|
194
|
-
runtimeStore = inject(TaskRuntimeStore);
|
|
195
|
-
state = signal({
|
|
196
|
-
rowsByProject: {},
|
|
197
|
-
loadingByProject: {},
|
|
198
|
-
loadedAtByProject: {}
|
|
199
|
-
});
|
|
200
|
-
/** 某项目任务 rows(spec + runtime快照,可选),不包含 ui 运行态 */
|
|
201
|
-
rowsOf(projectId) {
|
|
202
|
-
const pid = (projectId ?? "").trim();
|
|
203
|
-
return computed(() => this.state().rowsByProject[pid] ?? []);
|
|
204
|
-
}
|
|
205
|
-
/** 是否正在加载中 */
|
|
206
|
-
isLoading(projectId) {
|
|
207
|
-
const pid = (projectId ?? "").trim();
|
|
208
|
-
return computed(() => !!this.state().loadingByProject[pid]);
|
|
209
|
-
}
|
|
210
|
-
/** 是否已缓存:以 loadedAt 为准(0 tasks 也算 loaded) */
|
|
211
|
-
isLoaded(projectId) {
|
|
212
|
-
const pid = (projectId ?? "").trim();
|
|
213
|
-
return computed(() => this.state().loadedAtByProject[pid] != null);
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* 主入口:确保该项目 tasks 已加载
|
|
217
|
-
* 使用 getViews(list) 读取,不做 refresh(避免副作用)
|
|
218
|
-
*/
|
|
219
|
-
async ensureLoaded(projectId, opts) {
|
|
220
|
-
const pid = (projectId ?? "").trim();
|
|
221
|
-
if (!pid)
|
|
222
|
-
return;
|
|
223
|
-
const s = this.state();
|
|
224
|
-
const loaded = s.loadedAtByProject[pid] != null;
|
|
225
|
-
const loading = !!s.loadingByProject[pid];
|
|
226
|
-
if (!opts?.force && (loaded || loading))
|
|
227
|
-
return;
|
|
228
|
-
this.state.update((st) => __spreadProps(__spreadValues({}, st), {
|
|
229
|
-
loadingByProject: __spreadProps(__spreadValues({}, st.loadingByProject), { [pid]: true })
|
|
230
|
-
}));
|
|
231
|
-
try {
|
|
232
|
-
const res = await firstValueFrom(this.api.getViews(pid));
|
|
233
|
-
const normalized = (res ?? []).map((r) => ({
|
|
234
|
-
spec: r.spec,
|
|
235
|
-
runtime: r.runtime ? {
|
|
236
|
-
taskId: r.runtime.taskId,
|
|
237
|
-
projectId: r.runtime.projectId,
|
|
238
|
-
runId: r.runtime.runId,
|
|
239
|
-
status: r.runtime.status,
|
|
240
|
-
pid: r.runtime.pid,
|
|
241
|
-
startedAt: r.runtime.startedAt,
|
|
242
|
-
stoppedAt: r.runtime.stoppedAt,
|
|
243
|
-
exitCode: r.runtime.exitCode,
|
|
244
|
-
signal: r.runtime.signal
|
|
245
|
-
} : void 0
|
|
246
|
-
}));
|
|
247
|
-
for (const row of normalized) {
|
|
248
|
-
if (row.runtime)
|
|
249
|
-
this.runtimeStore.setRuntime(row.runtime);
|
|
250
|
-
}
|
|
251
|
-
this.state.update((st) => __spreadProps(__spreadValues({}, st), {
|
|
252
|
-
rowsByProject: __spreadProps(__spreadValues({}, st.rowsByProject), { [pid]: normalized }),
|
|
253
|
-
loadedAtByProject: __spreadProps(__spreadValues({}, st.loadedAtByProject), { [pid]: Date.now() })
|
|
254
|
-
}));
|
|
255
|
-
} finally {
|
|
256
|
-
this.state.update((st) => __spreadProps(__spreadValues({}, st), {
|
|
257
|
-
loadingByProject: __spreadProps(__spreadValues({}, st.loadingByProject), { [pid]: false })
|
|
258
|
-
}));
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
/** tasks 页面刷新后,把结果写回 catalog(保持一致) */
|
|
262
|
-
setRows(projectId, rows) {
|
|
263
|
-
const pid = (projectId ?? "").trim();
|
|
264
|
-
if (!pid)
|
|
265
|
-
return;
|
|
266
|
-
for (const row of rows ?? []) {
|
|
267
|
-
if (row.runtime)
|
|
268
|
-
this.runtimeStore.setRuntime(row.runtime);
|
|
269
|
-
}
|
|
270
|
-
this.state.update((st) => __spreadProps(__spreadValues({}, st), {
|
|
271
|
-
rowsByProject: __spreadProps(__spreadValues({}, st.rowsByProject), { [pid]: rows ?? [] }),
|
|
272
|
-
loadedAtByProject: __spreadProps(__spreadValues({}, st.loadedAtByProject), { [pid]: Date.now() })
|
|
273
|
-
}));
|
|
274
|
-
}
|
|
275
|
-
/** 清除某项目缓存 */
|
|
276
|
-
clear(projectId) {
|
|
277
|
-
const pid = (projectId ?? "").trim();
|
|
278
|
-
if (!pid)
|
|
279
|
-
return;
|
|
280
|
-
this.state.update((st) => {
|
|
281
|
-
const rowsByProject = __spreadValues({}, st.rowsByProject);
|
|
282
|
-
const loadingByProject = __spreadValues({}, st.loadingByProject);
|
|
283
|
-
const loadedAtByProject = __spreadValues({}, st.loadedAtByProject);
|
|
284
|
-
delete rowsByProject[pid];
|
|
285
|
-
delete loadingByProject[pid];
|
|
286
|
-
delete loadedAtByProject[pid];
|
|
287
|
-
return { rowsByProject, loadingByProject, loadedAtByProject };
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
};
|
|
291
|
-
TaskCatalogService = __decorate([
|
|
292
|
-
Injectable({ providedIn: "root" })
|
|
293
|
-
], TaskCatalogService);
|
|
294
|
-
|
|
295
|
-
// src/app/pages/tasks/services/tasks.state.service.ts
|
|
296
|
-
var TaskStateService = class TaskStateService2 {
|
|
297
|
-
api = inject(TasksApiService);
|
|
298
|
-
stream = inject(TaskStreamService);
|
|
299
|
-
runtimeStore = inject(TaskRuntimeStore);
|
|
300
|
-
catalog = inject(TaskCatalogService);
|
|
301
|
-
/* ---------------- 基础状态 ---------------- */
|
|
302
|
-
projectId = signal("");
|
|
303
|
-
keyword = signal("");
|
|
304
|
-
loading = signal(false);
|
|
305
|
-
selectedTaskId = signal("");
|
|
306
|
-
/** 当前项目 rows(spec + runtime 快照) */
|
|
307
|
-
rows = computed(() => {
|
|
308
|
-
const pid = this.projectId();
|
|
309
|
-
if (!pid)
|
|
310
|
-
return [];
|
|
311
|
-
return this.catalog.rowsOf(pid)();
|
|
312
|
-
});
|
|
313
|
-
/* ---------------- 派生状态 ---------------- */
|
|
314
|
-
rowsView = computed(() => {
|
|
315
|
-
const rows = this.rows();
|
|
316
|
-
return rows.map((r) => {
|
|
317
|
-
const taskId = r.spec.id;
|
|
318
|
-
const rt = this.getRuntimeSignal(taskId);
|
|
319
|
-
return __spreadProps(__spreadValues({}, r), {
|
|
320
|
-
runtime: rt ?? r.runtime
|
|
321
|
-
});
|
|
322
|
-
});
|
|
323
|
-
});
|
|
324
|
-
rowsViewFiltered = computed(() => {
|
|
325
|
-
const kw = this.keyword().trim().toLowerCase();
|
|
326
|
-
const rows = this.rowsView();
|
|
327
|
-
if (!kw)
|
|
328
|
-
return rows;
|
|
329
|
-
return rows.filter((r) => {
|
|
330
|
-
return r.spec.name?.toLowerCase().includes(kw);
|
|
331
|
-
});
|
|
332
|
-
});
|
|
333
|
-
selectedRow = computed(() => {
|
|
334
|
-
const id = this.selectedTaskId();
|
|
335
|
-
return this.rowsView().find((r) => r.spec.id === id) ?? null;
|
|
336
|
-
});
|
|
337
|
-
selectedRuntimeStatus = computed(() => {
|
|
338
|
-
const taskId = this.selectedTaskId();
|
|
339
|
-
if (!taskId)
|
|
340
|
-
return { status: "idle" };
|
|
341
|
-
const st = this.getRuntime(taskId);
|
|
342
|
-
return st;
|
|
343
|
-
});
|
|
344
|
-
isRunning = computed(() => this.selectedRuntimeStatus().status === "running");
|
|
345
|
-
isStopping = computed(() => this.selectedRuntimeStatus().status === "stopping");
|
|
346
|
-
isStopped = computed(() => {
|
|
347
|
-
const st = this.selectedRuntimeStatus().status;
|
|
348
|
-
return st === "idle" || st === "stopped" || st === "failed" || st === "success";
|
|
349
|
-
});
|
|
350
|
-
/* ---------------- 构造 & WS 同步 ---------------- */
|
|
351
|
-
constructor() {
|
|
352
|
-
effect((onCleanup) => {
|
|
353
|
-
const taskId = this.selectedTaskId();
|
|
354
|
-
if (!taskId)
|
|
355
|
-
return;
|
|
356
|
-
this.stream.ensureConnected();
|
|
357
|
-
this.stream.subscribeTask(taskId, 200);
|
|
358
|
-
const sub = this.runtimeStore.status$(taskId).subscribe();
|
|
359
|
-
onCleanup(() => {
|
|
360
|
-
sub.unsubscribe();
|
|
361
|
-
this.stream.unsubscribeTask(taskId);
|
|
362
|
-
});
|
|
363
|
-
});
|
|
364
|
-
}
|
|
365
|
-
getRuntime(taskId) {
|
|
366
|
-
return this.runtimeStore.statusSignal(taskId)();
|
|
367
|
-
}
|
|
368
|
-
getRuntimeSignal(taskId) {
|
|
369
|
-
return this.runtimeStore.runtimeSignal(taskId)();
|
|
370
|
-
}
|
|
371
|
-
/* ---------------- 页面动作 ---------------- */
|
|
372
|
-
async setProject(projectId) {
|
|
373
|
-
const pid = projectId?.trim();
|
|
374
|
-
if (!pid || this.projectId() === pid)
|
|
375
|
-
return;
|
|
376
|
-
this.projectId.set(pid);
|
|
377
|
-
this.selectedTaskId.set("");
|
|
378
|
-
this.keyword.set("");
|
|
379
|
-
await this.catalog.ensureLoaded(pid);
|
|
380
|
-
const first = this.rows()[0];
|
|
381
|
-
if (first)
|
|
382
|
-
this.select(first.spec.id);
|
|
383
|
-
}
|
|
384
|
-
refresh() {
|
|
385
|
-
const pid = this.projectId();
|
|
386
|
-
if (!pid)
|
|
387
|
-
return;
|
|
388
|
-
this.loading.set(true);
|
|
389
|
-
this.api.refresh(pid).subscribe({
|
|
390
|
-
next: (rows) => {
|
|
391
|
-
this.catalog.setRows(pid, rows ?? []);
|
|
392
|
-
this.loading.set(false);
|
|
393
|
-
},
|
|
394
|
-
error: (e) => {
|
|
395
|
-
this.loading.set(false);
|
|
396
|
-
}
|
|
397
|
-
});
|
|
398
|
-
}
|
|
399
|
-
select(taskId) {
|
|
400
|
-
this.selectedTaskId.set(taskId);
|
|
401
|
-
}
|
|
402
|
-
/* ---------------- 运行 / 停止 ---------------- */
|
|
403
|
-
toggleTask() {
|
|
404
|
-
if (this.isRunning()) {
|
|
405
|
-
this.stopSelected();
|
|
406
|
-
} else if (this.isStopped()) {
|
|
407
|
-
this.startSelected();
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
/**
|
|
411
|
-
* 启动选中任务
|
|
412
|
-
* @param taskId 如果不传则启动 selectedTaskId 指定的任务
|
|
413
|
-
*/
|
|
414
|
-
startSelected(taskId) {
|
|
415
|
-
taskId = taskId?.trim() || this.selectedRow()?.spec?.id;
|
|
416
|
-
if (!taskId)
|
|
417
|
-
return;
|
|
418
|
-
this.api.start(taskId).subscribe();
|
|
419
|
-
}
|
|
420
|
-
/**
|
|
421
|
-
* 停止选中任务
|
|
422
|
-
* @param taskId 如果不传则停止 selectedTaskId 指定的任务
|
|
423
|
-
*/
|
|
424
|
-
stopSelected(taskId) {
|
|
425
|
-
taskId = taskId?.trim() || this.selectedTaskId();
|
|
426
|
-
if (!taskId)
|
|
427
|
-
return;
|
|
428
|
-
const curRt = this.getRuntimeSignal(taskId);
|
|
429
|
-
if (curRt) {
|
|
430
|
-
this.runtimeStore.setRuntime(__spreadProps(__spreadValues({}, curRt), { status: "stopping" }));
|
|
431
|
-
}
|
|
432
|
-
this.api.stop(taskId).subscribe({
|
|
433
|
-
next: () => {
|
|
434
|
-
},
|
|
435
|
-
error: () => {
|
|
436
|
-
if (curRt && curRt.status === "running") {
|
|
437
|
-
this.runtimeStore.setRuntime(curRt);
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
});
|
|
441
|
-
}
|
|
442
|
-
/* ---------------- 给 popover 用 ---------------- */
|
|
443
|
-
rowsViewOf(projectId) {
|
|
444
|
-
return computed(() => {
|
|
445
|
-
const pid = projectId?.trim();
|
|
446
|
-
if (!pid)
|
|
447
|
-
return [];
|
|
448
|
-
const rows = this.catalog.rowsOf(pid)();
|
|
449
|
-
return rows.map((r) => {
|
|
450
|
-
const taskId = r.spec.id;
|
|
451
|
-
const st = this.getRuntime(taskId);
|
|
452
|
-
return __spreadProps(__spreadValues({}, r), {
|
|
453
|
-
runtime: __spreadProps(__spreadValues({}, r.runtime ?? {}), { status: st.status })
|
|
454
|
-
});
|
|
455
|
-
});
|
|
456
|
-
});
|
|
457
|
-
}
|
|
458
|
-
ensureProjectLoaded(projectId) {
|
|
459
|
-
return this.catalog.ensureLoaded(projectId);
|
|
460
|
-
}
|
|
461
|
-
static ctorParameters = () => [];
|
|
462
|
-
};
|
|
463
|
-
TaskStateService = __decorate([
|
|
464
|
-
Injectable({ providedIn: "root" })
|
|
465
|
-
], TaskStateService);
|
|
466
|
-
|
|
467
|
-
export {
|
|
468
|
-
TaskStreamService,
|
|
469
|
-
TaskStateService
|
|
470
|
-
};
|
|
471
|
-
//# sourceMappingURL=chunk-SS73S33S.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["src/app/pages/tasks/services/task-stream.service.ts", "src/app/pages/tasks/services/task-catalog.service.ts", "src/app/pages/tasks/services/tasks.state.service.ts"],
|
|
4
|
-
"sourcesContent": ["import { Injectable } from \"@angular/core\";\r\nimport { WsClientService } from \"@app/core/ws/ws-client.service\";\r\nimport type { TaskEventMsg, TaskEventPayloadMap, TaskEventType, TaskExitedPayload, TaskOutputMsg, TaskOutputPayload, TaskSnapshotPayload, TaskStartedPayload, TaskStatus, WsClientMsg, WsServerMsg, WsState } from \"@core/ws\";\r\nimport type { TaskRuntime } from \"@models/task.model\";\r\nimport { Subject } from \"rxjs\";\r\nimport { TaskRuntimeStore } from \"./task-runtime-store\";\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class TaskStreamService {\r\n private outputByTaskId = new Map<string, Subject<TaskOutputMsg>>(); // taskId -> output stream\r\n private event$ = new Subject<TaskEventMsg>();\r\n\r\n private subs = new Map<string, number>(); // taskId -> tail\r\n private lastWsState: WsState = \"idle\";\r\n\r\n constructor(\r\n private ws: WsClientService,\r\n private runtimeStore: TaskRuntimeStore\r\n ) {\r\n this.ws.messages().subscribe((msg) => this.onMessage(msg));\r\n\r\n this.ws.stateChanges().subscribe((s) => {\r\n if (s === \"open\" && this.lastWsState !== \"open\") {\r\n this.replaySubs();\r\n }\r\n this.lastWsState = s;\r\n });\r\n }\r\n\r\n ensureConnected() {\r\n this.ws.connect();\r\n }\r\n\r\n subscribeTask(taskId: string, tail = 200) {\r\n const id = taskId.trim();\r\n if (!id) return;\r\n const t = Math.max(0, Math.min(5000, tail | 0));\r\n if (this.subs.get(id) === t) return;\r\n\r\n this.subs.set(id, t);\r\n if (this.ws.isOpen()) {\r\n this.ws.send({ op: \"sub\", topic: \"task\", taskId: id, tail: t });\r\n }\r\n }\r\n\r\n unsubscribeTask(taskId: string) {\r\n const id = taskId.trim();\r\n if (!this.subs.has(id)) return;\r\n this.subs.delete(id);\r\n if (this.ws.isOpen()) {\r\n this.ws.send({ op: \"unsub\", topic: \"task\", taskId: id });\r\n }\r\n }\r\n\r\n resize(taskId: string, cols: number, rows: number) {\r\n const id = String(taskId ?? \"\").trim();\r\n if (!id) return;\r\n // 仅 open 发送,避免 pending 堆积 resize\r\n if (!this.ws.isOpen()) return;\r\n this.ws.send({ op: \"resize\", topic: \"task\", taskId: id, cols, rows } as Extract<WsClientMsg, { op: \"resize\" }>);\r\n }\r\n\r\n output$(taskId: string) {\r\n return this.ensureOutput(taskId).asObservable();\r\n }\r\n\r\n events$() {\r\n return this.event$.asObservable();\r\n }\r\n\r\n status$(runId: string) {\r\n return this.runtimeStore.status$(runId);\r\n }\r\n\r\n\r\n private replaySubs() {\r\n for (const [taskId, tail] of this.subs.entries()) {\r\n this.ws.send({ op: \"sub\", topic: \"task\", taskId, tail } as WsClientMsg);\r\n }\r\n }\r\n\r\n private onMessage(msg: WsServerMsg) {\r\n const op = msg?.op;\r\n if (op === \"task.output\") {\r\n const payload = msg.payload;\r\n const taskId = String(payload.taskId ?? \"\").trim();\r\n if (!taskId) return;\r\n this.ensureOutput(taskId).next(msg);\r\n return;\r\n }\r\n\r\n if (op === \"task.event\") {\r\n const payload = msg.payload;\r\n const type = msg.type;\r\n const taskId = String(payload.taskId ?? \"\").trim();\r\n if (!taskId) return;\r\n // 事件先发出去(StateService 用它维护 taskId -> runId)\r\n this.event$.next(msg);\r\n // 组装 TaskRuntime,然后 setRuntime\r\n const nextRt = this.applyEventToRuntime(type, payload);\r\n if (nextRt) {\r\n this.runtimeStore.setRuntime(nextRt);\r\n }\r\n // 清理 output subject \r\n if (type === \"exited\" || type === \"failed\") {\r\n setTimeout(() => this.outputByTaskId.delete(taskId), 5 * 60 * 1000);\r\n }\r\n // failed 追加一条 stderr \r\n if (type === \"failed\") {\r\n const failePayload = payload as TaskEventPayloadMap[\"failed\"];\r\n const errText = `[failed] ${failePayload?.error ?? \"\"}`.trim();\r\n const outputPayload: TaskOutputPayload = {\r\n runId: failePayload.runId,\r\n taskId,\r\n stream: \"stderr\",\r\n text: errText + \"\\n\",\r\n }\r\n this.ensureOutput(taskId).next({ op: \"task.output\", payload: outputPayload, ts: msg.ts });\r\n }\r\n }\r\n }\r\n\r\n private ensureOutput(taskId: string) {\r\n const id = String(taskId ?? \"\").trim();\r\n if (!this.outputByTaskId.has(id)) this.outputByTaskId.set(id, new Subject<TaskOutputMsg>());\r\n return this.outputByTaskId.get(id)!;\r\n }\r\n\r\n private applyEventToRuntime<K extends TaskEventType>(type: K, payload: TaskEventPayloadMap[K]): TaskRuntime | null {\r\n const taskId = String(payload?.taskId ?? '').trim();\r\n const runId = String(payload?.runId ?? '').trim();\r\n if (!taskId || !runId) return null;\r\n const prev = this.runtimeStore.runtimeSignal(taskId)();\r\n // 如果 runId 变了(新一次执行),以新 runId 为准\r\n const base: TaskRuntime = prev && prev.runId === runId\r\n ? { ...prev }\r\n : {\r\n taskId,\r\n runId,\r\n projectId: String(payload?.projectId ?? prev?.projectId ?? '').trim(),\r\n status: 'idle',\r\n };\r\n\r\n // 不同事件填充不同字段\r\n switch (type) {\r\n case \"snapshot\":\r\n const snapPayload = payload as TaskSnapshotPayload;\r\n base.projectId = String(snapPayload?.projectId ?? base.projectId ?? '').trim();\r\n base.status = snapPayload.status as TaskStatus;\r\n base.startedAt = snapPayload.startedAt;\r\n base.stoppedAt = snapPayload.stoppedAt;\r\n base.pid = snapPayload.pid;\r\n base.exitCode = snapPayload.exitCode;\r\n base.signal = snapPayload.signal;\r\n return base;\r\n case 'started':\r\n base.projectId = String(payload?.projectId ?? base.projectId ?? '').trim();\r\n base.status = 'running';\r\n base.pid = (payload as TaskStartedPayload)?.pid ?? base.pid;\r\n base.startedAt = (payload as TaskStartedPayload)?.startedAt ?? base.startedAt ?? Date.now();\r\n // 清理上一次退出字段\r\n base.stoppedAt = undefined;\r\n base.exitCode = undefined;\r\n base.signal = undefined;\r\n return base;\r\n case 'stopRequested':\r\n base.status = 'stopping';\r\n return base;\r\n case 'exited':\r\n // exited payload: { taskId, runId, exitCode, signal, stoppedAt }\r\n base.status = 'stopped'; // 后端规则里 stopping/exited 都归 stopped,但前端先落 stopped\r\n base.exitCode = (payload as TaskExitedPayload)?.exitCode ?? null;\r\n base.signal = (payload as TaskExitedPayload)?.signal ?? null;\r\n base.stoppedAt = (payload as TaskExitedPayload)?.stoppedAt ?? Date.now();\r\n return base;\r\n case 'failed':\r\n // failed payload: { taskId, runId, error }\r\n // 失败事件未必代表进程退出,后端 exit 会再来一次 exited。\r\n // 这里做“UI 立即失败提示”:标为 failed(busy=false),避免一直转圈\r\n base.status = 'failed';\r\n base.stoppedAt = base.stoppedAt ?? Date.now();\r\n base.exitCode = base.exitCode ?? null;\r\n base.signal = base.signal ?? null;\r\n return base;\r\n\r\n default:\r\n return null;\r\n }\r\n }\r\n}\r\n\r\n", "import { Injectable, computed, inject, signal } from \"@angular/core\";\r\nimport type { TaskRow } from \"@models/task.model\";\r\nimport { firstValueFrom } from \"rxjs\";\r\nimport { TasksApiService } from \"./tasks-api.service\";\r\nimport { TaskRuntimeStore } from \"./task-runtime-store\";\r\n\r\ntype ProjectId = string;\r\n\r\ntype CatalogState = {\r\n rowsByProject: Record<ProjectId, TaskRow[]>;\r\n loadingByProject: Record<ProjectId, boolean>;\r\n loadedAtByProject: Record<ProjectId, number | undefined>;\r\n};\r\n\r\n@Injectable({ providedIn: \"root\" })\r\nexport class TaskCatalogService {\r\n private api = inject(TasksApiService);\r\n private runtimeStore = inject(TaskRuntimeStore);\r\n private state = signal<CatalogState>({\r\n rowsByProject: {},\r\n loadingByProject: {},\r\n loadedAtByProject: {},\r\n });\r\n\r\n /** 某项目任务 rows(spec + runtime快照,可选),不包含 ui 运行态 */\r\n rowsOf(projectId: string) {\r\n const pid = (projectId ?? \"\").trim();\r\n return computed(() => this.state().rowsByProject[pid] ?? []);\r\n }\r\n\r\n /** 是否正在加载中 */\r\n isLoading(projectId: string) {\r\n const pid = (projectId ?? \"\").trim();\r\n return computed(() => !!this.state().loadingByProject[pid]);\r\n }\r\n\r\n /** 是否已缓存:以 loadedAt 为准(0 tasks 也算 loaded) */\r\n isLoaded(projectId: string) {\r\n const pid = (projectId ?? \"\").trim();\r\n return computed(() => this.state().loadedAtByProject[pid] != null);\r\n }\r\n\r\n /**\r\n * 主入口:确保该项目 tasks 已加载\r\n * 使用 getViews(list) 读取,不做 refresh(避免副作用)\r\n */\r\n async ensureLoaded(projectId: string, opts?: { force?: boolean }): Promise<void> {\r\n const pid = (projectId ?? \"\").trim();\r\n if (!pid) return;\r\n\r\n const s = this.state();\r\n const loaded = s.loadedAtByProject[pid] != null;\r\n const loading = !!s.loadingByProject[pid];\r\n if (!opts?.force && (loaded || loading)) return;\r\n\r\n this.state.update((st) => ({\r\n ...st,\r\n loadingByProject: { ...st.loadingByProject, [pid]: true },\r\n }));\r\n\r\n try {\r\n const res = await firstValueFrom(this.api.getViews(pid));\r\n // console.log(\"[task catalog] loaded\", pid, res);\r\n\r\n // 这里保留后端 runtime(是快照,不是实时态)\r\n const normalized: TaskRow[] = (res ?? []).map((r: any) => ({\r\n spec: r.spec,\r\n runtime: r.runtime\r\n ? {\r\n taskId: r.runtime.taskId,\r\n projectId: r.runtime.projectId,\r\n runId: r.runtime.runId,\r\n status: r.runtime.status,\r\n pid: r.runtime.pid,\r\n startedAt: r.runtime.startedAt,\r\n stoppedAt: r.runtime.stoppedAt,\r\n exitCode: r.runtime.exitCode,\r\n signal: r.runtime.signal,\r\n }\r\n : undefined,\r\n }));\r\n\r\n // 用后端 runtime 快照初始化 runtimeStore(建立 runningCount)\r\n for (const row of normalized) {\r\n if (row.runtime) this.runtimeStore.setRuntime(row.runtime);\r\n }\r\n\r\n this.state.update((st) => ({\r\n ...st,\r\n rowsByProject: { ...st.rowsByProject, [pid]: normalized },\r\n loadedAtByProject: { ...st.loadedAtByProject, [pid]: Date.now() },\r\n }));\r\n } finally {\r\n this.state.update((st) => ({\r\n ...st,\r\n loadingByProject: { ...st.loadingByProject, [pid]: false },\r\n }));\r\n }\r\n }\r\n\r\n /** tasks 页面刷新后,把结果写回 catalog(保持一致) */\r\n setRows(projectId: string, rows: TaskRow[]) {\r\n const pid = (projectId ?? \"\").trim();\r\n if (!pid) return;\r\n for (const row of rows ?? []) {\r\n if (row.runtime) this.runtimeStore.setRuntime(row.runtime);\r\n }\r\n this.state.update((st) => ({\r\n ...st,\r\n rowsByProject: { ...st.rowsByProject, [pid]: rows ?? [] },\r\n loadedAtByProject: { ...st.loadedAtByProject, [pid]: Date.now() },\r\n }));\r\n }\r\n\r\n /** 清除某项目缓存 */\r\n clear(projectId: string) {\r\n const pid = (projectId ?? \"\").trim();\r\n if (!pid) return;\r\n\r\n this.state.update((st) => {\r\n const rowsByProject = { ...st.rowsByProject };\r\n const loadingByProject = { ...st.loadingByProject };\r\n const loadedAtByProject = { ...st.loadedAtByProject };\r\n delete rowsByProject[pid];\r\n delete loadingByProject[pid];\r\n delete loadedAtByProject[pid];\r\n return { rowsByProject, loadingByProject, loadedAtByProject };\r\n });\r\n }\r\n}\r\n", "import { Injectable, Signal, computed, effect, inject, signal } from \"@angular/core\";\r\nimport { TaskRow, TaskRuntime, TaskRuntimeStatus } from \"@models/task.model\";\r\nimport { TasksApiService } from \"./tasks-api.service\";\r\nimport { TaskStreamService } from \"./task-stream.service\";\r\nimport { TaskRuntimeStore } from \"./task-runtime-store\";\r\nimport { TaskCatalogService } from \"./task-catalog.service\";\r\n@Injectable({ providedIn: \"root\" })\r\nexport class TaskStateService {\r\n private api = inject(TasksApiService);\r\n private stream = inject(TaskStreamService);\r\n private runtimeStore = inject(TaskRuntimeStore);\r\n private catalog = inject(TaskCatalogService);\r\n\r\n /* ---------------- 基础状态 ---------------- */\r\n\r\n readonly projectId = signal<string>(\"\");\r\n\r\n readonly keyword = signal(\"\");\r\n readonly loading = signal(false);\r\n readonly selectedTaskId = signal<string>(\"\");\r\n\r\n /** 当前项目 rows(spec + runtime 快照) */\r\n readonly rows = computed<TaskRow[]>(() => {\r\n const pid = this.projectId();\r\n if (!pid) return [];\r\n return this.catalog.rowsOf(pid)();\r\n });\r\n\r\n /* ---------------- 派生状态 ---------------- */\r\n\r\n readonly rowsView = computed(() => {\r\n const rows = this.rows();\r\n return rows.map((r) => {\r\n const taskId = r.spec.id;\r\n const rt = this.getRuntimeSignal(taskId);\r\n return {\r\n ...r,\r\n runtime: rt ?? r.runtime,\r\n };\r\n });\r\n });\r\n\r\n readonly rowsViewFiltered = computed(() => {\r\n const kw = this.keyword().trim().toLowerCase();\r\n const rows = this.rowsView();\r\n if (!kw) return rows;\r\n return rows.filter((r) => {\r\n return (\r\n r.spec.name?.toLowerCase().includes(kw)\r\n );\r\n });\r\n });\r\n\r\n readonly selectedRow = computed(() => {\r\n const id = this.selectedTaskId();\r\n return this.rowsView().find((r) => r.spec.id === id) ?? null;\r\n });\r\n\r\n readonly selectedRuntimeStatus = computed<TaskRuntimeStatus>(() => {\r\n const taskId = this.selectedTaskId();\r\n if (!taskId) return { status: \"idle\" };\r\n const st = this.getRuntime(taskId);\r\n return st;\r\n });\r\n\r\n readonly isRunning = computed(() => this.selectedRuntimeStatus().status === \"running\");\r\n readonly isStopping = computed(() => this.selectedRuntimeStatus().status === \"stopping\");\r\n readonly isStopped = computed(() => {\r\n const st = this.selectedRuntimeStatus().status;\r\n return st === \"idle\" || st === \"stopped\" || st === \"failed\" || st === \"success\";\r\n });\r\n\r\n /* ---------------- 构造 & WS 同步 ---------------- */\r\n\r\n constructor() {\r\n /** WS 事件是 runIndex 的唯一实时来源 */\r\n // this.stream.events$().subscribe((e) => {\r\n // console.log(\"[task state] event\", e);\r\n // });\r\n\r\n /** 选中 runId → 自动订阅 WS */\r\n effect((onCleanup) => {\r\n const taskId = this.selectedTaskId();\r\n if (!taskId) return;\r\n // console.log(\"[task state effect] subscribe task stream\", taskId);\r\n this.stream.ensureConnected();\r\n this.stream.subscribeTask(taskId, 200);\r\n const sub = this.runtimeStore.status$(taskId).subscribe();\r\n onCleanup(() => {\r\n sub.unsubscribe();\r\n this.stream.unsubscribeTask(taskId);\r\n });\r\n });\r\n }\r\n\r\n getRuntime(taskId: string): TaskRuntimeStatus {\r\n return this.runtimeStore.statusSignal(taskId)();\r\n }\r\n\r\n private getRuntimeSignal(taskId: string): TaskRuntime | undefined {\r\n return this.runtimeStore.runtimeSignal(taskId)();\r\n }\r\n\r\n /* ---------------- 页面动作 ---------------- */\r\n\r\n async setProject(projectId: string) {\r\n const pid = projectId?.trim();\r\n if (!pid || this.projectId() === pid) return;\r\n this.projectId.set(pid);\r\n this.selectedTaskId.set(\"\");\r\n this.keyword.set(\"\");\r\n await this.catalog.ensureLoaded(pid);\r\n const first = this.rows()[0];\r\n if (first) this.select(first.spec.id);\r\n }\r\n\r\n refresh() {\r\n const pid = this.projectId();\r\n if (!pid) return;\r\n\r\n this.loading.set(true);\r\n\r\n this.api.refresh(pid).subscribe({\r\n next: (rows) => {\r\n this.catalog.setRows(pid, rows ?? []);\r\n this.loading.set(false);\r\n },\r\n error: (e) => {\r\n this.loading.set(false);\r\n },\r\n });\r\n }\r\n\r\n select(taskId: string) {\r\n this.selectedTaskId.set(taskId);\r\n }\r\n\r\n /* ---------------- 运行 / 停止 ---------------- */\r\n toggleTask() {\r\n if (this.isRunning()) {\r\n this.stopSelected();\r\n } else if (this.isStopped()) {\r\n this.startSelected();\r\n }\r\n }\r\n\r\n /**\r\n * 启动选中任务\r\n * @param taskId 如果不传则启动 selectedTaskId 指定的任务\r\n */\r\n startSelected(taskId?: string) {\r\n taskId = taskId?.trim() || this.selectedRow()?.spec?.id;\r\n if (!taskId) return;\r\n // const spec = this.selectedRow()?.spec;\r\n // if (!spec) return;\r\n this.api.start(taskId).subscribe();\r\n }\r\n\r\n /**\r\n * 停止选中任务\r\n * @param taskId 如果不传则停止 selectedTaskId 指定的任务\r\n */\r\n stopSelected(taskId?: string) {\r\n taskId = taskId?.trim() || this.selectedTaskId();\r\n if (!taskId) return;\r\n // 取当前 runtime(必须要有 runId/projectId 才能工程化维护 runningCount) \r\n const curRt = this.getRuntimeSignal(taskId);\r\n if (curRt) {\r\n // 先置 stopping(保留 pid/startedAt/runId/projectId)\r\n this.runtimeStore.setRuntime({ ...curRt, status: 'stopping' });\r\n }\r\n\r\n this.api.stop(taskId).subscribe({\r\n next: () => { },\r\n error: () => {\r\n // 回滚:如果乐观置了 stopping,则恢复为 running(前提:原来确实在 running)\r\n if (curRt && curRt.status === 'running') {\r\n this.runtimeStore.setRuntime(curRt);\r\n }\r\n }\r\n });\r\n }\r\n\r\n /* ---------------- 给 popover 用 ---------------- */\r\n\r\n rowsViewOf(projectId: string): Signal<TaskRow[]> {\r\n return computed(() => {\r\n const pid = projectId?.trim();\r\n if (!pid) return [];\r\n const rows = this.catalog.rowsOf(pid)();\r\n return rows.map((r) => {\r\n const taskId = r.spec.id;\r\n const st = this.getRuntime(taskId);\r\n return {\r\n ...r,\r\n runtime: { ...(r.runtime ?? {}), status: st.status } as TaskRuntime,\r\n }\r\n });\r\n });\r\n }\r\n\r\n ensureProjectLoaded(projectId: string) {\r\n return this.catalog.ensureLoaded(projectId);\r\n }\r\n\r\n}\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["TaskStreamService", "TaskCatalogService", "TaskStateService"]
|
|
7
|
-
}
|