UNPKG

@cerbos/core

Version:
767 lines 28.5 kB
/* eslint-disable @typescript-eslint/no-deprecated */ import { toJson } from "@bufbuild/protobuf"; import { ValueSchema, timestampDate } from "@bufbuild/protobuf/wkt"; import { PolicySource_Database_Driver } from "@cerbos/api/cerbos/audit/v1/audit_pb"; import { Effect as EffectProtobuf } from "@cerbos/api/cerbos/effect/v1/effect_pb"; import { PlanResourcesFilter_Kind } from "@cerbos/api/cerbos/engine/v1/engine_pb"; import { ScopePermissions as ScopePermissionsProtobuf } from "@cerbos/api/cerbos/policy/v1/policy_pb"; import { InspectPoliciesResponse_Attribute_Kind, InspectPoliciesResponse_Constant_Kind, InspectPoliciesResponse_DerivedRole_Kind, InspectPoliciesResponse_Variable_Kind, } from "@cerbos/api/cerbos/response/v1/response_pb"; import { ValidationError_Source } from "@cerbos/api/cerbos/schema/v1/schema_pb"; import { HealthCheckResponse_ServingStatus } from "@cerbos/api/grpc/health/v1/health_pb"; import { CheckResourcesResponse, CheckResourcesResult, DatabaseDriver, Effect, InspectedAttributeKind, InspectedConstantKind, InspectedDerivedRoleKind, InspectedVariableKind, PlanExpression, PlanExpressionValue, PlanExpressionVariable, PlanKind, SchemaDefinition, ScopePermissions, ServiceStatus, ValidationErrorSource, } from "../types/external.js"; export function accessLogEntryFromProtobuf({ entry, }) { requireOneOf("ListAuditLogEntriesResponse.entry", entry, "accessLogEntry"); const { callId, timestamp, peer, metadata, method, statusCode, oversized, policySource, } = entry.value; requireField("AccessLogEntry.timestamp", timestamp); requireField("AccessLogEntry.peer", peer); return { callId, timestamp: timestampDate(timestamp), peer: peerFromProtobuf(peer), metadata: auditLogMetadataFromProtobuf(metadata), method, statusCode, oversized, policySource: policySource && policySourceFromProtobuf(policySource), }; } export function decisionLogEntryFromProtobuf({ entry, }) { requireOneOf("ListAuditLogEntriesResponse.entry", entry, "decisionLogEntry"); const { callId, timestamp, peer, metadata, auditTrail, method, oversized, policySource, } = entry.value; requireField("DecisionLogEntry.timestamp", timestamp); requireField("DecisionLogEntry.peer", peer); return { callId, timestamp: timestampDate(timestamp), peer: peerFromProtobuf(peer), metadata: auditLogMetadataFromProtobuf(metadata), auditTrail: auditTrailFromProtobuf(auditTrail), method: decisionLogEntryMethodFromProtobuf(method), oversized, policySource: policySource && policySourceFromProtobuf(policySource), }; } function peerFromProtobuf({ address, authInfo, userAgent, forwardedFor, }) { return { address, authInfo, userAgent, forwardedFor, }; } function auditLogMetadataFromProtobuf(metadata) { return Object.fromEntries(Object.entries(metadata).map(([key, { values }]) => [key, values])); } /** @internal */ export function auditTrailFromProtobuf(auditTrail) { const { effectivePolicies = {} } = auditTrail ?? {}; return { effectivePolicies: Object.fromEntries(Object.entries(effectivePolicies).map(([policyId, sourceAttributes]) => [ policyId, sourceAttributesFromProtobuf(sourceAttributes), ])), }; } function policySourceFromProtobuf({ source, }) { return transformOneOf("PolicySource.source", source, { blob: policySourceBlobFromProtobuf, database: policySourceDatabaseFromProtobuf, disk: policySourceDiskFromProtobuf, embeddedPdp: policySourceEmbeddedPDPFromProtobuf, git: policySourceGitFromProtobuf, hub: policySourceHubFromProtobuf, }); } function policySourceBlobFromProtobuf({ bucketUrl, prefix, }) { return { kind: "blob", bucketUrl, prefix, }; } function policySourceDatabaseFromProtobuf({ driver, }) { return { kind: "database", driver: translateEnum("PolicySource.Database.Driver", PolicySource_Database_Driver, driver, { [PolicySource_Database_Driver.UNSPECIFIED]: unexpected, [PolicySource_Database_Driver.MYSQL]: DatabaseDriver.MYSQL, [PolicySource_Database_Driver.POSTGRES]: DatabaseDriver.POSTGRES, [PolicySource_Database_Driver.SQLITE3]: DatabaseDriver.SQLITE3, }), }; } function policySourceDiskFromProtobuf({ directory, }) { return { kind: "disk", directory, }; } function policySourceEmbeddedPDPFromProtobuf({ url, commitHash, builtAt, }) { return { kind: "embeddedPDP", url, commit: commitHash, builtAt: builtAt && timestampDate(builtAt), }; } function policySourceGitFromProtobuf({ repositoryUrl, branch, subdirectory, }) { return { kind: "git", repositoryUrl, branch, subdirectory, }; } function policySourceHubFromProtobuf({ source, }) { return { kind: "hub", ...policySourceHubSourceFromProtobuf(source), }; } function policySourceHubSourceFromProtobuf(source) { return transformOneOf("PolicySource.Hub.source", source, { deploymentId: policySourceHubDeploymentFromProtobuf, embeddedBundle: policySourceHubEmbeddedBundleFromProtobuf, label: policySourceHubLabelFromProtobuf, localBundle: policySourceHubLocalBundleFromProtobuf, playgroundId: policySourceHubPlaygroundFromProtobuf, }); } function policySourceHubDeploymentFromProtobuf(deploymentId) { return { deploymentId }; } function policySourceHubEmbeddedBundleFromProtobuf(embeddedBundle) { return { embeddedBundle: embeddedBundleFromProtobuf(embeddedBundle) }; } function policySourceHubLabelFromProtobuf(label) { return { label }; } function policySourceHubLocalBundleFromProtobuf(localBundle) { return { localBundle: localBundleFromProtobuf(localBundle) }; } function policySourceHubPlaygroundFromProtobuf(playgroundId) { return { playgroundId }; } function embeddedBundleFromProtobuf({ ruleId, scopes, }) { return { ruleId, scopes, }; } function localBundleFromProtobuf({ path, }) { return { path }; } function decisionLogEntryMethodFromProtobuf(method) { return transformOneOf("DecisionLogEntry.method", method, { checkResources: decisionLogEntryCheckResourcesFromProtobuf, planResources: decisionLogEntryPlanResourcesFromProtobuf, }); } function decisionLogEntryCheckResourcesFromProtobuf({ inputs, outputs, error, }) { return { name: "CheckResources", inputs: inputs.map(checkInputFromProtobuf), outputs: outputs.map(checkOutputFromProtobuf), error: error || undefined, }; } /** @internal */ export function checkInputFromProtobuf({ requestId, principal, resource, actions, auxData, }) { requireField("CheckInput.principal", principal); requireField("CheckInput.resource", resource); return { requestId, principal: principalFromProtobuf(principal), resource: resourceFromProtobuf(resource), actions, auxData: auxData && decodedAuxDataFromProtobuf(auxData), }; } function principalFromProtobuf({ id, roles, attr, policyVersion, scope, }) { return { id, roles, attr: valuesFromProtobuf(attr), policyVersion, scope, }; } function resourceFromProtobuf({ kind, id, attr, policyVersion, scope, }) { return { kind, id, attr: valuesFromProtobuf(attr), policyVersion, scope, }; } function decodedAuxDataFromProtobuf({ jwt }) { return { jwt: valuesFromProtobuf(jwt), }; } /** @internal */ export function valuesFromProtobuf(values) { return Object.fromEntries(Object.entries(values).map(([key, value]) => [ key, valueFromProtobuf(value), ])); } function valueFromProtobuf(value) { return toJson(ValueSchema, value); } /** @internal */ export function checkOutputFromProtobuf({ requestId, resourceId, actions, effectiveDerivedRoles, validationErrors, outputs, }) { return { requestId, resourceId, actions: Object.fromEntries(Object.entries(actions).map(([action, effect]) => [ action, checkOutputActionEffectFromProtobuf(effect), ])), effectiveDerivedRoles, validationErrors: validationErrors.map(validationErrorFromProtobuf), outputs: outputs.map(outputResultFromProtobuf), }; } function checkOutputActionEffectFromProtobuf({ effect, policy, scope, }) { return { effect: effectFromProtobuf(effect), policy, scope, }; } function decisionLogEntryPlanResourcesFromProtobuf({ input, output, error, }) { requireField("DecisionLogEntry.PlanResources.input", input); return { name: "PlanResources", input: planResourcesInputFromProtobuf(input), output: output && planResourcesOutputFromProtobuf(output), error: error || undefined, }; } /** @internal */ export function planResourcesInputFromProtobuf({ requestId, principal, resource, action, actions, auxData, }) { requireField("PlanResourcesInput.principal", principal); requireField("PlanResourcesInput.resource", resource); return { requestId, principal: principalFromProtobuf(principal), resource: resourceQueryFromProtobuf(resource), ...planResourcesActionsFromProtobuf({ action, actions }), auxData: auxData && decodedAuxDataFromProtobuf(auxData), }; } function resourceQueryFromProtobuf({ kind, attr, policyVersion, scope, }) { return { kind, attr: valuesFromProtobuf(attr), policyVersion, scope, }; } /** @internal */ export function planResourcesOutputFromProtobuf({ requestId, filter, filterDebug, action, actions, policyVersion, scope, validationErrors, }) { const base = { requestId, ...planResourcesActionsFromProtobuf({ action, actions }), policyVersion, scope, validationErrors: validationErrors.map(validationErrorFromProtobuf), }; requireField("PlanResourcesOutput.filter", filter); const kind = planKindFromProtobuf(filter.kind); if (kind !== PlanKind.CONDITIONAL) { return { ...base, kind }; } requireField("PlanResourcesFilter.condition", filter.condition); return { ...base, kind, condition: planOperandFromProtobuf(filter.condition), conditionString: filterDebug, }; } function planResourcesActionsFromProtobuf({ action, actions, }) { return { action: actions.length === 1 ? actions[0] : action, // eslint-disable-line @typescript-eslint/no-non-null-assertion actions: actions.length ? actions : [action], }; } export function checkResourcesResponseFromProtobuf({ cerbosCallId, requestId, results, }) { return new CheckResourcesResponse({ cerbosCallId, requestId, results: results.map(checkResourcesResultFromProtobuf), }); } function checkResourcesResultFromProtobuf({ resource, actions, validationErrors, meta, outputs, }) { requireField("CheckResourcesResponse.ResultEntry.resource", resource); return new CheckResourcesResult({ resource: checkResourcesResultResourceFromProtobuf(resource), actions: actionsFromProtobuf(actions), validationErrors: validationErrors.map(validationErrorFromProtobuf), metadata: meta && checkResourcesResultMetadataFromProtobuf(meta), outputs: outputs.map(outputResultFromProtobuf), }); } function checkResourcesResultResourceFromProtobuf({ kind, id, policyVersion, scope, }) { return { kind, id, policyVersion, scope, }; } function checkResourcesResultMetadataFromProtobuf({ actions, effectiveDerivedRoles, }) { return { actions: checkResourcesResultMetadataActionsFromProtobuf(actions), effectiveDerivedRoles, }; } function checkResourcesResultMetadataActionsFromProtobuf(actions) { return Object.fromEntries(Object.entries(actions).map(([action, effect]) => [ action, checkResourcesResultMetadataEffectFromProtobuf(effect), ])); } function checkResourcesResultMetadataEffectFromProtobuf({ matchedPolicy, matchedScope, }) { return { matchedPolicy, matchedScope, }; } function actionsFromProtobuf(actions) { return Object.fromEntries(Object.entries(actions).map(([action, effect]) => [ action, effectFromProtobuf(effect), ])); } function effectFromProtobuf(effect) { return effect === EffectProtobuf.ALLOW ? Effect.ALLOW : Effect.DENY; } function validationErrorFromProtobuf({ path, message, source, }) { return { path, message, source: validationErrorSourceFromProtobuf(source), }; } function validationErrorSourceFromProtobuf(source) { return translateEnum("ValidationError.Source", ValidationError_Source, source, { [ValidationError_Source.UNSPECIFIED]: unexpected, [ValidationError_Source.PRINCIPAL]: ValidationErrorSource.PRINCIPAL, [ValidationError_Source.RESOURCE]: ValidationErrorSource.RESOURCE, }); } function outputResultFromProtobuf({ src, val }) { return { source: src, value: val && valueFromProtobuf(val), }; } export function deleteSchemasResponseFromProtobuf({ deletedSchemas, }) { return { deletedSchemas }; } export function disablePoliciesResponseFromProtobuf({ disabledPolicies, }) { return { disabledPolicies }; } export function enablePoliciesResponseFromProtobuf({ enabledPolicies, }) { return { enabledPolicies }; } export function getPoliciesResponseFromProtobuf({ policies, }) { return { policies: policies.map(policyFromProtobuf) }; } export function healthCheckResponseFromProtobuf({ status, }) { return { status: status === HealthCheckResponse_ServingStatus.SERVING ? ServiceStatus.SERVING : ServiceStatus.NOT_SERVING, }; } /** @internal */ export function policyFromProtobuf({ apiVersion, description, disabled, metadata, variables, policyType, }) { return { apiVersion, description, disabled, metadata: metadata && policyMetadataFromProtobuf(metadata), variables, ...policyTypeFromProtobuf(policyType), }; } function policyMetadataFromProtobuf({ annotations, hash, sourceAttributes, sourceFile, storeIdentifer, storeIdentifier, }) { return { annotations, hash, sourceAttributes: sourceAttributesFromProtobuf(sourceAttributes), sourceFile, storeIdentifer: storeIdentifier || storeIdentifer, storeIdentifier: storeIdentifier || storeIdentifer, }; } function sourceAttributesFromProtobuf(sourceAttributes) { if (!sourceAttributes) { return {}; } return valuesFromProtobuf(sourceAttributes.attributes); } function policyTypeFromProtobuf(policyType) { return transformOneOf("Policy.policyType", policyType, { derivedRoles: derivedRolesFromProtobuf, exportConstants: exportConstantsFromProtobuf, exportVariables: exportVariablesFromProtobuf, principalPolicy: principalPolicyFromProtobuf, resourcePolicy: resourcePolicyFromProtobuf, rolePolicy: rolePolicyFromProtobuf, }); } function derivedRolesFromProtobuf({ name, definitions, constants, variables, }) { return { derivedRoles: { name, definitions: definitions.map(derivedRoleDefinitionFromProtobuf), constants: constants && constantsFromProtobuf(constants), variables: variables && variablesFromProtobuf(variables), }, }; } function derivedRoleDefinitionFromProtobuf({ name, parentRoles, condition, }) { return { name, parentRoles, condition: condition && conditionFromProtobuf(condition), }; } function conditionFromProtobuf({ condition }) { requireOneOf("Condition.condition", condition, "match"); return { match: matchFromProtobuf(condition.value) }; } function matchFromProtobuf({ op }) { return transformOneOf("Match.op", op, { all: (all) => ({ all: matchesFromProtobuf(all) }), any: (any) => ({ any: matchesFromProtobuf(any) }), none: (none) => ({ none: matchesFromProtobuf(none) }), expr: (expr) => ({ expr }), }); } function matchesFromProtobuf({ of }) { return { of: of.map(matchFromProtobuf) }; } function constantsFromProtobuf({ import: imports, local, }) { return { import: imports, local: valuesFromProtobuf(local), }; } function exportConstantsFromProtobuf({ name, definitions, }) { return { exportConstants: { name, definitions: valuesFromProtobuf(definitions), }, }; } function variablesFromProtobuf({ import: imports, local, }) { return { import: imports, local, }; } function exportVariablesFromProtobuf({ name, definitions, }) { return { exportVariables: { name, definitions, }, }; } function principalPolicyFromProtobuf({ principal, version, rules, scope, scopePermissions, constants, variables, }) { return { principalPolicy: { principal, version, rules: rules.map(principalRuleFromProtobuf), scope, scopePermissions: scopePermissionsFromProtobuf(scopePermissions), constants: constants && constantsFromProtobuf(constants), variables: variables && variablesFromProtobuf(variables), }, }; } function principalRuleFromProtobuf({ resource, actions, }) { return { resource, actions: actions.map(principalRuleActionFromProtobuf), }; } function principalRuleActionFromProtobuf({ action, effect, condition, name, output, }) { return { action, effect: effectFromProtobuf(effect), condition: condition && conditionFromProtobuf(condition), name, output: output && outputFromProtobuf(output), }; } function outputFromProtobuf({ expr, when }) { const output = {}; if (expr) { output.expr = expr; } if (when) { output.when = when; } return output; } function resourcePolicyFromProtobuf({ resource, version, importDerivedRoles, rules, schemas, scope, scopePermissions, constants, variables, }) { return { resourcePolicy: { resource, version, importDerivedRoles, rules: rules.map(resourceRuleFromProtobuf), schemas: schemas && schemaRefsFromProtobuf(schemas), scope, scopePermissions: scopePermissionsFromProtobuf(scopePermissions), constants: constants && constantsFromProtobuf(constants), variables: variables && variablesFromProtobuf(variables), }, }; } function resourceRuleFromProtobuf({ actions, effect, derivedRoles, roles, condition, name, output, }) { return { actions, effect: effectFromProtobuf(effect), derivedRoles, roles, condition: condition && conditionFromProtobuf(condition), name, output: output && outputFromProtobuf(output), }; } function rolePolicyFromProtobuf({ policyType, parentRoles, scope, rules, }) { requireOneOf("RolePolicy.policyType", policyType, "role"); return { rolePolicy: { role: policyType.value, parentRoles: parentRoles, scope, rules: rules.map(roleRuleFromProtobuf), }, }; } function roleRuleFromProtobuf({ resource, allowActions, }) { return { resource, allowActions, }; } function scopePermissionsFromProtobuf(scopePermissions) { return translateEnum("ScopePermissions", ScopePermissionsProtobuf, scopePermissions, { [ScopePermissionsProtobuf.UNSPECIFIED]: undefined, [ScopePermissionsProtobuf.OVERRIDE_PARENT]: ScopePermissions.OVERRIDE_PARENT, [ScopePermissionsProtobuf.REQUIRE_PARENTAL_CONSENT_FOR_ALLOWS]: ScopePermissions.REQUIRE_PARENTAL_CONSENT_FOR_ALLOWS, }); } function schemaRefsFromProtobuf({ principalSchema, resourceSchema, }) { return { principalSchema: principalSchema && schemaRefFromProtobuf(principalSchema), resourceSchema: resourceSchema && schemaRefFromProtobuf(resourceSchema), }; } function schemaRefFromProtobuf({ ref, ignoreWhen }) { return { ref, ignoreWhen: ignoreWhen && { actions: ignoreWhen.actions }, }; } export function getSchemasResponseFromProtobuf({ schemas, }) { return { schemas: schemas.map(schemaFromProtobuf) }; } function schemaFromProtobuf({ id, definition }) { return { id, definition: new SchemaDefinition(definition), }; } export function inspectPoliciesResponseFromProtobuf({ results, }) { return { policies: Object.fromEntries(Object.entries(results).map(([id, result]) => [ id, inspectedPolicyFromProtobuf(result), ])), }; } function inspectedPolicyFromProtobuf({ policyId, actions, attributes, constants, derivedRoles, variables, }) { return { id: policyId, actions, attributes: attributes.map(inspectedAttributeFromProtobuf), constants: constants.map(inspectedConstantFromProtobuf), derivedRoles: derivedRoles.map(inspectedDerivedRoleFromProtobuf), variables: variables.map(inspectedVariableFromProtobuf), }; } function inspectedAttributeFromProtobuf({ kind, name, }) { return { kind: inspectedAttributeKindFromProtobuf(kind), name, }; } function inspectedAttributeKindFromProtobuf(kind) { return translateEnum("InspectPoliciesResponse.Attribute.Kind", InspectPoliciesResponse_Attribute_Kind, kind, { [InspectPoliciesResponse_Attribute_Kind.UNSPECIFIED]: unexpected, [InspectPoliciesResponse_Attribute_Kind.PRINCIPAL_ATTRIBUTE]: InspectedAttributeKind.PRINCIPAL, [InspectPoliciesResponse_Attribute_Kind.RESOURCE_ATTRIBUTE]: InspectedAttributeKind.RESOURCE, }); } function inspectedConstantFromProtobuf({ kind, name, value, source, used, }) { return { kind: inspectedConstantKindFromProtobuf(kind), name, value: value && valueFromProtobuf(value), source: source || undefined, used, }; } function inspectedConstantKindFromProtobuf(kind) { return translateEnum("InspectPoliciesResponse.Constant.Kind", InspectPoliciesResponse_Constant_Kind, kind, { [InspectPoliciesResponse_Constant_Kind.UNSPECIFIED]: unexpected, [InspectPoliciesResponse_Constant_Kind.EXPORTED]: InspectedConstantKind.EXPORTED, [InspectPoliciesResponse_Constant_Kind.IMPORTED]: InspectedConstantKind.IMPORTED, [InspectPoliciesResponse_Constant_Kind.LOCAL]: InspectedConstantKind.LOCAL, [InspectPoliciesResponse_Constant_Kind.UNDEFINED]: InspectedConstantKind.UNDEFINED, [InspectPoliciesResponse_Constant_Kind.UNKNOWN]: InspectedConstantKind.UNKNOWN, }); } function inspectedDerivedRoleFromProtobuf({ kind, name, source, }) { return { kind: inspectedDerivedRoleKindFromProtobuf(kind), name, source: source || undefined, }; } function inspectedDerivedRoleKindFromProtobuf(kind) { return translateEnum("InspectPoliciesResponse.DerivedRole.Kind", InspectPoliciesResponse_DerivedRole_Kind, kind, { [InspectPoliciesResponse_DerivedRole_Kind.UNSPECIFIED]: unexpected, [InspectPoliciesResponse_DerivedRole_Kind.EXPORTED]: InspectedDerivedRoleKind.EXPORTED, [InspectPoliciesResponse_DerivedRole_Kind.IMPORTED]: InspectedDerivedRoleKind.IMPORTED, [InspectPoliciesResponse_DerivedRole_Kind.UNDEFINED]: InspectedDerivedRoleKind.UNDEFINED, }); } function inspectedVariableFromProtobuf({ kind, name, value, source, used, }) { return { kind: inspectedVariableKindFromProtobuf(kind), name, definition: value || undefined, source: source || undefined, used, }; } function inspectedVariableKindFromProtobuf(kind) { return translateEnum("InspectPoliciesResponse.Variable.Kind", InspectPoliciesResponse_Variable_Kind, kind, { [InspectPoliciesResponse_Variable_Kind.UNSPECIFIED]: unexpected, [InspectPoliciesResponse_Variable_Kind.EXPORTED]: InspectedVariableKind.EXPORTED, [InspectPoliciesResponse_Variable_Kind.IMPORTED]: InspectedVariableKind.IMPORTED, [InspectPoliciesResponse_Variable_Kind.LOCAL]: InspectedVariableKind.LOCAL, [InspectPoliciesResponse_Variable_Kind.UNDEFINED]: InspectedVariableKind.UNDEFINED, [InspectPoliciesResponse_Variable_Kind.UNKNOWN]: InspectedVariableKind.UNKNOWN, }); } export function listPoliciesResponseFromProtobuf({ policyIds, }) { return { ids: policyIds }; } export function listSchemasResponseFromProtobuf({ schemaIds, }) { return { ids: schemaIds }; } export function planResourcesResponseFromProtobuf({ cerbosCallId, requestId, filter, validationErrors, meta, }) { const base = { cerbosCallId, requestId, validationErrors: validationErrors.map(validationErrorFromProtobuf), metadata: meta && planResourcesMetadataFromProtobuf(meta), }; requireField("PlanResourcesResponse.filter", filter); const kind = planKindFromProtobuf(filter.kind); if (kind !== PlanKind.CONDITIONAL) { return { ...base, kind }; } requireField("PlanResourcesFilter.condition", filter.condition); return { ...base, kind, condition: planOperandFromProtobuf(filter.condition), }; } function planKindFromProtobuf(kind) { return translateEnum("PlanResourcesFilter.Kind", PlanResourcesFilter_Kind, kind, { [PlanResourcesFilter_Kind.UNSPECIFIED]: unexpected, [PlanResourcesFilter_Kind.ALWAYS_ALLOWED]: PlanKind.ALWAYS_ALLOWED, [PlanResourcesFilter_Kind.ALWAYS_DENIED]: PlanKind.ALWAYS_DENIED, [PlanResourcesFilter_Kind.CONDITIONAL]: PlanKind.CONDITIONAL, }); } function planOperandFromProtobuf({ node, }) { return transformOneOf("PlanResourcesFilter.Expression.Operand.node", node, { expression: (expression) => new PlanExpression(expression.operator, expression.operands.map(planOperandFromProtobuf)), value: (value) => new PlanExpressionValue(valueFromProtobuf(value)), variable: (variable) => new PlanExpressionVariable(variable), }); } function planResourcesMetadataFromProtobuf({ filterDebug, matchedScope, matchedScopes, }) { return { conditionString: filterDebug, matchedScope, matchedScopes, }; } export function serverInfoFromProtobuf({ buildDate, commit, version, }) { return { buildDate, commit, version, }; } /** @internal */ export const unexpected = Symbol("unexpected"); function isUnexpected(value) { return value === unexpected; } /** @internal */ export function translateEnum(descriptor, source, value, translate) { if (value in translate) { const result = translate[value]; if (!isUnexpected(result)) { return result; } } const wanted = Object.entries(source) .filter(([, value]) => typeof value === "number" && !isUnexpected(translate[value])) .map(([key, value]) => `${key}:${value}`) .join("|"); const got = source[value] ? `${source[value]}:${value}` : value; throw new Error(`Unexpected ${descriptor}: wanted ${wanted}, got ${got}`); } function transformOneOf(descriptor, oneOf, transforms) { requireField(descriptor, oneOf); const transform = transforms[oneOf.case]; if (!transform || isUnexpected(transform)) { throw new Error(`Unexpected ${descriptor}: wanted ${Object.keys(transforms).join("|")}, got ${oneOf.case}`); } return transform(oneOf.value); } function requireOneOf(descriptor, oneOf, $case) { requireField(descriptor, oneOf); if (oneOf.case !== $case) { throw new Error(`Unexpected ${descriptor}: wanted ${$case}, got ${oneOf.case}`); } } /** @internal */ export function requireField(descriptor, value) { if (value === undefined) { throw new Error(`Missing ${descriptor}`); } } //# sourceMappingURL=fromProtobuf.js.map