From b60c36054fdcba4ebe1d548e559b3f8e7f08aea0 Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Sat, 19 Jun 2021 22:52:18 +0200 Subject: [PATCH] more web cleanup --- terminus-core/src/api/index.ts | 1 - terminus-electron/src/index.ts | 5 +- .../src/services/docking.service.ts | 3 +- .../src/services/electron.service.ts | 0 .../src/services/fileProvider.service.ts | 3 +- .../src/services/hostApp.service.ts | 3 +- .../src/services/hostWindow.service.ts | 3 +- terminus-electron/src/services/log.service.ts | 3 +- .../src/services/platform.service.ts | 3 +- .../src/services/shellIntegration.service.ts | 3 +- .../src/services/touchbar.service.ts | 3 +- .../src/services/updater.service.ts | 3 +- terminus-local/src/buttonProvider.ts | 3 +- .../components/shellSettingsTab.component.ts | 4 +- .../src/services/dockMenu.service.ts | 3 +- terminus-local/src/services/uac.service.ts | 3 +- terminus-local/src/shells/windowsStock.ts | 3 +- .../editConnectionModal.component.pug | 8 +- .../editConnectionModal.component.ts | 4 +- .../src/components/sshTab.component.pug | 5 +- .../src/components/sshTab.component.ts | 3 +- .../src/frontends/xtermFrontend.ts | 2 +- web/entry.preload.ts | 3 + web/polyfills.buffer.ts | 10 +++ web/polyfills.ts | 83 +++++++++++-------- 25 files changed, 105 insertions(+), 62 deletions(-) rename {terminus-core => terminus-electron}/src/services/electron.service.ts (100%) diff --git a/terminus-core/src/api/index.ts b/terminus-core/src/api/index.ts index 25ea4156..75a8a60c 100644 --- a/terminus-core/src/api/index.ts +++ b/terminus-core/src/api/index.ts @@ -20,7 +20,6 @@ export { FileProvider } from './fileProvider' export { AppService } from '../services/app.service' export { ConfigService } from '../services/config.service' export { DockingService, Screen } from '../services/docking.service' -export { ElectronService } from '../services/electron.service' export { Logger, ConsoleLogger, LogService } from '../services/log.service' export { HomeBaseService } from '../services/homeBase.service' export { HotkeysService } from '../services/hotkeys.service' diff --git a/terminus-electron/src/index.ts b/terminus-electron/src/index.ts index 7d90a938..da024fa2 100644 --- a/terminus-electron/src/index.ts +++ b/terminus-electron/src/index.ts @@ -1,5 +1,5 @@ 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 { HyperColorSchemes } from './colorSchemes' @@ -11,6 +11,7 @@ import { ElectronDockingService } from './services/docking.service' import { ElectronHostWindow } from './services/hostWindow.service' import { ElectronFileProvider } from './services/fileProvider.service' import { ElectronHostAppService } from './services/hostApp.service' +import { ElectronService } from './services/electron.service' import { ElectronHotkeyProvider } from './hotkeys' import { ElectronConfigProvider } from './config' @@ -116,4 +117,4 @@ export default class ElectronModule { } } -export { ElectronHostWindow, ElectronHostAppService } +export { ElectronHostWindow, ElectronHostAppService, ElectronService } diff --git a/terminus-electron/src/services/docking.service.ts b/terminus-electron/src/services/docking.service.ts index b422c1e3..63cc72e0 100644 --- a/terminus-electron/src/services/docking.service.ts +++ b/terminus-electron/src/services/docking.service.ts @@ -1,6 +1,7 @@ import { Injectable, NgZone } from '@angular/core' 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' @Injectable() diff --git a/terminus-core/src/services/electron.service.ts b/terminus-electron/src/services/electron.service.ts similarity index 100% rename from terminus-core/src/services/electron.service.ts rename to terminus-electron/src/services/electron.service.ts diff --git a/terminus-electron/src/services/fileProvider.service.ts b/terminus-electron/src/services/fileProvider.service.ts index 119d7466..c00a3276 100644 --- a/terminus-electron/src/services/fileProvider.service.ts +++ b/terminus-electron/src/services/fileProvider.service.ts @@ -1,6 +1,7 @@ import { promises as fs } from 'fs' 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' @Injectable() diff --git a/terminus-electron/src/services/hostApp.service.ts b/terminus-electron/src/services/hostApp.service.ts index b3ddd26a..c74fc64e 100644 --- a/terminus-electron/src/services/hostApp.service.ts +++ b/terminus-electron/src/services/hostApp.service.ts @@ -1,5 +1,6 @@ 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' }) diff --git a/terminus-electron/src/services/hostWindow.service.ts b/terminus-electron/src/services/hostWindow.service.ts index b44170df..fc203e68 100644 --- a/terminus-electron/src/services/hostWindow.service.ts +++ b/terminus-electron/src/services/hostWindow.service.ts @@ -1,6 +1,7 @@ import type { BrowserWindow, TouchBar } from 'electron' 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 { x: number diff --git a/terminus-electron/src/services/log.service.ts b/terminus-electron/src/services/log.service.ts index 57cfbe06..42ac70f7 100644 --- a/terminus-electron/src/services/log.service.ts +++ b/terminus-electron/src/services/log.service.ts @@ -2,7 +2,8 @@ import * as fs from 'fs' import * as path from 'path' import * as winston from 'winston' 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 logDirectory = electron.app.getPath('userData') diff --git a/terminus-electron/src/services/platform.service.ts b/terminus-electron/src/services/platform.service.ts index 989aea99..fdd755bb 100644 --- a/terminus-electron/src/services/platform.service.ts +++ b/terminus-electron/src/services/platform.service.ts @@ -5,7 +5,8 @@ import * as os from 'os' import promiseIpc from 'electron-promise-ipc' import { execFile } from 'mz/child_process' 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' const fontManager = require('fontmanager-redux') // eslint-disable-line diff --git a/terminus-electron/src/services/shellIntegration.service.ts b/terminus-electron/src/services/shellIntegration.service.ts index ae02b363..784b93d8 100644 --- a/terminus-electron/src/services/shellIntegration.service.ts +++ b/terminus-electron/src/services/shellIntegration.service.ts @@ -2,7 +2,8 @@ import * as path from 'path' import * as fs from 'mz/fs' import { exec } from 'mz/child_process' 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 */ diff --git a/terminus-electron/src/services/touchbar.service.ts b/terminus-electron/src/services/touchbar.service.ts index ab819f13..342efc14 100644 --- a/terminus-electron/src/services/touchbar.service.ts +++ b/terminus-electron/src/services/touchbar.service.ts @@ -1,6 +1,7 @@ import { SegmentedControlSegment, TouchBarSegmentedControl } from 'electron' 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' /** @hidden */ diff --git a/terminus-electron/src/services/updater.service.ts b/terminus-electron/src/services/updater.service.ts index cae4983b..6e063cf0 100644 --- a/terminus-electron/src/services/updater.service.ts +++ b/terminus-electron/src/services/updater.service.ts @@ -1,7 +1,8 @@ import { Injectable } from '@angular/core' 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' diff --git a/terminus-local/src/buttonProvider.ts b/terminus-local/src/buttonProvider.ts index 6eebd15d..dc2ec8fb 100644 --- a/terminus-local/src/buttonProvider.ts +++ b/terminus-local/src/buttonProvider.ts @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ 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' diff --git a/terminus-local/src/components/shellSettingsTab.component.ts b/terminus-local/src/components/shellSettingsTab.component.ts index 1f1e5732..42cb79e7 100644 --- a/terminus-local/src/components/shellSettingsTab.component.ts +++ b/terminus-local/src/components/shellSettingsTab.component.ts @@ -1,8 +1,8 @@ import { Component } from '@angular/core' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { Subscription } from 'rxjs' -import { ConfigService, ElectronService, HostAppService, Platform, WIN_BUILD_CONPTY_SUPPORTED, WIN_BUILD_CONPTY_STABLE, isWindowsBuild } from 'terminus-core' -import { ElectronHostWindow } from 'terminus-electron' +import { ConfigService, HostAppService, Platform, WIN_BUILD_CONPTY_SUPPORTED, WIN_BUILD_CONPTY_STABLE, isWindowsBuild } from 'terminus-core' +import { ElectronService, ElectronHostWindow } from 'terminus-electron' import { EditProfileModalComponent } from './editProfileModal.component' import { Shell, Profile } from '../api' import { TerminalService } from '../services/terminal.service' diff --git a/terminus-local/src/services/dockMenu.service.ts b/terminus-local/src/services/dockMenu.service.ts index ae389042..2577df6f 100644 --- a/terminus-local/src/services/dockMenu.service.ts +++ b/terminus-local/src/services/dockMenu.service.ts @@ -1,5 +1,6 @@ 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' /** @hidden */ diff --git a/terminus-local/src/services/uac.service.ts b/terminus-local/src/services/uac.service.ts index b81d15a8..16c93fd6 100644 --- a/terminus-local/src/services/uac.service.ts +++ b/terminus-local/src/services/uac.service.ts @@ -1,6 +1,7 @@ import * as path from 'path' 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' /** @hidden */ diff --git a/terminus-local/src/shells/windowsStock.ts b/terminus-local/src/shells/windowsStock.ts index c12e636b..1627b6cf 100644 --- a/terminus-local/src/shells/windowsStock.ts +++ b/terminus-local/src/shells/windowsStock.ts @@ -1,6 +1,7 @@ import * as path from 'path' 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' diff --git a/terminus-ssh/src/components/editConnectionModal.component.pug b/terminus-ssh/src/components/editConnectionModal.component.pug index 575436b9..b1161ea8 100644 --- a/terminus-ssh/src/components/editConnectionModal.component.pug +++ b/terminus-ssh/src/components/editConnectionModal.component.pug @@ -65,7 +65,7 @@ input(type='radio', ngbButton, [value]='"publicKey"') i.fas.fa-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"') i.fas.fa-user-secret .m-0 Agent @@ -117,12 +117,12 @@ option(value='') None 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 .title X11 forwarding toggle([(ngModel)]='connection.x11') - .form-line + .form-line(ng:if='hostApp.platform !== Platform.Web') .header .title Agent forwarding toggle([(ngModel)]='connection.agentForward') @@ -176,7 +176,7 @@ [(ngModel)]='connection.readyTimeout', ) - .form-line(*ngIf='!connection.jumpHost') + .form-line(*ngIf='!connection.jumpHost && hostApp.platform !== Platform.Web') .header .title Use a proxy command .description Command's stdin/stdout is used instead of a network connection diff --git a/terminus-ssh/src/components/editConnectionModal.component.ts b/terminus-ssh/src/components/editConnectionModal.component.ts index bf2a4918..9b6b6562 100644 --- a/terminus-ssh/src/components/editConnectionModal.component.ts +++ b/terminus-ssh/src/components/editConnectionModal.component.ts @@ -4,7 +4,7 @@ import { NgbModal, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' import { Observable } from 'rxjs' 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 { SSHConnection, LoginScript, ForwardedPortConfig, SSHAlgorithmType, ALGORITHM_BLACKLIST } from '../api' import { PromptModalComponent } from './promptModal.component' @@ -15,6 +15,7 @@ import * as ALGORITHMS from 'ssh2/lib/protocol/constants' template: require('./editConnectionModal.component.pug'), }) export class EditConnectionModalComponent { + Platform = Platform connection: SSHConnection hasSavedPassword: boolean useProxyCommand: boolean @@ -27,6 +28,7 @@ export class EditConnectionModalComponent { constructor ( public config: ConfigService, + public hostApp: HostAppService, private modalInstance: NgbActiveModal, private platform: PlatformService, private passwordStorage: PasswordStorageService, diff --git a/terminus-ssh/src/components/sshTab.component.pug b/terminus-ssh/src/components/sshTab.component.pug index 97fd70f1..95e03fbd 100644 --- a/terminus-ssh/src/components/sshTab.component.pug +++ b/terminus-ssh/src/components/sshTab.component.pug @@ -15,7 +15,10 @@ i.fas.fa-flask 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 span Ports diff --git a/terminus-ssh/src/components/sshTab.component.ts b/terminus-ssh/src/components/sshTab.component.ts index 87175a85..46756976 100644 --- a/terminus-ssh/src/components/sshTab.component.ts +++ b/terminus-ssh/src/components/sshTab.component.ts @@ -3,7 +3,7 @@ import { Spinner } from 'cli-spinner' import { Component, Injector, HostListener } from '@angular/core' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { first } from 'rxjs/operators' -import { RecoveryToken } from 'terminus-core' +import { Platform, RecoveryToken } from 'terminus-core' import { BaseTerminalTabComponent } from 'terminus-terminal' import { SSHService } from '../services/ssh.service' import { SSHConnection, SSHSession } from '../api' @@ -18,6 +18,7 @@ import { SSHPortForwardingModalComponent } from './sshPortForwardingModal.compon animations: BaseTerminalTabComponent.animations, }) export class SSHTabComponent extends BaseTerminalTabComponent { + Platform = Platform connection?: SSHConnection session: SSHSession|null = null sftpPanelVisible = false diff --git a/terminus-terminal/src/frontends/xtermFrontend.ts b/terminus-terminal/src/frontends/xtermFrontend.ts index a67e6639..56e0bce1 100644 --- a/terminus-terminal/src/frontends/xtermFrontend.ts +++ b/terminus-terminal/src/frontends/xtermFrontend.ts @@ -158,7 +158,7 @@ export class XTermFrontend extends Frontend { this.opened = true // 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) { this.webGLAddon = new WebglAddon() diff --git a/web/entry.preload.ts b/web/entry.preload.ts index ef918025..7d17ffa2 100644 --- a/web/entry.preload.ts +++ b/web/entry.preload.ts @@ -6,3 +6,6 @@ import '@fortawesome/fontawesome-free/css/regular.css' import '@fortawesome/fontawesome-free/css/fontawesome.css' import 'ngx-toastr/toastr.css' import '../app/src/preload.scss' + +// Required before other imports +import './polyfills.buffer' diff --git a/web/polyfills.buffer.ts b/web/polyfills.buffer.ts index 023b1daa..c3332dce 100644 --- a/web/polyfills.buffer.ts +++ b/web/polyfills.buffer.ts @@ -234,3 +234,13 @@ export function hexSlice (start, end) { } 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 diff --git a/web/polyfills.ts b/web/polyfills.ts index be79ec1e..7500ce83 100644 --- a/web/polyfills.ts +++ b/web/polyfills.ts @@ -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 angularCompilerModule from '@angular/compiler' 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 ngxToastrModule from 'ngx-toastr' -import { Buffer } from 'buffer' -import { base64Slice, hexSlice, latin1Slice, utf8Slice, utf8Write } from './polyfills.buffer' +import './polyfills.buffer' +import { Duplex } from 'stream-browserify' -window['Buffer'] = Buffer +export class SocketProxy extends Duplex { + socket: any -Buffer.prototype['latin1Slice'] = latin1Slice -Buffer.prototype['utf8Slice'] = utf8Slice -Buffer.prototype['base64Slice'] = base64Slice -Buffer.prototype['utf8Write'] = utf8Write -Buffer.prototype['hexSlice'] = hexSlice + constructor (...args) { + super({ + allowHalfOpen: false, + }) + 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 = { fs: { - // console.warn('mock realPathSync', path) - // return path - // }, - // existsSync: path => { - // console.warn('mock existsSync', path) - // return false - // }, realpathSync: () => null, readdir: () => null, stat: () => 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: {}, }, buffer: { - Buffer, + Buffer: window['Buffer'], }, crypto: { ...require('crypto-browserify'), @@ -81,6 +87,9 @@ const mocks = { url: { parse: () => null, }, + net: { + Socket: SocketProxy, + }, http: { Agent: class {}, request: {}, @@ -117,10 +126,13 @@ const mocks = { }, }, dns: {}, + socksv5: {}, util: require('util/'), keytar: { getPassword: () => null, }, + './crypto/build/Release/sshcrypto.node': {}, + '../build/Release/cpufeatures.node': {}, } const builtins = { @@ -157,18 +169,17 @@ mockRequire['resolve'] = (() => null) as any Object.assign(window, { require: mockRequire, + module: { + paths: [], + }, + __dirname: '__dirname', + setImmediate: setTimeout as any, }) window['require'].main = { paths: [], } as any -window['module'] = { - paths: [], -} as any - -window['__dirname'] = '__dirname' -window['setImmediate'] = setTimeout as any mocks.module['prototype'] = { require: window['require'] } mocks.assert.assertNotStrictEqual = () => true mocks.assert.notStrictEqual = () => true