Extract permission evaluator helpers

master
dev 5 months ago
parent d1a706a886
commit e8281ebf83

@ -29,6 +29,7 @@ Estado al cierre:
- `arts/auth/active-auth.svelte.ts` delega CSRF, validacion de respuestas, normalizacion de errores e invalidacion de cache en `active-auth-runtime.ts`.
- `arts/conn/connection.ts` delega apertura/cierre logico e `isConnected` en `connection-lifecycle.ts`.
- `arts/conn/connection.ts` delega la programacion de reconnect y exhaustion en `connection-reconnect-runtime.ts`.
- `libs/perm/evaluator.ts` delega helpers puros de resultado, dependencias y comparacion en `evaluator-helpers.ts`.
- `arts/conn/connection.ts` delega decode/routing de frames entrantes en `connection-message-router.ts`.
- `arts/conn/connection.ts` delega el intento open/auth/flush/join en `connection-connect.ts`.
- `arts/conn/connection.ts` delega current transport, attach/detach y close en `connection-transport-runtime.ts`.

@ -0,0 +1,62 @@
import {
PERMISSION_EVAL_UNKNOWN,
PERMISSION_EXPR_EQ,
PERMISSION_EXPR_GT,
PERMISSION_EXPR_GTE,
PERMISSION_EXPR_LT,
PERMISSION_EXPR_LTE,
PERMISSION_EXPR_NEQ,
permissionDependencyKey
} from './consts.ts';
import type { DependencyKey, EvalResult, EvalValue, ExprIR } from './types.ts';
export function ok(
value: EvalValue,
dependencies: readonly DependencyKey[] = [],
reason?: string,
error?: unknown
): EvalResult {
const result: EvalResult = { value, dependencies };
if (reason !== undefined) (result as { reason?: string }).reason = reason;
if (error !== undefined) (result as { error?: unknown }).error = error;
return result;
}
export function dep(kind: string, key: string): DependencyKey {
return permissionDependencyKey(kind, key) as DependencyKey;
}
export function dedupeDeps(deps: readonly DependencyKey[]): DependencyKey[] {
return [...new Set(deps)];
}
export function comparePermissionValues(
op: ExprIR['op'],
left: unknown,
right: unknown
): boolean | typeof PERMISSION_EVAL_UNKNOWN {
switch (op) {
case PERMISSION_EXPR_EQ:
return left === right;
case PERMISSION_EXPR_NEQ:
return left !== right;
case PERMISSION_EXPR_GT:
return typeof left === 'number' && typeof right === 'number'
? left > right
: PERMISSION_EVAL_UNKNOWN;
case PERMISSION_EXPR_GTE:
return typeof left === 'number' && typeof right === 'number'
? left >= right
: PERMISSION_EVAL_UNKNOWN;
case PERMISSION_EXPR_LT:
return typeof left === 'number' && typeof right === 'number'
? left < right
: PERMISSION_EVAL_UNKNOWN;
case PERMISSION_EXPR_LTE:
return typeof left === 'number' && typeof right === 'number'
? left <= right
: PERMISSION_EVAL_UNKNOWN;
default:
return PERMISSION_EVAL_UNKNOWN;
}
}

@ -28,14 +28,13 @@ import {
PERMISSION_EXPR_REL,
PERMISSION_PATH_SEPARATOR,
PERMISSION_ROOT_ACTOR,
PERMISSION_ROOT_RESOURCE,
permissionDependencyKey
PERMISSION_ROOT_RESOURCE
} from './consts.ts';
import { comparePermissionValues, dedupeDeps, dep, ok } from './evaluator-helpers.ts';
import { getPath } from './path.ts';
import type {
DependencyKey,
EvalResult,
EvalValue,
ExprIR,
PermissionProviders,
PermissionRequestContext,
@ -43,57 +42,6 @@ import type {
SubjectRef
} from './types.ts';
function ok(
value: EvalValue,
dependencies: readonly DependencyKey[] = [],
reason?: string,
error?: unknown
): EvalResult {
const result: EvalResult = { value, dependencies };
if (reason !== undefined) (result as { reason?: string }).reason = reason;
if (error !== undefined) (result as { error?: unknown }).error = error;
return result;
}
function dep(kind: string, key: string): DependencyKey {
return permissionDependencyKey(kind, key) as DependencyKey;
}
function dedupeDeps(deps: readonly DependencyKey[]): DependencyKey[] {
return [...new Set(deps)];
}
function compare(
op: ExprIR['op'],
left: unknown,
right: unknown
): boolean | typeof PERMISSION_EVAL_UNKNOWN {
switch (op) {
case PERMISSION_EXPR_EQ:
return left === right;
case PERMISSION_EXPR_NEQ:
return left !== right;
case PERMISSION_EXPR_GT:
return typeof left === 'number' && typeof right === 'number'
? left > right
: PERMISSION_EVAL_UNKNOWN;
case PERMISSION_EXPR_GTE:
return typeof left === 'number' && typeof right === 'number'
? left >= right
: PERMISSION_EVAL_UNKNOWN;
case PERMISSION_EXPR_LT:
return typeof left === 'number' && typeof right === 'number'
? left < right
: PERMISSION_EVAL_UNKNOWN;
case PERMISSION_EXPR_LTE:
return typeof left === 'number' && typeof right === 'number'
? left <= right
: PERMISSION_EVAL_UNKNOWN;
default:
return PERMISSION_EVAL_UNKNOWN;
}
}
export class DefaultPermissionEvaluator {
constructor(private readonly providers: PermissionProviders = {}) {}
@ -180,7 +128,7 @@ export class DefaultPermissionEvaluator {
if (left.unknown || right.unknown) {
return ok(PERMISSION_EVAL_UNKNOWN, dependencies, left.unknown ?? right.unknown);
}
const value = compare(expr.op, left.value, right.value);
const value = comparePermissionValues(expr.op, left.value, right.value);
return value === PERMISSION_EVAL_UNKNOWN
? ok(
PERMISSION_EVAL_UNKNOWN,

Loading…
Cancel
Save

Powered by TurnKey Linux.