/**
* SEC EDGAR single-filing-document connector.
*
* Downloads a specific filing's primary document from sec.gov, strips
* HTML to plain text, and truncates at maxChars (default 50,000).
* Only sec.gov hosts are accepted.
*/
import {
RetrievalError,
type FetchParams,
type RawPayload,
type RetrievalConnector,
} from '../interface.js';
import { secFilingDocument, type SecFilingDocument } from './sec-edgar.js';
const DEFAULT_MAX_CHARS = 50_000;
export class SecFilingDocumentConnector implements RetrievalConnector {
readonly name = 'sec-filing-document';
readonly authRequired = false;
readonly rateLimit = { requestsPerSecond: 10, burstSize: 10 };
async isAvailable(): Promise<boolean> {
return true;
}
async fetch(params: FetchParams): Promise<RawPayload> {
const documentUrl =
typeof params.query?.documentUrl === 'string' ? (params.query.documentUrl as string) : '';
if (!documentUrl) {
throw new RetrievalError(
'invalid-request',
'sec-filing-document: query.documentUrl is required (sec.gov host).',
);
}
const maxChars =
typeof params.query?.maxChars === 'number' ? (params.query.maxChars as number) : DEFAULT_MAX_CHARS;
const doc = await secFilingDocument(documentUrl, maxChars);
return {
source: this.name,
sourceUrl: doc.url,
capturedAt: doc.capturedAt,
contentType: doc.contentType,
rawContent: doc.text,
metadata: {
originalBytes: doc.originalBytes,
truncated: doc.truncated,
maxChars,
},
};
}
}
/** Standalone fetcher mirroring the documented signature. */
export async function fetchSecFilingDocument(
documentUrl: string,
maxChars?: number,
): Promise<SecFilingDocument> {
return secFilingDocument(documentUrl, maxChars);
}
export type { SecFilingDocument };