UNPKG

@energica-city/shared-amplify-utils

Version:

Shared utilities for AWS Amplify projects

85 lines 12.4 kB
import { logger } from '../../log'; import { buildWebSocketContext, getErrorMessage } from './utils'; export function createWebSocketModelInitializer(config) { const { schema, amplifyOutputs, entities, clientKey = 'default', timeout = 5000, } = config; let isInitialized = false; let initPromise = null; const initialize = async (input) => { const context = buildWebSocketContext(input); try { const { initializeQueries } = await import('../../queries'); logger.debug('WebSocket Model Initializer - Initializing queries', { ...context, entities: entities ?? 'all', }); const db = await Promise.race([ initializeQueries({ amplifyOutputs, schema, entities, clientKey, }), new Promise((_, reject) => setTimeout(() => reject(new Error(`Initialization timeout after ${timeout}ms`)), timeout)), ]); // Create a properly typed models object const models = {}; const modelKeys = entities ?? Object.keys(schema.models || {}); for (const modelName of modelKeys) { const instance = db[modelName]; if (instance) { models[modelName] = instance; } } logger.info('WebSocket Model Initializer - Models initialized successfully', { ...context, modelCount: Object.keys(models).length, models: Object.keys(models), }); return models; } catch (error) { logger.error('WebSocket Model Initializer - Initialization failed', { ...context, error: getErrorMessage(error), }); throw error; } }; return async (input, next) => { const context = buildWebSocketContext(input); try { if (isInitialized && initPromise) { const models = await initPromise; return await next({ ...input, models }); } if (!initPromise) { logger.info('WebSocket Model Initializer - Starting', context); initPromise = initialize(input); } const models = await initPromise; isInitialized = true; logger.info('WebSocket Model Initializer - Complete', { ...context, modelCount: Object.keys(models).length, }); return await next({ ...input, models }); } catch (error) { const message = getErrorMessage(error); logger.error('WebSocket Model Initializer - Failed', { ...context, error: message, }); isInitialized = false; initPromise = null; return { statusCode: 500, body: JSON.stringify({ error: 'Model initialization failed', message, }), }; } }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ViU29ja2V0TW9kZWxJbml0aWFsaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL21pZGRsZXdhcmUvd2Vic29ja2V0L1dlYlNvY2tldE1vZGVsSW5pdGlhbGl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQVNuQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWpFLE1BQU0sVUFBVSwrQkFBK0IsQ0FLN0MsTUFBd0Q7SUFFeEQsTUFBTSxFQUNKLE1BQU0sRUFDTixjQUFjLEVBQ2QsUUFBUSxFQUNSLFNBQVMsR0FBRyxTQUFTLEVBQ3JCLE9BQU8sR0FBRyxJQUFJLEdBQ2YsR0FBRyxNQUFNLENBQUM7SUFFWCxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDMUIsSUFBSSxXQUFXLEdBRUgsSUFBSSxDQUFDO0lBRWpCLE1BQU0sVUFBVSxHQUFHLEtBQUssRUFDdEIsS0FBdUMsRUFHdEMsRUFBRTtRQUNILE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTdDLElBQUksQ0FBQztZQUNILE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBRTVELE1BQU0sQ0FBQyxLQUFLLENBQUMsb0RBQW9ELEVBQUU7Z0JBQ2pFLEdBQUcsT0FBTztnQkFDVixRQUFRLEVBQUUsUUFBUSxJQUFJLEtBQUs7YUFDNUIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxFQUFFLEdBQUcsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUM1QixpQkFBaUIsQ0FBa0I7b0JBQ2pDLGNBQWM7b0JBQ2QsTUFBTTtvQkFDTixRQUFRO29CQUNSLFNBQVM7aUJBQ1YsQ0FBQztnQkFDRixJQUFJLE9BQU8sQ0FBUSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsRUFB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LENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL2xvZyc7XG5pbXBvcnQgdHlwZSB7XG4gIFdlYlNvY2tldE1vZGVsSW5pdGlhbGl6ZXJDb25maWcsXG4gIFdlYlNvY2tldElucHV0V2l0aE1vZGVscyxcbiAgV2ViU29ja2V0SGFuZGxlclJldHVybixcbiAgV2ViU29ja2V0UmVzcG9uc2UsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBNaWRkbGV3YXJlIH0gZnJvbSAnLi4vbWlkZGxld2FyZUNoYWluJztcbmltcG9ydCB0eXBlIHsgQW1wbGlmeU1vZGVsVHlwZSwgUXVlcnlGYWN0b3J5UmVzdWx0IH0gZnJvbSAnLi4vLi4vcXVlcmllcy90eXBlcyc7XG5pbXBvcnQgeyBidWlsZFdlYlNvY2tldENvbnRleHQsIGdldEVycm9yTWVzc2FnZSB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViU29ja2V0TW9kZWxJbml0aWFsaXplcjxcbiAgVFNjaGVtYSBleHRlbmRzIHsgbW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9LFxuICBUVHlwZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBBbXBsaWZ5TW9kZWxUeXBlPixcbiAgVFJldHVybiBleHRlbmRzIFdlYlNvY2tldEhhbmRsZXJSZXR1cm4gPSBXZWJTb2NrZXRSZXNwb25zZSxcbj4oXG4gIGNvbmZpZzogV2ViU29ja2V0TW9kZWxJbml0aWFsaXplckNvbmZpZzxUU2NoZW1hLCBUVHlwZXM+LFxuKTogTWlkZGxld2FyZTxXZWJTb2NrZXRJbnB1dFdpdGhNb2RlbHM8VFR5cGVzPiwgVFJldHVybj4ge1xuICBjb25zdCB7XG4gICAgc2NoZW1hLFxuICAgIGFtcGxpZnlPdXRwdXRzLFxuICAgIGVudGl0aWVzLFxuICAgIGNsaWVudEtleSA9ICdkZWZhdWx0JyxcbiAgICB0aW1lb3V0ID0gNTAwMCxcbiAgfSA9IGNvbmZpZztcblxuICBsZXQgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICBsZXQgaW5pdFByb21pc2U6IFByb21pc2U8e1xuICAgIFtLIGluIGtleW9mIFRUeXBlc106IFF1ZXJ5RmFjdG9yeVJlc3VsdDxLICYgc3RyaW5nLCBUVHlwZXM+O1xuICB9PiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0IGluaXRpYWxpemUgPSBhc3luYyAoXG4gICAgaW5wdXQ6IFdlYlNvY2tldElucHV0V2l0aE1vZGVsczxUVHlwZXM+LFxuICApOiBQcm9taXNlPHtcbiAgICBbSyBpbiBrZXlvZiBUVHlwZXNdOiBRdWVyeUZhY3RvcnlSZXN1bHQ8SyAmIHN0cmluZywgVFR5cGVzPjtcbiAgfT4gPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBidWlsZFdlYlNvY2tldENvbnRleHQoaW5wdXQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgaW5pdGlhbGl6ZVF1ZXJpZXMgfSA9IGF3YWl0IGltcG9ydCgnLi4vLi4vcXVlcmllcycpO1xuXG4gICAgICBsb2dnZXIuZGVidWcoJ1dlYlNvY2tldCBNb2RlbCBJbml0aWFsaXplciAtIEluaXRpYWxpemluZyBxdWVyaWVzJywge1xuICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICBlbnRpdGllczogZW50aXRpZXMgPz8gJ2FsbCcsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGIgPSBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgICAgICBpbml0aWFsaXplUXVlcmllczxUU2NoZW1hLCBUVHlwZXM+KHtcbiAgICAgICAgICBhbXBsaWZ5T3V0cHV0cyxcbiAgICAgICAgICBzY2hlbWEsXG4gICAgICAgICAgZW50aXRpZXMsXG4gICAgICAgICAgY2xpZW50S2V5LFxuICAgICAgICB9KSxcbiAgICAgICAgbmV3IFByb21pc2U8bmV2ZXI+KChfLCByZWplY3QpID0+XG4gICAgICAgICAgc2V0VGltZW91dChcbiAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEluaXRpYWxpemF0aW9uIHRpbWVvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zYCkpLFxuICAgICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgXSk7XG5cbiAgICAgIC8vIENyZWF0ZSBhIHByb3Blcmx5IHR5cGVkIG1vZGVscyBvYmplY3RcbiAgICAgIGNvbnN0IG1vZGVsczoge1xuICAgICAgICBbSyBpbiBrZXlvZiBUVHlwZXNdOiBRdWVyeUZhY3RvcnlSZXN1bHQ8SyAmIHN0cmluZywgVFR5cGVzPjtcbiAgICAgIH0gPSB7fSBhcyB7XG4gICAgICAgIFtLIGluIGtleW9mIFRUeXBlc106IFF1ZXJ5RmFjdG9yeVJlc3VsdDxLICYgc3RyaW5nLCBUVHlwZXM+O1xuICAgICAgfTtcblxuICAgICAgY29uc3QgbW9kZWxLZXlzID0gZW50aXRpZXMgPz8gT2JqZWN0LmtleXMoc2NoZW1hLm1vZGVscyB8fCB7fSk7XG5cbiAgICAgIGZvciAoY29uc3QgbW9kZWxOYW1lIG9mIG1vZGVsS2V5cykge1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGRiW21vZGVsTmFtZSBhcyBrZXlvZiB0eXBlb2YgZGJdO1xuICAgICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICBtb2RlbHNbbW9kZWxOYW1lIGFzIGtleW9mIFRUeXBlc10gPSBpbnN0YW5jZSBhcyBRdWVyeUZhY3RvcnlSZXN1bHQ8XG4gICAgICAgICAgICB0eXBlb2YgbW9kZWxOYW1lICYgc3RyaW5nLFxuICAgICAgICAgICAgVFR5cGVzXG4gICAgICAgICAgPjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgJ1dlYlNvY2tldCBNb2RlbCBJbml0aWFsaXplciAtIE1vZGVscyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHknLFxuICAgICAgICB7XG4gICAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgICBtb2RlbENvdW50OiBPYmplY3Qua2V5cyhtb2RlbHMpLmxlbmd0aCxcbiAgICAgICAgICBtb2RlbHM6IE9iamVjdC5rZXlzKG1vZGVscyksXG4gICAgICAgIH0sXG4gICAgICApO1xuXG4gICAgICByZXR1cm4gbW9kZWxzO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1dlYlNvY2tldCBNb2RlbCBJbml0aWFsaXplciAtIEluaXRpYWxpemF0aW9uIGZhaWxlZCcsIHtcbiAgICAgICAgLi4uY29udGV4dCxcbiAgICAgICAgZXJyb3I6IGdldEVycm9yTWVzc2FnZShlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gYXN5bmMgKGlucHV0LCBuZXh0KSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IGJ1aWxkV2ViU29ja2V0Q29udGV4dChpbnB1dCk7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKGlzSW5pdGlhbGl6ZWQgJiYgaW5pdFByb21pc2UpIHtcbiAgICAgICAgY29uc3QgbW9kZWxzID0gYXdhaXQgaW5pdFByb21pc2U7XG4gICAgICAgIHJldHVybiBhd2FpdCBuZXh0KHsgLi4uaW5wdXQsIG1vZGVscyB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpbml0UHJvbWlzZSkge1xuICAgICAgICBsb2dnZXIuaW5mbygnV2ViU29ja2V0IE1vZGVsIEluaXRpYWxpemVyIC0gU3RhcnRpbmcnLCBjb250ZXh0KTtcbiAgICAgICAgaW5pdFByb21pc2UgPSBpbml0aWFsaXplKGlucHV0KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbW9kZWxzID0gYXdhaXQgaW5pdFByb21pc2U7XG4gICAgICBpc0luaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgICAgbG9nZ2VyLmluZm8oJ1dlYlNvY2tldCBNb2RlbCBJbml0aWFsaXplciAtIENvbXBsZXRlJywge1xuICAgICAgICAuLi5jb250ZXh0LFxuICAgICAgICBtb2RlbENvdW50OiBPYmplY3Qua2V5cyhtb2RlbHMpLmxlbmd0aCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYXdhaXQgbmV4dCh7IC4uLmlucHV0LCBtb2RlbHMgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnZXRFcnJvck1lc3NhZ2UoZXJyb3IpO1xuICAgICAgbG9nZ2VyLmVycm9yKCdXZWJTb2NrZXQgTW9kZWwgSW5pdGlhbGl6ZXIgLSBGYWlsZWQnLCB7XG4gICAgICAgIC4uLmNvbnRleHQsXG4gICAgICAgIGVycm9yOiBtZXNzYWdlLFxuICAgICAgfSk7XG5cbiAgICAgIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgIGluaXRQcm9taXNlID0gbnVsbDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzQ29kZTogNTAwLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZXJyb3I6ICdNb2RlbCBpbml0aWFsaXphdGlvbiBmYWlsZWQnLFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIH0pLFxuICAgICAgfSBhcyBUUmV0dXJuO1xuICAgIH1cbiAgfTtcbn1cbiJdfQ==