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