UNPKG

@energica-city/shared-amplify-utils

Version:

Shared utilities for AWS Amplify projects

80 lines 8.83 kB
// ClientManager.ts (Updated) import { generateClient } from 'aws-amplify/data'; import { logger } from '../log'; /** * Singleton manager for AWS Amplify client instances. * Assumes Amplify.configure() has already been called. */ export class ClientManager { clientKey; static instances = new Map(); client = null; initPromise = null; constructor(clientKey) { this.clientKey = clientKey; } static getInstance(clientKey = 'default') { if (!ClientManager.instances.has(clientKey)) { ClientManager.instances.set(clientKey, new ClientManager(clientKey)); } return ClientManager.instances.get(clientKey); } /** * Initialize the client by generating it from Amplify. */ initialize() { if (this.initPromise) { return this.initPromise; } this.initPromise = this.generateClient(); return this.initPromise; } /** * Get the initialized client. */ async getClient() { if (!this.initPromise) { throw new Error(`Client not initialized for key '${this.clientKey}'. Call initialize() first.`); } await this.initPromise; return this.client; } /** * Check if client is initialized. */ isInitialized() { return this.client !== null; } /** * Reset this client instance. */ reset() { this.client = null; this.initPromise = null; logger.debug(`Client reset for key: ${this.clientKey}`); } /** * Reset all client instances. */ static resetAll() { ClientManager.instances.forEach(manager => manager.reset()); ClientManager.instances.clear(); logger.debug('All clients reset'); } async generateClient() { try { logger.debug(`Generating client for key: ${this.clientKey}`); this.client = generateClient(); logger.info(`Client generated for key: ${this.clientKey}`); } catch (error) { this.initPromise = null; // Allow retry const message = error instanceof Error ? error.message : String(error); logger.error(`Client generation failed for key: ${this.clientKey}`, { error: message, }); throw new Error(`Failed to generate client '${this.clientKey}': ${message}`); } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xpZW50TWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3F1ZXJpZXMvQ2xpZW50TWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2QkFBNkI7QUFDN0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFaEM7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFLYTtJQUo3QixNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksR0FBRyxFQUF5QixDQUFDO0lBQ3BELE1BQU0sR0FBbUIsSUFBSSxDQUFDO0lBQzlCLFdBQVcsR0FBeUIsSUFBSSxDQUFDO0lBRWpELFlBQXFDLFNBQWlCO1FBQWpCLGNBQVMsR0FBVCxTQUFTLENBQVE7SUFBRyxDQUFDO0lBRW5ELE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBb0IsU0FBUztRQUNyRCxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN2RSxDQUFDO1FBQ0QsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVO1FBQ2YsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzFCLENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUssQ0FBQztRQUM1QyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFNBQVM7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksS0FBSyxDQUNiLG1DQUFtQyxJQUFJLENBQUMsU0FBUyw2QkFBNkIsQ0FDL0UsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDdkIsT0FBTyxJQUFJLENBQUMsTUFBVyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNJLGFBQWE7UUFDbEIsT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLO1FBQ1YsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsTUFBTSxDQUFDLEtBQUssQ0FBQyx5QkFBeUIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLFFBQVE7UUFDcEIsYUFBYSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM1RCxhQUFhLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU8sS0FBSyxDQUFDLGNBQWM7UUFHMUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLE1BQU0sR0FBRyxjQUFjLEVBQUssQ0FBQztZQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLDZCQUE2QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUMsY0FBYztZQUN2QyxNQUFNLE9BQU8sR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkUsTUFBTSxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUNsRSxLQUFLLEVBQUUsT0FBTzthQUNmLENBQUMsQ0FBQztZQUNILE1BQU0sSUFBSSxLQUFLLENBQ2IsOEJBQThCLElBQUksQ0FBQyxTQUFTLE1BQU0sT0FBTyxFQUFFLENBQzVELENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENsaWVudE1hbmFnZXIudHMgKFVwZGF0ZWQpXG5pbXBvcnQgeyBnZW5lcmF0ZUNsaWVudCB9IGZyb20gJ2F3cy1hbXBsaWZ5L2RhdGEnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vbG9nJztcblxuLyoqXG4gKiBTaW5nbGV0b24gbWFuYWdlciBmb3IgQVdTIEFtcGxpZnkgY2xpZW50IGluc3RhbmNlcy5cbiAqIEFzc3VtZXMgQW1wbGlmeS5jb25maWd1cmUoKSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIENsaWVudE1hbmFnZXIge1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZXMgPSBuZXcgTWFwPHN0cmluZywgQ2xpZW50TWFuYWdlcj4oKTtcbiAgcHJpdmF0ZSBjbGllbnQ6IHVua25vd24gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpbml0UHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjbGllbnRLZXk6IHN0cmluZykge31cblxuICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKGNsaWVudEtleTogc3RyaW5nID0gJ2RlZmF1bHQnKTogQ2xpZW50TWFuYWdlciB7XG4gICAgaWYgKCFDbGllbnRNYW5hZ2VyLmluc3RhbmNlcy5oYXMoY2xpZW50S2V5KSkge1xuICAgICAgQ2xpZW50TWFuYWdlci5pbnN0YW5jZXMuc2V0KGNsaWVudEtleSwgbmV3IENsaWVudE1hbmFnZXIoY2xpZW50S2V5KSk7XG4gICAgfVxuICAgIHJldHVybiBDbGllbnRNYW5hZ2VyLmluc3RhbmNlcy5nZXQoY2xpZW50S2V5KSE7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgY2xpZW50IGJ5IGdlbmVyYXRpbmcgaXQgZnJvbSBBbXBsaWZ5LlxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pbml0UHJvbWlzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5pdFByb21pc2U7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0UHJvbWlzZSA9IHRoaXMuZ2VuZXJhdGVDbGllbnQ8VD4oKTtcbiAgICByZXR1cm4gdGhpcy5pbml0UHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGluaXRpYWxpemVkIGNsaWVudC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDbGllbnQ8VD4oKTogUHJvbWlzZTxUPiB7XG4gICAgaWYgKCF0aGlzLmluaXRQcm9taXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDbGllbnQgbm90IGluaXRpYWxpemVkIGZvciBrZXkgJyR7dGhpcy5jbGllbnRLZXl9Jy4gQ2FsbCBpbml0aWFsaXplKCkgZmlyc3QuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5pbml0UHJvbWlzZTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjbGllbnQgaXMgaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwdWJsaWMgaXNJbml0aWFsaXplZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhpcyBjbGllbnQgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5jbGllbnQgPSBudWxsO1xuICAgIHRoaXMuaW5pdFByb21pc2UgPSBudWxsO1xuICAgIGxvZ2dlci5kZWJ1ZyhgQ2xpZW50IHJlc2V0IGZvciBrZXk6ICR7dGhpcy5jbGllbnRLZXl9YCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgYWxsIGNsaWVudCBpbnN0YW5jZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlc2V0QWxsKCk6IHZvaWQge1xuICAgIENsaWVudE1hbmFnZXIuaW5zdGFuY2VzLmZvckVhY2gobWFuYWdlciA9PiBtYW5hZ2VyLnJlc2V0KCkpO1xuICAgIENsaWVudE1hbmFnZXIuaW5zdGFuY2VzLmNsZWFyKCk7XG4gICAgbG9nZ2VyLmRlYnVnKCdBbGwgY2xpZW50cyByZXNldCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUNsaWVudDxcbiAgICBUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gID4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgR2VuZXJhdGluZyBjbGllbnQgZm9yIGtleTogJHt0aGlzLmNsaWVudEtleX1gKTtcbiAgICAgIHRoaXMuY2xpZW50ID0gZ2VuZXJhdGVDbGllbnQ8VD4oKTtcbiAgICAgIGxvZ2dlci5pbmZvKGBDbGllbnQgZ2VuZXJhdGVkIGZvciBrZXk6ICR7dGhpcy5jbGllbnRLZXl9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuaW5pdFByb21pc2UgPSBudWxsOyAvLyBBbGxvdyByZXRyeVxuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGxvZ2dlci5lcnJvcihgQ2xpZW50IGdlbmVyYXRpb24gZmFpbGVkIGZvciBrZXk6ICR7dGhpcy5jbGllbnRLZXl9YCwge1xuICAgICAgICBlcnJvcjogbWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGdlbmVyYXRlIGNsaWVudCAnJHt0aGlzLmNsaWVudEtleX0nOiAke21lc3NhZ2V9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=