feat(mcp): подготовить сервер и доступ к приёмке
This commit is contained in:
commit
bf3d50e1ff
3835 files changed
+537122
No files matched your search
@@ -0,0 +1,76 @@
|
||||
import EmbeddedPostgres from 'embedded-postgres'
|
||||
import { build, stop } from 'esbuild'
|
||||
import { mkdtemp, rm, readFile } from 'node:fs/promises'
|
||||
import { tmpdir } from 'node:os'
|
||||
import { join, resolve, dirname } from 'node:path'
|
||||
import { createServer } from 'node:net'
|
||||
import { randomBytes } from 'node:crypto'
|
||||
import { spawn } from 'node:child_process'
|
||||
import assert from 'node:assert/strict'
|
||||
import { pathToFileURL } from 'node:url'
|
||||
|
||||
if (process.argv.length !== 2) throw Error('Read HTTP acceptance requires its own disposable cluster and no arguments')
|
||||
const repo = resolve(import.meta.dirname, '../..')
|
||||
const directory = await mkdtemp(join(tmpdir(), 'mm-flow-http-owned-'))
|
||||
const bundleDirectory = await mkdtemp(join(repo, 'tmp', 'mm-flow-http-owned-bundle-'))
|
||||
const listener = createServer()
|
||||
await new Promise(resolve => listener.listen(0, '127.0.0.1', resolve))
|
||||
const port = listener.address().port
|
||||
await new Promise(resolve => listener.close(resolve))
|
||||
const password = randomBytes(24).toString('hex')
|
||||
const postgres = new EmbeddedPostgres({
|
||||
databaseDir: join(directory, 'pg'), port, user: 'mcp_test', password,
|
||||
persistent: true, createPostgresUser: false, initdbFlags: ['--encoding=UTF8'],
|
||||
postgresFlags: ['-h', '127.0.0.1', '-c', 'work_mem=4MB'],
|
||||
onLog: () => {}, onError: () => {},
|
||||
})
|
||||
let started = false
|
||||
let outcome = 1
|
||||
try {
|
||||
const file = join(bundleDirectory, 'read-http-owned.mjs')
|
||||
// Current application sources only: no candidate overlays or generated mocks.
|
||||
await build({
|
||||
entryPoints: [join(repo, 'backend/src/services/traffic-flow-read-http.owned.test.ts')],
|
||||
outfile: file, platform: 'node', format: 'esm', bundle: true,
|
||||
packages: 'external', sourcemap: 'inline',
|
||||
banner: { js: "import {createRequire as __ownedCreateRequire} from 'node:module';const require=__ownedCreateRequire(import.meta.url);" },
|
||||
plugins: [{ name: 'contracts-source', setup(builder) {
|
||||
builder.onResolve({ filter: /^@mmapp\/contracts(?:\/.*)?$/ }, args => ({
|
||||
path: resolve(repo, 'packages/contracts/src', args.path.replace(/^@mmapp\/contracts\/?/, '') || 'index') + '.ts',
|
||||
}))
|
||||
builder.onLoad({ filter: /\.ts$/ }, async args => ({
|
||||
contents: (await readFile(args.path, 'utf8')).replaceAll('import.meta.url', JSON.stringify(pathToFileURL(args.path).href)),
|
||||
loader: 'ts',
|
||||
}))
|
||||
} }],
|
||||
})
|
||||
await postgres.initialise()
|
||||
await postgres.start()
|
||||
started = true
|
||||
const exit = await new Promise((resolve, reject) => {
|
||||
const child = spawn(process.execPath, [file], {
|
||||
cwd: directory, windowsHide: true, stdio: 'inherit',
|
||||
env: { ...process.env,
|
||||
DATABASE_URL: `postgresql://mcp_test:${password}@127.0.0.1:${port}/postgres`,
|
||||
DATABASE_PATH: join(directory, 'unused.sqlite'), MCP_STATE_DIR: join(directory, 'state'),
|
||||
AUTH_REQUIRED: 'true', AUTH_ISSUER: 'https://auth.test.local',
|
||||
AUTH_JWT_SECRET: 'owned-flow-http-only-secret', MCP_PUBLIC_URL: 'http://localhost:8000/mcp', NODE_ENV: 'test',
|
||||
NODE_PATH: join(repo, 'node_modules'),
|
||||
},
|
||||
})
|
||||
child.once('error', reject)
|
||||
child.once('exit', resolve)
|
||||
})
|
||||
outcome = exit ?? 1
|
||||
} finally {
|
||||
if (started) await postgres.stop()
|
||||
assert.equal(dirname(resolve(directory)), resolve(tmpdir()))
|
||||
assert.match(directory, /mm-flow-http-owned-/)
|
||||
await rm(directory, { recursive: true, force: true, maxRetries: 20, retryDelay: 100 })
|
||||
assert.equal(dirname(resolve(bundleDirectory)), resolve(repo, 'tmp'))
|
||||
assert.match(bundleDirectory, /mm-flow-http-owned-bundle-/)
|
||||
await rm(bundleDirectory, { recursive: true, force: true, maxRetries: 20, retryDelay: 100 })
|
||||
stop()
|
||||
console.log('Owned read HTTP cluster stopped and temporary resources removed')
|
||||
}
|
||||
process.exitCode = outcome
|
||||
Reference in new issue
Block a user