okta-mcp-server
Version:
Model Context Protocol (MCP) server for Okta API operations with support for bulk operations and caching
123 lines • 4.27 kB
JavaScript
export class DelaySimulator {
config;
constructor(config = {
enabled: true,
baseDelay: 50,
variability: 0.3,
networkConditions: 'normal',
}) {
this.config = config;
this.applyNetworkConditions();
}
applyNetworkConditions() {
switch (this.config.networkConditions) {
case 'fast':
this.config.baseDelay = 20;
this.config.variability = 0.1;
break;
case 'slow':
this.config.baseDelay = 200;
this.config.variability = 0.5;
break;
case 'unstable':
this.config.baseDelay = 100;
this.config.variability = 0.8;
break;
case 'normal':
default:
// Use configured values
break;
}
}
async delay(operation) {
if (!this.config.enabled)
return;
const delay = this.calculateDelay(operation);
await new Promise((resolve) => setTimeout(resolve, delay));
}
calculateDelay(operation) {
let baseDelay = this.config.baseDelay;
// Check for operation-specific delay
if (operation && this.config.operationDelays?.has(operation)) {
baseDelay = this.config.operationDelays.get(operation);
}
// Add realistic variability
const variability = baseDelay * this.config.variability;
const randomFactor = (Math.random() - 0.5) * 2; // -1 to 1
const actualDelay = baseDelay + variability * randomFactor;
// Ensure minimum delay
return Math.max(10, actualDelay);
}
// Configure delays for specific operations
setOperationDelay(operation, delay) {
if (!this.config.operationDelays) {
this.config.operationDelays = new Map();
}
this.config.operationDelays.set(operation, delay);
}
// Simulate realistic delays for different operations
static getRealisticDelays() {
return new Map([
// User operations
['listUsers', 100],
['getUser', 50],
['createUser', 150],
['updateUser', 120],
['deleteUser', 100],
// Group operations
['listGroups', 120],
['getGroup', 60],
['createGroup', 130],
['updateGroup', 110],
['deleteGroup', 90],
// App operations
['listApps', 150],
['getApp', 70],
['createApp', 200],
['updateApp', 160],
['deleteApp', 140],
// Policy operations
['listPolicies', 130],
['getPolicy', 65],
['createPolicy', 180],
['updatePolicy', 150],
['deletePolicy', 120],
// Auth operations
['authenticate', 200],
['refreshToken', 100],
['revokeToken', 80],
// Bulk operations
['bulkImport', 500],
['bulkUpdate', 400],
['bulkDelete', 350],
]);
}
// Simulate network spikes
async simulateNetworkSpike(duration = 5000) {
const originalDelay = this.config.baseDelay;
const originalVariability = this.config.variability;
// Increase delays during spike
this.config.baseDelay = originalDelay * 5;
this.config.variability = 0.9;
// Reset after duration
setTimeout(() => {
this.config.baseDelay = originalDelay;
this.config.variability = originalVariability;
}, duration);
}
// Simulate gradual degradation
async simulateDegradation(steps = 10, intervalMs = 1000) {
const originalDelay = this.config.baseDelay;
const targetDelay = originalDelay * 10;
const increment = (targetDelay - originalDelay) / steps;
for (let i = 0; i < steps; i++) {
this.config.baseDelay = originalDelay + increment * (i + 1);
await new Promise((resolve) => setTimeout(resolve, intervalMs));
}
}
// Reset to original configuration
reset() {
this.applyNetworkConditions();
}
}
//# sourceMappingURL=delay-simulator.js.map