[Init] Initial commit - NetMesh terminal manager
Some checks failed
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / build-linux-x64 (push) Has been cancelled
build-packages / build-linux-arm64 (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / update Nix release metadata (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled
test / lint-and-test (push) Has been cancelled
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
build-et-binaries / build-linux-x64 (push) Has been cancelled
build-et-binaries / build-linux-arm64 (push) Has been cancelled
build-et-binaries / build-macos-universal (push) Has been cancelled
build-et-binaries / build-windows-x64 (push) Has been cancelled
build-et-binaries / release (push) Has been cancelled
Some checks failed
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / build-linux-x64 (push) Has been cancelled
build-packages / build-linux-arm64 (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / update Nix release metadata (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled
test / lint-and-test (push) Has been cancelled
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
build-et-binaries / build-linux-x64 (push) Has been cancelled
build-et-binaries / build-linux-arm64 (push) Has been cancelled
build-et-binaries / build-macos-universal (push) Has been cancelled
build-et-binaries / build-windows-x64 (push) Has been cancelled
build-et-binaries / release (push) Has been cancelled
This commit is contained in:
113
electron/capabilities/rpcTransport.test.cjs
Normal file
113
electron/capabilities/rpcTransport.test.cjs
Normal file
@@ -0,0 +1,113 @@
|
||||
"use strict";
|
||||
|
||||
const test = require("node:test");
|
||||
const assert = require("node:assert/strict");
|
||||
const { EventEmitter } = require("node:events");
|
||||
|
||||
const {
|
||||
createNdjsonRpcClient,
|
||||
createTaggedError,
|
||||
} = require("./rpcTransport.cjs");
|
||||
const { CAPABILITY_SURFACES } = require("./constants.cjs");
|
||||
|
||||
function createFakeSocket() {
|
||||
const socket = new EventEmitter();
|
||||
socket.destroyed = false;
|
||||
socket.writable = true;
|
||||
socket.setEncoding = () => {};
|
||||
socket.end = () => {
|
||||
socket.writable = false;
|
||||
socket.destroyed = true;
|
||||
socket.emit("close");
|
||||
};
|
||||
socket.write = (line, callback) => {
|
||||
const request = JSON.parse(line);
|
||||
socket.emit("data", `${JSON.stringify({ jsonrpc: "2.0", id: request.id, result: { ok: true } })}\n`);
|
||||
callback?.(null);
|
||||
return true;
|
||||
};
|
||||
return socket;
|
||||
}
|
||||
|
||||
test("createNdjsonRpcClient resolves rpc responses", async () => {
|
||||
const socket = createFakeSocket();
|
||||
const client = createNdjsonRpcClient({ socket, surface: CAPABILITY_SURFACES.BUILTIN });
|
||||
|
||||
const result = await client.call("netcatty/getStatus", {});
|
||||
assert.deepEqual(result, { ok: true });
|
||||
});
|
||||
|
||||
test("createNdjsonRpcClient surfaces RPC_ERROR with code for bridge failures", async () => {
|
||||
const socket = new EventEmitter();
|
||||
socket.destroyed = false;
|
||||
socket.writable = true;
|
||||
socket.setEncoding = () => {};
|
||||
socket.write = (line, callback) => {
|
||||
const request = JSON.parse(line);
|
||||
socket.emit("data", `${JSON.stringify({
|
||||
jsonrpc: "2.0",
|
||||
id: request.id,
|
||||
error: { message: "Operation denied by user." },
|
||||
})}\n`);
|
||||
callback?.(null);
|
||||
return true;
|
||||
};
|
||||
|
||||
const client = createNdjsonRpcClient({
|
||||
socket,
|
||||
surface: CAPABILITY_SURFACES.BUILTIN,
|
||||
createError: createTaggedError,
|
||||
});
|
||||
|
||||
await assert.rejects(
|
||||
() => client.call("netcatty/exec", { sessionId: "sess-1", command: "pwd" }),
|
||||
(error) => error.code === "RPC_ERROR" && error.message === "Operation denied by user.",
|
||||
);
|
||||
});
|
||||
|
||||
test("createNdjsonRpcClient uses injectable cli-compatible timeout messages", async () => {
|
||||
const socket = createFakeSocket();
|
||||
const client = createNdjsonRpcClient({
|
||||
socket,
|
||||
surface: CAPABILITY_SURFACES.BUILTIN,
|
||||
createError: createTaggedError,
|
||||
setTimeoutImpl: (callback) => {
|
||||
callback();
|
||||
return 1;
|
||||
},
|
||||
messages: {
|
||||
rpcTimeout: (method, timeoutMs) => (
|
||||
`Timed out waiting for Netcatty RPC response to "${method}" after ${timeoutMs}ms.`
|
||||
),
|
||||
},
|
||||
});
|
||||
|
||||
await assert.rejects(
|
||||
() => client.call("netcatty/exec", { sessionId: "sess-1", command: "pwd", chatSessionId: "chat-1" }),
|
||||
(error) => error.code === "RPC_TIMEOUT" && /Netcatty RPC response/.test(error.message),
|
||||
);
|
||||
});
|
||||
|
||||
test("createNdjsonRpcClient ingests bridge status for timeout calculation", async () => {
|
||||
const socket = createFakeSocket();
|
||||
let captured = null;
|
||||
const client = createNdjsonRpcClient({
|
||||
socket,
|
||||
surface: CAPABILITY_SURFACES.BUILTIN,
|
||||
onBridgeStatus: (status) => {
|
||||
captured = status;
|
||||
},
|
||||
});
|
||||
|
||||
client.ingestBridgeStatus({
|
||||
commandTimeoutMs: 45_000,
|
||||
permissionMode: "confirm",
|
||||
approvalTimeoutMs: 120_000,
|
||||
});
|
||||
|
||||
assert.deepEqual(captured, {
|
||||
bridgeCommandTimeoutMs: 45_000,
|
||||
bridgePermissionMode: "confirm",
|
||||
bridgeApprovalTimeoutMs: 120_000,
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user