diff --git a/tabby-core/src/api/index.ts b/tabby-core/src/api/index.ts index 4859519c98..f156f8a888 100644 --- a/tabby-core/src/api/index.ts +++ b/tabby-core/src/api/index.ts @@ -38,3 +38,4 @@ export { VaultService, Vault, VaultSecret, VaultFileSecret, VAULT_SECRET_TYPE_FI export { FileProvidersService } from '../services/fileProviders.service' export { LocaleService, TranslateServiceWrapper as TranslateService } from '../services/locale.service' export * from '../utils' +export { UTF8Splitter } from '../utfSplitter' diff --git a/tabby-core/src/utfSplitter.ts b/tabby-core/src/utfSplitter.ts new file mode 100644 index 0000000000..e09b094b7b --- /dev/null +++ b/tabby-core/src/utfSplitter.ts @@ -0,0 +1,32 @@ +const partials = [ + [0b110, 5, 0], + [0b1110, 4, 1], + [0b11110, 3, 2], +] + +export class UTF8Splitter { + private internal = Buffer.alloc(0) + + write (data: Buffer): Buffer { + this.internal = Buffer.concat([this.internal, data]) + + let keep = 0 + for (const [pattern, shift, maxOffset] of partials) { + for (let offset = 0; offset < maxOffset + 1; offset++) { + if (this.internal[this.internal.length - offset - 1] >> shift === pattern) { + keep = Math.max(keep, offset + 1) + } + } + } + + const result = this.internal.slice(0, this.internal.length - keep) + this.internal = this.internal.slice(this.internal.length - keep) + return result + } + + flush (): Buffer { + const result = this.internal + this.internal = Buffer.alloc(0) + return result + } +} diff --git a/tabby-ssh/src/session/shell.ts b/tabby-ssh/src/session/shell.ts index 7a98697aa1..6be8f6dc7d 100644 --- a/tabby-ssh/src/session/shell.ts +++ b/tabby-ssh/src/session/shell.ts @@ -2,11 +2,10 @@ import { Observable, Subject } from 'rxjs' import stripAnsi from 'strip-ansi' import { ClientChannel } from 'ssh2' import { Injector } from '@angular/core' -import { LogService } from 'tabby-core' +import { LogService, UTF8Splitter } from 'tabby-core' import { BaseSession } from 'tabby-terminal' import { SSHSession } from './ssh' import { SSHProfile } from '../api' -import { UTF8Splitter } from '../../../app/lib/utfSplitter' export class SSHShellSession extends BaseSession {