@tryglen/cli 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/login.js +0 -7
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +0 -2
- package/dist/commands/logout.js.map +1 -1
- package/package.json +1 -1
- package/dist/_utils/login-lock.d.ts +0 -3
- package/dist/_utils/login-lock.js +0 -32
- package/dist/_utils/login-lock.js.map +0 -1
package/dist/commands/login.js
CHANGED
|
@@ -3,16 +3,12 @@ import { buildConnectUrl } from "../_utils/build-connect-url.js";
|
|
|
3
3
|
import { config } from "../_utils/config.js";
|
|
4
4
|
import { writeCredentials } from "../_utils/credentials.js";
|
|
5
5
|
import { httpJson } from "../_utils/http.js";
|
|
6
|
-
import { acquireLoginLock, releaseLoginLock } from "../_utils/login-lock.js";
|
|
7
6
|
import { startLoopbackServer } from "../_utils/loopback-server.js";
|
|
8
7
|
import { openBrowser } from "../_utils/open-browser.js";
|
|
9
8
|
import { err, ok } from "../_utils/result.js";
|
|
10
9
|
import { writeState } from "../_utils/state.js";
|
|
11
10
|
const WAIT_MS = 10 * 60_000;
|
|
12
11
|
const login = async () => {
|
|
13
|
-
const lockAcquired = await acquireLoginLock();
|
|
14
|
-
if (!lockAcquired)
|
|
15
|
-
return err("another login is already in progress");
|
|
16
12
|
const state = randomBytes(32).toString("hex");
|
|
17
13
|
const verifier = randomBytes(48).toString("base64url");
|
|
18
14
|
const challenge = createHash("sha256").update(verifier).digest("base64url");
|
|
@@ -28,11 +24,9 @@ const login = async () => {
|
|
|
28
24
|
openBrowser(url);
|
|
29
25
|
const cb = await waitForCallback().catch(() => null);
|
|
30
26
|
if (!cb?.code) {
|
|
31
|
-
await releaseLoginLock();
|
|
32
27
|
return err("login callback timed out or was cancelled");
|
|
33
28
|
}
|
|
34
29
|
if (cb.state !== state) {
|
|
35
|
-
await releaseLoginLock();
|
|
36
30
|
return err("login state mismatch (possible local interception)");
|
|
37
31
|
}
|
|
38
32
|
const exchangeResult = await httpJson(config.exchangeUrl, {
|
|
@@ -41,7 +35,6 @@ const login = async () => {
|
|
|
41
35
|
body: JSON.stringify({ code: cb.code, verifier }),
|
|
42
36
|
timeoutMs: 15_000,
|
|
43
37
|
});
|
|
44
|
-
await releaseLoginLock();
|
|
45
38
|
if (!exchangeResult.ok)
|
|
46
39
|
return err("key exchange failed (network error)");
|
|
47
40
|
if (!exchangeResult.value.isOk)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/logout.js
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { clearCredentials } from "../_utils/credentials.js";
|
|
2
|
-
import { releaseLoginLock } from "../_utils/login-lock.js";
|
|
3
2
|
import { ok } from "../_utils/result.js";
|
|
4
3
|
import { clearState } from "../_utils/state.js";
|
|
5
4
|
const logout = async () => {
|
|
6
5
|
await clearCredentials();
|
|
7
6
|
await clearState();
|
|
8
|
-
await releaseLoginLock();
|
|
9
7
|
process.stdout.write("✓ Signed out of glen (credentials removed).\n");
|
|
10
8
|
return ok(undefined);
|
|
11
9
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../src/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAe,EAAE,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,MAAM,GAAG,KAAK,IAAmC,EAAE;IACvD,MAAM,gBAAgB,EAAE,CAAC;IACzB,MAAM,UAAU,EAAE,CAAC;IACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACtE,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;AACvB,CAAC,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { stat, unlink, writeFile } from "node:fs/promises";
|
|
2
|
-
import { dirname, join } from "node:path";
|
|
3
|
-
import { credentialsPath } from "./credentials.js";
|
|
4
|
-
import { fromPromise } from "./result.js";
|
|
5
|
-
const LOCK_TTL_MS = 10 * 1000; // 10 seconds — short so stale locks from crashed hooks don't block login
|
|
6
|
-
const lockPath = () => {
|
|
7
|
-
return join(dirname(credentialsPath()), ".login.lock");
|
|
8
|
-
};
|
|
9
|
-
const acquireLoginLock = async () => {
|
|
10
|
-
const path = lockPath();
|
|
11
|
-
// Attempt exclusive create — fails with EEXIST if lock already held.
|
|
12
|
-
const writeResult = await fromPromise(writeFile(path, String(Date.now()), { flag: "wx" }));
|
|
13
|
-
if (writeResult.ok)
|
|
14
|
-
return true;
|
|
15
|
-
// Lock file exists — check if stale.
|
|
16
|
-
const statResult = await fromPromise(stat(path));
|
|
17
|
-
if (!statResult.ok)
|
|
18
|
-
return false; // disappeared between write and stat — another process won
|
|
19
|
-
const age = Date.now() - statResult.value.mtimeMs;
|
|
20
|
-
if (age < LOCK_TTL_MS)
|
|
21
|
-
return false; // fresh lock held by another process
|
|
22
|
-
// Stale — remove and retry once with exclusive create.
|
|
23
|
-
await fromPromise(unlink(path));
|
|
24
|
-
const retryResult = await fromPromise(writeFile(path, String(Date.now()), { flag: "wx" }));
|
|
25
|
-
return retryResult.ok;
|
|
26
|
-
};
|
|
27
|
-
const releaseLoginLock = async () => {
|
|
28
|
-
const path = lockPath();
|
|
29
|
-
await fromPromise(unlink(path));
|
|
30
|
-
};
|
|
31
|
-
export { acquireLoginLock, releaseLoginLock };
|
|
32
|
-
//# sourceMappingURL=login-lock.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"login-lock.js","sourceRoot":"","sources":["../../src/_utils/login-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,yEAAyE;AAExG,MAAM,QAAQ,GAAG,GAAW,EAAE;IAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;AACzD,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,KAAK,IAAsB,EAAE;IACpD,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IAExB,qEAAqE;IACrE,MAAM,WAAW,GAAG,MAAM,WAAW,CACnC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CACpD,CAAC;IACF,IAAI,WAAW,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAEhC,qCAAqC;IACrC,MAAM,UAAU,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC,CAAC,2DAA2D;IAC7F,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC;IAClD,IAAI,GAAG,GAAG,WAAW;QAAE,OAAO,KAAK,CAAC,CAAC,qCAAqC;IAE1E,uDAAuD;IACvD,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAChC,MAAM,WAAW,GAAG,MAAM,WAAW,CACnC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CACpD,CAAC;IACF,OAAO,WAAW,CAAC,EAAE,CAAC;AACxB,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,KAAK,IAAmB,EAAE;IACjD,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;IACxB,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAClC,CAAC,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAC"}
|