SPB Git forge

spb/market-atlas

Public
12commits 1branches 0releases
1.1 MBsize
maindefault branch
10 days agolast push
TypeScript 96.7% SQL 1.6% CSS 0.8% JavaScript 0.5%
1.3 KB · 22 lines typescript
Raw Blame History
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