spb/market-atlas
Public
TypeScript 96.7%
SQL 1.6%
CSS 0.8%
JavaScript 0.5%
1import { ConnectorMetadataSchema, type RawObservation } from "@market-atlas/market-model";2import type { ConnectorDefinition } from "./types.js";34/** Validates metadata eagerly so a mis-declared connector fails at load time, not at 3 a.m. */5export function defineConnector(def: ConnectorDefinition): ConnectorDefinition {6 const parsed = ConnectorMetadataSchema.safeParse(def.metadata);7 if (!parsed.success) {8 throw new Error(`connector "${def.metadata?.id ?? "?"}" has invalid metadata: ${parsed.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ")}`);9 }10 if (!def.start && !def.poll) throw new Error(`connector "${def.metadata.id}" must implement start() or poll()`);11 if (def.poll && !def.schedule) throw new Error(`connector "${def.metadata.id}" polls but declares no schedule`);12 if (def.metadata.rightsStatus === "UNKNOWN") {13 // Allowed to exist, but the runtime will refuse to expose its values publicly.14 }15 return def;16}1718/** Helper for connectors to build raw observations consistently. */19export function raw(connectorId: string, sourceId: string, kind: string, payload: unknown, meta?: Record<string, unknown>): RawObservation {20 return { connectorId, sourceId, kind, payload, receivedAt: Date.now(), ...(meta ? { meta } : {}) };21}22