DSH-Arch-Setup/plugins/dsh-touched-git/lib/editor-route.js
Шурупов Илья Викторович cf9443753e Add one-command Arch DSH setup
Package the portable DSH profiles, local plugins, desktop integration, Firefox wrapper, and ownership-aware installer lifecycle. Bundle checksum-pinned OpenVSCode, editor extensions, translation assets, and cloudflared so unreliable upstream artifact downloads cannot break a clean installation.
2026-09-12 19:13:36 +03:00

42 lines
2 KiB
JavaScript

export function createEditorOpenHandler({ store, resolveDirectoryRepository, isLoopbackRequest, editor, writeJson }) {
return async (request, response) => {
response.setHeader('cache-control', 'no-store')
if (request.method !== 'POST') {
return writeJson(response, 405, { ok: false, error: { code: 'method-not-allowed', message: 'Use POST to open a workspace.' } })
}
if (!isLoopbackRequest(request) || request.headers['x-dsh-editor-action'] !== 'open') {
return writeJson(response, 403, { ok: false, error: { code: 'forbidden', message: 'Open workspaces from the local Git Working Dirs menu.' } })
}
const url = new URL(request.url, `http://${request.headers.host}`)
const sessionId = url.searchParams.get('sessionId') || ''
const path = url.searchParams.get('path') || ''
if (!sessionId || !path) {
return writeJson(response, 400, { ok: false, error: { code: 'invalid-request', message: 'Missing session or directory.' } })
}
try {
const entries = await store.list(sessionId)
const entry = entries.find(entry => entry.ok && [entry.id, entry.path, entry.repository, entry.workingDirectory].includes(path))
if (!entry) {
return writeJson(response, 403, { ok: false, error: { code: 'not-tracked', message: 'Directory is not tracked by this session.' } })
}
const directory = entry.workingDirectory || entry.repository
const resolved = await resolveDirectoryRepository(directory)
if (resolved.repository !== entry.repository) {
return writeJson(response, 409, { ok: false, error: { code: 'directory-changed', message: 'Repository location changed. Track it again before opening.' } })
}
const workspace = await editor.open(resolved.workingDirectory)
return writeJson(response, 200, { ok: true, value: workspace })
} catch (error) {
return writeJson(response, 503, { ok: false, error: { code: 'editor-unavailable', message: error.message || 'Unable to open VS Code.' } })
}
}
}