68 lines
2.2 KiB
JavaScript
68 lines
2.2 KiB
JavaScript
|
|
"use strict";
|
||
|
|
|
||
|
|
const { CAPABILITY_SURFACES, PERMISSION_MODES, RPC_TIMEOUT_DEFAULTS } = require("./constants.cjs");
|
||
|
|
const { getCapabilityByRpcMethod } = require("./registry.cjs");
|
||
|
|
const { requiresApprovalInConfirmMode } = require("./policy.cjs");
|
||
|
|
|
||
|
|
const {
|
||
|
|
DEFAULT_RPC_TIMEOUT_MS,
|
||
|
|
DEFAULT_OPERATION_TIMEOUT_MS,
|
||
|
|
RPC_TIMEOUT_BUFFER_MS,
|
||
|
|
DEFAULT_APPROVAL_TIMEOUT_MS,
|
||
|
|
} = RPC_TIMEOUT_DEFAULTS;
|
||
|
|
|
||
|
|
function isLongRunningRpcMethod(method, surface = CAPABILITY_SURFACES.BUILTIN) {
|
||
|
|
const capability = getCapabilityByRpcMethod(method, surface);
|
||
|
|
return Boolean(capability?.policy.longRunning);
|
||
|
|
}
|
||
|
|
|
||
|
|
function isApprovalWaitRpcMethod(method, surface, permissionMode) {
|
||
|
|
if (permissionMode !== PERMISSION_MODES.CONFIRM) return false;
|
||
|
|
const capability = getCapabilityByRpcMethod(method, surface);
|
||
|
|
return requiresApprovalInConfirmMode(capability, surface);
|
||
|
|
}
|
||
|
|
|
||
|
|
function resolveRpcTimeoutMs(
|
||
|
|
method,
|
||
|
|
{
|
||
|
|
surface = CAPABILITY_SURFACES.BUILTIN,
|
||
|
|
bridgeCommandTimeoutMs = null,
|
||
|
|
bridgePermissionMode = null,
|
||
|
|
bridgeApprovalTimeoutMs = null,
|
||
|
|
defaultOperationTimeoutMs = DEFAULT_OPERATION_TIMEOUT_MS,
|
||
|
|
defaultApprovalTimeoutMs = DEFAULT_APPROVAL_TIMEOUT_MS,
|
||
|
|
defaultRpcTimeoutMs = DEFAULT_RPC_TIMEOUT_MS,
|
||
|
|
timeoutBufferMs = RPC_TIMEOUT_BUFFER_MS,
|
||
|
|
} = {},
|
||
|
|
) {
|
||
|
|
const operationTimeoutMs = isLongRunningRpcMethod(method, surface)
|
||
|
|
? (Number.isFinite(bridgeCommandTimeoutMs) && bridgeCommandTimeoutMs > 0
|
||
|
|
? bridgeCommandTimeoutMs
|
||
|
|
: defaultOperationTimeoutMs)
|
||
|
|
: 0;
|
||
|
|
|
||
|
|
const approvalTimeoutMs = isApprovalWaitRpcMethod(method, surface, bridgePermissionMode)
|
||
|
|
? (Number.isFinite(bridgeApprovalTimeoutMs) && bridgeApprovalTimeoutMs > 0
|
||
|
|
? bridgeApprovalTimeoutMs
|
||
|
|
: defaultApprovalTimeoutMs)
|
||
|
|
: 0;
|
||
|
|
|
||
|
|
if (operationTimeoutMs > 0 && approvalTimeoutMs > 0) {
|
||
|
|
return Math.max(defaultRpcTimeoutMs, approvalTimeoutMs + operationTimeoutMs + timeoutBufferMs);
|
||
|
|
}
|
||
|
|
if (operationTimeoutMs > 0) {
|
||
|
|
return Math.max(defaultRpcTimeoutMs, operationTimeoutMs + timeoutBufferMs);
|
||
|
|
}
|
||
|
|
if (approvalTimeoutMs > 0) {
|
||
|
|
return Math.max(defaultRpcTimeoutMs, approvalTimeoutMs + timeoutBufferMs);
|
||
|
|
}
|
||
|
|
return defaultRpcTimeoutMs;
|
||
|
|
}
|
||
|
|
|
||
|
|
module.exports = {
|
||
|
|
isLongRunningRpcMethod,
|
||
|
|
isApprovalWaitRpcMethod,
|
||
|
|
resolveRpcTimeoutMs,
|
||
|
|
RPC_TIMEOUT_DEFAULTS,
|
||
|
|
};
|