@noony-serverless/core 0.3.4 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/build/core/containerPool.d.ts +129 -26
  2. package/build/core/containerPool.js +213 -68
  3. package/build/core/handler.d.ts +2 -2
  4. package/build/core/handler.js +6 -12
  5. package/build/core/index.d.ts +1 -0
  6. package/build/core/index.js +1 -0
  7. package/build/core/logger.d.ts +89 -1
  8. package/build/core/logger.js +136 -5
  9. package/build/core/telemetry/config.d.ts +331 -0
  10. package/build/core/telemetry/config.js +153 -0
  11. package/build/core/telemetry/index.d.ts +22 -0
  12. package/build/core/telemetry/index.js +45 -0
  13. package/build/core/telemetry/provider.d.ts +203 -0
  14. package/build/core/telemetry/provider.js +3 -0
  15. package/build/core/telemetry/providers/console-provider.d.ts +54 -0
  16. package/build/core/telemetry/providers/console-provider.js +124 -0
  17. package/build/core/telemetry/providers/index.d.ts +10 -0
  18. package/build/core/telemetry/providers/index.js +19 -0
  19. package/build/core/telemetry/providers/noop-provider.d.ts +51 -0
  20. package/build/core/telemetry/providers/noop-provider.js +67 -0
  21. package/build/core/telemetry/providers/opentelemetry-provider.d.ts +102 -0
  22. package/build/core/telemetry/providers/opentelemetry-provider.js +342 -0
  23. package/build/middlewares/dependencyInjectionMiddleware.d.ts +16 -8
  24. package/build/middlewares/dependencyInjectionMiddleware.js +31 -11
  25. package/build/middlewares/guards/adapters/CustomTokenVerificationPortAdapter.d.ts +1 -1
  26. package/build/middlewares/guards/guards/FastAuthGuard.d.ts +5 -5
  27. package/build/middlewares/guards/guards/FastAuthGuard.js +3 -2
  28. package/build/middlewares/guards/guards/PermissionGuardFactory.d.ts +7 -9
  29. package/build/middlewares/guards/resolvers/ExpressionPermissionResolver.d.ts +1 -1
  30. package/build/middlewares/guards/resolvers/ExpressionPermissionResolver.js +1 -1
  31. package/build/middlewares/guards/resolvers/PermissionResolver.d.ts +1 -1
  32. package/build/middlewares/guards/resolvers/PlainPermissionResolver.d.ts +1 -1
  33. package/build/middlewares/guards/resolvers/WildcardPermissionResolver.d.ts +1 -1
  34. package/build/middlewares/guards/services/FastUserContextService.d.ts +11 -32
  35. package/build/middlewares/index.d.ts +1 -0
  36. package/build/middlewares/index.js +1 -0
  37. package/build/middlewares/openTelemetryMiddleware.d.ts +162 -0
  38. package/build/middlewares/openTelemetryMiddleware.js +359 -0
  39. package/build/middlewares/rateLimitingMiddleware.js +16 -5
  40. package/build/utils/container.utils.js +4 -1
  41. package/build/utils/fastify-wrapper.d.ts +74 -0
  42. package/build/utils/fastify-wrapper.js +175 -0
  43. package/build/utils/index.d.ts +4 -0
  44. package/build/utils/index.js +23 -1
  45. package/build/utils/otel.helper.d.ts +122 -0
  46. package/build/utils/otel.helper.js +258 -0
  47. package/build/utils/pubsub-trace.utils.d.ts +102 -0
  48. package/build/utils/pubsub-trace.utils.js +155 -0
  49. package/build/utils/wrapper-utils.d.ts +177 -0
  50. package/build/utils/wrapper-utils.js +236 -0
  51. package/package.json +61 -2
@@ -162,16 +162,14 @@ export declare class PermissionGuardFactory {
162
162
  getStats(): {
163
163
  totalGuards: number;
164
164
  guardsByType: Record<string, number>;
165
- individualGuardStats: {
166
- guardType: string;
167
- checkCount: number;
168
- successCount: number;
169
- failureCount: number;
170
- successRate: number;
165
+ individualGuardStats: ReturnType<BasePermissionGuard['getStats']>[];
166
+ aggregatedStats: {
167
+ totalChecks: number;
168
+ totalSuccesses: number;
169
+ totalFailures: number;
170
+ overallSuccessRate: number;
171
171
  averageProcessingTimeUs: number;
172
- totalProcessingTimeUs: number;
173
- }[];
174
- aggregatedStats: any;
172
+ };
175
173
  };
176
174
  /**
177
175
  * Clear guard cache
@@ -118,7 +118,7 @@ export declare class ExpressionPermissionResolver extends PermissionResolver<Per
118
118
  /**
119
119
  * Check if this resolver can handle the given requirement type
120
120
  */
121
- canHandle(requirement: any): requirement is PermissionExpression;
121
+ canHandle(requirement: unknown): requirement is PermissionExpression;
122
122
  /**
123
123
  * Normalize expression for consistent cache keys
124
124
  *
@@ -412,7 +412,7 @@ class ExpressionPermissionResolver extends PermissionResolver_1.PermissionResolv
412
412
  * Check if this resolver can handle the given requirement type
413
413
  */
414
414
  canHandle(requirement) {
415
- return (requirement &&
415
+ return (!!requirement &&
416
416
  typeof requirement === 'object' &&
417
417
  PermissionResolver_1.PermissionUtils.isValidExpression(requirement));
418
418
  }
@@ -19,7 +19,7 @@
19
19
  * different types of permission requirements. The generic type T represents
20
20
  * the specific requirement format for each resolver.
21
21
  */
22
- export declare abstract class PermissionResolver<T = any> {
22
+ export declare abstract class PermissionResolver<T = unknown> {
23
23
  /**
24
24
  * Check if user permissions satisfy the requirement
25
25
  *
@@ -96,6 +96,6 @@ export declare class PlainPermissionResolver extends PermissionResolver<string[]
96
96
  * @param requirement - The requirement to check
97
97
  * @returns true if this resolver can handle the requirement
98
98
  */
99
- canHandle(requirement: any): requirement is string[];
99
+ canHandle(requirement: unknown): requirement is string[];
100
100
  }
101
101
  //# sourceMappingURL=PlainPermissionResolver.d.ts.map
@@ -141,6 +141,6 @@ export declare class WildcardPermissionResolver extends PermissionResolver<strin
141
141
  /**
142
142
  * Check if this resolver can handle the given requirement type
143
143
  */
144
- canHandle(requirement: any): requirement is string[];
144
+ canHandle(requirement: unknown): requirement is string[];
145
145
  }
146
146
  //# sourceMappingURL=WildcardPermissionResolver.d.ts.map
@@ -23,7 +23,10 @@
23
23
  * @version 1.0.0
24
24
  */
25
25
  import { CacheAdapter } from '../cache/CacheAdapter';
26
- import { GuardConfiguration, PermissionResolutionStrategy } from '../config/GuardConfiguration';
26
+ import { GuardConfiguration } from '../config/GuardConfiguration';
27
+ import { PlainPermissionResolver } from '../resolvers/PlainPermissionResolver';
28
+ import { WildcardPermissionResolver } from '../resolvers/WildcardPermissionResolver';
29
+ import { ExpressionPermissionResolver } from '../resolvers/ExpressionPermissionResolver';
27
30
  import { PermissionRegistry } from '../registry/PermissionRegistry';
28
31
  import { PermissionResolverType, PermissionCheckResult, PermissionExpression } from '../resolvers/PermissionResolver';
29
32
  /**
@@ -38,7 +41,7 @@ export interface UserContext {
38
41
  userId: string;
39
42
  permissions: Set<string>;
40
43
  roles: string[];
41
- metadata: Record<string, any>;
44
+ metadata: Record<string, unknown>;
42
45
  expandedPermissions?: Set<string>;
43
46
  lastUpdated: string;
44
47
  expiresAt?: string;
@@ -53,7 +56,7 @@ export interface UserPermissionSource {
53
56
  getUserPermissions(userId: string): Promise<{
54
57
  permissions: string[];
55
58
  roles: string[];
56
- metadata?: Record<string, any>;
59
+ metadata?: Record<string, unknown>;
57
60
  } | null>;
58
61
  /**
59
62
  * Get role-based permissions for expansion
@@ -118,7 +121,7 @@ export declare class FastUserContextService {
118
121
  * @param options - Check options
119
122
  * @returns Detailed permission check result
120
123
  */
121
- checkPermission(userId: string, requirement: any, options?: PermissionCheckOptions): Promise<PermissionCheckResult>;
124
+ checkPermission(userId: string, requirement: unknown, options?: PermissionCheckOptions): Promise<PermissionCheckResult>;
122
125
  /**
123
126
  * Batch check multiple permissions for a user
124
127
  *
@@ -131,7 +134,7 @@ export declare class FastUserContextService {
131
134
  * @returns Array of permission check results
132
135
  */
133
136
  checkPermissions(userId: string, requirements: Array<{
134
- requirement: any;
137
+ requirement: unknown;
135
138
  resolverType?: PermissionResolverType;
136
139
  }>, options?: PermissionCheckOptions): Promise<PermissionCheckResult[]>;
137
140
  /**
@@ -166,33 +169,9 @@ export declare class FastUserContextService {
166
169
  averageResolutionTimeUs: number;
167
170
  totalResolutionTimeUs: number;
168
171
  resolverStats: {
169
- plain: {
170
- checkCount: number;
171
- averageResolutionTimeUs: number;
172
- totalResolutionTimeUs: number;
173
- };
174
- wildcard: {
175
- strategy: PermissionResolutionStrategy;
176
- checkCount: number;
177
- averageResolutionTimeUs: number;
178
- totalResolutionTimeUs: number;
179
- cacheHitRate: number;
180
- cacheHits: number;
181
- cacheMisses: number;
182
- };
183
- expression: {
184
- checkCount: number;
185
- averageResolutionTimeUs: number;
186
- totalResolutionTimeUs: number;
187
- cacheHitRate: number;
188
- cacheHits: number;
189
- cacheMisses: number;
190
- complexityDistribution: {
191
- simple: number;
192
- moderate: number;
193
- complex: number;
194
- };
195
- };
172
+ plain: ReturnType<PlainPermissionResolver['getStats']>;
173
+ wildcard: ReturnType<WildcardPermissionResolver['getStats']>;
174
+ expression: ReturnType<ExpressionPermissionResolver['getStats']>;
196
175
  };
197
176
  };
198
177
  /**
@@ -5,6 +5,7 @@ export * from './dependencyInjectionMiddleware';
5
5
  export * from './errorHandlerMiddleware';
6
6
  export * from './headerVariablesMiddleware';
7
7
  export * from './httpAttributesMiddleware';
8
+ export * from './openTelemetryMiddleware';
8
9
  export * from './queryParametersMiddleware';
9
10
  export * from './rateLimitingMiddleware';
10
11
  export * from './responseWrapperMiddleware';
@@ -21,6 +21,7 @@ __exportStar(require("./dependencyInjectionMiddleware"), exports);
21
21
  __exportStar(require("./errorHandlerMiddleware"), exports);
22
22
  __exportStar(require("./headerVariablesMiddleware"), exports);
23
23
  __exportStar(require("./httpAttributesMiddleware"), exports);
24
+ __exportStar(require("./openTelemetryMiddleware"), exports);
24
25
  __exportStar(require("./queryParametersMiddleware"), exports);
25
26
  __exportStar(require("./rateLimitingMiddleware"), exports);
26
27
  __exportStar(require("./responseWrapperMiddleware"), exports);
@@ -0,0 +1,162 @@
1
+ import { BaseMiddleware, Context } from '../core';
2
+ import { TelemetryProvider, TelemetryConfig } from '../core/telemetry/provider';
3
+ /**
4
+ * OpenTelemetry Middleware Options
5
+ */
6
+ export interface OpenTelemetryOptions {
7
+ /**
8
+ * Telemetry provider (auto-detects if not provided)
9
+ * @default Auto-detected based on environment variables
10
+ */
11
+ provider?: TelemetryProvider;
12
+ /**
13
+ * Enable telemetry
14
+ * @default true for production, false for NODE_ENV=test
15
+ */
16
+ enabled?: boolean;
17
+ /**
18
+ * Extract custom attributes from context
19
+ * @default Extracts http.method, http.url, request.id, http.user_agent
20
+ */
21
+ extractAttributes?: (context: Context<unknown, unknown>) => Record<string, unknown>;
22
+ /**
23
+ * Filter which requests to trace
24
+ * @default Traces all requests
25
+ *
26
+ * @example
27
+ * shouldTrace: (context) => context.req.path !== '/health'
28
+ */
29
+ shouldTrace?: (context: Context<unknown, unknown>) => boolean;
30
+ /**
31
+ * Custom error handler for telemetry errors
32
+ * @default Logs error to console
33
+ */
34
+ onError?: (error: Error, context: Context<unknown, unknown>) => void;
35
+ /**
36
+ * Fail silently on telemetry errors (never throw)
37
+ * @default true (telemetry errors never break application)
38
+ */
39
+ failSilently?: boolean;
40
+ /**
41
+ * Enable trace context propagation for Google Cloud Pub/Sub messages
42
+ *
43
+ * When enabled:
44
+ * - Extracts W3C Trace Context from incoming Pub/Sub message attributes
45
+ * - Links new spans to parent trace from publisher
46
+ * - Allows distributed tracing across Pub/Sub producers and consumers
47
+ *
48
+ * Trace context is stored in message attributes as:
49
+ * - `traceparent`: W3C Trace Context version-traceid-spanid-flags
50
+ * - `tracestate`: Vendor-specific trace state (optional)
51
+ *
52
+ * @default true
53
+ */
54
+ propagatePubSubTraces?: boolean;
55
+ }
56
+ /**
57
+ * OpenTelemetry Middleware
58
+ *
59
+ * Provides distributed tracing and metrics collection with:
60
+ * - Auto-detection of telemetry provider from environment
61
+ * - Graceful degradation when configuration is missing
62
+ * - Zero-configuration local development support
63
+ * - Type-safe generics to preserve middleware chain
64
+ *
65
+ * Provider Auto-Detection Priority:
66
+ * 1. Explicit provider via options.provider
67
+ * 2. New Relic (if NEW_RELIC_LICENSE_KEY set)
68
+ * 3. Datadog (if DD_API_KEY or DD_SERVICE set)
69
+ * 4. Standard OTEL (if OTEL_EXPORTER_OTLP_ENDPOINT set)
70
+ * 5. Console (if NODE_ENV=development and no OTEL endpoint)
71
+ * 6. Noop (if NODE_ENV=test or no configuration)
72
+ *
73
+ * @template TBody - Request body type
74
+ * @template TUser - Authenticated user type
75
+ *
76
+ * @example
77
+ * // Zero configuration (auto-detects provider)
78
+ * const handler = new Handler()
79
+ * .use(new OpenTelemetryMiddleware())
80
+ * .handle(async (context) => {
81
+ * // Your business logic
82
+ * });
83
+ *
84
+ * @example
85
+ * // With custom filtering
86
+ * const handler = new Handler()
87
+ * .use(new OpenTelemetryMiddleware({
88
+ * shouldTrace: (context) => context.req.path !== '/health'
89
+ * }))
90
+ * .handle(async (context) => {
91
+ * // Your business logic
92
+ * });
93
+ */
94
+ export declare class OpenTelemetryMiddleware<TBody = unknown, TUser = unknown> implements BaseMiddleware<TBody, TUser> {
95
+ private provider;
96
+ private enabled;
97
+ private failSilently;
98
+ private propagatePubSubTraces;
99
+ private extractAttributes;
100
+ private shouldTrace;
101
+ private customErrorHandler;
102
+ private initialized;
103
+ constructor(options?: OpenTelemetryOptions);
104
+ /**
105
+ * Auto-detect telemetry provider based on environment
106
+ */
107
+ private autoDetectProvider;
108
+ /**
109
+ * Initialize provider with configuration
110
+ *
111
+ * This should be called once at application startup.
112
+ * If not called explicitly, it will be initialized on first request.
113
+ *
114
+ * @param config Telemetry configuration
115
+ */
116
+ initialize(config: TelemetryConfig): Promise<void>;
117
+ /**
118
+ * Before hook - Create span and store in context
119
+ *
120
+ * If propagatePubSubTraces is enabled and the request is a Pub/Sub message:
121
+ * 1. Extracts W3C Trace Context from message attributes
122
+ * 2. Creates a child span linked to the publisher's trace
123
+ * 3. Enables end-to-end distributed tracing across Pub/Sub
124
+ */
125
+ before(context: Context<TBody, TUser>): Promise<void>;
126
+ /**
127
+ * After hook - End span with success status and add X-Trace-Id header
128
+ */
129
+ after(context: Context<TBody, TUser>): Promise<void>;
130
+ /**
131
+ * Error hook - Record exception and end span
132
+ */
133
+ onError(error: Error, context: Context<TBody, TUser>): Promise<void>;
134
+ /**
135
+ * Default attribute extractor
136
+ */
137
+ private defaultExtractAttributes;
138
+ /**
139
+ * Default error handler
140
+ */
141
+ private defaultOnError;
142
+ /**
143
+ * Get current provider (useful for testing)
144
+ */
145
+ getProvider(): TelemetryProvider;
146
+ /**
147
+ * Shutdown telemetry provider
148
+ *
149
+ * Should be called during application shutdown to flush pending data.
150
+ */
151
+ shutdown(): Promise<void>;
152
+ }
153
+ /**
154
+ * Factory function for OpenTelemetry middleware
155
+ *
156
+ * @example
157
+ * const handler = new Handler()
158
+ * .use(openTelemetry({ shouldTrace: ctx => ctx.req.path !== '/health' }))
159
+ * .handle(async (context) => { });
160
+ */
161
+ export declare const openTelemetry: <TBody = unknown, TUser = unknown>(options?: OpenTelemetryOptions) => OpenTelemetryMiddleware<TBody, TUser>;
162
+ //# sourceMappingURL=openTelemetryMiddleware.d.ts.map