Squashed 'packages/mcp-typescript/' changes from e665be0..7d70db8

7d70db8 Merge pull request #20 from modelcontextprotocol/ashwin/progress
65a8613 fix schema definitions for RequestSchema

git-subtree-dir: packages/mcp-typescript
git-subtree-split: 7d70db805740c53f21153d72be6f34d70818a9da
This commit is contained in:
Ashwin Bhat
2024-10-17 08:10:26 -07:00
parent 23ca80ed66
commit cc1bf029fa
134 changed files with 4659 additions and 7709 deletions

99
dist/client/stdio.js generated vendored Normal file
View File

@@ -0,0 +1,99 @@
import { spawn } from "node:child_process";
import { ReadBuffer, serializeMessage } from "../shared/stdio.js";
/**
* Client transport for stdio: this will connect to a server by spawning a process and communicating with it over stdin/stdout.
*
* This transport is only available in Node.js environments.
*/
export class StdioClientTransport {
constructor(server) {
this._abortController = new AbortController();
this._readBuffer = new ReadBuffer();
this._serverParams = server;
}
/**
* Starts the server process and prepares to communicate with it.
*/
async start() {
if (this._process) {
throw new Error("StdioClientTransport already started! If using Client class, note that connect() calls start() automatically.");
}
return new Promise((resolve, reject) => {
var _a, _b, _c, _d;
this._process = spawn(this._serverParams.command, (_a = this._serverParams.args) !== null && _a !== void 0 ? _a : [], {
// The parent process may have sensitive secrets in its env, so don't inherit it automatically.
env: this._serverParams.env === undefined
? {}
: { ...this._serverParams.env },
stdio: ["pipe", "pipe", "inherit"],
signal: this._abortController.signal,
});
this._process.on("error", (error) => {
var _a, _b;
if (error.name === "AbortError") {
// Expected when close() is called.
(_a = this.onclose) === null || _a === void 0 ? void 0 : _a.call(this);
return;
}
reject(error);
(_b = this.onerror) === null || _b === void 0 ? void 0 : _b.call(this, error);
});
this._process.on("spawn", () => {
resolve();
});
this._process.on("close", (_code) => {
var _a;
this._process = undefined;
(_a = this.onclose) === null || _a === void 0 ? void 0 : _a.call(this);
});
(_b = this._process.stdin) === null || _b === void 0 ? void 0 : _b.on("error", (error) => {
var _a;
(_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, error);
});
(_c = this._process.stdout) === null || _c === void 0 ? void 0 : _c.on("data", (chunk) => {
this._readBuffer.append(chunk);
this.processReadBuffer();
});
(_d = this._process.stdout) === null || _d === void 0 ? void 0 : _d.on("error", (error) => {
var _a;
(_a = this.onerror) === null || _a === void 0 ? void 0 : _a.call(this, error);
});
});
}
processReadBuffer() {
var _a, _b;
while (true) {
try {
const message = this._readBuffer.readMessage();
if (message === null) {
break;
}
(_a = this.onmessage) === null || _a === void 0 ? void 0 : _a.call(this, message);
}
catch (error) {
(_b = this.onerror) === null || _b === void 0 ? void 0 : _b.call(this, error);
}
}
}
async close() {
this._abortController.abort();
this._process = undefined;
this._readBuffer.clear();
}
send(message) {
return new Promise((resolve) => {
var _a;
if (!((_a = this._process) === null || _a === void 0 ? void 0 : _a.stdin)) {
throw new Error("Not connected");
}
const json = serializeMessage(message);
if (this._process.stdin.write(json)) {
resolve();
}
else {
this._process.stdin.once("drain", resolve);
}
});
}
}
//# sourceMappingURL=stdio.js.map