UNPKG

@jakub.knejzlik/ts-query-server

Version:

TypeScript library for executing SQL queries built with ts-query across diverse server environments.

57 lines (46 loc) 1.5 kB
import { Query, QueryRouterClient } from "./client"; type ClientSourceName = string; export class QueryRouter { private clientsMap: Record<ClientSourceName, QueryRouterClient> = {}; constructor(private defaultClient: QueryRouterClient) {} addClient(client: QueryRouterClient, sourceName: ClientSourceName) { if (this.clientsMap[sourceName]) { throw new Error(`Client with source name ${sourceName} already exists`); } this.clientsMap[sourceName] = client; } async executeQueries(queries: Query[], datasource?: string): Promise<any[]> { if (!datasource) { const sources = this.getSources(queries); if (sources.length > 1) { throw new Error( `Queries from multiple sources are not supported: ${sources.join( ", " )}` ); } if (sources.length === 1) { datasource = sources[0]; } } const client = datasource ? this.clientsMap[datasource] : this.defaultClient; if (!client) { throw new Error(`Client with source name ${datasource} not found`); } return client.executeQueries(queries); } private getSources(queries: Query[]): ClientSourceName[] { const sources = new Set<string>(); for (const query of queries) { for (const table of query.getTableNames()) { const parts = table.split("@"); if (parts.length > 1) { sources.add(parts[0]); } } } return Array.from(sources); } }