@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
JavaScript
/**
* 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