nitrostack 1.0.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.
- package/CHANGELOG.md +227 -0
- package/CONTRIBUTING.md +182 -0
- package/LICENSE +201 -0
- package/LICENSE_URLS_UPDATE_COMPLETE.md +388 -0
- package/NOTICE +153 -0
- package/README.md +571 -0
- package/dist/auth/api-key.d.ts +118 -0
- package/dist/auth/api-key.d.ts.map +1 -0
- package/dist/auth/api-key.js +168 -0
- package/dist/auth/api-key.js.map +1 -0
- package/dist/auth/client.d.ts +151 -0
- package/dist/auth/client.d.ts.map +1 -0
- package/dist/auth/client.js +330 -0
- package/dist/auth/client.js.map +1 -0
- package/dist/auth/index.d.ts +30 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +43 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +95 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +260 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/pkce.d.ts +53 -0
- package/dist/auth/pkce.d.ts.map +1 -0
- package/dist/auth/pkce.js +105 -0
- package/dist/auth/pkce.js.map +1 -0
- package/dist/auth/quick-setup.d.ts +94 -0
- package/dist/auth/quick-setup.d.ts.map +1 -0
- package/dist/auth/quick-setup.js +210 -0
- package/dist/auth/quick-setup.js.map +1 -0
- package/dist/auth/server-integration.d.ts +97 -0
- package/dist/auth/server-integration.d.ts.map +1 -0
- package/dist/auth/server-integration.js +182 -0
- package/dist/auth/server-integration.js.map +1 -0
- package/dist/auth/server-metadata.d.ts +51 -0
- package/dist/auth/server-metadata.d.ts.map +1 -0
- package/dist/auth/server-metadata.js +106 -0
- package/dist/auth/server-metadata.js.map +1 -0
- package/dist/auth/simple-jwt.d.ts +88 -0
- package/dist/auth/simple-jwt.d.ts.map +1 -0
- package/dist/auth/simple-jwt.js +152 -0
- package/dist/auth/simple-jwt.js.map +1 -0
- package/dist/auth/token-store.d.ts +104 -0
- package/dist/auth/token-store.d.ts.map +1 -0
- package/dist/auth/token-store.js +205 -0
- package/dist/auth/token-store.js.map +1 -0
- package/dist/auth/token-validation.d.ts +47 -0
- package/dist/auth/token-validation.d.ts.map +1 -0
- package/dist/auth/token-validation.js +237 -0
- package/dist/auth/token-validation.js.map +1 -0
- package/dist/auth/types.d.ts +215 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +6 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/cli/commands/build.d.ts +6 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +104 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +7 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +312 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/generate-types.d.ts +8 -0
- package/dist/cli/commands/generate-types.d.ts.map +1 -0
- package/dist/cli/commands/generate-types.js +220 -0
- package/dist/cli/commands/generate-types.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +5 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +365 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +7 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +365 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/start.d.ts +6 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +61 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +47 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/mcp-dev-wrapper.d.ts +3 -0
- package/dist/cli/mcp-dev-wrapper.d.ts.map +1 -0
- package/dist/cli/mcp-dev-wrapper.js +116 -0
- package/dist/cli/mcp-dev-wrapper.js.map +1 -0
- package/dist/core/apikey-module.d.ts +69 -0
- package/dist/core/apikey-module.d.ts.map +1 -0
- package/dist/core/apikey-module.js +114 -0
- package/dist/core/apikey-module.js.map +1 -0
- package/dist/core/app-decorator.d.ts +58 -0
- package/dist/core/app-decorator.d.ts.map +1 -0
- package/dist/core/app-decorator.js +261 -0
- package/dist/core/app-decorator.js.map +1 -0
- package/dist/core/builders.d.ts +38 -0
- package/dist/core/builders.d.ts.map +1 -0
- package/dist/core/builders.js +129 -0
- package/dist/core/builders.js.map +1 -0
- package/dist/core/component.d.ts +105 -0
- package/dist/core/component.d.ts.map +1 -0
- package/dist/core/component.js +182 -0
- package/dist/core/component.js.map +1 -0
- package/dist/core/config-module.d.ts +55 -0
- package/dist/core/config-module.d.ts.map +1 -0
- package/dist/core/config-module.js +94 -0
- package/dist/core/config-module.js.map +1 -0
- package/dist/core/decorators/cache.decorator.d.ts +61 -0
- package/dist/core/decorators/cache.decorator.d.ts.map +1 -0
- package/dist/core/decorators/cache.decorator.js +115 -0
- package/dist/core/decorators/cache.decorator.js.map +1 -0
- package/dist/core/decorators/health-check.decorator.d.ts +80 -0
- package/dist/core/decorators/health-check.decorator.d.ts.map +1 -0
- package/dist/core/decorators/health-check.decorator.js +153 -0
- package/dist/core/decorators/health-check.decorator.js.map +1 -0
- package/dist/core/decorators/rate-limit.decorator.d.ts +62 -0
- package/dist/core/decorators/rate-limit.decorator.d.ts.map +1 -0
- package/dist/core/decorators/rate-limit.decorator.js +129 -0
- package/dist/core/decorators/rate-limit.decorator.js.map +1 -0
- package/dist/core/decorators.d.ts +151 -0
- package/dist/core/decorators.d.ts.map +1 -0
- package/dist/core/decorators.js +142 -0
- package/dist/core/decorators.js.map +1 -0
- package/dist/core/di/container.d.ts +42 -0
- package/dist/core/di/container.d.ts.map +1 -0
- package/dist/core/di/container.js +76 -0
- package/dist/core/di/container.js.map +1 -0
- package/dist/core/di/injectable.decorator.d.ts +35 -0
- package/dist/core/di/injectable.decorator.d.ts.map +1 -0
- package/dist/core/di/injectable.decorator.js +57 -0
- package/dist/core/di/injectable.decorator.js.map +1 -0
- package/dist/core/errors.d.ts +54 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +87 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/events/event-emitter.d.ts +50 -0
- package/dist/core/events/event-emitter.d.ts.map +1 -0
- package/dist/core/events/event-emitter.js +94 -0
- package/dist/core/events/event-emitter.js.map +1 -0
- package/dist/core/events/event.decorator.d.ts +48 -0
- package/dist/core/events/event.decorator.d.ts.map +1 -0
- package/dist/core/events/event.decorator.js +68 -0
- package/dist/core/events/event.decorator.js.map +1 -0
- package/dist/core/filters/exception-filter.decorator.d.ts +40 -0
- package/dist/core/filters/exception-filter.decorator.d.ts.map +1 -0
- package/dist/core/filters/exception-filter.decorator.js +54 -0
- package/dist/core/filters/exception-filter.decorator.js.map +1 -0
- package/dist/core/filters/exception-filter.interface.d.ts +30 -0
- package/dist/core/filters/exception-filter.interface.d.ts.map +1 -0
- package/dist/core/filters/exception-filter.interface.js +2 -0
- package/dist/core/filters/exception-filter.interface.js.map +1 -0
- package/dist/core/guards/apikey.guard.d.ts +22 -0
- package/dist/core/guards/apikey.guard.d.ts.map +1 -0
- package/dist/core/guards/apikey.guard.js +11 -0
- package/dist/core/guards/apikey.guard.js.map +1 -0
- package/dist/core/guards/guard.interface.d.ts +18 -0
- package/dist/core/guards/guard.interface.d.ts.map +1 -0
- package/dist/core/guards/guard.interface.js +2 -0
- package/dist/core/guards/guard.interface.js.map +1 -0
- package/dist/core/guards/jwt.guard.d.ts +18 -0
- package/dist/core/guards/jwt.guard.d.ts.map +1 -0
- package/dist/core/guards/jwt.guard.js +2 -0
- package/dist/core/guards/jwt.guard.js.map +1 -0
- package/dist/core/guards/oauth.guard.d.ts +35 -0
- package/dist/core/guards/oauth.guard.d.ts.map +1 -0
- package/dist/core/guards/oauth.guard.js +2 -0
- package/dist/core/guards/oauth.guard.js.map +1 -0
- package/dist/core/guards/use-guards.decorator.d.ts +25 -0
- package/dist/core/guards/use-guards.decorator.d.ts.map +1 -0
- package/dist/core/guards/use-guards.decorator.js +32 -0
- package/dist/core/guards/use-guards.decorator.js.map +1 -0
- package/dist/core/health/health-checks.resource.d.ts +14 -0
- package/dist/core/health/health-checks.resource.d.ts.map +1 -0
- package/dist/core/health/health-checks.resource.js +29 -0
- package/dist/core/health/health-checks.resource.js.map +1 -0
- package/dist/core/index.d.ts +55 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +57 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/interceptors/interceptor.decorator.d.ts +37 -0
- package/dist/core/interceptors/interceptor.decorator.d.ts.map +1 -0
- package/dist/core/interceptors/interceptor.decorator.js +51 -0
- package/dist/core/interceptors/interceptor.decorator.js.map +1 -0
- package/dist/core/interceptors/interceptor.interface.d.ts +31 -0
- package/dist/core/interceptors/interceptor.interface.d.ts.map +1 -0
- package/dist/core/interceptors/interceptor.interface.js +2 -0
- package/dist/core/interceptors/interceptor.interface.js.map +1 -0
- package/dist/core/jwt-module.d.ts +51 -0
- package/dist/core/jwt-module.d.ts.map +1 -0
- package/dist/core/jwt-module.js +52 -0
- package/dist/core/jwt-module.js.map +1 -0
- package/dist/core/logger.d.ts +18 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +51 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/middleware/middleware.decorator.d.ts +39 -0
- package/dist/core/middleware/middleware.decorator.d.ts.map +1 -0
- package/dist/core/middleware/middleware.decorator.js +53 -0
- package/dist/core/middleware/middleware.decorator.js.map +1 -0
- package/dist/core/middleware/middleware.interface.d.ts +29 -0
- package/dist/core/middleware/middleware.interface.d.ts.map +1 -0
- package/dist/core/middleware/middleware.interface.js +2 -0
- package/dist/core/middleware/middleware.interface.js.map +1 -0
- package/dist/core/module.d.ts +74 -0
- package/dist/core/module.d.ts.map +1 -0
- package/dist/core/module.js +82 -0
- package/dist/core/module.js.map +1 -0
- package/dist/core/oauth-module.d.ts +144 -0
- package/dist/core/oauth-module.d.ts.map +1 -0
- package/dist/core/oauth-module.js +190 -0
- package/dist/core/oauth-module.js.map +1 -0
- package/dist/core/pipes/pipe.decorator.d.ts +55 -0
- package/dist/core/pipes/pipe.decorator.d.ts.map +1 -0
- package/dist/core/pipes/pipe.decorator.js +85 -0
- package/dist/core/pipes/pipe.decorator.js.map +1 -0
- package/dist/core/pipes/pipe.interface.d.ts +36 -0
- package/dist/core/pipes/pipe.interface.d.ts.map +1 -0
- package/dist/core/pipes/pipe.interface.js +2 -0
- package/dist/core/pipes/pipe.interface.js.map +1 -0
- package/dist/core/prompt.d.ts +37 -0
- package/dist/core/prompt.d.ts.map +1 -0
- package/dist/core/prompt.js +76 -0
- package/dist/core/prompt.js.map +1 -0
- package/dist/core/resource.d.ts +42 -0
- package/dist/core/resource.d.ts.map +1 -0
- package/dist/core/resource.js +90 -0
- package/dist/core/resource.js.map +1 -0
- package/dist/core/server.d.ts +72 -0
- package/dist/core/server.d.ts.map +1 -0
- package/dist/core/server.js +406 -0
- package/dist/core/server.js.map +1 -0
- package/dist/core/tool.d.ts +78 -0
- package/dist/core/tool.d.ts.map +1 -0
- package/dist/core/tool.js +190 -0
- package/dist/core/tool.js.map +1 -0
- package/dist/core/transports/http-server.d.ts +102 -0
- package/dist/core/transports/http-server.d.ts.map +1 -0
- package/dist/core/transports/http-server.js +265 -0
- package/dist/core/transports/http-server.js.map +1 -0
- package/dist/core/types.d.ts +123 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/widgets/widget-examples.resource.d.ts +17 -0
- package/dist/core/widgets/widget-examples.resource.d.ts.map +1 -0
- package/dist/core/widgets/widget-examples.resource.js +28 -0
- package/dist/core/widgets/widget-examples.resource.js.map +1 -0
- package/dist/core/widgets/widget-registry.d.ts +56 -0
- package/dist/core/widgets/widget-registry.d.ts.map +1 -0
- package/dist/core/widgets/widget-registry.js +75 -0
- package/dist/core/widgets/widget-registry.js.map +1 -0
- package/dist/testing/index.d.ts +82 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +164 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/ui-next/index.d.ts +31 -0
- package/dist/ui-next/index.d.ts.map +1 -0
- package/dist/ui-next/index.js +687 -0
- package/dist/ui-next/index.js.map +1 -0
- package/dist/widgets/index.d.ts +9 -0
- package/dist/widgets/index.d.ts.map +1 -0
- package/dist/widgets/index.js +9 -0
- package/dist/widgets/index.js.map +1 -0
- package/dist/widgets/metadata.d.ts +53 -0
- package/dist/widgets/metadata.d.ts.map +1 -0
- package/dist/widgets/metadata.js +29 -0
- package/dist/widgets/metadata.js.map +1 -0
- package/dist/widgets/withToolData.d.ts +19 -0
- package/dist/widgets/withToolData.d.ts.map +1 -0
- package/dist/widgets/withToolData.js +240 -0
- package/dist/widgets/withToolData.js.map +1 -0
- package/jest.config.js +21 -0
- package/package.json +108 -0
- package/templates/typescript-auth/AI_AGENT_CLI_REFERENCE.md +702 -0
- package/templates/typescript-auth/AI_AGENT_SDK_REFERENCE.md +1260 -0
- package/templates/typescript-auth/README.md +400 -0
- package/templates/typescript-auth/package.json +44 -0
- package/templates/typescript-auth-api-key/AI_AGENT_CLI_REFERENCE.md +701 -0
- package/templates/typescript-auth-api-key/AI_AGENT_SDK_REFERENCE.md +1260 -0
- package/templates/typescript-auth-api-key/README.md +483 -0
- package/templates/typescript-auth-api-key/package-lock.json +124 -0
- package/templates/typescript-auth-api-key/package.json +29 -0
- package/templates/typescript-oauth/AI_AGENT_CLI_REFERENCE.md +701 -0
- package/templates/typescript-oauth/AI_AGENT_SDK_REFERENCE.md +1260 -0
- package/templates/typescript-oauth/OAUTH_SETUP.md +406 -0
- package/templates/typescript-oauth/README.md +350 -0
- package/templates/typescript-oauth/package.json +30 -0
- package/templates/typescript-starter/AI_AGENT_CLI_REFERENCE.md +701 -0
- package/templates/typescript-starter/AI_AGENT_SDK_REFERENCE.md +1260 -0
- package/templates/typescript-starter/README.md +312 -0
- package/templates/typescript-starter/package.json +32 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { ExecutionContext } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Middleware Interface
|
|
5
|
+
*
|
|
6
|
+
* Middleware can intercept tool execution for cross-cutting concerns
|
|
7
|
+
* like logging, authentication, validation, etc.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* @Middleware()
|
|
12
|
+
* export class LoggingMiddleware implements MiddlewareInterface {
|
|
13
|
+
* async use(context: ExecutionContext, next: () => Promise<any>) {
|
|
14
|
+
* console.log('Before:', context.toolName);
|
|
15
|
+
* const result = await next();
|
|
16
|
+
* console.log('After:', context.toolName);
|
|
17
|
+
* return result;
|
|
18
|
+
* }
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export interface MiddlewareInterface {
|
|
23
|
+
use(context: ExecutionContext, next: () => Promise<any>): Promise<any>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Middleware constructor type
|
|
27
|
+
*/
|
|
28
|
+
export type MiddlewareConstructor = new (...args: any[]) => MiddlewareInterface;
|
|
29
|
+
//# sourceMappingURL=middleware.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.interface.d.ts","sourceRoot":"","sources":["../../../src/core/middleware/middleware.interface.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CACxE;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.interface.js","sourceRoot":"","sources":["../../../src/core/middleware/middleware.interface.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
/**
|
|
3
|
+
* Module metadata key
|
|
4
|
+
*/
|
|
5
|
+
export declare const MODULE_METADATA: unique symbol;
|
|
6
|
+
/**
|
|
7
|
+
* Module metadata interface
|
|
8
|
+
*/
|
|
9
|
+
export interface ModuleMetadata {
|
|
10
|
+
/** Module name */
|
|
11
|
+
name: string;
|
|
12
|
+
/** Module description */
|
|
13
|
+
description?: string;
|
|
14
|
+
/** Controllers (classes with @Tool, @Resource, @Prompt decorators) */
|
|
15
|
+
controllers?: any[];
|
|
16
|
+
/** Services (dependency injection) */
|
|
17
|
+
providers?: any[];
|
|
18
|
+
/** Other modules to import */
|
|
19
|
+
imports?: any[];
|
|
20
|
+
/** Items to export to other modules */
|
|
21
|
+
exports?: any[];
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Module class (internal)
|
|
25
|
+
*/
|
|
26
|
+
declare class ModuleClass {
|
|
27
|
+
metadata: ModuleMetadata;
|
|
28
|
+
constructor(metadata: ModuleMetadata);
|
|
29
|
+
/**
|
|
30
|
+
* Get all controllers from this module
|
|
31
|
+
*/
|
|
32
|
+
getControllers(): any[];
|
|
33
|
+
/**
|
|
34
|
+
* Get module name
|
|
35
|
+
*/
|
|
36
|
+
getName(): string;
|
|
37
|
+
/**
|
|
38
|
+
* Get module description
|
|
39
|
+
*/
|
|
40
|
+
getDescription(): string | undefined;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Module decorator - Defines a module with controllers, providers, imports
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* @Module({
|
|
48
|
+
* name: 'auth',
|
|
49
|
+
* description: 'Authentication module',
|
|
50
|
+
* controllers: [AuthController],
|
|
51
|
+
* })
|
|
52
|
+
* export class AuthModule {}
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare function ModuleDecorator(metadata: ModuleMetadata): <T extends {
|
|
56
|
+
new (...args: any[]): {};
|
|
57
|
+
}>(constructor: T) => {
|
|
58
|
+
new (...args: any[]): {};
|
|
59
|
+
getMetadata(): ModuleMetadata;
|
|
60
|
+
} & T;
|
|
61
|
+
export { ModuleDecorator as Module };
|
|
62
|
+
/**
|
|
63
|
+
* Create a module instance from a class
|
|
64
|
+
*/
|
|
65
|
+
export declare function createModule(moduleClass: any): ModuleClass;
|
|
66
|
+
/**
|
|
67
|
+
* Check if a class is a module
|
|
68
|
+
*/
|
|
69
|
+
export declare function isModule(target: any): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Get module metadata from a class
|
|
72
|
+
*/
|
|
73
|
+
export declare function getModuleMetadata(target: any): ModuleMetadata | undefined;
|
|
74
|
+
//# sourceMappingURL=module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/core/module.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B;;GAEG;AACH,eAAO,MAAM,eAAe,eAA4B,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IAEb,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,sEAAsE;IACtE,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC;IAEpB,sCAAsC;IACtC,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC;IAElB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAEhB,uCAAuC;IACvC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;CACjB;AAED;;GAEG;AACH,cAAM,WAAW;IACI,QAAQ,EAAE,cAAc;gBAAxB,QAAQ,EAAE,cAAc;IAE3C;;OAEG;IACH,cAAc,IAAI,GAAG,EAAE;IAIvB;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACH,cAAc,IAAI,MAAM,GAAG,SAAS;CAGrC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,IACrC,CAAC,SAAS;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;CAAE,EAAE,aAAa,CAAC;kBAA5B,GAAG,EAAE;mBAMtB,cAAc;MAKzC;AAGD,OAAO,EAAE,eAAe,IAAI,MAAM,EAAE,CAAC;AAErC;;GAEG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,GAAG,GAAG,WAAW,CAM1D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,GAAG,GAAG,cAAc,GAAG,SAAS,CAEzE"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
/**
|
|
3
|
+
* Module metadata key
|
|
4
|
+
*/
|
|
5
|
+
export const MODULE_METADATA = Symbol('module:metadata');
|
|
6
|
+
/**
|
|
7
|
+
* Module class (internal)
|
|
8
|
+
*/
|
|
9
|
+
class ModuleClass {
|
|
10
|
+
metadata;
|
|
11
|
+
constructor(metadata) {
|
|
12
|
+
this.metadata = metadata;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Get all controllers from this module
|
|
16
|
+
*/
|
|
17
|
+
getControllers() {
|
|
18
|
+
return this.metadata.controllers || [];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get module name
|
|
22
|
+
*/
|
|
23
|
+
getName() {
|
|
24
|
+
return this.metadata.name;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Get module description
|
|
28
|
+
*/
|
|
29
|
+
getDescription() {
|
|
30
|
+
return this.metadata.description;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Module decorator - Defines a module with controllers, providers, imports
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* @Module({
|
|
39
|
+
* name: 'auth',
|
|
40
|
+
* description: 'Authentication module',
|
|
41
|
+
* controllers: [AuthController],
|
|
42
|
+
* })
|
|
43
|
+
* export class AuthModule {}
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export function ModuleDecorator(metadata) {
|
|
47
|
+
return function (constructor) {
|
|
48
|
+
// Store metadata on the class
|
|
49
|
+
Reflect.defineMetadata(MODULE_METADATA, metadata, constructor);
|
|
50
|
+
// Return a new class that extends the original
|
|
51
|
+
return class extends constructor {
|
|
52
|
+
static getMetadata() {
|
|
53
|
+
return Reflect.getMetadata(MODULE_METADATA, constructor) || metadata;
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// Export as "Module" for decorator usage
|
|
59
|
+
export { ModuleDecorator as Module };
|
|
60
|
+
/**
|
|
61
|
+
* Create a module instance from a class
|
|
62
|
+
*/
|
|
63
|
+
export function createModule(moduleClass) {
|
|
64
|
+
const metadata = Reflect.getMetadata(MODULE_METADATA, moduleClass);
|
|
65
|
+
if (!metadata) {
|
|
66
|
+
throw new Error(`Class ${moduleClass.name} is not decorated with @Module`);
|
|
67
|
+
}
|
|
68
|
+
return new ModuleClass(metadata);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Check if a class is a module
|
|
72
|
+
*/
|
|
73
|
+
export function isModule(target) {
|
|
74
|
+
return Reflect.hasMetadata(MODULE_METADATA, target);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get module metadata from a class
|
|
78
|
+
*/
|
|
79
|
+
export function getModuleMetadata(target) {
|
|
80
|
+
return Reflect.getMetadata(MODULE_METADATA, target);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/core/module.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAyBzD;;GAEG;AACH,MAAM,WAAW;IACI;IAAnB,YAAmB,QAAwB;QAAxB,aAAQ,GAAR,QAAQ,CAAgB;IAAG,CAAC;IAE/C;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;IACnC,CAAC;CACF;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAAC,QAAwB;IACtD,OAAO,UAAkD,WAAc;QACrE,8BAA8B;QAC9B,OAAO,CAAC,cAAc,CAAC,eAAe,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;QAE/D,+CAA+C;QAC/C,OAAO,KAAM,SAAQ,WAAW;YAC9B,MAAM,CAAC,WAAW;gBAChB,OAAO,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,WAAW,CAAC,IAAI,QAAQ,CAAC;YACvE,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,yCAAyC;AACzC,OAAO,EAAE,eAAe,IAAI,MAAM,EAAE,CAAC;AAErC;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,WAAgB;IAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;IACnE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,SAAS,WAAW,CAAC,IAAI,gCAAgC,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAW;IAClC,OAAO,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAW;IAC3C,OAAO,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
/**
|
|
3
|
+
* OAuth 2.1 Module Configuration
|
|
4
|
+
*
|
|
5
|
+
* Compliant with:
|
|
6
|
+
* - OAuth 2.1 (draft-ietf-oauth-v2-1-13)
|
|
7
|
+
* - RFC 9728 - Protected Resource Metadata
|
|
8
|
+
* - RFC 8414 - Authorization Server Metadata
|
|
9
|
+
* - RFC 7591 - Dynamic Client Registration
|
|
10
|
+
* - RFC 8707 - Resource Indicators (Token Audience Binding)
|
|
11
|
+
* - RFC 7636 - PKCE
|
|
12
|
+
* - RFC 7662 - Token Introspection
|
|
13
|
+
*/
|
|
14
|
+
export interface OAuthModuleConfig {
|
|
15
|
+
/**
|
|
16
|
+
* Resource URI - The MCP server's public URL
|
|
17
|
+
* Used for token audience validation (RFC 8707)
|
|
18
|
+
*/
|
|
19
|
+
resourceUri: string;
|
|
20
|
+
/**
|
|
21
|
+
* Authorization Server(s)
|
|
22
|
+
* The OAuth 2.1 authorization server URLs
|
|
23
|
+
*/
|
|
24
|
+
authorizationServers: string[];
|
|
25
|
+
/**
|
|
26
|
+
* Supported scopes for this MCP server
|
|
27
|
+
* Example: ['mcp:read', 'mcp:write', 'tools:execute']
|
|
28
|
+
*/
|
|
29
|
+
scopesSupported?: string[];
|
|
30
|
+
/**
|
|
31
|
+
* HTTP server configuration
|
|
32
|
+
* OAuth requires HTTP transport - port will be extracted from resourceUri or use this
|
|
33
|
+
*/
|
|
34
|
+
http?: {
|
|
35
|
+
port?: number;
|
|
36
|
+
host?: string;
|
|
37
|
+
basePath?: string;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Token Introspection Endpoint (RFC 7662)
|
|
41
|
+
* Required for validating opaque tokens
|
|
42
|
+
*/
|
|
43
|
+
tokenIntrospectionEndpoint?: string;
|
|
44
|
+
/**
|
|
45
|
+
* Client ID for token introspection
|
|
46
|
+
*/
|
|
47
|
+
tokenIntrospectionClientId?: string;
|
|
48
|
+
/**
|
|
49
|
+
* Client Secret for token introspection
|
|
50
|
+
* Should be stored in environment variable
|
|
51
|
+
*/
|
|
52
|
+
tokenIntrospectionClientSecret?: string;
|
|
53
|
+
/**
|
|
54
|
+
* Expected audience for tokens (RFC 8707)
|
|
55
|
+
* If not provided, defaults to resourceUri
|
|
56
|
+
*/
|
|
57
|
+
audience?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Issuer validation
|
|
60
|
+
* If provided, tokens must be from this issuer
|
|
61
|
+
*/
|
|
62
|
+
issuer?: string;
|
|
63
|
+
/**
|
|
64
|
+
* Custom token validation
|
|
65
|
+
* Additional validation logic beyond spec requirements
|
|
66
|
+
*/
|
|
67
|
+
customValidation?: (token: any) => Promise<boolean> | boolean;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* OAuth Module - Enable OAuth 2.1 authentication in your MCP server
|
|
71
|
+
*
|
|
72
|
+
* This module provides:
|
|
73
|
+
* - Protected Resource Metadata (RFC 9728)
|
|
74
|
+
* - Token validation with audience binding (RFC 8707)
|
|
75
|
+
* - Token introspection (RFC 7662)
|
|
76
|
+
* - PKCE support (RFC 7636)
|
|
77
|
+
*
|
|
78
|
+
* Compatible with OpenAI Apps SDK and MCP specification.
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```typescript
|
|
82
|
+
* import { McpApplicationFactory, OAuthModule } from 'nitrostack';
|
|
83
|
+
* import { AppModule } from './app.module.js';
|
|
84
|
+
*
|
|
85
|
+
* @McpApp({
|
|
86
|
+
* module: AppModule,
|
|
87
|
+
* server: {
|
|
88
|
+
* name: 'OAuth MCP Server',
|
|
89
|
+
* version: '1.0.0',
|
|
90
|
+
* },
|
|
91
|
+
* })
|
|
92
|
+
* @Module({
|
|
93
|
+
* name: 'app',
|
|
94
|
+
* imports: [
|
|
95
|
+
* // Enable OAuth 2.1 authentication
|
|
96
|
+
* OAuthModule.forRoot({
|
|
97
|
+
* resourceUri: process.env.RESOURCE_URI!,
|
|
98
|
+
* authorizationServers: [process.env.AUTH_SERVER_URL!],
|
|
99
|
+
* scopesSupported: ['mcp:read', 'mcp:write', 'tools:execute'],
|
|
100
|
+
* tokenIntrospectionEndpoint: process.env.INTROSPECTION_ENDPOINT,
|
|
101
|
+
* tokenIntrospectionClientId: process.env.INTROSPECTION_CLIENT_ID,
|
|
102
|
+
* tokenIntrospectionClientSecret: process.env.INTROSPECTION_CLIENT_SECRET,
|
|
103
|
+
* }),
|
|
104
|
+
* ],
|
|
105
|
+
* })
|
|
106
|
+
* export class AppModule {}
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
export declare class OAuthModule {
|
|
110
|
+
private static config;
|
|
111
|
+
/**
|
|
112
|
+
* Configure OAuth module for the application
|
|
113
|
+
*/
|
|
114
|
+
static forRoot(config: OAuthModuleConfig): OAuthModuleConfig;
|
|
115
|
+
/**
|
|
116
|
+
* Get current OAuth configuration
|
|
117
|
+
*/
|
|
118
|
+
static getConfig(): OAuthModuleConfig | null;
|
|
119
|
+
/**
|
|
120
|
+
* Validate an access token
|
|
121
|
+
*
|
|
122
|
+
* Performs:
|
|
123
|
+
* 1. Token introspection (if endpoint configured)
|
|
124
|
+
* 2. Audience validation (RFC 8707)
|
|
125
|
+
* 3. Issuer validation (if configured)
|
|
126
|
+
* 4. Custom validation (if configured)
|
|
127
|
+
*/
|
|
128
|
+
static validateToken(token: string): Promise<{
|
|
129
|
+
valid: boolean;
|
|
130
|
+
payload?: any;
|
|
131
|
+
error?: string;
|
|
132
|
+
}>;
|
|
133
|
+
/**
|
|
134
|
+
* Introspect token using RFC 7662
|
|
135
|
+
* @private
|
|
136
|
+
*/
|
|
137
|
+
private static introspectToken;
|
|
138
|
+
/**
|
|
139
|
+
* Decode JWT token (without validation)
|
|
140
|
+
* @private
|
|
141
|
+
*/
|
|
142
|
+
private static decodeToken;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=oauth-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-module.d.ts","sourceRoot":"","sources":["../../src/core/oauth-module.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAE/B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAE3B;;;OAGG;IACH,IAAI,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IAEF;;;OAGG;IACH,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAEpC;;OAEG;IACH,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAEpC;;;OAGG;IACH,8BAA8B,CAAC,EAAE,MAAM,CAAC;IAExC;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAC/D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAkC;IAEvD;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB;IAmB5D;;OAEG;IACH,MAAM,CAAC,SAAS,IAAI,iBAAiB,GAAG,IAAI;IAI5C;;;;;;;;OAQG;WACU,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QACjD,KAAK,EAAE,OAAO,CAAC;QACf,OAAO,CAAC,EAAE,GAAG,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IA0DF;;;OAGG;mBACkB,eAAe;IAyDpC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;CAc3B"}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
/**
|
|
3
|
+
* OAuth Module - Enable OAuth 2.1 authentication in your MCP server
|
|
4
|
+
*
|
|
5
|
+
* This module provides:
|
|
6
|
+
* - Protected Resource Metadata (RFC 9728)
|
|
7
|
+
* - Token validation with audience binding (RFC 8707)
|
|
8
|
+
* - Token introspection (RFC 7662)
|
|
9
|
+
* - PKCE support (RFC 7636)
|
|
10
|
+
*
|
|
11
|
+
* Compatible with OpenAI Apps SDK and MCP specification.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import { McpApplicationFactory, OAuthModule } from 'nitrostack';
|
|
16
|
+
* import { AppModule } from './app.module.js';
|
|
17
|
+
*
|
|
18
|
+
* @McpApp({
|
|
19
|
+
* module: AppModule,
|
|
20
|
+
* server: {
|
|
21
|
+
* name: 'OAuth MCP Server',
|
|
22
|
+
* version: '1.0.0',
|
|
23
|
+
* },
|
|
24
|
+
* })
|
|
25
|
+
* @Module({
|
|
26
|
+
* name: 'app',
|
|
27
|
+
* imports: [
|
|
28
|
+
* // Enable OAuth 2.1 authentication
|
|
29
|
+
* OAuthModule.forRoot({
|
|
30
|
+
* resourceUri: process.env.RESOURCE_URI!,
|
|
31
|
+
* authorizationServers: [process.env.AUTH_SERVER_URL!],
|
|
32
|
+
* scopesSupported: ['mcp:read', 'mcp:write', 'tools:execute'],
|
|
33
|
+
* tokenIntrospectionEndpoint: process.env.INTROSPECTION_ENDPOINT,
|
|
34
|
+
* tokenIntrospectionClientId: process.env.INTROSPECTION_CLIENT_ID,
|
|
35
|
+
* tokenIntrospectionClientSecret: process.env.INTROSPECTION_CLIENT_SECRET,
|
|
36
|
+
* }),
|
|
37
|
+
* ],
|
|
38
|
+
* })
|
|
39
|
+
* export class AppModule {}
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export class OAuthModule {
|
|
43
|
+
static config = null;
|
|
44
|
+
/**
|
|
45
|
+
* Configure OAuth module for the application
|
|
46
|
+
*/
|
|
47
|
+
static forRoot(config) {
|
|
48
|
+
// Validate required fields
|
|
49
|
+
if (!config.resourceUri) {
|
|
50
|
+
throw new Error('OAuthModule: resourceUri is required');
|
|
51
|
+
}
|
|
52
|
+
if (!config.authorizationServers || config.authorizationServers.length === 0) {
|
|
53
|
+
throw new Error('OAuthModule: at least one authorizationServer is required');
|
|
54
|
+
}
|
|
55
|
+
// Set default audience to resourceUri if not provided
|
|
56
|
+
if (!config.audience) {
|
|
57
|
+
config.audience = config.resourceUri;
|
|
58
|
+
}
|
|
59
|
+
this.config = config;
|
|
60
|
+
return this.config;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get current OAuth configuration
|
|
64
|
+
*/
|
|
65
|
+
static getConfig() {
|
|
66
|
+
return this.config;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Validate an access token
|
|
70
|
+
*
|
|
71
|
+
* Performs:
|
|
72
|
+
* 1. Token introspection (if endpoint configured)
|
|
73
|
+
* 2. Audience validation (RFC 8707)
|
|
74
|
+
* 3. Issuer validation (if configured)
|
|
75
|
+
* 4. Custom validation (if configured)
|
|
76
|
+
*/
|
|
77
|
+
static async validateToken(token) {
|
|
78
|
+
if (!this.config) {
|
|
79
|
+
return { valid: false, error: 'OAuth module not configured' };
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
// If introspection endpoint is configured, use it
|
|
83
|
+
if (this.config.tokenIntrospectionEndpoint) {
|
|
84
|
+
return await this.introspectToken(token);
|
|
85
|
+
}
|
|
86
|
+
// For JWT tokens without introspection, decode and validate
|
|
87
|
+
// Note: In production, you should validate JWT signature
|
|
88
|
+
const payload = this.decodeToken(token);
|
|
89
|
+
if (!payload) {
|
|
90
|
+
return { valid: false, error: 'Invalid token format' };
|
|
91
|
+
}
|
|
92
|
+
// Validate audience (RFC 8707 - critical for security)
|
|
93
|
+
if (payload.aud) {
|
|
94
|
+
const audiences = Array.isArray(payload.aud) ? payload.aud : [payload.aud];
|
|
95
|
+
if (!audiences.includes(this.config.audience)) {
|
|
96
|
+
return {
|
|
97
|
+
valid: false,
|
|
98
|
+
error: `Token audience mismatch. Expected: ${this.config.audience}, Got: ${audiences.join(', ')}`,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Validate issuer
|
|
103
|
+
if (this.config.issuer && payload.iss !== this.config.issuer) {
|
|
104
|
+
return {
|
|
105
|
+
valid: false,
|
|
106
|
+
error: `Token issuer mismatch. Expected: ${this.config.issuer}, Got: ${payload.iss}`,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
// Check expiration
|
|
110
|
+
if (payload.exp && payload.exp < Date.now() / 1000) {
|
|
111
|
+
return { valid: false, error: 'Token expired' };
|
|
112
|
+
}
|
|
113
|
+
// Custom validation
|
|
114
|
+
if (this.config.customValidation) {
|
|
115
|
+
const customValid = await this.config.customValidation(payload);
|
|
116
|
+
if (!customValid) {
|
|
117
|
+
return { valid: false, error: 'Custom validation failed' };
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return { valid: true, payload };
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
return { valid: false, error: error.message };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Introspect token using RFC 7662
|
|
128
|
+
* @private
|
|
129
|
+
*/
|
|
130
|
+
static async introspectToken(token) {
|
|
131
|
+
if (!this.config?.tokenIntrospectionEndpoint) {
|
|
132
|
+
return { valid: false, error: 'Introspection endpoint not configured' };
|
|
133
|
+
}
|
|
134
|
+
try {
|
|
135
|
+
const auth = Buffer.from(`${this.config.tokenIntrospectionClientId}:${this.config.tokenIntrospectionClientSecret}`).toString('base64');
|
|
136
|
+
const response = await fetch(this.config.tokenIntrospectionEndpoint, {
|
|
137
|
+
method: 'POST',
|
|
138
|
+
headers: {
|
|
139
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
140
|
+
'Authorization': `Basic ${auth}`,
|
|
141
|
+
},
|
|
142
|
+
body: new URLSearchParams({
|
|
143
|
+
token: token,
|
|
144
|
+
token_type_hint: 'access_token',
|
|
145
|
+
}),
|
|
146
|
+
});
|
|
147
|
+
if (!response.ok) {
|
|
148
|
+
return {
|
|
149
|
+
valid: false,
|
|
150
|
+
error: `Introspection failed: ${response.status} ${response.statusText}`,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
const result = await response.json();
|
|
154
|
+
if (!result.active) {
|
|
155
|
+
return { valid: false, error: 'Token is not active' };
|
|
156
|
+
}
|
|
157
|
+
// Validate audience from introspection response
|
|
158
|
+
if (result.aud) {
|
|
159
|
+
const audiences = Array.isArray(result.aud) ? result.aud : [result.aud];
|
|
160
|
+
if (!audiences.includes(this.config.audience)) {
|
|
161
|
+
return {
|
|
162
|
+
valid: false,
|
|
163
|
+
error: `Token audience mismatch. Expected: ${this.config.audience}`,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return { valid: true, payload: result };
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
return { valid: false, error: `Introspection error: ${error.message}` };
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Decode JWT token (without validation)
|
|
175
|
+
* @private
|
|
176
|
+
*/
|
|
177
|
+
static decodeToken(token) {
|
|
178
|
+
try {
|
|
179
|
+
const parts = token.split('.');
|
|
180
|
+
if (parts.length !== 3)
|
|
181
|
+
return null;
|
|
182
|
+
const payload = JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf8'));
|
|
183
|
+
return payload;
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
//# sourceMappingURL=oauth-module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-module.js","sourceRoot":"","sources":["../../src/core/oauth-module.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { PipeConstructor } from './pipe.interface.js';
|
|
3
|
+
/**
|
|
4
|
+
* Marks a class as a pipe
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* @Pipe()
|
|
9
|
+
* export class ValidationPipe implements PipeInterface {
|
|
10
|
+
* transform(value: any, metadata: ArgumentMetadata) {
|
|
11
|
+
* // Validate and transform
|
|
12
|
+
* return value;
|
|
13
|
+
* }
|
|
14
|
+
* }
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare function Pipe(): ClassDecorator;
|
|
18
|
+
/**
|
|
19
|
+
* Apply pipes to tool input (entire input object)
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* @Tool({ name: 'create_user', ... })
|
|
24
|
+
* @UsePipes(ValidationPipe, TransformPipe)
|
|
25
|
+
* async createUser(input: any) { }
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function UsePipes(...pipes: PipeConstructor[]): MethodDecorator;
|
|
29
|
+
/**
|
|
30
|
+
* Parameter decorator to apply pipes to specific parameters
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```typescript
|
|
34
|
+
* @Tool({ name: 'create_user', ... })
|
|
35
|
+
* async createUser(@Body(ValidationPipe) input: CreateUserDto) { }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare function Body(...pipes: PipeConstructor[]): ParameterDecorator;
|
|
39
|
+
/**
|
|
40
|
+
* Shorthand for validation pipe
|
|
41
|
+
*/
|
|
42
|
+
export declare function Validated(): ParameterDecorator;
|
|
43
|
+
/**
|
|
44
|
+
* Get pipes for a method
|
|
45
|
+
*/
|
|
46
|
+
export declare function getPipeMetadata(target: any, propertyKey: string | symbol): PipeConstructor[];
|
|
47
|
+
/**
|
|
48
|
+
* Get parameter pipes for a method
|
|
49
|
+
*/
|
|
50
|
+
export declare function getParamPipesMetadata(target: any, propertyKey: string | symbol): Record<number, any>;
|
|
51
|
+
/**
|
|
52
|
+
* Check if a class is marked as a pipe
|
|
53
|
+
*/
|
|
54
|
+
export declare function isPipe(target: any): boolean;
|
|
55
|
+
//# sourceMappingURL=pipe.decorator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipe.decorator.d.ts","sourceRoot":"","sources":["../../../src/core/pipes/pipe.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAMtD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,IAAI,IAAI,cAAc,CAIrC;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,GAAG,KAAK,EAAE,eAAe,EAAE,GAAG,eAAe,CAUrE;AAED;;;;;;;;GAQG;AACH,wBAAgB,IAAI,CAAC,GAAG,KAAK,EAAE,eAAe,EAAE,GAAG,kBAAkB,CAWpE;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,kBAAkB,CAE9C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,eAAe,EAAE,CAE5F;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAEpG;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAE3C"}
|