import { CapabilitiesRaw, CapabilityKey, capabilityKeys, PTZCapabilities, } from '../types'; import { CapabilitySearchOptions } from './types'; export class Capabilities { private _capabilities: CapabilitiesRaw; constructor( capabilities: CapabilitiesRaw, options?: { disable?: CapabilityKey[]; disableExcept?: CapabilityKey[]; }, ) { this._capabilities = capabilities; for (const key of options?.disable ?? []) { this._disable(key); } for (const key of capabilityKeys) { if (options?.disableExcept?.length && !options.disableExcept.includes(key)) { this._disable(key); } } } protected _disable(capability: CapabilityKey): void { delete this._capabilities[capability]; } public matches(capability: CapabilitySearchOptions): boolean { let result = true; if (typeof capability === 'string') { result &&= this.has(capability); } if (typeof capability === 'object' && capability.allCapabilities) { result &&= capability.allCapabilities.every((capability) => this.has(capability)); } if (typeof capability === 'object' && capability.anyCapabilities) { result &&= capability.anyCapabilities.some((capability) => this.has(capability)); } return result; } public has(capability: CapabilityKey): boolean { return !!this._capabilities[capability]; } public getPTZCapabilities(): PTZCapabilities | null { return this._capabilities.ptz ?? null; } public getRawCapabilities(): CapabilitiesRaw { return this._capabilities; } }