UNPKG

@lineai/municipal-intel

Version:

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

88 lines 5.2 kB
/** * Base client interface for municipal data sources */ /** * Abstract base class for municipal data clients */ export class BaseMunicipalClient { source; timeout; retries; debug; 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); } } } /** * Error types for municipal data access */ export class MunicipalDataError extends Error { source; statusCode; details; constructor(message, source, statusCode, details) { super(message); this.source = source; this.statusCode = statusCode; this.details = details; this.name = 'MunicipalDataError'; } } export class AuthenticationError extends MunicipalDataError { constructor(source, details) { super('Authentication failed', source, 401, details); this.name = 'AuthenticationError'; } } export class RateLimitError extends MunicipalDataError { constructor(source, resetTime) { super('Rate limit exceeded', source, 429, { resetTime }); this.name = 'RateLimitError'; } } export class ServiceUnavailableError extends MunicipalDataError { constructor(source, details) { super('Service is temporarily unavailable', source, 503, details); this.name = 'ServiceUnavailableError'; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpZW50cy9iYXNlLWNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQXlCSDs7R0FFRztBQUNILE1BQU0sT0FBZ0IsbUJBQW1CO0lBQzdCLE1BQU0sQ0FBa0I7SUFDeEIsT0FBTyxDQUFTO0lBQ2hCLE9BQU8sQ0FBUztJQUNoQixLQUFLLENBQVU7SUFFekIsWUFBWSxNQUF3QjtRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQztRQUN2QyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUM7SUFDckMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBMkJEOztPQUVHO0lBQ08sR0FBRyxDQUFDLE9BQWUsRUFBRSxJQUFVO1FBQ3ZDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7U0FDM0Q7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxLQUFLLENBQUMsRUFBVTtRQUN4QixPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRDs7T0FFRztJQUNPLEtBQUssQ0FBQyxTQUFTLENBQ3ZCLEVBQW9CLEVBQ3BCLFVBQWtCLElBQUksQ0FBQyxPQUFPLEVBQzlCLFFBQWdCLElBQUk7UUFFcEIsSUFBSTtZQUNGLE9BQU8sTUFBTSxFQUFFLEVBQUUsQ0FBQztTQUNuQjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsSUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFFO2dCQUNqQixNQUFNLEtBQUssQ0FBQzthQUNiO1lBRUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsS0FBSyxLQUFLLE9BQU8sc0JBQXNCLENBQUMsQ0FBQztZQUMzRSxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztTQUNuRDtJQUNILENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGtCQUFtQixTQUFRLEtBQUs7SUFHbEM7SUFDQTtJQUNBO0lBSlQsWUFDRSxPQUFlLEVBQ1IsTUFBYyxFQUNkLFVBQW1CLEVBQ25CLE9BQWE7UUFFcEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBSlIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGVBQVUsR0FBVixVQUFVLENBQVM7UUFDbkIsWUFBTyxHQUFQLE9BQU8sQ0FBTTtRQUdwQixJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDO0lBQ25DLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxrQkFBa0I7SUFDekQsWUFBWSxNQUFjLEVBQUUsT0FBYTtRQUN2QyxLQUFLLENBQUMsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFxQixDQUFDO0lBQ3BDLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxjQUFlLFNBQVEsa0JBQWtCO0lBQ3BELFlBQVksTUFBYyxFQUFFLFNBQWdCO1FBQzFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxrQkFBa0I7SUFDN0QsWUFBWSxNQUFjLEVBQUUsT0FBYTtRQUN2QyxLQUFLLENBQUMsb0NBQW9DLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsSUFBSSxHQUFHLHlCQUF5QixDQUFDO0lBQ3hDLENBQUM7Q0FDRiJ9