mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-30 12:11:56 +00:00
108 lines
3.0 KiB
TypeScript
108 lines
3.0 KiB
TypeScript
import { Injectable } from '@angular/core'
|
|
import { InterfaceDef, PackageDataEntry, PackageMainStatus, PackageState } from './patch-db/data-model'
|
|
|
|
const { patchDb, api, mocks } = require('../../../config.json') as UiConfig
|
|
|
|
type UiConfig = {
|
|
patchDb: {
|
|
poll: {
|
|
cooldown: number /* in ms */
|
|
}
|
|
}
|
|
api: {
|
|
url: string
|
|
version: string
|
|
}
|
|
mocks: {
|
|
enabled: boolean
|
|
connection: 'ws' | 'poll'
|
|
rpcPort: number
|
|
wsPort: number
|
|
maskAs: 'tor' | 'lan'
|
|
skipStartupAlerts: boolean
|
|
}
|
|
}
|
|
|
|
@Injectable({
|
|
providedIn: 'root',
|
|
})
|
|
export class ConfigService {
|
|
origin = removePort(removeProtocol(window.origin))
|
|
version = require('../../../package.json').version
|
|
|
|
patchDb = patchDb
|
|
api = api
|
|
mocks = mocks
|
|
|
|
skipStartupAlerts = mocks.enabled && mocks.skipStartupAlerts
|
|
isConsulate = window['platform'] === 'ios'
|
|
|
|
isTor (): boolean {
|
|
return (mocks.enabled && mocks.maskAs === 'tor') || this.origin.endsWith('.onion')
|
|
}
|
|
|
|
isLan (): boolean {
|
|
return (mocks.enabled && mocks.maskAs === 'lan') || this.origin.endsWith('.local')
|
|
}
|
|
|
|
usePoll (): boolean {
|
|
return this.isConsulate || (mocks.enabled && mocks.connection === 'poll')
|
|
}
|
|
|
|
isLaunchable (state: PackageState, status: PackageMainStatus, interfaces: { [id: string]: InterfaceDef }): boolean {
|
|
if (this.isConsulate || state !== PackageState.Installed) {
|
|
return false
|
|
}
|
|
|
|
return status === PackageMainStatus.Running &&
|
|
(
|
|
(hasTorUi(interfaces) && this.isTor()) ||
|
|
(hasLanUi(interfaces) && !this.isTor())
|
|
)
|
|
}
|
|
|
|
launchableURL (pkg: PackageDataEntry): string {
|
|
return this.isTor() ? `http://${torUiAddress(pkg)}` : `https://${lanUiAddress(pkg)}`
|
|
}
|
|
}
|
|
|
|
export function hasTorUi (interfaces: { [id: string]: InterfaceDef }): boolean {
|
|
return !!Object.values(interfaces).find(i => i.ui && i['tor-config'])
|
|
}
|
|
|
|
export function hasLanUi (interfaces: { [id: string]: InterfaceDef }): boolean {
|
|
return !!Object.values(interfaces).find(i => i.ui && i['lan-config'])
|
|
}
|
|
|
|
export function torUiAddress (pkg: PackageDataEntry): string {
|
|
const interfaces = pkg.manifest.interfaces
|
|
const id = Object.keys(interfaces).find(key => {
|
|
const val = interfaces[key]
|
|
return val.ui && val['tor-config']
|
|
})
|
|
return pkg.installed['interface-info'].addresses[id]['tor-address']
|
|
}
|
|
|
|
export function lanUiAddress (pkg: PackageDataEntry): string {
|
|
const interfaces = pkg.manifest.interfaces
|
|
const id = Object.keys(interfaces).find(key => {
|
|
const val = interfaces[key]
|
|
return val.ui && val['lan-config']
|
|
})
|
|
return pkg.installed['interface-info'].addresses[id]['lan-address']
|
|
}
|
|
|
|
export function hasUi (interfaces: { [id: string]: InterfaceDef }): boolean {
|
|
return hasTorUi(interfaces) || hasLanUi(interfaces)
|
|
}
|
|
|
|
function removeProtocol (str: string): string {
|
|
if (str.startsWith('http://')) return str.slice(7)
|
|
if (str.startsWith('https://')) return str.slice(8)
|
|
return str
|
|
}
|
|
|
|
function removePort (str: string): string {
|
|
return str.split(':')[0]
|
|
}
|