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 {