mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-26 10:21:52 +00:00
* refactor: isolate network toast and login redirect to separate services * chore: remove accidentally committed sketch of a service * chore: tidying things up * feat: add `GlobalModule` encapsulating all global subscription services * remove angular build cache when building deps * chore: fix more issues found while testing * chore: fix issues reported by testing * chore: fix template error * chore: fix server-info * chore: fix server-info * fix: switch to Observable to fix race conditions * fix embassy name display on load * update patchdb * clean up patch data watch Co-authored-by: Lucy Cifferello <12953208+elvece@users.noreply.github.com>
101 lines
2.6 KiB
TypeScript
101 lines
2.6 KiB
TypeScript
import { Injectable } from '@angular/core'
|
|
import { BehaviorSubject } from 'rxjs'
|
|
import {
|
|
ApiService,
|
|
CifsRecoverySource,
|
|
DiskRecoverySource,
|
|
} from './api/api.service'
|
|
import { pauseFor, ErrorToastService } from '@start9labs/shared'
|
|
|
|
@Injectable({
|
|
providedIn: 'root',
|
|
})
|
|
export class StateService {
|
|
hasProductKey: boolean
|
|
isMigrating: boolean
|
|
|
|
polling = false
|
|
embassyLoaded = false
|
|
|
|
recoverySource: CifsRecoverySource | DiskRecoverySource
|
|
recoveryPassword: string
|
|
|
|
dataTransferProgress: {
|
|
bytesTransferred: number
|
|
totalBytes: number
|
|
complete: boolean
|
|
} | null
|
|
dataProgress = 0
|
|
dataCompletionSubject = new BehaviorSubject(false)
|
|
|
|
torAddress: string
|
|
lanAddress: string
|
|
cert: string
|
|
|
|
constructor(
|
|
private readonly apiService: ApiService,
|
|
private readonly errorToastService: ErrorToastService,
|
|
) {}
|
|
|
|
async pollDataTransferProgress() {
|
|
this.polling = true
|
|
await pauseFor(500)
|
|
|
|
if (this.dataTransferProgress?.complete) {
|
|
this.dataCompletionSubject.next(true)
|
|
return
|
|
}
|
|
|
|
let progress
|
|
try {
|
|
progress = await this.apiService.getRecoveryStatus()
|
|
} catch (e: any) {
|
|
this.errorToastService.present({
|
|
message: `${e.message}\n\nRestart Embassy to try again.`,
|
|
})
|
|
}
|
|
if (progress) {
|
|
this.dataTransferProgress = {
|
|
bytesTransferred: progress['bytes-transferred'],
|
|
totalBytes: progress['total-bytes'],
|
|
complete: progress.complete,
|
|
}
|
|
if (this.dataTransferProgress.totalBytes) {
|
|
this.dataProgress =
|
|
this.dataTransferProgress.bytesTransferred /
|
|
this.dataTransferProgress.totalBytes
|
|
}
|
|
}
|
|
setTimeout(() => this.pollDataTransferProgress(), 0) // prevent call stack from growing
|
|
}
|
|
|
|
async importDrive(guid: string): Promise<void> {
|
|
const ret = await this.apiService.importDrive(guid)
|
|
this.torAddress = ret['tor-address']
|
|
this.lanAddress = ret['lan-address']
|
|
this.cert = ret['root-ca']
|
|
}
|
|
|
|
async setupEmbassy(
|
|
storageLogicalname: string,
|
|
password: string,
|
|
): Promise<void> {
|
|
const ret = await this.apiService.setupEmbassy({
|
|
'embassy-logicalname': storageLogicalname,
|
|
'embassy-password': password,
|
|
'recovery-source': this.recoverySource || null,
|
|
'recovery-password': this.recoveryPassword || null,
|
|
})
|
|
this.torAddress = ret['tor-address']
|
|
this.lanAddress = ret['lan-address']
|
|
this.cert = ret['root-ca']
|
|
}
|
|
|
|
async completeEmbassy(): Promise<void> {
|
|
const ret = await this.apiService.setupComplete()
|
|
this.torAddress = ret['tor-address']
|
|
this.lanAddress = ret['lan-address']
|
|
this.cert = ret['root-ca']
|
|
}
|
|
}
|