Compare commits
1 Commits
main
...
docs/hetzn
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d3c53f4596 |
@ -331,7 +331,8 @@ actor MacNodeBridgeSession {
|
|||||||
let now = self.clock.now
|
let now = self.clock.now
|
||||||
if now > last.advanced(by: timeout) {
|
if now > last.advanced(by: timeout) {
|
||||||
let age = last.duration(to: now)
|
let age = last.duration(to: now)
|
||||||
self.logger.warning("Node bridge heartbeat timed out; disconnecting (age: \(String(describing: age), privacy: .public)).")
|
self.logger.warning(
|
||||||
|
"Node bridge heartbeat timed out; disconnecting (age: \(String(describing: age), privacy: .public)).")
|
||||||
await self.disconnect()
|
await self.disconnect()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -341,7 +342,8 @@ actor MacNodeBridgeSession {
|
|||||||
do {
|
do {
|
||||||
try await self.send(BridgePing(type: "ping", id: id))
|
try await self.send(BridgePing(type: "ping", id: id))
|
||||||
} catch {
|
} catch {
|
||||||
self.logger.warning("Node bridge ping send failed; disconnecting (error: \(String(describing: error), privacy: .public)).")
|
self.logger.warning(
|
||||||
|
"Node bridge ping send failed; disconnecting (error: \(String(describing: error), privacy: .public)).")
|
||||||
await self.disconnect()
|
await self.disconnect()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -356,7 +358,8 @@ actor MacNodeBridgeSession {
|
|||||||
private func handleConnectionState(_ state: NWConnection.State) async {
|
private func handleConnectionState(_ state: NWConnection.State) async {
|
||||||
switch state {
|
switch state {
|
||||||
case let .failed(error):
|
case let .failed(error):
|
||||||
self.logger.warning("Node bridge connection failed; disconnecting (error: \(String(describing: error), privacy: .public)).")
|
self.logger.warning(
|
||||||
|
"Node bridge connection failed; disconnecting (error: \(String(describing: error), privacy: .public)).")
|
||||||
await self.disconnect()
|
await self.disconnect()
|
||||||
case .cancelled:
|
case .cancelled:
|
||||||
self.logger.warning("Node bridge connection cancelled; disconnecting.")
|
self.logger.warning("Node bridge connection cancelled; disconnecting.")
|
||||||
|
|||||||
@ -6,6 +6,10 @@ import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
|
|||||||
|
|
||||||
const realOs = await vi.importActual<typeof import("node:os")>("node:os");
|
const realOs = await vi.importActual<typeof import("node:os")>("node:os");
|
||||||
const HOME = path.join(realOs.tmpdir(), "clawdbot-home-test");
|
const HOME = path.join(realOs.tmpdir(), "clawdbot-home-test");
|
||||||
|
const PREV_CLAWDBOT_STATE_DIR = process.env.CLAWDBOT_STATE_DIR;
|
||||||
|
const PREV_CLAWDIS_STATE_DIR = process.env.CLAWDIS_STATE_DIR;
|
||||||
|
delete process.env.CLAWDBOT_STATE_DIR;
|
||||||
|
delete process.env.CLAWDIS_STATE_DIR;
|
||||||
|
|
||||||
vi.mock("node:os", () => ({
|
vi.mock("node:os", () => ({
|
||||||
default: { homedir: () => HOME, tmpdir: () => realOs.tmpdir() },
|
default: { homedir: () => HOME, tmpdir: () => realOs.tmpdir() },
|
||||||
@ -22,11 +26,18 @@ describe("media store", () => {
|
|||||||
|
|
||||||
afterAll(async () => {
|
afterAll(async () => {
|
||||||
await fs.rm(HOME, { recursive: true, force: true });
|
await fs.rm(HOME, { recursive: true, force: true });
|
||||||
|
if (PREV_CLAWDBOT_STATE_DIR !== undefined)
|
||||||
|
process.env.CLAWDBOT_STATE_DIR = PREV_CLAWDBOT_STATE_DIR;
|
||||||
|
else delete process.env.CLAWDBOT_STATE_DIR;
|
||||||
|
|
||||||
|
if (PREV_CLAWDIS_STATE_DIR !== undefined)
|
||||||
|
process.env.CLAWDIS_STATE_DIR = PREV_CLAWDIS_STATE_DIR;
|
||||||
|
else delete process.env.CLAWDIS_STATE_DIR;
|
||||||
});
|
});
|
||||||
|
|
||||||
it("creates and returns media directory", async () => {
|
it("creates and returns media directory", async () => {
|
||||||
const dir = await store.ensureMediaDir();
|
const dir = await store.ensureMediaDir();
|
||||||
expect(dir).toContain("clawdbot-home-test");
|
expect(path.basename(dir)).toBe("media");
|
||||||
const stat = await fs.stat(dir);
|
const stat = await fs.stat(dir);
|
||||||
expect(stat.isDirectory()).toBe(true);
|
expect(stat.isDirectory()).toBe(true);
|
||||||
});
|
});
|
||||||
|
|||||||
@ -14,9 +14,16 @@ const runtime = {
|
|||||||
describe("web logout", () => {
|
describe("web logout", () => {
|
||||||
const origHomedir = os.homedir;
|
const origHomedir = os.homedir;
|
||||||
let tmpDir: string;
|
let tmpDir: string;
|
||||||
|
let prevStateDir: string | undefined;
|
||||||
|
let prevClawdisStateDir: string | undefined;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
vi.clearAllMocks();
|
vi.clearAllMocks();
|
||||||
|
prevStateDir = process.env.CLAWDBOT_STATE_DIR;
|
||||||
|
prevClawdisStateDir = process.env.CLAWDIS_STATE_DIR;
|
||||||
|
delete process.env.CLAWDBOT_STATE_DIR;
|
||||||
|
delete process.env.CLAWDIS_STATE_DIR;
|
||||||
|
|
||||||
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "clawdbot-logout-"));
|
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "clawdbot-logout-"));
|
||||||
vi.spyOn(os, "homedir").mockReturnValue(tmpDir);
|
vi.spyOn(os, "homedir").mockReturnValue(tmpDir);
|
||||||
vi.resetModules();
|
vi.resetModules();
|
||||||
@ -36,6 +43,14 @@ describe("web logout", () => {
|
|||||||
await fsPromises
|
await fsPromises
|
||||||
.rm(tmpDir, { recursive: true, force: true })
|
.rm(tmpDir, { recursive: true, force: true })
|
||||||
.catch(() => {});
|
.catch(() => {});
|
||||||
|
|
||||||
|
if (prevStateDir !== undefined) process.env.CLAWDBOT_STATE_DIR = prevStateDir;
|
||||||
|
else delete process.env.CLAWDBOT_STATE_DIR;
|
||||||
|
|
||||||
|
if (prevClawdisStateDir !== undefined)
|
||||||
|
process.env.CLAWDIS_STATE_DIR = prevClawdisStateDir;
|
||||||
|
else delete process.env.CLAWDIS_STATE_DIR;
|
||||||
|
|
||||||
// restore for safety
|
// restore for safety
|
||||||
// eslint-disable-next-line @typescript-eslint/unbound-method
|
// eslint-disable-next-line @typescript-eslint/unbound-method
|
||||||
(os.homedir as unknown as typeof origHomedir) = origHomedir;
|
(os.homedir as unknown as typeof origHomedir) = origHomedir;
|
||||||
@ -47,7 +62,8 @@ describe("web logout", () => {
|
|||||||
async () => {
|
async () => {
|
||||||
const { logoutWeb, WA_WEB_AUTH_DIR } = await import("./session.js");
|
const { logoutWeb, WA_WEB_AUTH_DIR } = await import("./session.js");
|
||||||
|
|
||||||
expect(WA_WEB_AUTH_DIR.startsWith(tmpDir)).toBe(true);
|
const rel = path.relative(tmpDir, WA_WEB_AUTH_DIR);
|
||||||
|
expect(rel && !rel.startsWith("..") && !path.isAbsolute(rel)).toBe(true);
|
||||||
fs.mkdirSync(WA_WEB_AUTH_DIR, { recursive: true });
|
fs.mkdirSync(WA_WEB_AUTH_DIR, { recursive: true });
|
||||||
fs.writeFileSync(path.join(WA_WEB_AUTH_DIR, "creds.json"), "{}");
|
fs.writeFileSync(path.join(WA_WEB_AUTH_DIR, "creds.json"), "{}");
|
||||||
const result = await logoutWeb({ runtime: runtime as never });
|
const result = await logoutWeb({ runtime: runtime as never });
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user