Files
cline/apps/vscode/scripts/proto-utils.mjs
Tomás BarreiroandSaoud Rizwan 791d238996 Move vscode to apps (#10961)
* Move all vscode related files to /apps/vscode

* Fix launch and biome

* Ignore generated files

* Remove unused icons

* fix tsconfig

* Update workflows (#10962)

* Add default branch

* Move files to the right dir

* fix: add vscode publish README placeholder

---------

Co-authored-by: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com>
2026-05-25 21:35:59 +02:00

60 lines
1.8 KiB
JavaScript
Executable File

#!/usr/bin/env node
import * as grpc from "@grpc/grpc-js"
import * as protoLoader from "@grpc/proto-loader"
import * as fs from "fs/promises"
import * as path from "path"
const DESCRIPTOR_SET = path.resolve("dist-standalone/proto/descriptor_set.pb")
const typeNameToFQN = new Map()
function addTypeNameToFqn(name, fqn) {
if (typeNameToFQN.has(name) && typeNameToFQN.get(name) !== fqn) {
throw new Error(`Proto type ${name} redefined (${fqn}).`)
}
typeNameToFQN.set(name, fqn)
}
// Get the fully qualified name for a proto type, e.g. getFqn('StringRequest') returns 'cline.StringRequest'
export function getFqn(name) {
if (!typeNameToFQN.has(name)) {
throw Error(`No FQN for ${name}`)
}
return typeNameToFQN.get(name)
}
export async function getPackageDefinition() {
const descriptorBuffer = await fs.readFile(DESCRIPTOR_SET)
const options = { longs: Number } // Encode int64 fields as numbers
return protoLoader.loadFileDescriptorSetFromBuffer(descriptorBuffer, options)
}
export async function loadProtoDescriptorSet() {
const packageDefinition = await getPackageDefinition()
return grpc.loadPackageDefinition(packageDefinition)
}
export async function loadServicesFromProtoDescriptor() {
// Load service definitions from descriptor set
const proto = await loadProtoDescriptorSet()
// Extract host services and proto messages from the proto definition
const hostServices = {}
for (const [name, def] of Object.entries(proto.host)) {
if (def && "service" in def) {
hostServices[name] = def
} else {
addTypeNameToFqn(name, `proto.host.${name}`)
}
}
const protobusServices = {}
for (const [name, def] of Object.entries(proto.cline)) {
if (def && "service" in def) {
protobusServices[name] = def
} else {
addTypeNameToFqn(name, `proto.cline.${name}`)
}
}
return { protobusServices, hostServices }
}