@opra/nestjs 1.0.0-beta.3 → 1.0.0-beta.5
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/cjs/augmentation/nestjs.augmentation.js +8 -0
- package/cjs/constants.js +3 -2
- package/cjs/http/opra-http-core.module.js +116 -0
- package/cjs/{opra-nestjs-adapter.js → http/opra-http-nestjs-adapter.js} +14 -21
- package/cjs/{opra-http.module.js → http/opra-http.module.js} +11 -2
- package/cjs/{services → http/services}/opra-exception-filter.js +2 -2
- package/cjs/{services → http/services}/opra-middleware.js +3 -6
- package/cjs/index.js +4 -2
- package/cjs/kafka/opra-kafka-core.module.js +107 -0
- package/cjs/kafka/opra-kafka-nestjs-adapter.js +79 -0
- package/cjs/kafka/opra-kafka.module.js +33 -0
- package/esm/augmentation/nestjs.augmentation.js +8 -0
- package/esm/constants.js +2 -1
- package/esm/http/opra-http-core.module.js +113 -0
- package/esm/{opra-nestjs-adapter.js → http/opra-http-nestjs-adapter.js} +12 -19
- package/esm/{opra-http.module.js → http/opra-http.module.js} +11 -2
- package/esm/{services → http/services}/opra-exception-filter.js +2 -2
- package/esm/{services → http/services}/opra-middleware.js +5 -8
- package/esm/index.js +4 -2
- package/esm/kafka/opra-kafka-core.module.js +104 -0
- package/esm/kafka/opra-kafka-nestjs-adapter.js +75 -0
- package/esm/kafka/opra-kafka.module.js +30 -0
- package/package.json +8 -4
- package/types/constants.d.ts +2 -1
- package/types/http/opra-http-core.module.d.ts +12 -0
- package/types/{opra-nestjs-adapter.d.ts → http/opra-http-nestjs-adapter.d.ts} +6 -5
- package/types/http/opra-http.module.d.ts +35 -0
- package/types/http/services/opra-middleware.d.ts +8 -0
- package/types/index.d.cts +4 -2
- package/types/index.d.ts +4 -2
- package/types/kafka/opra-kafka-core.module.d.ts +14 -0
- package/types/kafka/opra-kafka-nestjs-adapter.d.ts +19 -0
- package/types/kafka/opra-kafka.module.d.ts +33 -0
- package/cjs/opra-http-core.module.js +0 -82
- package/esm/opra-http-core.module.js +0 -79
- package/types/opra-http-core.module.d.ts +0 -10
- package/types/opra-http.module.d.ts +0 -22
- package/types/services/opra-middleware.d.ts +0 -10
- /package/types/{services → http/services}/opra-exception-filter.d.ts +0 -0
|
@@ -5,30 +5,23 @@ import { EXCEPTION_FILTERS_METADATA, GUARDS_METADATA, INTERCEPTORS_METADATA } fr
|
|
|
5
5
|
import { ApiDocument, HTTP_CONTROLLER_METADATA, HttpApi, isConstructor, NotFoundError, } from '@opra/common';
|
|
6
6
|
import { HttpAdapter } from '@opra/http';
|
|
7
7
|
import { asMutable } from 'ts-gems';
|
|
8
|
-
import { Public } from '
|
|
9
|
-
export class
|
|
10
|
-
constructor(
|
|
8
|
+
import { Public } from '../decorators/public.decorator.js';
|
|
9
|
+
export class OpraHttpNestjsAdapter extends HttpAdapter {
|
|
10
|
+
constructor(options) {
|
|
11
11
|
super((function () {
|
|
12
12
|
const document = new ApiDocument();
|
|
13
|
-
document.api = new HttpApi({ owner: document, name:
|
|
13
|
+
document.api = new HttpApi({ owner: document, name: '', transport: 'http' });
|
|
14
14
|
return document;
|
|
15
|
-
})(),
|
|
16
|
-
...options,
|
|
17
|
-
interceptors: options?.interceptors,
|
|
18
|
-
});
|
|
15
|
+
})(), options);
|
|
19
16
|
this.nestControllers = [];
|
|
20
|
-
this.options
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
basePath = '/' + basePath;
|
|
24
|
-
this._addRootController(basePath);
|
|
25
|
-
if (init.controllers)
|
|
26
|
-
init.controllers.forEach(c => this._addToNestControllers(c, basePath, []));
|
|
17
|
+
this._addRootController(options.schemaIsPublic);
|
|
18
|
+
if (options.controllers)
|
|
19
|
+
options.controllers.forEach(c => this._addToNestControllers(c, this.basePath, []));
|
|
27
20
|
}
|
|
28
21
|
async close() {
|
|
29
22
|
//
|
|
30
23
|
}
|
|
31
|
-
_addRootController(
|
|
24
|
+
_addRootController(isPublic) {
|
|
32
25
|
const _this = this;
|
|
33
26
|
let RootController = class RootController {
|
|
34
27
|
schema(_req, next) {
|
|
@@ -45,10 +38,10 @@ export class OpraNestAdapter extends HttpAdapter {
|
|
|
45
38
|
], RootController.prototype, "schema", null);
|
|
46
39
|
RootController = __decorate([
|
|
47
40
|
Controller({
|
|
48
|
-
path: basePath,
|
|
41
|
+
path: this.basePath,
|
|
49
42
|
})
|
|
50
43
|
], RootController);
|
|
51
|
-
if (
|
|
44
|
+
if (isPublic) {
|
|
52
45
|
Public()(RootController.prototype, 'schema', Object.getOwnPropertyDescriptor(RootController.prototype, 'schema'));
|
|
53
46
|
}
|
|
54
47
|
this.nestControllers.push(RootController);
|
|
@@ -63,7 +56,7 @@ export class OpraNestAdapter extends HttpAdapter {
|
|
|
63
56
|
}[sourceClass.name];
|
|
64
57
|
/** Copy metadata keys from source class to new one */
|
|
65
58
|
let metadataKeys;
|
|
66
|
-
|
|
59
|
+
OpraHttpNestjsAdapter.copyDecoratorMetadataToChild(newClass, parentTree);
|
|
67
60
|
const newPath = metadata.path ? nodePath.join(currentPath, metadata.path) : currentPath;
|
|
68
61
|
const adapter = this;
|
|
69
62
|
// adapter.logger =
|
|
@@ -6,12 +6,21 @@ let OpraHttpModule = OpraHttpModule_1 = class OpraHttpModule {
|
|
|
6
6
|
/**
|
|
7
7
|
*
|
|
8
8
|
* @param init
|
|
9
|
+
*/
|
|
10
|
+
static forRoot(init) {
|
|
11
|
+
return {
|
|
12
|
+
module: OpraHttpModule_1,
|
|
13
|
+
imports: [OpraHttpCoreModule.forRoot(init)],
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
*
|
|
9
18
|
* @param options
|
|
10
19
|
*/
|
|
11
|
-
static
|
|
20
|
+
static forRootAsync(options) {
|
|
12
21
|
return {
|
|
13
22
|
module: OpraHttpModule_1,
|
|
14
|
-
imports: [OpraHttpCoreModule.
|
|
23
|
+
imports: [OpraHttpCoreModule.forRootAsync(options)],
|
|
15
24
|
};
|
|
16
25
|
}
|
|
17
26
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { __decorate, __metadata } from "tslib";
|
|
2
2
|
import { Catch } from '@nestjs/common';
|
|
3
3
|
import { BaseExceptionFilter, ModuleRef } from '@nestjs/core';
|
|
4
|
-
import {
|
|
4
|
+
import { OpraHttpNestjsAdapter } from '../opra-http-nestjs-adapter.js';
|
|
5
5
|
let OpraExceptionFilter = class OpraExceptionFilter extends BaseExceptionFilter {
|
|
6
6
|
constructor(moduleRef) {
|
|
7
7
|
super();
|
|
@@ -10,7 +10,7 @@ let OpraExceptionFilter = class OpraExceptionFilter extends BaseExceptionFilter
|
|
|
10
10
|
catch(exception, host) {
|
|
11
11
|
const ctx = host.switchToHttp().getRequest().opraContext;
|
|
12
12
|
if (ctx) {
|
|
13
|
-
const adapter = this.moduleRef.get(
|
|
13
|
+
const adapter = this.moduleRef.get(OpraHttpNestjsAdapter);
|
|
14
14
|
ctx.errors.push(exception);
|
|
15
15
|
return adapter.handler.sendResponse(ctx);
|
|
16
16
|
}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import { __decorate, __metadata
|
|
2
|
-
import {
|
|
1
|
+
import { __decorate, __metadata } from "tslib";
|
|
2
|
+
import { Injectable } from '@nestjs/common';
|
|
3
3
|
import { HttpContext, HttpIncoming, HttpOutgoing } from '@opra/http';
|
|
4
|
-
import {
|
|
5
|
-
import { OpraNestAdapter } from '../opra-nestjs-adapter.js';
|
|
4
|
+
import { OpraHttpNestjsAdapter } from '../opra-http-nestjs-adapter.js';
|
|
6
5
|
let OpraMiddleware = class OpraMiddleware {
|
|
7
|
-
constructor(opraAdapter
|
|
6
|
+
constructor(opraAdapter) {
|
|
8
7
|
this.opraAdapter = opraAdapter;
|
|
9
|
-
this.options = options;
|
|
10
8
|
}
|
|
11
9
|
use(req, res, next) {
|
|
12
10
|
const request = HttpIncoming.from(req);
|
|
@@ -27,7 +25,6 @@ let OpraMiddleware = class OpraMiddleware {
|
|
|
27
25
|
};
|
|
28
26
|
OpraMiddleware = __decorate([
|
|
29
27
|
Injectable(),
|
|
30
|
-
|
|
31
|
-
__metadata("design:paramtypes", [OpraNestAdapter, Object])
|
|
28
|
+
__metadata("design:paramtypes", [OpraHttpNestjsAdapter])
|
|
32
29
|
], OpraMiddleware);
|
|
33
30
|
export { OpraMiddleware };
|
package/esm/index.js
CHANGED
|
@@ -2,5 +2,7 @@ import 'reflect-metadata';
|
|
|
2
2
|
import './augmentation/nestjs.augmentation.js';
|
|
3
3
|
export * from './constants.js';
|
|
4
4
|
export * from './decorators/public.decorator.js';
|
|
5
|
-
export * from './opra-http.module.js';
|
|
6
|
-
export * from './opra-nestjs-adapter.js';
|
|
5
|
+
export * from './http/opra-http.module.js';
|
|
6
|
+
export * from './http/opra-http-nestjs-adapter.js';
|
|
7
|
+
export * from './kafka/opra-kafka.module.js';
|
|
8
|
+
export * from './kafka/opra-kafka-nestjs-adapter.js';
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
var OpraKafkaCoreModule_1;
|
|
2
|
+
import { __decorate, __metadata, __param } from "tslib";
|
|
3
|
+
import { Global, Inject, Logger, Module, } from '@nestjs/common';
|
|
4
|
+
import { ModuleRef } from '@nestjs/core';
|
|
5
|
+
import { isConstructor } from '@opra/common';
|
|
6
|
+
import { OPRA_KAFKA_MODULE_CONFIG } from '../constants.js';
|
|
7
|
+
import { OpraKafkaNestjsAdapter } from './opra-kafka-nestjs-adapter.js';
|
|
8
|
+
const opraKafkaNestjsAdapterToken = Symbol('OpraKafkaNestjsAdapter');
|
|
9
|
+
let OpraKafkaCoreModule = OpraKafkaCoreModule_1 = class OpraKafkaCoreModule {
|
|
10
|
+
constructor(adapter, init) {
|
|
11
|
+
this.adapter = adapter;
|
|
12
|
+
this.init = init;
|
|
13
|
+
}
|
|
14
|
+
static forRoot(moduleOptions) {
|
|
15
|
+
return this._getDynamicModule({
|
|
16
|
+
...moduleOptions,
|
|
17
|
+
providers: [
|
|
18
|
+
...(moduleOptions?.providers || []),
|
|
19
|
+
{
|
|
20
|
+
provide: OPRA_KAFKA_MODULE_CONFIG,
|
|
21
|
+
useValue: {
|
|
22
|
+
...moduleOptions,
|
|
23
|
+
logger: moduleOptions.logger || new Logger(moduleOptions.name),
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
static forRootAsync(moduleOptions) {
|
|
30
|
+
if (!moduleOptions.useFactory)
|
|
31
|
+
throw new Error('Invalid configuration. Must provide "useFactory"');
|
|
32
|
+
return this._getDynamicModule({
|
|
33
|
+
...moduleOptions,
|
|
34
|
+
providers: [
|
|
35
|
+
...(moduleOptions?.providers || []),
|
|
36
|
+
{
|
|
37
|
+
provide: OPRA_KAFKA_MODULE_CONFIG,
|
|
38
|
+
inject: moduleOptions.inject,
|
|
39
|
+
useFactory: async (...args) => {
|
|
40
|
+
const result = await moduleOptions.useFactory(...args);
|
|
41
|
+
result.logger = result.logger || new Logger(result.name);
|
|
42
|
+
return result;
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
static _getDynamicModule(moduleOptions) {
|
|
49
|
+
const token = moduleOptions.id || OpraKafkaNestjsAdapter;
|
|
50
|
+
const adapterProvider = {
|
|
51
|
+
provide: token,
|
|
52
|
+
inject: [ModuleRef, OPRA_KAFKA_MODULE_CONFIG],
|
|
53
|
+
useFactory: async (moduleRef, config) => {
|
|
54
|
+
const adapter = new OpraKafkaNestjsAdapter(moduleRef);
|
|
55
|
+
await adapter.initialize(config);
|
|
56
|
+
if (moduleOptions.interceptors) {
|
|
57
|
+
adapter.adapter.interceptors = moduleOptions.interceptors.map(x => {
|
|
58
|
+
if (isConstructor(x)) {
|
|
59
|
+
return async (ctx, next) => {
|
|
60
|
+
const interceptor = moduleRef.get(x);
|
|
61
|
+
if (typeof interceptor.intercept === 'function')
|
|
62
|
+
return interceptor.intercept(ctx, next);
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return x;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return adapter;
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
return {
|
|
72
|
+
global: moduleOptions.global,
|
|
73
|
+
module: OpraKafkaCoreModule_1,
|
|
74
|
+
controllers: moduleOptions.controllers,
|
|
75
|
+
providers: [
|
|
76
|
+
...(moduleOptions?.providers || []),
|
|
77
|
+
adapterProvider,
|
|
78
|
+
{
|
|
79
|
+
provide: opraKafkaNestjsAdapterToken,
|
|
80
|
+
useExisting: token,
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
imports: [...(moduleOptions?.imports || [])],
|
|
84
|
+
exports: [...(moduleOptions?.exports || []), adapterProvider],
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
async onModuleInit() {
|
|
88
|
+
await this.adapter.initialize(this.init);
|
|
89
|
+
}
|
|
90
|
+
async onApplicationBootstrap() {
|
|
91
|
+
await this.adapter.start();
|
|
92
|
+
}
|
|
93
|
+
async onApplicationShutdown() {
|
|
94
|
+
await this.adapter.stop();
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
OpraKafkaCoreModule = OpraKafkaCoreModule_1 = __decorate([
|
|
98
|
+
Module({}),
|
|
99
|
+
Global(),
|
|
100
|
+
__param(0, Inject(opraKafkaNestjsAdapterToken)),
|
|
101
|
+
__param(1, Inject(OPRA_KAFKA_MODULE_CONFIG)),
|
|
102
|
+
__metadata("design:paramtypes", [OpraKafkaNestjsAdapter, Object])
|
|
103
|
+
], OpraKafkaCoreModule);
|
|
104
|
+
export { OpraKafkaCoreModule };
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { RuntimeException } from '@nestjs/core/errors/exceptions/index';
|
|
2
|
+
import { ApiDocumentFactory, RPC_CONTROLLER_METADATA } from '@opra/common';
|
|
3
|
+
import { KafkaAdapter } from '@opra/kafka';
|
|
4
|
+
/**
|
|
5
|
+
* @class
|
|
6
|
+
*/
|
|
7
|
+
export class OpraKafkaNestjsAdapter {
|
|
8
|
+
constructor(moduleRef) {
|
|
9
|
+
this.moduleRef = moduleRef;
|
|
10
|
+
}
|
|
11
|
+
get document() {
|
|
12
|
+
if (!this._document)
|
|
13
|
+
throw new RuntimeException('Not initialized yet');
|
|
14
|
+
return this._document;
|
|
15
|
+
}
|
|
16
|
+
get adapter() {
|
|
17
|
+
if (!this._adapter)
|
|
18
|
+
throw new RuntimeException('Not initialized yet');
|
|
19
|
+
return this._adapter;
|
|
20
|
+
}
|
|
21
|
+
async start() {
|
|
22
|
+
if (!this._adapter) {
|
|
23
|
+
throw new RuntimeException('Not initialized yet');
|
|
24
|
+
}
|
|
25
|
+
return this._adapter.start();
|
|
26
|
+
}
|
|
27
|
+
async stop() {
|
|
28
|
+
return this._adapter?.close();
|
|
29
|
+
}
|
|
30
|
+
async initialize(init) {
|
|
31
|
+
const controllers = this._scanControllers();
|
|
32
|
+
this._document = await ApiDocumentFactory.createDocument({
|
|
33
|
+
info: init.info,
|
|
34
|
+
types: init.types,
|
|
35
|
+
references: init.references,
|
|
36
|
+
api: {
|
|
37
|
+
name: init.name,
|
|
38
|
+
description: init.description,
|
|
39
|
+
transport: 'rpc',
|
|
40
|
+
platform: 'kafka',
|
|
41
|
+
controllers,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
this._adapter = new KafkaAdapter({
|
|
45
|
+
client: init.client,
|
|
46
|
+
logger: init.logger,
|
|
47
|
+
logExtra: init.logExtra,
|
|
48
|
+
consumers: init.consumers,
|
|
49
|
+
document: this._document,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
_scanControllers() {
|
|
53
|
+
const container = this.moduleRef.container;
|
|
54
|
+
const modules = container.getModules();
|
|
55
|
+
const controllerInstances = [];
|
|
56
|
+
modules.forEach(({ controllers }) => {
|
|
57
|
+
controllers.forEach(wrapper => {
|
|
58
|
+
const ctor = Object.getPrototypeOf(wrapper.instance).constructor;
|
|
59
|
+
const metadata = Reflect.getMetadata(RPC_CONTROLLER_METADATA, ctor);
|
|
60
|
+
if (metadata) {
|
|
61
|
+
const instance = {};
|
|
62
|
+
Object.setPrototypeOf(instance, wrapper.instance);
|
|
63
|
+
controllerInstances.push(instance);
|
|
64
|
+
if (metadata.operations) {
|
|
65
|
+
// for (const [k, _] of Object.keys(metadata.operations)) {
|
|
66
|
+
// const fn = instance[k];
|
|
67
|
+
// instance[k] = fn;
|
|
68
|
+
// }
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
return controllerInstances;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
var OpraKafkaModule_1;
|
|
2
|
+
import { __decorate } from "tslib";
|
|
3
|
+
import { Module } from '@nestjs/common';
|
|
4
|
+
import { OpraKafkaCoreModule } from './opra-kafka-core.module.js';
|
|
5
|
+
let OpraKafkaModule = OpraKafkaModule_1 = class OpraKafkaModule {
|
|
6
|
+
/**
|
|
7
|
+
*
|
|
8
|
+
* @param options
|
|
9
|
+
*/
|
|
10
|
+
static forRoot(options) {
|
|
11
|
+
return {
|
|
12
|
+
module: OpraKafkaModule_1,
|
|
13
|
+
imports: [OpraKafkaCoreModule.forRoot(options)],
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
*
|
|
18
|
+
* @param options
|
|
19
|
+
*/
|
|
20
|
+
static forRootAsync(options) {
|
|
21
|
+
return {
|
|
22
|
+
module: OpraKafkaModule_1,
|
|
23
|
+
imports: [OpraKafkaCoreModule.forRootAsync(options)],
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
OpraKafkaModule = OpraKafkaModule_1 = __decorate([
|
|
28
|
+
Module({})
|
|
29
|
+
], OpraKafkaModule);
|
|
30
|
+
export { OpraKafkaModule };
|
package/package.json
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opra/nestjs",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.5",
|
|
4
4
|
"description": "Opra NestJS module",
|
|
5
5
|
"author": "Panates",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@opra/common": "^1.0.0-beta.
|
|
9
|
-
"@opra/core": "^1.0.0-beta.
|
|
10
|
-
"@opra/http": "^1.0.0-beta.3",
|
|
8
|
+
"@opra/common": "^1.0.0-beta.5",
|
|
9
|
+
"@opra/core": "^1.0.0-beta.5",
|
|
11
10
|
"fast-tokenizer": "^1.7.0",
|
|
12
11
|
"lodash.head": "^4.0.1",
|
|
13
12
|
"putil-promisify": "^1.10.1",
|
|
@@ -18,6 +17,11 @@
|
|
|
18
17
|
"@nestjs/common": "^10.4.4",
|
|
19
18
|
"@nestjs/core": "^10.4.4"
|
|
20
19
|
},
|
|
20
|
+
"optionalDependencies": {
|
|
21
|
+
"@nestjs/microservices": "^10.4.4",
|
|
22
|
+
"@opra/http": "^1.0.0-beta.5",
|
|
23
|
+
"@opra/kafka": "^1.0.0-beta.5"
|
|
24
|
+
},
|
|
21
25
|
"type": "module",
|
|
22
26
|
"exports": {
|
|
23
27
|
".": {
|
package/types/constants.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export declare const IS_PUBLIC_KEY = "opra:isPublic";
|
|
2
|
-
export declare const
|
|
2
|
+
export declare const OPRA_HTTP_API_CONFIG = "OPRA_HTTP_API_CONFIG";
|
|
3
|
+
export declare const OPRA_KAFKA_MODULE_CONFIG = "OPRA_KAFKA_MODULE_CONFIG";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type DynamicModule, type MiddlewareConsumer, type NestModule, type OnModuleDestroy } from '@nestjs/common';
|
|
2
|
+
import type { OpraHttpModule } from './opra-http.module.js';
|
|
3
|
+
import { OpraHttpNestjsAdapter } from './opra-http-nestjs-adapter.js';
|
|
4
|
+
export declare class OpraHttpCoreModule implements OnModuleDestroy, NestModule {
|
|
5
|
+
protected opraAdapter: OpraHttpNestjsAdapter;
|
|
6
|
+
constructor(opraAdapter: OpraHttpNestjsAdapter);
|
|
7
|
+
configure(consumer: MiddlewareConsumer): void;
|
|
8
|
+
static forRoot(moduleOptions: OpraHttpModule.ModuleOptions): DynamicModule;
|
|
9
|
+
static forRootAsync(moduleOptions: OpraHttpModule.AsyncModuleOptions): DynamicModule;
|
|
10
|
+
protected static _getDynamicModule(moduleOptions: OpraHttpModule.ModuleOptions | OpraHttpModule.AsyncModuleOptions): DynamicModule;
|
|
11
|
+
onModuleDestroy(): Promise<void>;
|
|
12
|
+
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { type Type } from '@nestjs/common';
|
|
2
2
|
import { HttpAdapter } from '@opra/http';
|
|
3
|
-
|
|
4
|
-
export declare class OpraNestAdapter extends HttpAdapter {
|
|
3
|
+
export declare class OpraHttpNestjsAdapter extends HttpAdapter {
|
|
5
4
|
readonly nestControllers: Type[];
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
constructor(options: HttpAdapter.Options & {
|
|
6
|
+
schemaIsPublic?: boolean;
|
|
7
|
+
controllers?: Type[];
|
|
8
|
+
});
|
|
8
9
|
close(): Promise<void>;
|
|
9
|
-
protected _addRootController(
|
|
10
|
+
protected _addRootController(isPublic?: boolean): void;
|
|
10
11
|
protected _addToNestControllers(sourceClass: Type, currentPath: string, parentTree: Type[]): void;
|
|
11
12
|
static copyDecoratorMetadataToChild(target: Type, parentTree: Type[]): void;
|
|
12
13
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type DynamicModule, Logger, type Type } from '@nestjs/common';
|
|
2
|
+
import { ApiDocumentFactory } from '@opra/common';
|
|
3
|
+
import { HttpAdapter } from '@opra/http';
|
|
4
|
+
export declare namespace OpraHttpModule {
|
|
5
|
+
export interface ModuleOptions extends BaseModuleOptions, ApiConfig {
|
|
6
|
+
}
|
|
7
|
+
export interface AsyncModuleOptions extends BaseModuleOptions {
|
|
8
|
+
inject?: any[];
|
|
9
|
+
useFactory?: (...args: any[]) => Promise<ApiConfig> | ApiConfig;
|
|
10
|
+
}
|
|
11
|
+
interface BaseModuleOptions extends Pick<DynamicModule, 'imports' | 'providers' | 'exports' | 'controllers' | 'global'> {
|
|
12
|
+
token?: any;
|
|
13
|
+
basePath?: string;
|
|
14
|
+
schemaIsPublic?: boolean;
|
|
15
|
+
interceptors?: (HttpAdapter.InterceptorFunction | HttpAdapter.IHttpInterceptor | Type<HttpAdapter.IHttpInterceptor>)[];
|
|
16
|
+
}
|
|
17
|
+
export interface ApiConfig extends Pick<ApiDocumentFactory.InitArguments, 'types' | 'references' | 'info'> {
|
|
18
|
+
name: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
logger?: Logger;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
23
|
+
}
|
|
24
|
+
export declare class OpraHttpModule {
|
|
25
|
+
/**
|
|
26
|
+
*
|
|
27
|
+
* @param init
|
|
28
|
+
*/
|
|
29
|
+
static forRoot(init: OpraHttpModule.ModuleOptions): DynamicModule;
|
|
30
|
+
/**
|
|
31
|
+
*
|
|
32
|
+
* @param options
|
|
33
|
+
*/
|
|
34
|
+
static forRootAsync(options: OpraHttpModule.AsyncModuleOptions): DynamicModule;
|
|
35
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type NestMiddleware } from '@nestjs/common';
|
|
2
|
+
import type { NextFunction, Request, Response } from 'express';
|
|
3
|
+
import { OpraHttpNestjsAdapter } from '../opra-http-nestjs-adapter.js';
|
|
4
|
+
export declare class OpraMiddleware implements NestMiddleware {
|
|
5
|
+
protected opraAdapter: OpraHttpNestjsAdapter;
|
|
6
|
+
constructor(opraAdapter: OpraHttpNestjsAdapter);
|
|
7
|
+
use(req: Request, res: Response, next: NextFunction): void;
|
|
8
|
+
}
|
package/types/index.d.cts
CHANGED
|
@@ -2,5 +2,7 @@ import 'reflect-metadata';
|
|
|
2
2
|
import './augmentation/nestjs.augmentation.js';
|
|
3
3
|
export * from './constants.js';
|
|
4
4
|
export * from './decorators/public.decorator.js';
|
|
5
|
-
export * from './opra-http.module.js';
|
|
6
|
-
export * from './opra-nestjs-adapter.js';
|
|
5
|
+
export * from './http/opra-http.module.js';
|
|
6
|
+
export * from './http/opra-http-nestjs-adapter.js';
|
|
7
|
+
export * from './kafka/opra-kafka.module.js';
|
|
8
|
+
export * from './kafka/opra-kafka-nestjs-adapter.js';
|
package/types/index.d.ts
CHANGED
|
@@ -2,5 +2,7 @@ import 'reflect-metadata';
|
|
|
2
2
|
import './augmentation/nestjs.augmentation.js';
|
|
3
3
|
export * from './constants.js';
|
|
4
4
|
export * from './decorators/public.decorator.js';
|
|
5
|
-
export * from './opra-http.module.js';
|
|
6
|
-
export * from './opra-nestjs-adapter.js';
|
|
5
|
+
export * from './http/opra-http.module.js';
|
|
6
|
+
export * from './http/opra-http-nestjs-adapter.js';
|
|
7
|
+
export * from './kafka/opra-kafka.module.js';
|
|
8
|
+
export * from './kafka/opra-kafka-nestjs-adapter.js';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type DynamicModule, OnApplicationBootstrap, OnApplicationShutdown, OnModuleInit } from '@nestjs/common';
|
|
2
|
+
import type { OpraKafkaModule } from './opra-kafka.module.js';
|
|
3
|
+
import { OpraKafkaNestjsAdapter } from './opra-kafka-nestjs-adapter.js';
|
|
4
|
+
export declare class OpraKafkaCoreModule implements OnModuleInit, OnApplicationBootstrap, OnApplicationShutdown {
|
|
5
|
+
protected adapter: OpraKafkaNestjsAdapter;
|
|
6
|
+
protected init: OpraKafkaModule.ApiConfig;
|
|
7
|
+
constructor(adapter: OpraKafkaNestjsAdapter, init: OpraKafkaModule.ApiConfig);
|
|
8
|
+
static forRoot(moduleOptions: OpraKafkaModule.ModuleOptions): DynamicModule;
|
|
9
|
+
static forRootAsync(moduleOptions: OpraKafkaModule.AsyncModuleOptions): DynamicModule;
|
|
10
|
+
protected static _getDynamicModule(moduleOptions: OpraKafkaModule.ModuleOptions | OpraKafkaModule.AsyncModuleOptions): DynamicModule;
|
|
11
|
+
onModuleInit(): Promise<void>;
|
|
12
|
+
onApplicationBootstrap(): Promise<void>;
|
|
13
|
+
onApplicationShutdown(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ModuleRef } from '@nestjs/core';
|
|
2
|
+
import { ApiDocument } from '@opra/common';
|
|
3
|
+
import { KafkaAdapter } from '@opra/kafka';
|
|
4
|
+
import type { OpraKafkaModule } from './opra-kafka.module.js';
|
|
5
|
+
/**
|
|
6
|
+
* @class
|
|
7
|
+
*/
|
|
8
|
+
export declare class OpraKafkaNestjsAdapter {
|
|
9
|
+
protected moduleRef: ModuleRef;
|
|
10
|
+
private _adapter?;
|
|
11
|
+
private _document?;
|
|
12
|
+
constructor(moduleRef: ModuleRef);
|
|
13
|
+
get document(): ApiDocument;
|
|
14
|
+
get adapter(): KafkaAdapter;
|
|
15
|
+
start(): Promise<void>;
|
|
16
|
+
stop(): Promise<void | undefined>;
|
|
17
|
+
initialize(init: OpraKafkaModule.ApiConfig): Promise<void>;
|
|
18
|
+
protected _scanControllers(): any[];
|
|
19
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type DynamicModule, Logger, type Type } from '@nestjs/common';
|
|
2
|
+
import { ApiDocumentFactory } from '@opra/common';
|
|
3
|
+
import { KafkaAdapter } from '@opra/kafka';
|
|
4
|
+
export declare namespace OpraKafkaModule {
|
|
5
|
+
export interface ModuleOptions extends BaseModuleOptions, ApiConfig {
|
|
6
|
+
}
|
|
7
|
+
export interface AsyncModuleOptions extends BaseModuleOptions {
|
|
8
|
+
inject?: any[];
|
|
9
|
+
useFactory?: (...args: any[]) => Promise<ApiConfig> | ApiConfig;
|
|
10
|
+
}
|
|
11
|
+
interface BaseModuleOptions extends Pick<DynamicModule, 'imports' | 'providers' | 'exports' | 'controllers' | 'global'> {
|
|
12
|
+
id?: any;
|
|
13
|
+
interceptors?: (KafkaAdapter.InterceptorFunction | KafkaAdapter.IKafkaInterceptor | Type<KafkaAdapter.IKafkaInterceptor>)[];
|
|
14
|
+
}
|
|
15
|
+
export interface ApiConfig extends Pick<ApiDocumentFactory.InitArguments, 'types' | 'references' | 'info'>, Pick<KafkaAdapter.Config, 'client' | 'consumers' | 'logExtra'> {
|
|
16
|
+
name: string;
|
|
17
|
+
description?: string;
|
|
18
|
+
logger?: Logger;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
21
|
+
}
|
|
22
|
+
export declare class OpraKafkaModule {
|
|
23
|
+
/**
|
|
24
|
+
*
|
|
25
|
+
* @param options
|
|
26
|
+
*/
|
|
27
|
+
static forRoot(options: OpraKafkaModule.ModuleOptions): DynamicModule;
|
|
28
|
+
/**
|
|
29
|
+
*
|
|
30
|
+
* @param options
|
|
31
|
+
*/
|
|
32
|
+
static forRootAsync(options: OpraKafkaModule.AsyncModuleOptions): DynamicModule;
|
|
33
|
+
}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var OpraHttpCoreModule_1;
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.OpraHttpCoreModule = void 0;
|
|
5
|
-
const tslib_1 = require("tslib");
|
|
6
|
-
const common_1 = require("@nestjs/common");
|
|
7
|
-
const core_1 = require("@nestjs/core");
|
|
8
|
-
const common_2 = require("@opra/common");
|
|
9
|
-
const ts_gems_1 = require("ts-gems");
|
|
10
|
-
const constants_js_1 = require("./constants.js");
|
|
11
|
-
const opra_nestjs_adapter_js_1 = require("./opra-nestjs-adapter.js");
|
|
12
|
-
const opra_exception_filter_js_1 = require("./services/opra-exception-filter.js");
|
|
13
|
-
const opra_middleware_js_1 = require("./services/opra-middleware.js");
|
|
14
|
-
let OpraHttpCoreModule = OpraHttpCoreModule_1 = class OpraHttpCoreModule {
|
|
15
|
-
constructor(opraAdapter) {
|
|
16
|
-
this.opraAdapter = opraAdapter;
|
|
17
|
-
}
|
|
18
|
-
configure(consumer) {
|
|
19
|
-
consumer.apply(opra_middleware_js_1.OpraMiddleware).forRoutes({
|
|
20
|
-
path: '*',
|
|
21
|
-
method: common_1.RequestMethod.ALL,
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
static forRoot(init, options) {
|
|
25
|
-
const opraAdapter = new opra_nestjs_adapter_js_1.OpraNestAdapter(init, options);
|
|
26
|
-
const token = init?.id || opra_nestjs_adapter_js_1.OpraNestAdapter;
|
|
27
|
-
const providers = [
|
|
28
|
-
...(init?.providers || []),
|
|
29
|
-
{
|
|
30
|
-
provide: constants_js_1.OPRA_HTTP_MODULE_OPTIONS,
|
|
31
|
-
useValue: { ...options },
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
provide: opra_nestjs_adapter_js_1.OpraNestAdapter,
|
|
35
|
-
inject: [core_1.ModuleRef],
|
|
36
|
-
useFactory: async (moduleRef) => {
|
|
37
|
-
(0, ts_gems_1.asMutable)(opraAdapter).document = await common_2.ApiDocumentFactory.createDocument({
|
|
38
|
-
...init,
|
|
39
|
-
api: { transport: 'http', name: init.name, controllers: init.controllers },
|
|
40
|
-
});
|
|
41
|
-
opraAdapter.interceptors.map(x => {
|
|
42
|
-
if ((0, common_2.isConstructor)(x)) {
|
|
43
|
-
return (ctx, next) => {
|
|
44
|
-
const interceptor = moduleRef.get(x);
|
|
45
|
-
if (typeof interceptor.intercept === 'function')
|
|
46
|
-
return interceptor.intercept(ctx, next());
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
return x;
|
|
50
|
-
});
|
|
51
|
-
return opraAdapter;
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
provide: core_1.APP_FILTER,
|
|
56
|
-
useClass: opra_exception_filter_js_1.OpraExceptionFilter,
|
|
57
|
-
},
|
|
58
|
-
];
|
|
59
|
-
if (token !== opra_nestjs_adapter_js_1.OpraNestAdapter) {
|
|
60
|
-
providers.push({
|
|
61
|
-
provide: token,
|
|
62
|
-
useValue: opraAdapter,
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
return {
|
|
66
|
-
module: OpraHttpCoreModule_1,
|
|
67
|
-
controllers: opraAdapter.nestControllers,
|
|
68
|
-
imports: [...(init?.imports || [])],
|
|
69
|
-
exports: [...(init?.exports || []), token],
|
|
70
|
-
providers,
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
async onModuleDestroy() {
|
|
74
|
-
await this.opraAdapter.close();
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
exports.OpraHttpCoreModule = OpraHttpCoreModule;
|
|
78
|
-
exports.OpraHttpCoreModule = OpraHttpCoreModule = OpraHttpCoreModule_1 = tslib_1.__decorate([
|
|
79
|
-
(0, common_1.Module)({}),
|
|
80
|
-
(0, common_1.Global)(),
|
|
81
|
-
tslib_1.__metadata("design:paramtypes", [opra_nestjs_adapter_js_1.OpraNestAdapter])
|
|
82
|
-
], OpraHttpCoreModule);
|