173 lines
5.6 KiB
TypeScript
173 lines
5.6 KiB
TypeScript
/**
|
|
* QUANTUM CAPABILITY ORCHESTRATOR v2.0 (STRENGTHENED)
|
|
*
|
|
* Logic Tier tertinggi untuk orkestrasi JUMPA.ID Multiverse.
|
|
* Menangani resolusi konflik, grace period, dan pemetaan 101 modul secara granular.
|
|
*/
|
|
|
|
export type LicenseState = 'GRANTED' | 'UPSELL' | 'HIDDEN';
|
|
|
|
export interface QuantumCapabilities {
|
|
status: 'ACTIVE' | 'SUSPENDED' | 'GRACE_PERIOD';
|
|
|
|
// VIDEO ENGINE (XCU)
|
|
video: {
|
|
codec: 'AV1' | 'HEVC' | 'VP9' | 'VP8';
|
|
transport: 'MOQ' | 'WEBTRANSPORT' | 'WEBRTC';
|
|
maxResolution: '4K' | '2K' | '1080p' | '720p';
|
|
fps: 30 | 60 | 120;
|
|
features: {
|
|
svc: boolean;
|
|
onPremGateway: boolean;
|
|
ebpfBypass: boolean;
|
|
autopilot: boolean;
|
|
multicam: boolean;
|
|
recording: boolean;
|
|
};
|
|
};
|
|
|
|
// CHAT ENGINE (XTM)
|
|
chat: {
|
|
encryption: 'E2EE_QUANTUM' | 'E2EE_STANDARD' | 'NONE';
|
|
vaultStorageGB: number;
|
|
retentionDays: number;
|
|
features: {
|
|
omniBrainAI: boolean;
|
|
selfDestruct: boolean;
|
|
biometric: boolean;
|
|
fileLarge: boolean;
|
|
};
|
|
};
|
|
|
|
// IDENTITY & ACCESS (IAM)
|
|
iam: {
|
|
branding: {
|
|
enabled: boolean;
|
|
customDomain: boolean;
|
|
};
|
|
security: {
|
|
sso: boolean;
|
|
ipWhitelist: boolean;
|
|
auditLog: boolean;
|
|
killswitch: boolean;
|
|
};
|
|
};
|
|
|
|
// UI SOVEREIGNTY MATRIX (JVC/JC)
|
|
// Dynamic Record: Mendukung tak terbatas injeksi DNA UI dari database tanpa hardcoding
|
|
ui: Record<string, boolean>;
|
|
}
|
|
|
|
export class QuantumOrchestrator {
|
|
/**
|
|
* Memperkuat Logika Resolusi Lisensi.
|
|
* Menggabungkan Tenant-Level Policy dengan User-Level Overrides.
|
|
*/
|
|
static resolve(
|
|
tenantLicenses: Record<string, string>,
|
|
userLicenses: Record<string, string> = {},
|
|
tenantIsActive: boolean = true
|
|
): QuantumCapabilities {
|
|
|
|
// 1. Hard Override: Jika Tenant Suspended, semua fitur mati kecuali Killswitch
|
|
if (!tenantIsActive) {
|
|
return this.generateSuspendedState(tenantLicenses);
|
|
}
|
|
|
|
// 2. Merge Logic: User license overrides tenant license unless tenant blocks it
|
|
const merged = { ...tenantLicenses };
|
|
for (const key in userLicenses) {
|
|
if (tenantLicenses[key] !== 'HIDDEN') {
|
|
merged[key] = userLicenses[key];
|
|
}
|
|
}
|
|
|
|
const isGranted = (key: string) => merged[key] === 'GRANTED';
|
|
|
|
return {
|
|
status: 'ACTIVE',
|
|
|
|
video: {
|
|
codec: isGranted('xcu.codec.av1') ? 'AV1' :
|
|
isGranted('xcu.codec.hevc') ? 'HEVC' :
|
|
isGranted('xcu.codec.vp9') ? 'VP9' : 'VP8',
|
|
|
|
transport: isGranted('xcu.transport.moq') ? 'MOQ' :
|
|
isGranted('xcu.transport.quic') ? 'WEBTRANSPORT' : 'WEBRTC',
|
|
|
|
maxResolution: isGranted('xcu.codec.av1') ? '4K' :
|
|
isGranted('xcu.codec.hevc') ? '2K' : '1080p',
|
|
|
|
fps: isGranted('xcu.feature.screenshare_high') ? 60 : 30,
|
|
|
|
features: {
|
|
svc: isGranted('xcu.feature.svc'),
|
|
onPremGateway: isGranted('xcu.feature.onprem'),
|
|
ebpfBypass: isGranted('xcu.feature.ebpf'),
|
|
autopilot: isGranted('xcu.feature.autopilot'),
|
|
multicam: isGranted('xcu.feature.multicam'),
|
|
recording: isGranted('xcu.feature.recording'),
|
|
}
|
|
},
|
|
|
|
chat: {
|
|
encryption: isGranted('xtm.security.quantum') ? 'E2EE_QUANTUM' :
|
|
isGranted('xtm.security.e2ee') ? 'E2EE_STANDARD' : 'NONE',
|
|
|
|
vaultStorageGB: isGranted('xtm.storage.vault') ? 100 : 5,
|
|
retentionDays: isGranted('xtm.feature.persistence') ? 365 : 30,
|
|
|
|
features: {
|
|
omniBrainAI: isGranted('xtm.ai.interceptor'),
|
|
selfDestruct: isGranted('xtm.feature.burn'),
|
|
biometric: isGranted('xtm.security.biometric'),
|
|
fileLarge: isGranted('xtm.feature.file_large'),
|
|
}
|
|
},
|
|
|
|
iam: {
|
|
branding: {
|
|
enabled: isGranted('iam.feature.branding'),
|
|
customDomain: isGranted('iam.feature.custom_domain'),
|
|
},
|
|
security: {
|
|
sso: isGranted('iam.auth.sso'),
|
|
ipWhitelist: isGranted('iam.security.ip_whitelist'),
|
|
auditLog: isGranted('iam.security.audit_log'),
|
|
killswitch: isGranted('iam.security.killswitch'),
|
|
}
|
|
},
|
|
|
|
ui: Object.keys(merged).filter(k => k.startsWith('jvc.ui.') || k.startsWith('ui.')).reduce((acc, key) => {
|
|
// Expose dynamic UI features by removing the 'jvc.ui.' prefix for simpler frontend access if desired,
|
|
// or just keep the full key. Using full key to avoid conflicts.
|
|
acc[key] = isGranted(key);
|
|
return acc;
|
|
}, {} as Record<string, boolean>)
|
|
};
|
|
}
|
|
|
|
/**
|
|
* State Khusus untuk Tenant yang disuspensi (Kill-Switch Active)
|
|
*/
|
|
private static generateSuspendedState(licenses: Record<string, string>): QuantumCapabilities {
|
|
return {
|
|
status: 'SUSPENDED',
|
|
video: { codec: 'VP8', transport: 'WEBRTC', maxResolution: '720p', fps: 30,
|
|
features: { svc: false, onPremGateway: false, ebpfBypass: false, autopilot: false, multicam: false, recording: false }
|
|
},
|
|
chat: { encryption: 'NONE', vaultStorageGB: 0, retentionDays: 0,
|
|
features: { omniBrainAI: false, selfDestruct: false, biometric: false, fileLarge: false }
|
|
},
|
|
iam: {
|
|
branding: { enabled: false, customDomain: false },
|
|
security: { sso: false, ipWhitelist: false, auditLog: false, killswitch: licenses['iam.security.killswitch'] === 'GRANTED' }
|
|
},
|
|
ui: Object.keys(licenses).filter(k => k.startsWith('jvc.ui.') || k.startsWith('ui.')).reduce((acc, key) => {
|
|
acc[key] = false; // Always false in suspended mode
|
|
return acc;
|
|
}, {} as Record<string, boolean>)
|
|
};
|
|
}
|
|
}
|