@dimina-kit/devtools 0.4.0-dev.20260803105710 → 0.4.0-dev.20260828092243

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.
Files changed (208) hide show
  1. package/dist/main/api.d.ts +1 -1
  2. package/dist/main/app/app.js +66 -2
  3. package/dist/main/index.bundle.js +1454 -540
  4. package/dist/main/ipc/index.d.ts +3 -0
  5. package/dist/main/ipc/index.js +3 -0
  6. package/dist/main/ipc/popover.js +1 -1
  7. package/dist/main/ipc/project-create.d.ts +15 -0
  8. package/dist/main/ipc/project-create.js +26 -0
  9. package/dist/main/ipc/projects.d.ts +1 -1
  10. package/dist/main/ipc/projects.js +11 -0
  11. package/dist/main/ipc/session.js +11 -0
  12. package/dist/main/ipc/settings.js +2 -1
  13. package/dist/main/ipc/simulator-module.d.ts +4 -3
  14. package/dist/main/ipc/simulator-module.js +4 -5
  15. package/dist/main/ipc/tooltip.d.ts +13 -0
  16. package/dist/main/ipc/tooltip.js +28 -0
  17. package/dist/main/ipc/views.d.ts +15 -1
  18. package/dist/main/ipc/views.js +61 -4
  19. package/dist/main/runtime/miniapp-runtime.d.ts +87 -19
  20. package/dist/main/services/layout/index.d.ts +11 -0
  21. package/dist/main/services/layout/index.js +23 -0
  22. package/dist/main/services/network-forward/frontend-dispatch.js +2 -1
  23. package/dist/main/services/notifications/renderer-notifier.d.ts +32 -1
  24. package/dist/main/services/notifications/renderer-notifier.js +29 -1
  25. package/dist/main/services/projects/project-repository.d.ts +4 -1
  26. package/dist/main/services/projects/project-repository.js +63 -5
  27. package/dist/main/services/simulator-current-page/index.d.ts +5 -3
  28. package/dist/main/services/simulator-current-page/index.js +8 -1
  29. package/dist/main/services/update/update-manager.d.ts +17 -3
  30. package/dist/main/services/update/update-manager.js +25 -6
  31. package/dist/main/services/views/clear-console-filter.d.ts +44 -0
  32. package/dist/main/services/views/clear-console-filter.js +86 -0
  33. package/dist/main/services/views/console-filter-test-fixtures.d.ts +94 -0
  34. package/dist/main/services/views/console-filter-test-fixtures.js +82 -0
  35. package/dist/main/services/views/console-filter.d.ts +79 -130
  36. package/dist/main/services/views/console-filter.js +140 -183
  37. package/dist/main/services/views/devtools-tabs.d.ts +24 -4
  38. package/dist/main/services/views/devtools-tabs.js +40 -21
  39. package/dist/main/services/views/host-dialog-port-channel.d.ts +18 -0
  40. package/dist/main/services/views/host-dialog-port-channel.js +15 -0
  41. package/dist/main/services/views/host-dialog-session-runtime.d.ts +10 -0
  42. package/dist/main/services/views/host-dialog-session-runtime.js +17 -0
  43. package/dist/main/services/views/host-dialog-view.d.ts +95 -0
  44. package/dist/main/services/views/host-dialog-view.js +147 -0
  45. package/dist/main/services/views/host-sidebar-port-channel.d.ts +18 -0
  46. package/dist/main/services/views/host-sidebar-port-channel.js +15 -0
  47. package/dist/main/services/views/host-sidebar-session-runtime.d.ts +10 -0
  48. package/dist/main/services/views/host-sidebar-session-runtime.js +17 -0
  49. package/dist/main/services/views/host-sidebar-view.d.ts +59 -0
  50. package/dist/main/services/views/host-sidebar-view.js +44 -0
  51. package/dist/main/services/views/host-slot-port-channel.d.ts +107 -0
  52. package/dist/main/services/views/host-slot-port-channel.js +261 -0
  53. package/dist/main/services/views/host-slot-session-runtime.d.ts +40 -0
  54. package/dist/main/services/views/host-slot-session-runtime.js +50 -0
  55. package/dist/main/services/views/host-slot-view.d.ts +109 -0
  56. package/dist/main/services/views/host-slot-view.js +147 -0
  57. package/dist/main/services/views/host-toolbar-port-channel.d.ts +6 -91
  58. package/dist/main/services/views/host-toolbar-port-channel.js +10 -243
  59. package/dist/main/services/views/host-toolbar-session-runtime.d.ts +5 -30
  60. package/dist/main/services/views/host-toolbar-session-runtime.js +9 -47
  61. package/dist/main/services/views/host-toolbar-view.d.ts +34 -7
  62. package/dist/main/services/views/host-toolbar-view.js +30 -237
  63. package/dist/main/services/views/managed-web-contents-view.d.ts +48 -0
  64. package/dist/main/services/views/managed-web-contents-view.js +123 -0
  65. package/dist/main/services/views/native-simulator-devtools-host.js +64 -45
  66. package/dist/main/services/views/native-simulator-view.js +6 -24
  67. package/dist/main/services/views/native-view-tree.d.ts +25 -0
  68. package/dist/main/services/views/native-view-tree.js +69 -0
  69. package/dist/main/services/views/overlay-panels-view.d.ts +50 -4
  70. package/dist/main/services/views/overlay-panels-view.js +226 -108
  71. package/dist/main/services/views/placement-reconciler.d.ts +18 -18
  72. package/dist/main/services/views/placement-reconciler.js +91 -29
  73. package/dist/main/services/views/placement-test-driver.d.ts +27 -0
  74. package/dist/main/services/views/placement-test-driver.js +29 -0
  75. package/dist/main/services/views/view-manager-devtools-host-test-fixtures.js +3 -1
  76. package/dist/main/services/views/view-manager.d.ts +14 -86
  77. package/dist/main/services/views/view-manager.js +41 -4
  78. package/dist/main/services/views/workbench-view.js +27 -20
  79. package/dist/main/services/workbench-coi-server.d.ts +11 -0
  80. package/dist/main/services/workbench-coi-server.js +32 -0
  81. package/dist/main/services/workspace/rebuild-status.d.ts +21 -8
  82. package/dist/main/services/workspace/rebuild-status.js +24 -8
  83. package/dist/main/utils/paths.d.ts +4 -0
  84. package/dist/main/utils/paths.js +4 -0
  85. package/dist/main/utils/sender-policy.d.ts +1 -1
  86. package/dist/main/utils/sender-policy.js +16 -1
  87. package/dist/main/utils/theme.d.ts +7 -2
  88. package/dist/main/utils/theme.js +8 -3
  89. package/dist/native-host/common/common.js +65 -62
  90. package/dist/native-host/container/pageFrame.css +1 -1
  91. package/dist/native-host/render/render.js +3226 -2898
  92. package/dist/native-host/service/service.js +2 -2
  93. package/dist/preload/runtime/host-dialog-advertiser.d.ts +22 -0
  94. package/dist/preload/runtime/host-dialog-advertiser.js +37 -0
  95. package/dist/preload/runtime/host-dialog-port.d.ts +44 -0
  96. package/dist/preload/runtime/host-dialog-port.js +53 -0
  97. package/dist/preload/runtime/host-dialog-runtime.d.ts +28 -0
  98. package/dist/preload/runtime/host-dialog-runtime.js +36 -0
  99. package/dist/preload/runtime/host-sidebar-advertiser.d.ts +19 -0
  100. package/dist/preload/runtime/host-sidebar-advertiser.js +35 -0
  101. package/dist/preload/runtime/host-sidebar-port.d.ts +44 -0
  102. package/dist/preload/runtime/host-sidebar-port.js +53 -0
  103. package/dist/preload/runtime/host-sidebar-runtime.d.ts +28 -0
  104. package/dist/preload/runtime/host-sidebar-runtime.js +36 -0
  105. package/dist/preload/runtime/host-slot-port-bridge.d.ts +18 -0
  106. package/dist/preload/runtime/host-slot-port-bridge.js +112 -0
  107. package/dist/preload/runtime/host-toolbar-advertiser.d.ts +5 -13
  108. package/dist/preload/runtime/host-toolbar-advertiser.js +18 -38
  109. package/dist/preload/runtime/host-toolbar-port.d.ts +9 -0
  110. package/dist/preload/runtime/host-toolbar-port.js +11 -95
  111. package/dist/preload/runtime/wait-for-slot-root.d.ts +20 -0
  112. package/dist/preload/runtime/wait-for-slot-root.js +52 -0
  113. package/dist/preload/windows/host-dialog-runtime.cjs +353 -0
  114. package/dist/preload/windows/host-dialog-runtime.cjs.map +7 -0
  115. package/dist/preload/windows/host-dialog-runtime.d.ts +2 -0
  116. package/dist/preload/windows/host-dialog-runtime.js +13 -0
  117. package/dist/preload/windows/host-sidebar-runtime.cjs +354 -0
  118. package/dist/preload/windows/host-sidebar-runtime.cjs.map +7 -0
  119. package/dist/preload/windows/host-sidebar-runtime.d.ts +2 -0
  120. package/dist/preload/windows/host-sidebar-runtime.js +13 -0
  121. package/dist/preload/windows/host-toolbar-runtime.cjs +134 -51
  122. package/dist/preload/windows/host-toolbar-runtime.cjs.map +3 -3
  123. package/dist/preload/windows/main.cjs +3176 -14
  124. package/dist/preload/windows/main.cjs.map +4 -4
  125. package/dist/preload/windows/main.css +428 -0
  126. package/dist/preload/windows/main.css.map +7 -0
  127. package/dist/preload/windows/simulator.cjs +5 -2
  128. package/dist/preload/windows/simulator.cjs.map +2 -2
  129. package/dist/preload/windows/simulator.js +5 -2
  130. package/dist/renderer/assets/button-DsNqZm7o.js +2 -0
  131. package/dist/renderer/assets/constants-D7DfVqMp.js +2 -0
  132. package/dist/renderer/assets/constants-D8zsejFq.js +2 -0
  133. package/dist/renderer/assets/createLucideIcon-CYJeT1ji.js +2 -0
  134. package/dist/renderer/assets/dialog-pT4qWmka.js +46 -0
  135. package/dist/renderer/assets/dist-o70xmpc1.js +2 -0
  136. package/dist/renderer/assets/hostSidebarDefault-NvGZlE9O.js +2 -0
  137. package/dist/renderer/assets/index-zErhG3ta.js +5 -0
  138. package/dist/renderer/assets/input-4QxTXMZN.js +2 -0
  139. package/dist/renderer/assets/ipc-channels-overlays-Blr5TNoB.js +2 -0
  140. package/dist/renderer/assets/jsx-runtime-B-3rq1y5.css +1 -0
  141. package/dist/renderer/assets/jsx-runtime-CqVdW3eg.js +9 -0
  142. package/dist/renderer/assets/popover-CJiSWwuE.js +2 -0
  143. package/dist/renderer/assets/project-api-DZ1Zi6EC.js +2 -0
  144. package/dist/renderer/assets/projectCreateDialog-DMWNhw_1.js +2 -0
  145. package/dist/renderer/assets/select-C86pNcsu.js +2 -0
  146. package/dist/renderer/assets/settings-BoI8mLT1.js +2 -0
  147. package/dist/renderer/assets/settings-api-Bs_g4NHs.js +2 -0
  148. package/dist/renderer/assets/settings-tab-bar-DHLLygqv.js +2 -0
  149. package/dist/renderer/assets/tooltip-BhAyY0T4.js +2 -0
  150. package/dist/renderer/assets/types-YYjkvane.js +2 -0
  151. package/dist/renderer/assets/updateDialog-DPum3wx1.js +2 -0
  152. package/dist/renderer/assets/utils-kfQov6Pa.js +2 -0
  153. package/dist/renderer/assets/view-api-DFhb2R8-.js +2 -0
  154. package/dist/renderer/assets/workbenchSettings-DrajRQUk.js +8 -0
  155. package/dist/renderer/entries/host-sidebar-default/index.html +21 -0
  156. package/dist/renderer/entries/main/index.html +15 -7
  157. package/dist/renderer/entries/popover/index.html +10 -6
  158. package/dist/renderer/entries/project-create-dialog/index.html +27 -0
  159. package/dist/renderer/entries/settings/index.html +10 -5
  160. package/dist/renderer/entries/tooltip/index.html +21 -0
  161. package/dist/renderer/entries/update-dialog/index.html +25 -0
  162. package/dist/renderer/entries/workbench-settings/index.html +11 -5
  163. package/dist/service-host/preload.cjs +10 -0
  164. package/dist/service-host/sync-impls/menu-button-geometry.js +1 -0
  165. package/dist/shared/constants.d.ts +22 -0
  166. package/dist/shared/constants.js +22 -0
  167. package/dist/shared/ipc-channels-overlays.d.ts +156 -0
  168. package/dist/shared/ipc-channels-overlays.js +186 -0
  169. package/dist/shared/ipc-channels.d.ts +1 -67
  170. package/dist/shared/ipc-channels.js +9 -81
  171. package/dist/shared/ipc-schemas.d.ts +52 -0
  172. package/dist/shared/ipc-schemas.js +64 -0
  173. package/dist/shared/simulator-route.d.ts +8 -0
  174. package/dist/shared/simulator-route.js +15 -0
  175. package/dist/shared/types.d.ts +17 -0
  176. package/dist/shared/view-ids.d.ts +9 -0
  177. package/dist/shared/view-ids.js +21 -0
  178. package/dist/simulator/assets/device-shell-CmtM1QxP.js +2 -0
  179. package/dist/simulator/assets/device-shell-iFZo1igL.css +1 -0
  180. package/dist/simulator/assets/{simulator-COIE6R49.js → simulator-CIobn3Mh.js} +6 -6
  181. package/dist/simulator/assets/{simulator-mini-app-BLn7XV8e.js → simulator-mini-app-CRe6n9br.js} +2 -2
  182. package/dist/simulator/assets/simulator-ui-BupATgKo.css +1 -0
  183. package/dist/simulator/assets/simulator-ui-C_cP602X.js +2 -0
  184. package/dist/simulator/simulator.html +3 -2
  185. package/dist/vscode-workbench/assets/__vite-browser-external-Bc1vizTf.js +1 -0
  186. package/dist/vscode-workbench/assets/{dist-oHcwN53f.js → dist-CMfmHflW.js} +3 -3
  187. package/dist/vscode-workbench/assets/{iconv-lite-umd-CLMLpdGm.js → iconv-lite-umd-Bx8CgaZq.js} +1 -1
  188. package/dist/vscode-workbench/assets/{index-BE3UJdoH.js → index-CdG6YWhW.js} +436 -436
  189. package/dist/vscode-workbench/assets/{jschardet-BICW8PLJ.js → jschardet-M0qgd2lN.js} +1 -1
  190. package/dist/vscode-workbench/index.html +21 -1
  191. package/package.json +9 -8
  192. package/dist/main/services/views/destroy-child-view.d.ts +0 -9
  193. package/dist/main/services/views/destroy-child-view.js +0 -23
  194. package/dist/renderer/assets/constants-EAMiwL9_.js +0 -2
  195. package/dist/renderer/assets/index-BBg3YI5b.js +0 -49
  196. package/dist/renderer/assets/input-xdmfv-eH.js +0 -2
  197. package/dist/renderer/assets/ipc-transport-B3EpmfNS.js +0 -9
  198. package/dist/renderer/assets/ipc-transport-Blac3sOj.css +0 -1
  199. package/dist/renderer/assets/popover-B88e2hkg.js +0 -2
  200. package/dist/renderer/assets/select-CD9CJyhI.js +0 -2
  201. package/dist/renderer/assets/settings-44hf0QtO.js +0 -2
  202. package/dist/renderer/assets/settings-api-pJKPuP1M.js +0 -2
  203. package/dist/renderer/assets/workbenchSettings-DKD5U1Ql.js +0 -8
  204. package/dist/simulator/assets/device-shell-Cw7c-IkG.js +0 -2
  205. package/dist/simulator/assets/device-shell-DbC5ccs8.css +0 -1
  206. package/dist/simulator/assets/jsx-runtime-DkKmJyBb.js +0 -2
  207. package/dist/simulator/device-shell/menu-button-geometry.js +0 -18
  208. package/dist/vscode-workbench/assets/__vite-browser-external-BON7qP59.js +0 -1
@@ -2,7 +2,7 @@ export { launch, buildDefaultMenu, openSettingsWindow } from './app/launch.js';
2
2
  export type { WorkbenchAppInstance } from './app/app.js';
3
3
  export { suppressEpipe, setupCdpPort } from './app/bootstrap.js';
4
4
  export { asMiniappRuntime } from './runtime/miniapp-runtime.js';
5
- export type { MiniappRuntime, MiniappSessionAppInfo, DiminaHostToolbarPageBridge, } from './runtime/miniapp-runtime.js';
5
+ export type { MiniappRuntime, MiniappSessionAppInfo, DiminaHostToolbarPageBridge, DiminaHostSidebarPageBridge, DiminaHostDialogPageBridge, } from './runtime/miniapp-runtime.js';
6
6
  export { createWorkbenchContext } from './services/workbench-context.js';
7
7
  export type { WorkbenchContext, CreateContextOptions } from './services/workbench-context.js';
8
8
  export { createMainWindow } from './windows/main-window/index.js';
@@ -4,6 +4,7 @@ import { registerProjectFsIpc } from '../ipc/project-fs.js';
4
4
  import { app, BrowserWindow, nativeImage, session } from 'electron';
5
5
  import fs from 'fs';
6
6
  import path from 'path';
7
+ import { HOST_SIDEBAR_DEFAULT_WIDTH } from '../../shared/constants.js';
7
8
  import { rendererDir as defaultRendererDir, defaultPreloadPath, devtoolsPackageRoot } from '../utils/paths.js';
8
9
  import { installThemeBackgroundSync } from '../utils/theme.js';
9
10
  import { createMainWindow, wireMainWindowEvents } from '../windows/main-window/index.js';
@@ -17,7 +18,7 @@ import { createWorkbenchContext } from '../services/workbench-context.js';
17
18
  import { setupCompileWorkerStandby } from '../services/compile-standby.js';
18
19
  import { loadWorkbenchSettings, applyTheme } from '../services/settings/index.js';
19
20
  import { installAppMenu } from '../menu/index.js';
20
- import { registerAppIpc, registerInternalDevtoolsIpc, popoverModule, projectsModule, sessionModule, settingsModule, simulatorModule, } from '../ipc/index.js';
21
+ import { registerAppIpc, registerInternalDevtoolsIpc, registerTooltipIpc, registerProjectCreateIpc, registerViewsIpc, popoverModule, projectsModule, sessionModule, settingsModule, simulatorModule, } from '../ipc/index.js';
21
22
  import { startAutomationServer } from '../services/automation/index.js';
22
23
  import { startMcpServer, setNativeHost, setActiveBridgeId, setNativeOverviewProvider, } from '../services/mcp/index.js';
23
24
  import { setupSimulatorStorage } from '../services/simulator-storage/index.js';
@@ -407,6 +408,23 @@ onInstanceCreated) {
407
408
  // Unconditional (not a toggleable BUILTIN_MODULES entry): it's core dev
408
409
  // tooling, not a host-configurable feature.
409
410
  context.registry.add(registerInternalDevtoolsIpc(context));
411
+ // Unconditional (not a toggleable BUILTIN_MODULES entry): the tooltip
412
+ // overlay is core UI chrome (every toolbar in this app relies on it), not a
413
+ // host-configurable feature.
414
+ context.registry.add(registerTooltipIpc(context));
415
+ // Unconditional: the project-create dialog is core UI chrome (the built-in
416
+ // "新建项目" flow every host falls back to), not a host-configurable feature.
417
+ context.registry.add(registerProjectCreateIpc(context));
418
+ // Unconditional (not a toggleable BUILTIN_MODULES entry): placement/host-
419
+ // slot IPC has no real dependency on the simulator module — `ctx.views`
420
+ // (ViewManager) is constructed unconditionally regardless of
421
+ // `modules.simulator`, and host-sidebar in particular lives on the
422
+ // project-list page, unrelated to the simulator webview. Every renderer
423
+ // entry point also blocks its first render on `AllocatePlacementGeneration`
424
+ // (see renderer-placement-generation.ts) — gating any of this behind the
425
+ // simulator toggle would strand a host that disables it on the fatal
426
+ // boot-failure page, or leave placement silently non-functional.
427
+ context.registry.add(registerViewsIpc(context));
410
428
  // Referer/CORS webRequest policy for the simulator runtime's sessions (shared
411
429
  // fallback + every per-project partition). Registered into the context
412
430
  // registry so its configurator + per-session listeners are torn down with the
@@ -493,13 +511,52 @@ onInstanceCreated) {
493
511
  instance.registerSimulatorApi('login', async () => {
494
512
  return 'hello';
495
513
  });
514
+ // devtools' own default content for the host-sidebar slot: a narrow icon
515
+ // rail (logo + 小程序/小游戏 toggle) filtering the project-list grid by
516
+ // `Project.type`. Loaded BEFORE `config.onSetup` runs below, so any
517
+ // downstream `loadURL`/`loadFile` call inside onSetup necessarily happens
518
+ // later and naturally supersedes this default via plain chronological
519
+ // ordering — no override flag needed.
520
+ context.registry.add(context.views.hostSidebar.onMessage('project-category-selected', (payload) => {
521
+ const category = payload?.category;
522
+ if (category !== 'miniprogram' && category !== 'minigame')
523
+ return;
524
+ context.notify.hostSidebarCategorySelected(category);
525
+ }));
526
+ context.views.hostSidebar
527
+ .loadFile(path.join(rendererDir, 'entries/host-sidebar-default/index.html'))
528
+ .catch((err) => {
529
+ console.warn('[workbench] failed to load host-sidebar default content:', err);
530
+ });
531
+ // Seed the notified width with the rail's own known intrinsic width
532
+ // (`HOST_SIDEBAR_DEFAULT_WIDTH`) instead of leaving it at 0 until the
533
+ // rail's in-page advertiser reports back. That report can never arrive on
534
+ // its own: the placeholder above only becomes "desired visible" once a
535
+ // nonzero width is known (project-list-screen.tsx), attach only happens
536
+ // for a "desired visible" view (placement-reconciler.ts), and the rail's
537
+ // advertiser (view-anchor's measure-loop.ts) only ever fires via
538
+ // `requestAnimationFrame`, which Chromium never schedules for a
539
+ // WebContentsView that was never attached — a structural deadlock, not a
540
+ // slow-to-resolve race. `setWidthMode({fixed})` pushes the seed
541
+ // synchronously (no attach/rAF dependency) and, critically, retains it in
542
+ // `getHostSidebarWidth()` too, so a renderer that mounts and pulls before
543
+ // any push replays the real seed instead of a stale 0. Flipping back to
544
+ // 'auto' immediately after, before anything has attached or advertised, is
545
+ // a same-tick no-op past the seed (`setExtentMode`'s reapply branch only
546
+ // fires once something has actually been advertised) — it leaves the slot
547
+ // in 'auto' for whichever content ends up loaded (this rail's own later
548
+ // report, or a downstream replacement's), not pinned.
549
+ context.views.hostSidebar.setWidthMode({ fixed: HOST_SIDEBAR_DEFAULT_WIDTH });
550
+ context.views.hostSidebar.setWidthMode('auto');
496
551
  if (config.onSetup) {
497
552
  await config.onSetup(instance);
498
553
  }
499
554
  if (config.updateChecker) {
500
555
  instance.updateManager = new UpdateManager({
501
556
  checker: config.updateChecker,
502
- mainWindow,
557
+ showUpdatePanel: (info) => context.views.showUpdateDialog(info),
558
+ notifyDownloadProgress: (percent) => context.views.notifyUpdateDownloadProgress(percent),
559
+ hideUpdatePanel: () => context.views.hideUpdateDialog(),
503
560
  senderPolicy: context.senderPolicy,
504
561
  checkInterval: config.updateOptions?.checkInterval,
505
562
  initialDelay: config.updateOptions?.initialDelay,
@@ -680,6 +737,13 @@ onInstanceCreated) {
680
737
  getProjectRoot: () => context.workspace.getProjectPath(),
681
738
  extensionsDir: config.editorViewConfig?.extensionsDir,
682
739
  getFileTypes: () => context.fileTypes,
740
+ // Names the editor's VS Code workspace after the active miniapp, so each
741
+ // project gets its own open-editors/view-state bucket instead of all of
742
+ // them sharing the one derived from the constant mirror root.
743
+ getProjectIdentity: () => ({
744
+ appId: getActiveAppId(),
745
+ projectPath: context.workspace.getProjectPath(),
746
+ }),
683
747
  });
684
748
  // Return the close promise so the registry awaits server shutdown on dispose
685
749
  // instead of fire-and-forgetting it (a dangling http server would keep the