diff --git a/src/routing/binding-scope.ts b/src/routing/binding-scope.ts index 1b0d952fa14..40e1daa14f0 100644 --- a/src/routing/binding-scope.ts +++ b/src/routing/binding-scope.ts @@ -36,6 +36,26 @@ function scopeIdMatches(params: { return params.constraint === params.exact || params.constraint === params.groupSpace; } +function hasRoleLookup( + memberRoleIds: Iterable, +): memberRoleIds is Iterable & { has(roleId: string): boolean } { + return typeof (memberRoleIds as { has?: unknown }).has === "function"; +} + +function hasAnyRouteBindingRole( + roles: readonly string[], + memberRoleIds: Iterable | null | undefined, +): boolean { + if (!memberRoleIds) { + return false; + } + if (hasRoleLookup(memberRoleIds)) { + return roles.some((role) => memberRoleIds.has(role)); + } + const memberRoleIdSet = new Set(memberRoleIds); + return roles.some((role) => memberRoleIdSet.has(role)); +} + export function routeBindingScopeMatches( constraint: RouteBindingScopeConstraint, scope: RouteBindingScope, @@ -54,6 +74,5 @@ export function routeBindingScopeMatches( if (!roles) { return true; } - const memberRoleIds = new Set(scope.memberRoleIds ?? []); - return roles.some((role) => memberRoleIds.has(role)); + return hasAnyRouteBindingRole(roles, scope.memberRoleIds); }