Files
windmill/cli/login.ts
T
Kai Jellinghaus 31ac1ddf39 feat(cli): improved setup & allow workspace in base url & refactor workspaces/remotes to unify (#966)
* Setup V2 & Allow Workspace in base url

* Handle login conflict information

* Rework workspace & remote logic

* Add login logic

* Add token storage logic

* 🚀 finish refactor

* :Fix Pull

* Remove setup

* Add create-token

* Remove legacy typesc

* Fix change

* Fix warns

* fix warning

* Update README

* Switch to new workspace by default

* Update demo video

* Update Images

* remove duplicate

* Change wording

* Add to main README

* Fix main readme

* Fix videos
2022-12-01 22:56:57 +01:00

71 lines
1.9 KiB
TypeScript

import { Select } from "https://deno.land/x/cliffy@v0.25.4/prompt/select.ts";
import { GlobalOptions } from "./types.ts";
import { colors } from "https://deno.land/x/cliffy@v0.25.4/ansi/colors.ts";
import { getAvailablePort } from "https://deno.land/x/port@1.0.0/mod.ts";
import { Secret } from "https://deno.land/x/cliffy@v0.25.4/prompt/secret.ts";
export async function loginInteractive(remote: string) {
let token: string | undefined;
if (
await Select.prompt({
message: "How do you want to login",
options: [
{
name: "Browser",
value: "b",
},
{
name: "Token",
value: "t",
},
],
}) === "b"
) {
token = await browserLogin(remote);
} else {
token = await Secret.prompt("Enter your token");
}
return token;
}
// deno-lint-ignore require-await
export async function tryGetLoginInfo(
opts: GlobalOptions,
): Promise<string | undefined> {
if (opts.token) {
return opts.token;
}
return undefined;
}
export async function browserLogin(
baseUrl: string,
): Promise<string | undefined> {
return "AoAg2mjbMju0LSoaVv6NvLfsfHwuxw";
const port = await getAvailablePort();
if (port == undefined) {
console.log(colors.red.underline("failed to aquire port"));
return undefined;
}
const server = Deno.listen({ transport: "tcp", port });
console.log(`Login by going to ${baseUrl}user/cli?port=${port}`);
const firstConnection = await server.accept();
const httpFirstConnection = Deno.serveHttp(firstConnection);
const firstRequest = (await httpFirstConnection.nextRequest())!;
const params = new URL(firstRequest.request.url!).searchParams;
const token = params.get("token");
const _workspace = params.get("workspace");
await firstRequest?.respondWith(
Response.redirect(baseUrl + "user/cli-success", 302),
);
setTimeout(() => {
httpFirstConnection.close();
server.close();
}, 10);
return token ?? undefined;
}