Files
qris_bank_jatim/config/websocket.js
2025-10-17 15:12:20 +07:00

185 lines
4.8 KiB
JavaScript

// ~/config/websocket.js
// Helper function untuk mendeteksi environment
const detectEnvironment = () => {
// Jika ada environment variable NODE_ENV
if (process.env.NODE_ENV) {
return process.env.NODE_ENV;
}
// Deteksi berdasarkan hostname/URL jika di browser
if (typeof window !== 'undefined') {
const hostname = window.location.hostname;
// Local development
if (hostname === 'localhost' || hostname === '127.0.0.1') {
return 'development';
}
// Server di jaringan lokal (IP private)
if (hostname.match(/^192\.168\./) ||
hostname.match(/^10\./) ||
hostname.match(/^172\.(1[6-9]|2[0-9]|3[0-1])\./)) {
return 'staging';
}
// Production (domain atau IP public)
return 'production';
}
// Default fallback
return 'development';
};
export const websocketConfig = {
// Local Development (localhost)
development: {
url: 'ws://localhost:8084/api/v1/ws',
// Alternative untuk development
// url: 'ws://localhost:8084/api/v1/ws',
queryParams: {
user_id: 'QRIS',
room: 'BANKJATIM'
},
options: {
transports: ['websocket', 'polling'],
timeout: 15000,
reconnection: true,
reconnectionAttempts: 3,
reconnectionDelay: 1000,
reconnectionDelayMax: 3000,
}
},
// Staging/Network Server (IP jaringan)
staging: {
url: 'ws://10.10.150.68:8084/api/v1/ws',
queryParams: {
user_id: 'QRIS',
room: 'BANKJATIM'
},
options: {
transports: ['websocket', 'polling'],
timeout: 20000,
reconnection: true,
reconnectionAttempts: 5,
reconnectionDelay: 1000,
reconnectionDelayMax: 5000,
}
},
// Production (domain atau IP public)
production: {
url: 'wss://your-production-server.com/api/v1/ws',
queryParams: {
user_id: 'QRIS',
room: 'BANKJATIM'
},
options: {
transports: ['websocket', 'polling'],
timeout: 30000,
reconnection: true,
reconnectionAttempts: 10,
reconnectionDelay: 2000,
reconnectionDelayMax: 10000,
// Additional production settings
secure: true,
rejectUnauthorized: true,
}
},
// Testing Environment
test: {
url: 'ws://test-server:8084/api/v1/ws',
queryParams: {
user_id: 'QRIS_TEST',
room: 'BANKJATIM_TEST'
},
options: {
transports: ['websocket'],
timeout: 10000,
reconnection: false,
}
}
};
// Helper function untuk build URL dengan query parameters
export const buildWebSocketUrl = (baseUrl, queryParams = {}) => {
const url = new URL(baseUrl);
Object.entries(queryParams).forEach(([key, value]) => {
url.searchParams.append(key, value);
});
return url.toString();
};
// Helper function untuk mendapatkan config berdasarkan environment
export const getWebSocketConfig = () => {
const env = detectEnvironment();
const config = websocketConfig[env] || websocketConfig.development;
// Build URL dengan query parameters
const fullUrl = buildWebSocketUrl(config.url, config.queryParams);
console.log(`🌍 Detected environment: ${env}`);
console.log(`🔗 WebSocket URL: ${fullUrl}`);
return {
...config,
fullUrl,
environment: env
};
};
// Helper untuk override manual dengan custom query params
export const getCustomWebSocketConfig = (customUrl, customQueryParams = {}, customOptions = {}) => {
const baseConfig = getWebSocketConfig();
const mergedQueryParams = {
...baseConfig.queryParams,
...customQueryParams
};
const fullUrl = buildWebSocketUrl(customUrl, mergedQueryParams);
return {
...baseConfig,
url: customUrl,
queryParams: mergedQueryParams,
fullUrl,
options: {
...baseConfig.options,
...customOptions
},
environment: 'custom'
};
};
// Environment detection helpers
export const isProduction = () => detectEnvironment() === 'production';
export const isDevelopment = () => detectEnvironment() === 'development';
export const isStaging = () => detectEnvironment() === 'staging';
// Advanced configuration berdasarkan kondisi khusus
export const getAdvancedConfig = () => {
const baseConfig = getWebSocketConfig();
// Tambah konfigurasi khusus berdasarkan browser atau device
if (typeof window !== 'undefined') {
// Mobile device adjustments
if (navigator.userAgent.match(/Mobile|Android|iPhone|iPad/)) {
baseConfig.options.timeout = Math.min(baseConfig.options.timeout, 15000);
baseConfig.options.reconnectionDelay = 2000;
}
// Connection type adjustments
if ('connection' in navigator) {
const connection = navigator.connection;
if (connection.effectiveType === 'slow-2g' || connection.effectiveType === '2g') {
baseConfig.options.timeout = 30000;
baseConfig.options.reconnectionDelay = 3000;
}
}
}
return baseConfig;
};