@energica-city/shared-amplify-utils
Version:
Shared utilities for AWS Amplify projects
85 lines • 12.4 kB
JavaScript
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==