more web cleanup

This commit is contained in:
Eugene Pankov 2021-06-19 22:52:18 +02:00
parent 6742c77378
commit b60c36054f
No known key found for this signature in database
GPG Key ID: 5896FCBBDD1CF4F4
25 changed files with 105 additions and 62 deletions

View File

@ -20,7 +20,6 @@ export { FileProvider } from './fileProvider'
export { AppService } from '../services/app.service' export { AppService } from '../services/app.service'
export { ConfigService } from '../services/config.service' export { ConfigService } from '../services/config.service'
export { DockingService, Screen } from '../services/docking.service' export { DockingService, Screen } from '../services/docking.service'
export { ElectronService } from '../services/electron.service'
export { Logger, ConsoleLogger, LogService } from '../services/log.service' export { Logger, ConsoleLogger, LogService } from '../services/log.service'
export { HomeBaseService } from '../services/homeBase.service' export { HomeBaseService } from '../services/homeBase.service'
export { HotkeysService } from '../services/hotkeys.service' export { HotkeysService } from '../services/hotkeys.service'

View File

@ -1,5 +1,5 @@
import { NgModule } from '@angular/core' import { NgModule } from '@angular/core'
import { PlatformService, LogService, UpdaterService, DockingService, HostAppService, ThemesService, Platform, AppService, ConfigService, ElectronService, WIN_BUILD_FLUENT_BG_SUPPORTED, isWindowsBuild, HostWindowService, HotkeyProvider, ConfigProvider, FileProvider } from 'terminus-core' import { PlatformService, LogService, UpdaterService, DockingService, HostAppService, ThemesService, Platform, AppService, ConfigService, WIN_BUILD_FLUENT_BG_SUPPORTED, isWindowsBuild, HostWindowService, HotkeyProvider, ConfigProvider, FileProvider } from 'terminus-core'
import { TerminalColorSchemeProvider } from 'terminus-terminal' import { TerminalColorSchemeProvider } from 'terminus-terminal'
import { HyperColorSchemes } from './colorSchemes' import { HyperColorSchemes } from './colorSchemes'
@ -11,6 +11,7 @@ import { ElectronDockingService } from './services/docking.service'
import { ElectronHostWindow } from './services/hostWindow.service' import { ElectronHostWindow } from './services/hostWindow.service'
import { ElectronFileProvider } from './services/fileProvider.service' import { ElectronFileProvider } from './services/fileProvider.service'
import { ElectronHostAppService } from './services/hostApp.service' import { ElectronHostAppService } from './services/hostApp.service'
import { ElectronService } from './services/electron.service'
import { ElectronHotkeyProvider } from './hotkeys' import { ElectronHotkeyProvider } from './hotkeys'
import { ElectronConfigProvider } from './config' import { ElectronConfigProvider } from './config'
@ -116,4 +117,4 @@ export default class ElectronModule {
} }
} }
export { ElectronHostWindow, ElectronHostAppService } export { ElectronHostWindow, ElectronHostAppService, ElectronService }

View File

@ -1,6 +1,7 @@
import { Injectable, NgZone } from '@angular/core' import { Injectable, NgZone } from '@angular/core'
import type { Display } from 'electron' import type { Display } from 'electron'
import { ConfigService, ElectronService, DockingService, Screen, PlatformService } from 'terminus-core' import { ConfigService, DockingService, Screen, PlatformService } from 'terminus-core'
import { ElectronService } from '../services/electron.service'
import { ElectronHostWindow, Bounds } from './hostWindow.service' import { ElectronHostWindow, Bounds } from './hostWindow.service'
@Injectable() @Injectable()

View File

@ -1,6 +1,7 @@
import { promises as fs } from 'fs' import { promises as fs } from 'fs'
import { Injectable } from '@angular/core' import { Injectable } from '@angular/core'
import { ElectronService, FileProvider } from 'terminus-core' import { FileProvider } from 'terminus-core'
import { ElectronService } from '../services/electron.service'
import { ElectronHostWindow } from './hostWindow.service' import { ElectronHostWindow } from './hostWindow.service'
@Injectable() @Injectable()

View File

@ -1,5 +1,6 @@
import { Injectable, NgZone, Injector } from '@angular/core' import { Injectable, NgZone, Injector } from '@angular/core'
import { ElectronService, isWindowsBuild, WIN_BUILD_FLUENT_BG_SUPPORTED, HostAppService, Platform, CLIHandler } from 'terminus-core' import { isWindowsBuild, WIN_BUILD_FLUENT_BG_SUPPORTED, HostAppService, Platform, CLIHandler } from 'terminus-core'
import { ElectronService } from '../services/electron.service'
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })

View File

@ -1,6 +1,7 @@
import type { BrowserWindow, TouchBar } from 'electron' import type { BrowserWindow, TouchBar } from 'electron'
import { Injectable, Inject, NgZone } from '@angular/core' import { Injectable, Inject, NgZone } from '@angular/core'
import { BootstrapData, BOOTSTRAP_DATA, ElectronService, HostWindowService } from 'terminus-core' import { BootstrapData, BOOTSTRAP_DATA, HostWindowService } from 'terminus-core'
import { ElectronService } from '../services/electron.service'
export interface Bounds { export interface Bounds {
x: number x: number

View File

@ -2,7 +2,8 @@ import * as fs from 'fs'
import * as path from 'path' import * as path from 'path'
import * as winston from 'winston' import * as winston from 'winston'
import { Injectable } from '@angular/core' import { Injectable } from '@angular/core'
import { ConsoleLogger, Logger, ElectronService } from 'terminus-core' import { ConsoleLogger, Logger } from 'terminus-core'
import { ElectronService } from '../services/electron.service'
const initializeWinston = (electron: ElectronService) => { const initializeWinston = (electron: ElectronService) => {
const logDirectory = electron.app.getPath('userData') const logDirectory = electron.app.getPath('userData')

View File

@ -5,7 +5,8 @@ import * as os from 'os'
import promiseIpc from 'electron-promise-ipc' import promiseIpc from 'electron-promise-ipc'
import { execFile } from 'mz/child_process' import { execFile } from 'mz/child_process'
import { Injectable, NgZone } from '@angular/core' import { Injectable, NgZone } from '@angular/core'
import { PlatformService, ClipboardContent, HostAppService, Platform, ElectronService, MenuItemOptions, MessageBoxOptions, MessageBoxResult, FileUpload, FileDownload, FileUploadOptions, wrapPromise } from 'terminus-core' import { PlatformService, ClipboardContent, HostAppService, Platform, MenuItemOptions, MessageBoxOptions, MessageBoxResult, FileUpload, FileDownload, FileUploadOptions, wrapPromise } from 'terminus-core'
import { ElectronService } from '../services/electron.service'
import { ElectronHostWindow } from './hostWindow.service' import { ElectronHostWindow } from './hostWindow.service'
const fontManager = require('fontmanager-redux') // eslint-disable-line const fontManager = require('fontmanager-redux') // eslint-disable-line

View File

@ -2,7 +2,8 @@ import * as path from 'path'
import * as fs from 'mz/fs' import * as fs from 'mz/fs'
import { exec } from 'mz/child_process' import { exec } from 'mz/child_process'
import { Injectable } from '@angular/core' import { Injectable } from '@angular/core'
import { ElectronService, HostAppService, Platform } from 'terminus-core' import { HostAppService, Platform } from 'terminus-core'
import { ElectronService } from '../services/electron.service'
/* eslint-disable block-scoped-var */ /* eslint-disable block-scoped-var */

View File

@ -1,6 +1,7 @@
import { SegmentedControlSegment, TouchBarSegmentedControl } from 'electron' import { SegmentedControlSegment, TouchBarSegmentedControl } from 'electron'
import { Injectable, NgZone } from '@angular/core' import { Injectable, NgZone } from '@angular/core'
import { AppService, HostAppService, Platform, ElectronService } from 'terminus-core' import { AppService, HostAppService, Platform } from 'terminus-core'
import { ElectronService } from '../services/electron.service'
import { ElectronHostWindow } from './hostWindow.service' import { ElectronHostWindow } from './hostWindow.service'
/** @hidden */ /** @hidden */

View File

@ -1,7 +1,8 @@
import { Injectable } from '@angular/core' import { Injectable } from '@angular/core'
import axios from 'axios' import axios from 'axios'
import { Logger, LogService, ElectronService, ConfigService, UpdaterService, PlatformService } from 'terminus-core' import { Logger, LogService, ConfigService, UpdaterService, PlatformService } from 'terminus-core'
import { ElectronService } from '../services/electron.service'
const UPDATES_URL = 'https://api.github.com/repos/eugeny/terminus/releases/latest' const UPDATES_URL = 'https://api.github.com/repos/eugeny/terminus/releases/latest'

View File

@ -1,6 +1,7 @@
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { Injectable } from '@angular/core' import { Injectable } from '@angular/core'
import { ToolbarButtonProvider, ToolbarButton, ElectronService, ConfigService, SelectorOption, AppService } from 'terminus-core' import { ToolbarButtonProvider, ToolbarButton, ConfigService, SelectorOption, AppService } from 'terminus-core'
import { ElectronService } from 'terminus-electron'
import { TerminalService } from './services/terminal.service' import { TerminalService } from './services/terminal.service'

View File

@ -1,8 +1,8 @@
import { Component } from '@angular/core' import { Component } from '@angular/core'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { Subscription } from 'rxjs' import { Subscription } from 'rxjs'
import { ConfigService, ElectronService, HostAppService, Platform, WIN_BUILD_CONPTY_SUPPORTED, WIN_BUILD_CONPTY_STABLE, isWindowsBuild } from 'terminus-core' import { ConfigService, HostAppService, Platform, WIN_BUILD_CONPTY_SUPPORTED, WIN_BUILD_CONPTY_STABLE, isWindowsBuild } from 'terminus-core'
import { ElectronHostWindow } from 'terminus-electron' import { ElectronService, ElectronHostWindow } from 'terminus-electron'
import { EditProfileModalComponent } from './editProfileModal.component' import { EditProfileModalComponent } from './editProfileModal.component'
import { Shell, Profile } from '../api' import { Shell, Profile } from '../api'
import { TerminalService } from '../services/terminal.service' import { TerminalService } from '../services/terminal.service'

View File

@ -1,5 +1,6 @@
import { NgZone, Injectable } from '@angular/core' import { NgZone, Injectable } from '@angular/core'
import { ElectronService, ConfigService, HostAppService, Platform } from 'terminus-core' import { ConfigService, HostAppService, Platform } from 'terminus-core'
import { ElectronService } from 'terminus-electron'
import { TerminalService } from './terminal.service' import { TerminalService } from './terminal.service'
/** @hidden */ /** @hidden */

View File

@ -1,6 +1,7 @@
import * as path from 'path' import * as path from 'path'
import { Injectable } from '@angular/core' import { Injectable } from '@angular/core'
import { ElectronService, WIN_BUILD_CONPTY_SUPPORTED, isWindowsBuild } from 'terminus-core' import { WIN_BUILD_CONPTY_SUPPORTED, isWindowsBuild } from 'terminus-core'
import { ElectronService } from 'terminus-electron'
import { SessionOptions } from '../api' import { SessionOptions } from '../api'
/** @hidden */ /** @hidden */

View File

@ -1,6 +1,7 @@
import * as path from 'path' import * as path from 'path'
import { Injectable } from '@angular/core' import { Injectable } from '@angular/core'
import { HostAppService, Platform, ElectronService } from 'terminus-core' import { HostAppService, Platform } from 'terminus-core'
import { ElectronService } from 'terminus-electron'
import { ShellProvider, Shell } from '../api' import { ShellProvider, Shell } from '../api'

View File

@ -65,7 +65,7 @@
input(type='radio', ngbButton, [value]='"publicKey"') input(type='radio', ngbButton, [value]='"publicKey"')
i.fas.fa-key i.fas.fa-key
.m-0 Key .m-0 Key
label.btn.btn-secondary(ngbButtonLabel) label.btn.btn-secondary(ngbButtonLabel, ng:if='hostApp.platform !== Platform.Web')
input(type='radio', ngbButton, [value]='"agent"') input(type='radio', ngbButton, [value]='"agent"')
i.fas.fa-user-secret i.fas.fa-user-secret
.m-0 Agent .m-0 Agent
@ -117,12 +117,12 @@
option(value='') None option(value='') None
option([ngValue]='x.name', *ngFor='let x of config.store.ssh.connections') {{x.name}} option([ngValue]='x.name', *ngFor='let x of config.store.ssh.connections') {{x.name}}
.form-line .form-line(ng:if='hostApp.platform !== Platform.Web')
.header .header
.title X11 forwarding .title X11 forwarding
toggle([(ngModel)]='connection.x11') toggle([(ngModel)]='connection.x11')
.form-line .form-line(ng:if='hostApp.platform !== Platform.Web')
.header .header
.title Agent forwarding .title Agent forwarding
toggle([(ngModel)]='connection.agentForward') toggle([(ngModel)]='connection.agentForward')
@ -176,7 +176,7 @@
[(ngModel)]='connection.readyTimeout', [(ngModel)]='connection.readyTimeout',
) )
.form-line(*ngIf='!connection.jumpHost') .form-line(*ngIf='!connection.jumpHost && hostApp.platform !== Platform.Web')
.header .header
.title Use a proxy command .title Use a proxy command
.description Command's stdin/stdout is used instead of a network connection .description Command's stdin/stdout is used instead of a network connection

View File

@ -4,7 +4,7 @@ import { NgbModal, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'
import { Observable } from 'rxjs' import { Observable } from 'rxjs'
import { debounceTime, distinctUntilChanged, map } from 'rxjs/operators' import { debounceTime, distinctUntilChanged, map } from 'rxjs/operators'
import { ConfigService, PlatformService, FileProvidersService } from 'terminus-core' import { ConfigService, PlatformService, FileProvidersService, Platform, HostAppService } from 'terminus-core'
import { PasswordStorageService } from '../services/passwordStorage.service' import { PasswordStorageService } from '../services/passwordStorage.service'
import { SSHConnection, LoginScript, ForwardedPortConfig, SSHAlgorithmType, ALGORITHM_BLACKLIST } from '../api' import { SSHConnection, LoginScript, ForwardedPortConfig, SSHAlgorithmType, ALGORITHM_BLACKLIST } from '../api'
import { PromptModalComponent } from './promptModal.component' import { PromptModalComponent } from './promptModal.component'
@ -15,6 +15,7 @@ import * as ALGORITHMS from 'ssh2/lib/protocol/constants'
template: require('./editConnectionModal.component.pug'), template: require('./editConnectionModal.component.pug'),
}) })
export class EditConnectionModalComponent { export class EditConnectionModalComponent {
Platform = Platform
connection: SSHConnection connection: SSHConnection
hasSavedPassword: boolean hasSavedPassword: boolean
useProxyCommand: boolean useProxyCommand: boolean
@ -27,6 +28,7 @@ export class EditConnectionModalComponent {
constructor ( constructor (
public config: ConfigService, public config: ConfigService,
public hostApp: HostAppService,
private modalInstance: NgbActiveModal, private modalInstance: NgbActiveModal,
private platform: PlatformService, private platform: PlatformService,
private passwordStorage: PasswordStorageService, private passwordStorage: PasswordStorageService,

View File

@ -15,7 +15,10 @@
i.fas.fa-flask i.fas.fa-flask
span Experimental span Experimental
button.btn.btn-secondary((click)='showPortForwarding()', *ngIf='session && session.open') button.btn.btn-secondary(
*ngIf='session && session.open && hostApp.platform !== Platform.Web',
(click)='showPortForwarding()'
)
i.fas.fa-plug i.fas.fa-plug
span Ports span Ports

View File

@ -3,7 +3,7 @@ import { Spinner } from 'cli-spinner'
import { Component, Injector, HostListener } from '@angular/core' import { Component, Injector, HostListener } from '@angular/core'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { first } from 'rxjs/operators' import { first } from 'rxjs/operators'
import { RecoveryToken } from 'terminus-core' import { Platform, RecoveryToken } from 'terminus-core'
import { BaseTerminalTabComponent } from 'terminus-terminal' import { BaseTerminalTabComponent } from 'terminus-terminal'
import { SSHService } from '../services/ssh.service' import { SSHService } from '../services/ssh.service'
import { SSHConnection, SSHSession } from '../api' import { SSHConnection, SSHSession } from '../api'
@ -18,6 +18,7 @@ import { SSHPortForwardingModalComponent } from './sshPortForwardingModal.compon
animations: BaseTerminalTabComponent.animations, animations: BaseTerminalTabComponent.animations,
}) })
export class SSHTabComponent extends BaseTerminalTabComponent { export class SSHTabComponent extends BaseTerminalTabComponent {
Platform = Platform
connection?: SSHConnection connection?: SSHConnection
session: SSHSession|null = null session: SSHSession|null = null
sftpPanelVisible = false sftpPanelVisible = false

View File

@ -158,7 +158,7 @@ export class XTermFrontend extends Frontend {
this.opened = true this.opened = true
// Work around font loading bugs // Work around font loading bugs
await new Promise(resolve => setTimeout(resolve, process.env.XWEB ? 1000 : 0)) await new Promise(resolve => setTimeout(resolve, this.hostApp.platform === Platform.Web ? 1000 : 0))
if (this.enableWebGL) { if (this.enableWebGL) {
this.webGLAddon = new WebglAddon() this.webGLAddon = new WebglAddon()

View File

@ -6,3 +6,6 @@ import '@fortawesome/fontawesome-free/css/regular.css'
import '@fortawesome/fontawesome-free/css/fontawesome.css' import '@fortawesome/fontawesome-free/css/fontawesome.css'
import 'ngx-toastr/toastr.css' import 'ngx-toastr/toastr.css'
import '../app/src/preload.scss' import '../app/src/preload.scss'
// Required before other imports
import './polyfills.buffer'

View File

@ -234,3 +234,13 @@ export function hexSlice (start, end) {
} }
return out return out
} }
import { Buffer } from 'buffer'
Buffer.prototype['latin1Slice'] = latin1Slice
Buffer.prototype['utf8Slice'] = utf8Slice
Buffer.prototype['base64Slice'] = base64Slice
Buffer.prototype['utf8Write'] = utf8Write
Buffer.prototype['hexSlice'] = hexSlice
window['Buffer'] = Buffer

View File

@ -1,3 +1,5 @@
/* eslint-disable @typescript-eslint/no-empty-function */
/* eslint-disable @typescript-eslint/no-extraneous-class */
import * as angularCoreModule from '@angular/core' import * as angularCoreModule from '@angular/core'
import * as angularCompilerModule from '@angular/compiler' import * as angularCompilerModule from '@angular/compiler'
import * as angularCommonModule from '@angular/common' import * as angularCommonModule from '@angular/common'
@ -9,49 +11,53 @@ import * as angularAnimationsModule from '@angular/animations'
import * as ngBootstrapModule from '@ng-bootstrap/ng-bootstrap' import * as ngBootstrapModule from '@ng-bootstrap/ng-bootstrap'
import * as ngxToastrModule from 'ngx-toastr' import * as ngxToastrModule from 'ngx-toastr'
import { Buffer } from 'buffer' import './polyfills.buffer'
import { base64Slice, hexSlice, latin1Slice, utf8Slice, utf8Write } from './polyfills.buffer' import { Duplex } from 'stream-browserify'
window['Buffer'] = Buffer export class SocketProxy extends Duplex {
socket: any
Buffer.prototype['latin1Slice'] = latin1Slice constructor (...args) {
Buffer.prototype['utf8Slice'] = utf8Slice super({
Buffer.prototype['base64Slice'] = base64Slice allowHalfOpen: false,
Buffer.prototype['utf8Write'] = utf8Write })
Buffer.prototype['hexSlice'] = hexSlice this.socket = new window['__connector__'].Socket(...args)
this.socket.connect$.subscribe(() => this['emit']('connect'))
this.socket.data$.subscribe(data => this['emit']('data', Buffer.from(data)))
}
connect (...args) {
this.socket.connect(...args)
}
setNoDelay () { }
setTimeout () { }
_read (_size: number): void { }
_write (chunk: Buffer, _encoding: string, callback: (error?: Error | null) => void): void {
this.socket.write(chunk)
callback()
}
_destroy (error: Error|null, callback: (error: Error|null) => void): void {
this.socket.close(error)
callback(error)
}
}
const mocks = { const mocks = {
fs: { fs: {
// console.warn('mock realPathSync', path)
// return path
// },
// existsSync: path => {
// console.warn('mock existsSync', path)
// return false
// },
realpathSync: () => null, realpathSync: () => null,
readdir: () => null, readdir: () => null,
stat: () => null, stat: () => null,
appendFile: () => null, appendFile: () => null,
// mkdir: path => {
// console.warn('mock mkdir', path)
// },
// mkdirSync: path => {
// console.warn('mock mkdirSync', path)
// },
// writeFileSync: () => null,
// readFileSync: (path) => {
// return ''
// },
// readFile: (path, enc, cb) => {
// console.warn('mock readFile', path)
// cb('UNKNOWN', null)
// },
constants: {}, constants: {},
}, },
buffer: { buffer: {
Buffer, Buffer: window['Buffer'],
}, },
crypto: { crypto: {
...require('crypto-browserify'), ...require('crypto-browserify'),
@ -81,6 +87,9 @@ const mocks = {
url: { url: {
parse: () => null, parse: () => null,
}, },
net: {
Socket: SocketProxy,
},
http: { http: {
Agent: class {}, Agent: class {},
request: {}, request: {},
@ -117,10 +126,13 @@ const mocks = {
}, },
}, },
dns: {}, dns: {},
socksv5: {},
util: require('util/'), util: require('util/'),
keytar: { keytar: {
getPassword: () => null, getPassword: () => null,
}, },
'./crypto/build/Release/sshcrypto.node': {},
'../build/Release/cpufeatures.node': {},
} }
const builtins = { const builtins = {
@ -157,18 +169,17 @@ mockRequire['resolve'] = (() => null) as any
Object.assign(window, { Object.assign(window, {
require: mockRequire, require: mockRequire,
module: {
paths: [],
},
__dirname: '__dirname',
setImmediate: setTimeout as any,
}) })
window['require'].main = { window['require'].main = {
paths: [], paths: [],
} as any } as any
window['module'] = {
paths: [],
} as any
window['__dirname'] = '__dirname'
window['setImmediate'] = setTimeout as any
mocks.module['prototype'] = { require: window['require'] } mocks.module['prototype'] = { require: window['require'] }
mocks.assert.assertNotStrictEqual = () => true mocks.assert.assertNotStrictEqual = () => true
mocks.assert.notStrictEqual = () => true mocks.assert.notStrictEqual = () => true