@noony-serverless/core
Version:
A Middy base framework compatible with Firebase and GCP Cloud Functions with TypeScript
237 lines • 12 kB
JavaScript
;
/**
* Noony Guards - High-Performance Permission System
*
* A comprehensive permission and authentication system designed for serverless
* environments with sub-millisecond cached permission checks.
*
* Features:
* - Multi-layer caching (L1 memory + L2 distributed)
* - Three distinct permission resolution strategies
* - Conservative cache invalidation for security
* - NestJS-inspired guard decorators and middleware
* - Framework-agnostic middleware integration
* - Comprehensive monitoring and audit trails
*
* @author Noony Framework Team
* @version 1.0.0
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.GuardSetup = exports.PERMISSION_PATTERNS = exports.GUARD_DEFAULTS = exports.TokenVerificationAdapterFactory = exports.CustomTokenVerificationPortAdapter = exports.PermissionGuardFactory = exports.FastAuthGuard = exports.FastUserContextService = exports.ExpressionPermissionResolver = exports.WildcardPermissionResolver = exports.PlainPermissionResolver = exports.PermissionUtils = exports.PermissionResolverType = exports.PermissionResolver = exports.InvalidationScope = exports.InvalidationType = exports.ConservativeCacheInvalidation = exports.NoopCacheAdapter = exports.MemoryCacheAdapter = exports.CacheKeyBuilder = exports.PermissionResolutionStrategy = exports.GuardConfiguration = exports.RouteGuards = void 0;
// Main facade - primary entry point
var RouteGuards_1 = require("./RouteGuards");
Object.defineProperty(exports, "RouteGuards", { enumerable: true, get: function () { return RouteGuards_1.RouteGuards; } });
// Configuration
var GuardConfiguration_1 = require("./config/GuardConfiguration");
Object.defineProperty(exports, "GuardConfiguration", { enumerable: true, get: function () { return GuardConfiguration_1.GuardConfiguration; } });
Object.defineProperty(exports, "PermissionResolutionStrategy", { enumerable: true, get: function () { return GuardConfiguration_1.PermissionResolutionStrategy; } });
// Cache system
var CacheAdapter_1 = require("./cache/CacheAdapter");
Object.defineProperty(exports, "CacheKeyBuilder", { enumerable: true, get: function () { return CacheAdapter_1.CacheKeyBuilder; } });
var MemoryCacheAdapter_1 = require("./cache/MemoryCacheAdapter");
Object.defineProperty(exports, "MemoryCacheAdapter", { enumerable: true, get: function () { return MemoryCacheAdapter_1.MemoryCacheAdapter; } });
var NoopCacheAdapter_1 = require("./cache/NoopCacheAdapter");
Object.defineProperty(exports, "NoopCacheAdapter", { enumerable: true, get: function () { return NoopCacheAdapter_1.NoopCacheAdapter; } });
var ConservativeCacheInvalidation_1 = require("./cache/ConservativeCacheInvalidation");
Object.defineProperty(exports, "ConservativeCacheInvalidation", { enumerable: true, get: function () { return ConservativeCacheInvalidation_1.ConservativeCacheInvalidation; } });
Object.defineProperty(exports, "InvalidationType", { enumerable: true, get: function () { return ConservativeCacheInvalidation_1.InvalidationType; } });
Object.defineProperty(exports, "InvalidationScope", { enumerable: true, get: function () { return ConservativeCacheInvalidation_1.InvalidationScope; } });
// Permission resolvers
var PermissionResolver_1 = require("./resolvers/PermissionResolver");
Object.defineProperty(exports, "PermissionResolver", { enumerable: true, get: function () { return PermissionResolver_1.PermissionResolver; } });
Object.defineProperty(exports, "PermissionResolverType", { enumerable: true, get: function () { return PermissionResolver_1.PermissionResolverType; } });
Object.defineProperty(exports, "PermissionUtils", { enumerable: true, get: function () { return PermissionResolver_1.PermissionUtils; } });
var PlainPermissionResolver_1 = require("./resolvers/PlainPermissionResolver");
Object.defineProperty(exports, "PlainPermissionResolver", { enumerable: true, get: function () { return PlainPermissionResolver_1.PlainPermissionResolver; } });
var WildcardPermissionResolver_1 = require("./resolvers/WildcardPermissionResolver");
Object.defineProperty(exports, "WildcardPermissionResolver", { enumerable: true, get: function () { return WildcardPermissionResolver_1.WildcardPermissionResolver; } });
var ExpressionPermissionResolver_1 = require("./resolvers/ExpressionPermissionResolver");
Object.defineProperty(exports, "ExpressionPermissionResolver", { enumerable: true, get: function () { return ExpressionPermissionResolver_1.ExpressionPermissionResolver; } });
// Services
var FastUserContextService_1 = require("./services/FastUserContextService");
Object.defineProperty(exports, "FastUserContextService", { enumerable: true, get: function () { return FastUserContextService_1.FastUserContextService; } });
// Guards
var FastAuthGuard_1 = require("./guards/FastAuthGuard");
Object.defineProperty(exports, "FastAuthGuard", { enumerable: true, get: function () { return FastAuthGuard_1.FastAuthGuard; } });
var PermissionGuardFactory_1 = require("./guards/PermissionGuardFactory");
Object.defineProperty(exports, "PermissionGuardFactory", { enumerable: true, get: function () { return PermissionGuardFactory_1.PermissionGuardFactory; } });
// Token verification adapters for integration with AuthenticationMiddleware
var CustomTokenVerificationPortAdapter_1 = require("./adapters/CustomTokenVerificationPortAdapter");
Object.defineProperty(exports, "CustomTokenVerificationPortAdapter", { enumerable: true, get: function () { return CustomTokenVerificationPortAdapter_1.CustomTokenVerificationPortAdapter; } });
Object.defineProperty(exports, "TokenVerificationAdapterFactory", { enumerable: true, get: function () { return CustomTokenVerificationPortAdapter_1.TokenVerificationAdapterFactory; } });
// Utility types and constants
exports.GUARD_DEFAULTS = {
CACHE_TTL_MS: 15 * 60 * 1000, // 15 minutes
AUTH_TOKEN_TTL_MS: 5 * 60 * 1000, // 5 minutes
MAX_CACHE_ENTRIES: 1000,
MAX_EXPRESSION_COMPLEXITY: 100,
MAX_PATTERN_DEPTH: 3,
MAX_NESTING_DEPTH: 2,
};
exports.PERMISSION_PATTERNS = {
VALID_PERMISSION: /^[a-zA-Z][a-zA-Z0-9_]*(\.[a-zA-Z][a-zA-Z0-9_]*){1,2}(\*)?$/,
WILDCARD_SUFFIX: /\*$/,
PERMISSION_PARTS: /\./,
};
// Import the types we need for the class methods
const GuardConfiguration_2 = require("./config/GuardConfiguration");
/**
* Quick setup helper for common configurations
*/
class GuardSetup {
/**
* Development environment setup
*
* Note: Caching is disabled by default unless NOONY_GUARD_CACHE_ENABLE=true is set.
* Even with cacheType: 'memory', the environment variable takes precedence.
*
* @example
* ```bash
* # Caching disabled (default)
* npm run dev
*
* # Caching enabled
* NOONY_GUARD_CACHE_ENABLE=true npm run dev
* ```
*/
static development() {
return {
environment: 'development',
cacheType: 'memory',
security: {
permissionResolutionStrategy: GuardConfiguration_2.PermissionResolutionStrategy.ON_DEMAND,
conservativeCacheInvalidation: false,
maxExpressionComplexity: 50,
maxPatternDepth: 3,
maxNestingDepth: 2,
},
cache: {
maxEntries: 500,
defaultTtlMs: 5 * 60 * 1000, // 5 minutes
userContextTtlMs: 2 * 60 * 1000, // 2 minutes
authTokenTtlMs: 2 * 60 * 1000, // 2 minutes
},
monitoring: {
enablePerformanceTracking: true,
enableDetailedLogging: true,
logLevel: 'debug',
metricsCollectionInterval: 30000, // 30 seconds
},
};
}
/**
* Production environment setup
*
* Note: Caching is disabled by default unless NOONY_GUARD_CACHE_ENABLE=true is set.
* This provides a security-first approach where caching must be explicitly enabled.
*
* @example
* ```bash
* # Production with caching enabled (recommended)
* NOONY_GUARD_CACHE_ENABLE=true node dist/index.js
*
* # Production with caching disabled (debugging/troubleshooting)
* node dist/index.js
* ```
*/
static production() {
return {
environment: 'production',
cacheType: 'memory', // Would be 'redis' in real production
security: {
permissionResolutionStrategy: GuardConfiguration_2.PermissionResolutionStrategy.PRE_EXPANSION,
conservativeCacheInvalidation: true,
maxExpressionComplexity: 100,
maxPatternDepth: 3,
maxNestingDepth: 2,
},
cache: {
maxEntries: 2000,
defaultTtlMs: 15 * 60 * 1000, // 15 minutes
userContextTtlMs: 10 * 60 * 1000, // 10 minutes
authTokenTtlMs: 5 * 60 * 1000, // 5 minutes
},
monitoring: {
enablePerformanceTracking: true,
enableDetailedLogging: false,
logLevel: 'info',
metricsCollectionInterval: 60000, // 1 minute
},
};
}
/**
* Serverless environment setup (optimized for cold starts)
*
* Note: Caching is disabled by default unless NOONY_GUARD_CACHE_ENABLE=true is set.
* For serverless environments, consider enabling caching to improve performance
* across warm invocations.
*
* @example
* ```bash
* # Serverless with caching enabled (recommended for warm starts)
* NOONY_GUARD_CACHE_ENABLE=true serverless deploy
*
* # Serverless with caching disabled (cold start optimization)
* serverless deploy
* ```
*/
static serverless() {
return {
environment: 'serverless',
cacheType: 'memory',
security: {
permissionResolutionStrategy: GuardConfiguration_2.PermissionResolutionStrategy.PRE_EXPANSION,
conservativeCacheInvalidation: true,
maxExpressionComplexity: 75,
maxPatternDepth: 2, // Reduced for faster cold starts
maxNestingDepth: 2,
},
cache: {
maxEntries: 1000,
defaultTtlMs: 10 * 60 * 1000, // 10 minutes
userContextTtlMs: 5 * 60 * 1000, // 5 minutes
authTokenTtlMs: 3 * 60 * 1000, // 3 minutes
},
monitoring: {
enablePerformanceTracking: true,
enableDetailedLogging: false,
logLevel: 'warn',
metricsCollectionInterval: 120000, // 2 minutes
},
};
}
/**
* Testing environment setup
*
* Note: Uses cacheType: 'none' explicitly, so caching is always disabled
* regardless of NOONY_GUARD_CACHE_ENABLE environment variable.
* This ensures predictable test behavior.
*/
static testing() {
return {
environment: 'testing',
cacheType: 'none', // Disable caching for predictable tests
security: {
permissionResolutionStrategy: GuardConfiguration_2.PermissionResolutionStrategy.ON_DEMAND,
conservativeCacheInvalidation: false,
maxExpressionComplexity: 25,
maxPatternDepth: 3,
maxNestingDepth: 2,
},
cache: {
maxEntries: 100,
defaultTtlMs: 1000, // 1 second
userContextTtlMs: 1000,
authTokenTtlMs: 1000,
},
monitoring: {
enablePerformanceTracking: false,
enableDetailedLogging: true,
logLevel: 'debug',
metricsCollectionInterval: 1000, // 1 second
},
};
}
}
exports.GuardSetup = GuardSetup;
//# sourceMappingURL=index.js.map