Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions src/lib/cors.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ const DEFAULT_CORS_HEADERS = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, PATCH, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
'Access-Control-Max-Age': '86400', // 24 hours
'Access-Control-Max-Age': '86400' // 24 hours
// Removed 'Access-Control-Allow-Credentials': 'true' - incompatible with '*' origin
};
}

/**
* Applies CORS headers to a response
Expand All @@ -25,23 +25,23 @@ const DEFAULT_CORS_HEADERS = {
* @param {Object} [customHeaders] - Custom CORS headers to merge with defaults
* @returns {void}
*/
function applyCorsHeaders(response, enabled = true, customHeaders = {}) {
if (!enabled) return;
function applyCorsHeaders (response, enabled = true, customHeaders = {}) {
if (!enabled) return

const headers = { ...DEFAULT_CORS_HEADERS, ...customHeaders };
const headers = { ...DEFAULT_CORS_HEADERS, ...customHeaders }

// Validate CORS configuration to prevent common mistakes
if (headers['Access-Control-Allow-Origin'] === '*' &&
headers['Access-Control-Allow-Credentials'] === 'true') {
throw new Error('CORS configuration error: Cannot use credentials with wildcard origin (*). Either specify allowed origins or disable credentials.');
throw new Error('CORS configuration error: Cannot use credentials with wildcard origin (*). Either specify allowed origins or disable credentials.')
}

Object.entries(headers).forEach(([key, value]) => {
// Only set if explicitly provided in customHeaders or if not already set
if (customHeaders[key] || !response.headers[key]) {
response.setHeader(key, value);
response.setHeader(key, value)
}
});
})
}

/**
Expand All @@ -51,24 +51,24 @@ function applyCorsHeaders(response, enabled = true, customHeaders = {}) {
* @param {boolean} [enabled=true] - Whether CORS is enabled
* @returns {boolean} - True if this was a preflight request that was handled
*/
function handlePreflight(request, response, enabled = true) {
function handlePreflight (request, response, enabled = true) {
if (!enabled || request.method !== 'OPTIONS') {
return false;
return false
}

applyCorsHeaders(response, true, {
'Access-Control-Allow-Methods': request.headers['access-control-request-method'] ||
DEFAULT_CORS_HEADERS['Access-Control-Allow-Methods'],
'Access-Control-Allow-Headers': request.headers['access-control-request-headers'] ||
DEFAULT_CORS_HEADERS['Access-Control-Allow-Headers']
});
})

response.status(204).send('');
return true;
response.status(204).send('')
return true
}

module.exports = {
applyCorsHeaders,
handlePreflight,
DEFAULT_CORS_HEADERS
};
}
59 changes: 30 additions & 29 deletions src/lib/logger.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,35 +8,35 @@ const LOG_LEVELS = {
WARN: 1,
INFO: 2,
DEBUG: 3
};
}

const LOG_LEVEL_NAMES = {
0: 'ERROR',
1: 'WARN',
2: 'INFO',
3: 'DEBUG'
};
}

let currentLogLevel = LOG_LEVELS.INFO; // Default to INFO level
let logToConsole = true; // Default to console logging
let currentLogLevel = LOG_LEVELS.INFO // Default to INFO level
let logToConsole = true // Default to console logging

/**
* Set the current log level
* @param {string} level - Log level (ERROR, WARN, INFO, DEBUG)
*/
function setLogLevel(level) {
const upperLevel = level.toUpperCase();
function setLogLevel (level) {
const upperLevel = level.toUpperCase()
if (LOG_LEVELS[upperLevel] !== undefined) {
currentLogLevel = LOG_LEVELS[upperLevel];
currentLogLevel = LOG_LEVELS[upperLevel]
}
}

/**
* Enable or disable console logging
* @param {boolean} enabled - Whether to log to console
*/
function setConsoleLogging(enabled) {
logToConsole = enabled;
function setConsoleLogging (enabled) {
logToConsole = enabled
}

/**
Expand All @@ -46,10 +46,10 @@ function setConsoleLogging(enabled) {
* @param {Object} [meta] - Additional metadata
* @returns {string} Formatted log message
*/
function formatLogMessage(level, message, meta = {}) {
const timestamp = new Date().toISOString();
const metaStr = Object.keys(meta).length > 0 ? ` ${JSON.stringify(meta)}` : '';
return `[${timestamp}] ${level}: ${message}${metaStr}`;
function formatLogMessage (level, message, meta = {}) {
const timestamp = new Date().toISOString()
const metaStr = Object.keys(meta).length > 0 ? ` ${JSON.stringify(meta)}` : ''
return `[${timestamp}] ${level}: ${message}${metaStr}`
}

/**
Expand All @@ -58,16 +58,17 @@ function formatLogMessage(level, message, meta = {}) {
* @param {string} message - Log message
* @param {Object} [meta] - Additional metadata
*/
function log(level, message, meta = {}) {
if (level > currentLogLevel) return;
function log (level, message, meta = {}) {
if (level > currentLogLevel) return

const levelName = LOG_LEVEL_NAMES[level];
const formattedMessage = formatLogMessage(levelName, message, meta);
const levelName = LOG_LEVEL_NAMES[level]
const formattedMessage = formatLogMessage(levelName, message, meta)

if (logToConsole) {
const consoleMethod = level === LOG_LEVELS.ERROR ? 'error' :
level === LOG_LEVELS.WARN ? 'warn' : 'log';
console[consoleMethod](formattedMessage);
const consoleMethod = level === LOG_LEVELS.ERROR
? 'error'
: level === LOG_LEVELS.WARN ? 'warn' : 'log'
console[consoleMethod](formattedMessage)
}

// Future: Could add file logging, external service logging, etc.
Expand All @@ -78,35 +79,35 @@ function log(level, message, meta = {}) {
* @param {string} message - Error message
* @param {Object} [meta] - Additional metadata
*/
function error(message, meta = {}) {
log(LOG_LEVELS.ERROR, message, meta);
function error (message, meta = {}) {
log(LOG_LEVELS.ERROR, message, meta)
}

/**
* Log warning message
* @param {string} message - Warning message
* @param {Object} [meta] - Additional metadata
*/
function warn(message, meta = {}) {
log(LOG_LEVELS.WARN, message, meta);
function warn (message, meta = {}) {
log(LOG_LEVELS.WARN, message, meta)
}

/**
* Log info message
* @param {string} message - Info message
* @param {Object} [meta] - Additional metadata
*/
function info(message, meta = {}) {
log(LOG_LEVELS.INFO, message, meta);
function info (message, meta = {}) {
log(LOG_LEVELS.INFO, message, meta)
}

/**
* Log debug message
* @param {string} message - Debug message
* @param {Object} [meta] - Additional metadata
*/
function debug(message, meta = {}) {
log(LOG_LEVELS.DEBUG, message, meta);
function debug (message, meta = {}) {
log(LOG_LEVELS.DEBUG, message, meta)
}

module.exports = {
Expand All @@ -117,4 +118,4 @@ module.exports = {
info,
debug,
LOG_LEVELS
};
}
Loading
Loading