From bc4959c0daf076194fe9852ae9a56ea65a0e886b Mon Sep 17 00:00:00 2001 From: Rob Colbert Date: Fri, 1 May 2026 15:37:35 -0400 Subject: [PATCH] refactor session startup, shutdown, and import --- gadget-code/src/services/index.ts | 57 +++++++++++++++++++++++++++ gadget-code/src/web-app.ts | 28 ++++++------- gadget-code/src/web-cli.ts | 41 ++++++++++++------- gadget-drone/src/services/platform.ts | 1 + 4 files changed, 98 insertions(+), 29 deletions(-) create mode 100644 gadget-code/src/services/index.ts diff --git a/gadget-code/src/services/index.ts b/gadget-code/src/services/index.ts new file mode 100644 index 0000000..5f2eed0 --- /dev/null +++ b/gadget-code/src/services/index.ts @@ -0,0 +1,57 @@ +// src/services/index.ts +// Copyright (C) 2026 Robert Colbert +// All Rights Reserved + +import ApiClientService from "./api-client.js"; +import ChatSessionService from "./chat-session.js"; +import ContactService from "./contact.js"; +import CryptoService from "./crypto.js"; +import DroneService from "./drone.js"; +import NotificationService from "./notification.js"; +import ProjectService from "./project.js"; +import SessionService from "./session.js"; +import SocketService from "./socket.js"; +import StorageService from "./storage.js"; +import UserService from "./user.js"; + +export async function startServices(): Promise { + await ApiClientService.start(); + await ChatSessionService.start(); + await ContactService.start(); + await CryptoService.start(); + await DroneService.start(); + await NotificationService.start(); + await ProjectService.start(); + await SessionService.start(); + await SocketService.start(); + await StorageService.start(); + await UserService.start(); +} + +export async function stopServices(): Promise { + await ApiClientService.stop(); + await ChatSessionService.stop(); + await ContactService.stop(); + await CryptoService.stop(); + await DroneService.stop(); + await NotificationService.stop(); + await ProjectService.stop(); + await SessionService.stop(); + await SocketService.stop(); + await StorageService.stop(); + await UserService.stop(); +} + +export { + ApiClientService, + ChatSessionService, + ContactService, + CryptoService, + DroneService, + NotificationService, + ProjectService, + SessionService, + SocketService, + StorageService, + UserService, +}; diff --git a/gadget-code/src/web-app.ts b/gadget-code/src/web-app.ts index 81c4c4b..dbba391 100644 --- a/gadget-code/src/web-app.ts +++ b/gadget-code/src/web-app.ts @@ -34,18 +34,20 @@ type SameSiteOption = boolean | "lax" | "strict" | "none" | undefined; import { DtpLog } from "./lib/log.js"; import { DtpComponent } from "./lib/component.js"; +import { User } from "./models/user.js"; + import { ApiController } from "./controllers/api.js"; import { AuthController } from "./controllers/auth.js"; import { HomeController } from "./controllers/home.js"; import { UserController } from "./controllers/user.js"; -import ApiClient from "./services/api-client.js"; -import ContactService from "./services/contact.js"; -import SocketService from "./services/socket.js"; -import SessionService, { SessionType } from "./services/session.js"; -import StorageService from "./services/storage.js"; - -import { User } from "./models/user.js"; +import { + SessionService, + SocketService, + startServices, + stopServices, +} from "./services/index.js"; +import { SessionType } from "./services/session.js"; class DtpWebAppServer implements DtpComponent { private log: DtpLog; @@ -67,7 +69,8 @@ class DtpWebAppServer implements DtpComponent { async start(): Promise { this.hookProcessSignals(); - await this.startServices(); + await startServices(); + await this.createExpressApp(); await this.startHttpServer(); @@ -78,14 +81,9 @@ class DtpWebAppServer implements DtpComponent { async stop(): Promise { await this.stopHttpServer(); - return 0; - } + await stopServices(); - async startServices(): Promise { - await ApiClient.start(); - await ContactService.start(); - await SocketService.start(); - await StorageService.start(); + return 0; } async createExpressApp(): Promise { diff --git a/gadget-code/src/web-cli.ts b/gadget-code/src/web-cli.ts index 56cdbe9..b9f6511 100644 --- a/gadget-code/src/web-cli.ts +++ b/gadget-code/src/web-cli.ts @@ -6,22 +6,40 @@ import { v4 as uuidv4 } from "uuid"; import "./lib/db.js"; +/* + * Models + */ + import ApiClient, { ApiClientStatus } from "./models/api-client.js"; import User from "./models/user.js"; import AiProvider from "./models/ai-provider.js"; -import ApiClientService from "./services/api-client.js"; -import CryptoService from "./services/crypto.js"; -import UserService from "./services/user.js"; +/* + * Services + */ + +import { + startServices, + stopServices, + ApiClientService, + UserService, + CryptoService, +} from "./services/index.js"; + +/* + * App Logic + */ -import { DtpProcess } from "./lib/process.js"; import { createAiApi, type IAiLogger } from "@gadget/ai"; + import { type IAiModel, type IAiModelCapabilities, type IAiModelSettings, } from "@gadget/api"; +import { DtpProcess } from "./lib/process.js"; + class DtpWebCli extends DtpProcess { get name(): string { return "DtpWebCli"; @@ -547,22 +565,17 @@ class DtpWebCli extends DtpProcess { })), }); } - - async start(): Promise { - await this.startServices(); - } - - async startServices(): Promise { - await ApiClientService.start(); - await (await import("./services/chat-session.js")).default.start(); - } } (async () => { try { + await startServices(); + const cli = new DtpWebCli(); - await cli.start(); await cli.run(process.argv.slice(2)); + + await stopServices(); + process.exit(0); } catch (error) { console.error((error as Error).message); diff --git a/gadget-drone/src/services/platform.ts b/gadget-drone/src/services/platform.ts index 5654ee0..36e7014 100644 --- a/gadget-drone/src/services/platform.ts +++ b/gadget-drone/src/services/platform.ts @@ -69,6 +69,7 @@ class PlatformService extends GadgetService { }); const json = (await response.json()) as PlatformRegistrationResponse; + this.log.debug("platform registration response", json); if (!json.success) { const error = new Error("failed to register drone with Platform"); error.name = "PlatformError";