{"version":3,"file":"feature-gate.d.ts","sourceRoot":"","sources":["../../src/bundle/feature-gate.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,qBAAqB;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAQD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAOnG;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAE/F;AAED,wBAAgB,uBAAuB,CAAC,SAAS,SAAS,SAAS,OAAO,EAAE,EAAE,MAAM,EACnF,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,SAAS,KAAK,MAAM,EACvC,OAAO,GAAE,qBAA0B,GACjC,CAAC,GAAG,IAAI,EAAE,SAAS,KAAK,MAAM,GAAG,SAAS,CAK5C;AAED,wFAAwF;AACxF,wBAAgB,yBAAyB,CACxC,eAAe,EAAE,SAAS,MAAM,EAAE,EAClC,OAAO,EAAE,qBAAqB,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GACpD,MAAM,IAAI,CAYZ","sourcesContent":["import { getEvoPaths } from \"../paths.ts\";\n\nexport interface EvoFeatureGateOptions {\n\troot?: string;\n\tsessionId?: string;\n}\n\nconst activeSessions = new Map<string, Map<string, ReadonlySet<string>>>();\n\nfunction resolveGateRoot(options: EvoFeatureGateOptions): string {\n\treturn getEvoPaths(options.root).root;\n}\n\nexport function isEvoFeatureEnabled(featureId: string, options: EvoFeatureGateOptions = {}): boolean {\n\tconst sessions = activeSessions.get(resolveGateRoot(options));\n\tif (!sessions) return false;\n\tif (options.sessionId !== undefined) return sessions.get(options.sessionId)?.has(featureId) ?? false;\n\tif (sessions.size !== 1) return false;\n\tconst features = sessions.values().next().value;\n\treturn features?.has(featureId) ?? false;\n}\n\nexport function guardEvoFeature(featureId: string, options: EvoFeatureGateOptions = {}): boolean {\n\treturn isEvoFeatureEnabled(featureId, options);\n}\n\nexport function createEvoFeatureHandler<Arguments extends readonly unknown[], Result>(\n\tfeatureId: string,\n\thandler: (...args: Arguments) => Result,\n\toptions: EvoFeatureGateOptions = {},\n): (...args: Arguments) => Result | undefined {\n\treturn (...args) => {\n\t\tif (!guardEvoFeature(featureId, options)) return undefined;\n\t\treturn handler(...args);\n\t};\n}\n\n/** @internal Used by the policy runtime to bind feature flags to one pinned session. */\nexport function activateEvoFeatureSession(\n\tenabledFeatures: readonly string[],\n\toptions: EvoFeatureGateOptions & { sessionId: string },\n): () => void {\n\tconst root = resolveGateRoot(options);\n\tconst sessions = activeSessions.get(root) ?? new Map<string, ReadonlySet<string>>();\n\tconst features = new Set(enabledFeatures);\n\tsessions.set(options.sessionId, features);\n\tactiveSessions.set(root, sessions);\n\treturn () => {\n\t\tconst current = activeSessions.get(root);\n\t\tif (current?.get(options.sessionId) !== features) return;\n\t\tcurrent.delete(options.sessionId);\n\t\tif (current.size === 0) activeSessions.delete(root);\n\t};\n}\n"]}