diff --git a/web/projects/setup-wizard/src/app/app.module.ts b/web/projects/setup-wizard/src/app/app.module.ts index fc23c15f2..cbfe318e6 100644 --- a/web/projects/setup-wizard/src/app/app.module.ts +++ b/web/projects/setup-wizard/src/app/app.module.ts @@ -2,7 +2,11 @@ import { HttpClientModule } from '@angular/common/http' import { NgModule } from '@angular/core' import { BrowserAnimationsModule } from '@angular/platform-browser/animations' import { PreloadAllModules, RouterModule } from '@angular/router' -import { RELATIVE_URL, WorkspaceConfig } from '@start9labs/shared' +import { + provideSetupLogsService, + RELATIVE_URL, + WorkspaceConfig, +} from '@start9labs/shared' import { tuiButtonOptionsProvider, TuiRoot } from '@taiga-ui/core' import { NG_EVENT_PLUGINS } from '@taiga-ui/event-plugins' import { ApiService } from 'src/app/services/api.service' @@ -29,6 +33,7 @@ const { ], providers: [ NG_EVENT_PLUGINS, + provideSetupLogsService(ApiService), tuiButtonOptionsProvider({ size: 'm' }), { provide: ApiService, diff --git a/web/projects/setup-wizard/src/app/pages/loading.page.ts b/web/projects/setup-wizard/src/app/pages/loading.page.ts index e146b9aa8..c367968d5 100644 --- a/web/projects/setup-wizard/src/app/pages/loading.page.ts +++ b/web/projects/setup-wizard/src/app/pages/loading.page.ts @@ -21,6 +21,7 @@ import { StateService } from 'src/app/services/state.service' @Component({ standalone: true, template: '', + styles: ':host { max-width: unset; align-items: stretch; }', imports: [InitializingComponent], changeDetection: ChangeDetectionStrategy.OnPush, }) diff --git a/web/projects/setup-wizard/src/app/services/api.service.ts b/web/projects/setup-wizard/src/app/services/api.service.ts index 882d656ae..912f2378f 100644 --- a/web/projects/setup-wizard/src/app/services/api.service.ts +++ b/web/projects/setup-wizard/src/app/services/api.service.ts @@ -2,6 +2,9 @@ import * as jose from 'node-jose' import { DiskInfo, DiskListResponse, + FollowLogsReq, + FollowLogsRes, + Log, PartitionInfo, StartOSDiskInfo, } from '@start9labs/shared' @@ -22,6 +25,10 @@ export abstract class ApiService { abstract execute(setupInfo: T.SetupExecuteParams): Promise // setup.execute abstract complete(): Promise // setup.complete abstract exit(): Promise // setup.exit + abstract followServerLogs(params: FollowLogsReq): Promise // setup.logs.follow + abstract openLogsWebsocket$( + config: WebSocketSubjectConfig, + ): Observable abstract openProgressWebsocket$(guid: string): Observable async encrypt(toEncrypt: string): Promise { diff --git a/web/projects/setup-wizard/src/app/services/live-api.service.ts b/web/projects/setup-wizard/src/app/services/live-api.service.ts index 161b611ca..797a8a176 100644 --- a/web/projects/setup-wizard/src/app/services/live-api.service.ts +++ b/web/projects/setup-wizard/src/app/services/live-api.service.ts @@ -3,8 +3,11 @@ import { Inject, Injectable } from '@angular/core' import { DiskListResponse, encodeBase64, + FollowLogsReq, + FollowLogsRes, HttpService, isRpcError, + Log, RpcError, RPCOptions, StartOSDiskInfo, @@ -12,7 +15,7 @@ import { import { T } from '@start9labs/start-sdk' import * as jose from 'node-jose' import { Observable } from 'rxjs' -import { webSocket } from 'rxjs/webSocket' +import { webSocket, WebSocketSubjectConfig } from 'rxjs/webSocket' import { ApiService } from './api.service' @Injectable({ @@ -96,6 +99,14 @@ export class LiveApiService extends ApiService { }) } + async followServerLogs(params: FollowLogsReq): Promise { + return this.rpcRequest({ method: 'setup.logs.follow', params }) + } + + openLogsWebsocket$({ url }: WebSocketSubjectConfig): Observable { + return webSocket(`http://start.local/ws/${url}`) + } + async complete(): Promise { const res = await this.rpcRequest({ method: 'setup.complete', diff --git a/web/projects/setup-wizard/src/app/services/mock-api.service.ts b/web/projects/setup-wizard/src/app/services/mock-api.service.ts index 6199e9c2a..ed8435ddf 100644 --- a/web/projects/setup-wizard/src/app/services/mock-api.service.ts +++ b/web/projects/setup-wizard/src/app/services/mock-api.service.ts @@ -2,12 +2,16 @@ import { Injectable } from '@angular/core' import { DiskListResponse, encodeBase64, + FollowLogsReq, + FollowLogsRes, + Log, pauseFor, StartOSDiskInfo, } from '@start9labs/shared' import { T } from '@start9labs/start-sdk' import * as jose from 'node-jose' -import { Observable, of } from 'rxjs' +import { interval, map, Observable, of } from 'rxjs' +import { WebSocketSubjectConfig } from 'rxjs/webSocket' import { ApiService } from './api.service' @Injectable({ @@ -266,6 +270,24 @@ export class MockApiService extends ApiService { } } + async followServerLogs(params: FollowLogsReq): Promise { + await pauseFor(1000) + return { + startCursor: 'fakestartcursor', + guid: 'fake-guid', + } + } + + openLogsWebsocket$(config: WebSocketSubjectConfig): Observable { + return interval(500).pipe( + map(() => ({ + timestamp: new Date().toISOString(), + message: 'fake log entry', + bootId: 'boot-id', + })), + ) + } + async complete(): Promise { await pauseFor(1000) return { diff --git a/web/projects/shared/src/components/initializing/initializing.component.ts b/web/projects/shared/src/components/initializing/initializing.component.ts index 524c80ff8..fd471cbb1 100644 --- a/web/projects/shared/src/components/initializing/initializing.component.ts +++ b/web/projects/shared/src/components/initializing/initializing.component.ts @@ -23,7 +23,7 @@ import { LogsWindowComponent } from './logs-window.component' >

{{ progress.message }}

- + `, styles: ` section {