UNPKG

@lineai/municipal-intel

Version:

AI-first municipal data API providing natural language descriptions of building permits and planning applications from major US cities

89 lines 5.5 kB
"use strict"; /** * Base client interface for municipal data sources */ Object.defineProperty(exports, "__esModule", { value: true }); exports.ServiceUnavailableError = exports.RateLimitError = exports.AuthenticationError = exports.MunicipalDataError = exports.BaseMunicipalClient = void 0; /** * Abstract base class for municipal data clients */ class BaseMunicipalClient { constructor(config) { this.source = config.source; this.timeout = config.timeout || 30000; this.retries = config.retries || 3; this.debug = config.debug || false; } /** * Get the source configuration */ getSource() { return this.source; } /** * Log debug message if debug mode enabled */ log(message, data) { if (this.debug) { console.log(`[${this.source.id}] ${message}`, data || ''); } } /** * Sleep for specified milliseconds */ sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } /** * Retry a function with exponential backoff */ async withRetry(fn, retries = this.retries, delay = 1000) { try { return await fn(); } catch (error) { if (retries === 0) { throw error; } this.log(`Retrying after error: ${error}. ${retries} attempts remaining.`); await this.sleep(delay); return this.withRetry(fn, retries - 1, delay * 2); } } } exports.BaseMunicipalClient = BaseMunicipalClient; /** * Error types for municipal data access */ class MunicipalDataError extends Error { constructor(message, source, statusCode, details) { super(message); this.source = source; this.statusCode = statusCode; this.details = details; this.name = 'MunicipalDataError'; } } exports.MunicipalDataError = MunicipalDataError; class AuthenticationError extends MunicipalDataError { constructor(source, details) { super('Authentication failed', source, 401, details); this.name = 'AuthenticationError'; } } exports.AuthenticationError = AuthenticationError; class RateLimitError extends MunicipalDataError { constructor(source, resetTime) { super('Rate limit exceeded', source, 429, { resetTime }); this.name = 'RateLimitError'; } } exports.RateLimitError = RateLimitError; class ServiceUnavailableError extends MunicipalDataError { constructor(source, details) { super('Service is temporarily unavailable', source, 503, details); this.name = 'ServiceUnavailableError'; } } exports.ServiceUnavailableError = ServiceUnavailableError; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpZW50cy9iYXNlLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7OztBQXlCSDs7R0FFRztBQUNILE1BQXNCLG1CQUFtQjtJQU12QyxZQUFZLE1BQXdCO1FBQ2xDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUEyQkQ7O09BRUc7SUFDTyxHQUFHLENBQUMsT0FBZSxFQUFFLElBQVU7UUFDdkMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztTQUMzRDtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNPLEtBQUssQ0FBQyxFQUFVO1FBQ3hCLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ08sS0FBSyxDQUFDLFNBQVMsQ0FDdkIsRUFBb0IsRUFDcEIsVUFBa0IsSUFBSSxDQUFDLE9BQU8sRUFDOUIsUUFBZ0IsSUFBSTtRQUVwQixJQUFJO1lBQ0YsT0FBTyxNQUFNLEVBQUUsRUFBRSxDQUFDO1NBQ25CO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUU7Z0JBQ2pCLE1BQU0sS0FBSyxDQUFDO2FBQ2I7WUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLHlCQUF5QixLQUFLLEtBQUssT0FBTyxzQkFBc0IsQ0FBQyxDQUFDO1lBQzNFLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ25EO0lBQ0gsQ0FBQztDQUNGO0FBakZELGtEQWlGQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxLQUFLO0lBQzNDLFlBQ0UsT0FBZSxFQUNSLE1BQWMsRUFDZCxVQUFtQixFQUNuQixPQUFhO1FBRXBCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUpSLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxlQUFVLEdBQVYsVUFBVSxDQUFTO1FBQ25CLFlBQU8sR0FBUCxPQUFPLENBQU07UUFHcEIsSUFBSSxDQUFDLElBQUksR0FBRyxvQkFBb0IsQ0FBQztJQUNuQyxDQUFDO0NBQ0Y7QUFWRCxnREFVQztBQUVELE1BQWEsbUJBQW9CLFNBQVEsa0JBQWtCO0lBQ3pELFlBQVksTUFBYyxFQUFFLE9BQWE7UUFDdkMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLElBQUksR0FBRyxxQkFBcUIsQ0FBQztJQUNwQyxDQUFDO0NBQ0Y7QUFMRCxrREFLQztBQUVELE1BQWEsY0FBZSxTQUFRLGtCQUFrQjtJQUNwRCxZQUFZLE1BQWMsRUFBRSxTQUFnQjtRQUMxQyxLQUFLLENBQUMscUJBQXFCLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0NBQ0Y7QUFMRCx3Q0FLQztBQUVELE1BQWEsdUJBQXdCLFNBQVEsa0JBQWtCO0lBQzdELFlBQVksTUFBYyxFQUFFLE9BQWE7UUFDdkMsS0FBSyxDQUFDLG9DQUFvQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLElBQUksR0FBRyx5QkFBeUIsQ0FBQztJQUN4QyxDQUFDO0NBQ0Y7QUFMRCwwREFLQyJ9