[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:
112
electron/plugins/contractValidator.cjs
Normal file
112
electron/plugins/contractValidator.cjs
Normal file
@@ -0,0 +1,112 @@
|
||||
"use strict";
|
||||
|
||||
const path = require("node:path");
|
||||
|
||||
const Ajv2020 = require("ajv/dist/2020").default;
|
||||
const addFormats = require("ajv-formats").default;
|
||||
const schema = require("./generated/plugin-contract.schema.json");
|
||||
const { assertPluginJsonValue } = require("./jsonBoundary.cjs");
|
||||
const {
|
||||
PLUGIN_RPC_MAX_JSON_BYTES,
|
||||
PLUGIN_STREAM_MAX_FRAME_JSON_BYTES,
|
||||
} = require("./constants.cjs");
|
||||
|
||||
function createDefinitionValidator(definitionName) {
|
||||
if (!schema.$defs?.[definitionName]) throw new Error(`Unknown plugin contract definition: ${definitionName}`);
|
||||
const ajv = new Ajv2020({ allErrors: true, strict: false, validateFormats: true });
|
||||
addFormats(ajv);
|
||||
ajv.addSchema(schema);
|
||||
return ajv.compile({ $ref: `${schema.$id}#/$defs/${definitionName}` });
|
||||
}
|
||||
|
||||
function formatValidationErrors(errors) {
|
||||
return (errors ?? [])
|
||||
.slice(0, 8)
|
||||
.map((error) => `${error.instancePath || "/"} ${error.message ?? "is invalid"}`)
|
||||
.join("; ");
|
||||
}
|
||||
|
||||
const rpcMessageValidator = createDefinitionValidator("RpcMessage");
|
||||
const initializeResultValidator = createDefinitionValidator("RuntimeInitializeResult");
|
||||
const terminalInterceptorAttachmentParamsValidator = createDefinitionValidator("TerminalInterceptorAttachmentParams");
|
||||
const terminalInterceptorAttachmentResultValidator = createDefinitionValidator("TerminalInterceptorAttachmentResult");
|
||||
const terminalInterceptorFrameValidator = createDefinitionValidator("TerminalInterceptorFrame");
|
||||
const providerRequestValidator = createDefinitionValidator("ProviderRequest");
|
||||
const providerResultValidator = createDefinitionValidator("ProviderResult");
|
||||
const streamFrameValidator = createDefinitionValidator("StreamFrame");
|
||||
|
||||
function assertContractValue(validator, value, label) {
|
||||
if (!validator(value)) {
|
||||
throw new TypeError(`${label} violates the plugin contract: ${formatValidationErrors(validator.errors)}`);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
function assertRpcMessage(value) {
|
||||
assertPluginJsonValue(value, { maxBytes: PLUGIN_RPC_MAX_JSON_BYTES });
|
||||
return assertContractValue(rpcMessageValidator, value, "RPC message");
|
||||
}
|
||||
|
||||
function assertInitializeResult(value) {
|
||||
assertPluginJsonValue(value, { maxBytes: PLUGIN_RPC_MAX_JSON_BYTES });
|
||||
return assertContractValue(initializeResultValidator, value, "Initialize result");
|
||||
}
|
||||
|
||||
function assertTerminalInterceptorAttachmentParams(value) {
|
||||
assertPluginJsonValue(value, { maxBytes: PLUGIN_RPC_MAX_JSON_BYTES });
|
||||
return assertContractValue(
|
||||
terminalInterceptorAttachmentParamsValidator,
|
||||
value,
|
||||
"Terminal interceptor attachment params",
|
||||
);
|
||||
}
|
||||
|
||||
function assertTerminalInterceptorAttachmentResult(value) {
|
||||
assertPluginJsonValue(value, { maxBytes: PLUGIN_RPC_MAX_JSON_BYTES });
|
||||
return assertContractValue(
|
||||
terminalInterceptorAttachmentResultValidator,
|
||||
value,
|
||||
"Terminal interceptor attachment result",
|
||||
);
|
||||
}
|
||||
|
||||
function assertTerminalInterceptorFrameSchema(value) {
|
||||
return assertContractValue(
|
||||
terminalInterceptorFrameValidator,
|
||||
value,
|
||||
"Terminal interceptor frame",
|
||||
);
|
||||
}
|
||||
|
||||
function assertProviderRequest(value) {
|
||||
assertPluginJsonValue(value, { maxBytes: PLUGIN_RPC_MAX_JSON_BYTES });
|
||||
return assertContractValue(providerRequestValidator, value, "Provider request");
|
||||
}
|
||||
|
||||
function assertProviderResult(value) {
|
||||
assertPluginJsonValue(value, { maxBytes: PLUGIN_RPC_MAX_JSON_BYTES });
|
||||
return assertContractValue(providerResultValidator, value, "Provider result");
|
||||
}
|
||||
|
||||
function assertStreamFrameSchema(value) {
|
||||
assertPluginJsonValue(value, { maxBytes: PLUGIN_STREAM_MAX_FRAME_JSON_BYTES });
|
||||
return assertContractValue(streamFrameValidator, value, "Stream frame");
|
||||
}
|
||||
|
||||
function resolveContractRuntimePath(...segments) {
|
||||
return path.join(__dirname, "..", "..", "node_modules", "@netcatty", "plugin-contract", "dist", ...segments);
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
assertInitializeResult,
|
||||
assertTerminalInterceptorAttachmentParams,
|
||||
assertTerminalInterceptorAttachmentResult,
|
||||
assertTerminalInterceptorFrameSchema,
|
||||
assertProviderRequest,
|
||||
assertProviderResult,
|
||||
assertRpcMessage,
|
||||
assertStreamFrameSchema,
|
||||
createDefinitionValidator,
|
||||
formatValidationErrors,
|
||||
resolveContractRuntimePath,
|
||||
};
|
||||
Reference in New Issue
Block a user