Skip to main content
Glama

MCP Specification Server

by MCPJam
23
6
  • Apple
WebStreamDefaultReader.js•2.09 kB
import { EndOfStreamError } from './Errors.js'; import { AbstractStreamReader } from "./AbstractStreamReader.js"; export class WebStreamDefaultReader extends AbstractStreamReader { constructor(reader) { super(); this.reader = reader; this.buffer = null; // Internal buffer to store excess data } /** * Copy chunk to target, and store the remainder in this.buffer */ writeChunk(target, chunk) { const written = Math.min(chunk.length, target.length); target.set(chunk.subarray(0, written)); // Adjust the remainder of the buffer if (written < chunk.length) { this.buffer = chunk.subarray(written); } else { this.buffer = null; } return written; } /** * Read from stream * @param buffer - Target Uint8Array (or Buffer) to store data read from stream in * @param mayBeLess - If true, may fill the buffer partially * @protected Bytes read */ async readFromStream(buffer, mayBeLess) { if (buffer.length === 0) return 0; let totalBytesRead = 0; // Serve from the internal buffer first if (this.buffer) { totalBytesRead += this.writeChunk(buffer, this.buffer); } // Continue reading from the stream if more data is needed while (totalBytesRead < buffer.length && !this.endOfStream) { const result = await this.reader.read(); if (result.done) { this.endOfStream = true; break; } if (result.value) { totalBytesRead += this.writeChunk(buffer.subarray(totalBytesRead), result.value); } } if (!mayBeLess && totalBytesRead === 0 && this.endOfStream) { throw new EndOfStreamError(); } return totalBytesRead; } abort() { this.interrupted = true; return this.reader.cancel(); } async close() { await this.abort(); this.reader.releaseLock(); } }

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/MCPJam/mcp-spec'

If you have feedback or need assistance with the MCP directory API, please join our Discord server