6f5096fa61
Runs a Tailscale client in the browser (via a WebAssembly build of the wasm package) and allows SSH access to machines. The wasm package exports a newIPN function, which returns a simple JS object with methods like start(), login(), logout() and ssh(). The golang.org/x/crypto/ssh package is used for the SSH client. Terminal emulation and QR code renedring is done via NPM packages (xterm and qrcode respectively), thus we also need a JS toolchain that can install and bundle them. Yarn is used for installation, and esbuild handles loading them and bundling for production serving. Updates #3157 Signed-off-by: Mihai Parparita <mihai@tailscale.com>
27 lines
907 B
JavaScript
27 lines
907 B
JavaScript
// Copyright (c) 2022 Tailscale Inc & AUTHORS All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
import "./wasm_exec"
|
|
import wasmUrl from "./main.wasm"
|
|
import { notifyState, notifyNetMap, notifyBrowseToURL } from "./notifier"
|
|
import { sessionStateStorage } from "./js-state-store"
|
|
|
|
const go = new window.Go()
|
|
WebAssembly.instantiateStreaming(
|
|
fetch(`./dist/${wasmUrl}`),
|
|
go.importObject
|
|
).then((result) => {
|
|
go.run(result.instance)
|
|
const ipn = newIPN({
|
|
// Persist IPN state in sessionStorage in development, so that we don't need
|
|
// to re-authorize every time we reload the page.
|
|
stateStorage: DEBUG ? sessionStateStorage : undefined,
|
|
})
|
|
ipn.run({
|
|
notifyState: notifyState.bind(null, ipn),
|
|
notifyNetMap: notifyNetMap.bind(null, ipn),
|
|
notifyBrowseToURL: notifyBrowseToURL.bind(null, ipn),
|
|
})
|
|
})
|