@kiyasov/platform-hono 1.0.6 → 1.0.8
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/.yarn/install-state.gz +0 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/src/adapters/hono-adapter.d.ts +11 -11
- package/dist/cjs/src/adapters/hono-adapter.js +24 -24
- package/dist/cjs/src/adapters/hono-adapter.js.map +1 -1
- package/dist/cjs/src/drivers/constants/apollo.constants.d.ts +1 -0
- package/dist/cjs/src/drivers/constants/apollo.constants.js +5 -0
- package/dist/cjs/src/drivers/constants/apollo.constants.js.map +1 -0
- package/dist/cjs/src/drivers/constants/index.d.ts +1 -0
- package/dist/cjs/src/drivers/constants/index.js +18 -0
- package/dist/cjs/src/drivers/constants/index.js.map +1 -0
- package/dist/cjs/src/drivers/graphql.driver.d.ts +7 -3
- package/dist/cjs/src/drivers/graphql.driver.js +32 -12
- package/dist/cjs/src/drivers/graphql.driver.js.map +1 -1
- package/dist/cjs/src/drivers/services/plugins-explorer.service.d.ts +9 -0
- package/dist/cjs/src/drivers/services/plugins-explorer.service.js +25 -0
- package/dist/cjs/src/drivers/services/plugins-explorer.service.js.map +1 -0
- package/dist/cjs/src/multer/crypto/index.d.ts +2 -0
- package/dist/cjs/src/multer/crypto/index.js +7 -0
- package/dist/cjs/src/multer/crypto/index.js.map +1 -0
- package/dist/cjs/src/multer/decorators/index.d.ts +2 -0
- package/dist/cjs/src/multer/decorators/index.js +19 -0
- package/dist/cjs/src/multer/decorators/index.js.map +1 -0
- package/dist/cjs/src/multer/decorators/uploaded-file-decorator.d.ts +1 -0
- package/dist/cjs/src/multer/decorators/uploaded-file-decorator.js +10 -0
- package/dist/cjs/src/multer/decorators/uploaded-file-decorator.js.map +1 -0
- package/dist/cjs/src/multer/decorators/uploaded-files-decorator.d.ts +1 -0
- package/dist/cjs/src/multer/decorators/uploaded-files-decorator.js +10 -0
- package/dist/cjs/src/multer/decorators/uploaded-files-decorator.js.map +1 -0
- package/dist/cjs/src/multer/fs/index.d.ts +2 -0
- package/dist/cjs/src/multer/fs/index.js +23 -0
- package/dist/cjs/src/multer/fs/index.js.map +1 -0
- package/dist/cjs/src/multer/index.d.ts +4 -0
- package/dist/cjs/src/multer/index.js +21 -0
- package/dist/cjs/src/multer/index.js.map +1 -0
- package/dist/cjs/src/multer/interceptors/any-files-interceptor.d.ts +3 -0
- package/dist/cjs/src/multer/interceptors/any-files-interceptor.js +27 -0
- package/dist/cjs/src/multer/interceptors/any-files-interceptor.js.map +1 -0
- package/dist/cjs/src/multer/interceptors/file-fields-interceptor.d.ts +4 -0
- package/dist/cjs/src/multer/interceptors/file-fields-interceptor.js +28 -0
- package/dist/cjs/src/multer/interceptors/file-fields-interceptor.js.map +1 -0
- package/dist/cjs/src/multer/interceptors/file-interceptor.d.ts +3 -0
- package/dist/cjs/src/multer/interceptors/file-interceptor.js +27 -0
- package/dist/cjs/src/multer/interceptors/file-interceptor.js.map +1 -0
- package/dist/cjs/src/multer/interceptors/files-interceptor.d.ts +3 -0
- package/dist/cjs/src/multer/interceptors/files-interceptor.js +27 -0
- package/dist/cjs/src/multer/interceptors/files-interceptor.js.map +1 -0
- package/dist/cjs/src/multer/interceptors/index.d.ts +4 -0
- package/dist/cjs/src/multer/interceptors/index.js +21 -0
- package/dist/cjs/src/multer/interceptors/index.js.map +1 -0
- package/dist/cjs/src/multer/multipart/exceptions.d.ts +1 -0
- package/dist/cjs/src/multer/multipart/exceptions.js +22 -0
- package/dist/cjs/src/multer/multipart/exceptions.js.map +1 -0
- package/dist/cjs/src/multer/multipart/file.d.ts +10 -0
- package/dist/cjs/src/multer/multipart/file.js +10 -0
- package/dist/cjs/src/multer/multipart/file.js.map +1 -0
- package/dist/cjs/src/multer/multipart/filter.d.ts +6 -0
- package/dist/cjs/src/multer/multipart/filter.js +22 -0
- package/dist/cjs/src/multer/multipart/filter.js.map +1 -0
- package/dist/cjs/src/multer/multipart/handlers/any-files.d.ts +8 -0
- package/dist/cjs/src/multer/multipart/handlers/any-files.js +33 -0
- package/dist/cjs/src/multer/multipart/handlers/any-files.js.map +1 -0
- package/dist/cjs/src/multer/multipart/handlers/file-fields.d.ts +14 -0
- package/dist/cjs/src/multer/multipart/handlers/file-fields.js +57 -0
- package/dist/cjs/src/multer/multipart/handlers/file-fields.js.map +1 -0
- package/dist/cjs/src/multer/multipart/handlers/index.d.ts +1 -0
- package/dist/cjs/src/multer/multipart/handlers/index.js +3 -0
- package/dist/cjs/src/multer/multipart/handlers/index.js.map +1 -0
- package/dist/cjs/src/multer/multipart/handlers/multiple-files.d.ts +8 -0
- package/dist/cjs/src/multer/multipart/handlers/multiple-files.js +40 -0
- package/dist/cjs/src/multer/multipart/handlers/multiple-files.js.map +1 -0
- package/dist/cjs/src/multer/multipart/handlers/single-file.d.ts +8 -0
- package/dist/cjs/src/multer/multipart/handlers/single-file.js +45 -0
- package/dist/cjs/src/multer/multipart/handlers/single-file.js.map +1 -0
- package/dist/cjs/src/multer/multipart/index.d.ts +3 -0
- package/dist/cjs/src/multer/multipart/index.js +19 -0
- package/dist/cjs/src/multer/multipart/index.js.map +1 -0
- package/dist/cjs/src/multer/multipart/options.d.ts +22 -0
- package/dist/cjs/src/multer/multipart/options.js +23 -0
- package/dist/cjs/src/multer/multipart/options.js.map +1 -0
- package/dist/cjs/src/multer/multipart/request.d.ts +16 -0
- package/dist/cjs/src/multer/multipart/request.js +25 -0
- package/dist/cjs/src/multer/multipart/request.js.map +1 -0
- package/dist/cjs/src/multer/storage/disk-storage.d.ts +31 -0
- package/dist/cjs/src/multer/storage/disk-storage.js +62 -0
- package/dist/cjs/src/multer/storage/disk-storage.js.map +1 -0
- package/dist/cjs/src/multer/storage/index.d.ts +3 -0
- package/dist/cjs/src/multer/storage/index.js +20 -0
- package/dist/cjs/src/multer/storage/index.js.map +1 -0
- package/dist/cjs/src/multer/storage/memory-storage.d.ts +17 -0
- package/dist/cjs/src/multer/storage/memory-storage.js +21 -0
- package/dist/cjs/src/multer/storage/memory-storage.js.map +1 -0
- package/dist/cjs/src/multer/storage/storage.d.ts +13 -0
- package/dist/cjs/src/multer/storage/storage.js +3 -0
- package/dist/cjs/src/multer/storage/storage.js.map +1 -0
- package/dist/cjs/src/multer/stream/index.d.ts +3 -0
- package/dist/cjs/src/multer/stream/index.js +7 -0
- package/dist/cjs/src/multer/stream/index.js.map +1 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/src/adapters/hono-adapter.d.ts +11 -11
- package/dist/esm/src/adapters/hono-adapter.js +35 -35
- package/dist/esm/src/adapters/hono-adapter.js.map +1 -1
- package/dist/esm/src/drivers/constants/apollo.constants.d.ts +1 -0
- package/dist/esm/src/drivers/constants/apollo.constants.js +2 -0
- package/dist/esm/src/drivers/constants/apollo.constants.js.map +1 -0
- package/dist/esm/src/drivers/constants/index.d.ts +1 -0
- package/dist/esm/src/drivers/constants/index.js +2 -0
- package/dist/esm/src/drivers/constants/index.js.map +1 -0
- package/dist/esm/src/drivers/graphql.driver.d.ts +7 -3
- package/dist/esm/src/drivers/graphql.driver.js +36 -16
- package/dist/esm/src/drivers/graphql.driver.js.map +1 -1
- package/dist/esm/src/drivers/services/plugins-explorer.service.d.ts +9 -0
- package/dist/esm/src/drivers/services/plugins-explorer.service.js +21 -0
- package/dist/esm/src/drivers/services/plugins-explorer.service.js.map +1 -0
- package/dist/esm/src/multer/crypto/index.d.ts +2 -0
- package/dist/esm/src/multer/crypto/index.js +4 -0
- package/dist/esm/src/multer/crypto/index.js.map +1 -0
- package/dist/esm/src/multer/decorators/index.d.ts +2 -0
- package/dist/esm/src/multer/decorators/index.js +3 -0
- package/dist/esm/src/multer/decorators/index.js.map +1 -0
- package/dist/esm/src/multer/decorators/uploaded-file-decorator.d.ts +1 -0
- package/dist/esm/src/multer/decorators/uploaded-file-decorator.js +7 -0
- package/dist/esm/src/multer/decorators/uploaded-file-decorator.js.map +1 -0
- package/dist/esm/src/multer/decorators/uploaded-files-decorator.d.ts +1 -0
- package/dist/esm/src/multer/decorators/uploaded-files-decorator.js +7 -0
- package/dist/esm/src/multer/decorators/uploaded-files-decorator.js.map +1 -0
- package/dist/esm/src/multer/fs/index.d.ts +2 -0
- package/dist/esm/src/multer/fs/index.js +18 -0
- package/dist/esm/src/multer/fs/index.js.map +1 -0
- package/dist/esm/src/multer/index.d.ts +4 -0
- package/dist/esm/src/multer/index.js +5 -0
- package/dist/esm/src/multer/index.js.map +1 -0
- package/dist/esm/src/multer/interceptors/any-files-interceptor.d.ts +3 -0
- package/dist/esm/src/multer/interceptors/any-files-interceptor.js +23 -0
- package/dist/esm/src/multer/interceptors/any-files-interceptor.js.map +1 -0
- package/dist/esm/src/multer/interceptors/file-fields-interceptor.d.ts +4 -0
- package/dist/esm/src/multer/interceptors/file-fields-interceptor.js +24 -0
- package/dist/esm/src/multer/interceptors/file-fields-interceptor.js.map +1 -0
- package/dist/esm/src/multer/interceptors/file-interceptor.d.ts +3 -0
- package/dist/esm/src/multer/interceptors/file-interceptor.js +23 -0
- package/dist/esm/src/multer/interceptors/file-interceptor.js.map +1 -0
- package/dist/esm/src/multer/interceptors/files-interceptor.d.ts +3 -0
- package/dist/esm/src/multer/interceptors/files-interceptor.js +23 -0
- package/dist/esm/src/multer/interceptors/files-interceptor.js.map +1 -0
- package/dist/esm/src/multer/interceptors/index.d.ts +4 -0
- package/dist/esm/src/multer/interceptors/index.js +5 -0
- package/dist/esm/src/multer/interceptors/index.js.map +1 -0
- package/dist/esm/src/multer/multipart/exceptions.d.ts +1 -0
- package/dist/esm/src/multer/multipart/exceptions.js +18 -0
- package/dist/esm/src/multer/multipart/exceptions.js.map +1 -0
- package/dist/esm/src/multer/multipart/file.d.ts +10 -0
- package/dist/esm/src/multer/multipart/file.js +6 -0
- package/dist/esm/src/multer/multipart/file.js.map +1 -0
- package/dist/esm/src/multer/multipart/filter.d.ts +6 -0
- package/dist/esm/src/multer/multipart/filter.js +18 -0
- package/dist/esm/src/multer/multipart/filter.js.map +1 -0
- package/dist/esm/src/multer/multipart/handlers/any-files.d.ts +8 -0
- package/dist/esm/src/multer/multipart/handlers/any-files.js +29 -0
- package/dist/esm/src/multer/multipart/handlers/any-files.js.map +1 -0
- package/dist/esm/src/multer/multipart/handlers/file-fields.d.ts +14 -0
- package/dist/esm/src/multer/multipart/handlers/file-fields.js +52 -0
- package/dist/esm/src/multer/multipart/handlers/file-fields.js.map +1 -0
- package/dist/esm/src/multer/multipart/handlers/index.d.ts +1 -0
- package/dist/esm/src/multer/multipart/handlers/index.js +2 -0
- package/dist/esm/src/multer/multipart/handlers/index.js.map +1 -0
- package/dist/esm/src/multer/multipart/handlers/multiple-files.d.ts +8 -0
- package/dist/esm/src/multer/multipart/handlers/multiple-files.js +36 -0
- package/dist/esm/src/multer/multipart/handlers/multiple-files.js.map +1 -0
- package/dist/esm/src/multer/multipart/handlers/single-file.d.ts +8 -0
- package/dist/esm/src/multer/multipart/handlers/single-file.js +41 -0
- package/dist/esm/src/multer/multipart/handlers/single-file.js.map +1 -0
- package/dist/esm/src/multer/multipart/index.d.ts +3 -0
- package/dist/esm/src/multer/multipart/index.js +3 -0
- package/dist/esm/src/multer/multipart/index.js.map +1 -0
- package/dist/esm/src/multer/multipart/options.d.ts +22 -0
- package/dist/esm/src/multer/multipart/options.js +19 -0
- package/dist/esm/src/multer/multipart/options.js.map +1 -0
- package/dist/esm/src/multer/multipart/request.d.ts +16 -0
- package/dist/esm/src/multer/multipart/request.js +20 -0
- package/dist/esm/src/multer/multipart/request.js.map +1 -0
- package/dist/esm/src/multer/storage/disk-storage.d.ts +31 -0
- package/dist/esm/src/multer/storage/disk-storage.js +58 -0
- package/dist/esm/src/multer/storage/disk-storage.js.map +1 -0
- package/dist/esm/src/multer/storage/index.d.ts +3 -0
- package/dist/esm/src/multer/storage/index.js +4 -0
- package/dist/esm/src/multer/storage/index.js.map +1 -0
- package/dist/esm/src/multer/storage/memory-storage.d.ts +17 -0
- package/dist/esm/src/multer/storage/memory-storage.js +17 -0
- package/dist/esm/src/multer/storage/memory-storage.js.map +1 -0
- package/dist/esm/src/multer/storage/storage.d.ts +13 -0
- package/dist/esm/src/multer/storage/storage.js +2 -0
- package/dist/esm/src/multer/storage/storage.js.map +1 -0
- package/dist/esm/src/multer/stream/index.d.ts +3 -0
- package/dist/esm/src/multer/stream/index.js +4 -0
- package/dist/esm/src/multer/stream/index.js.map +1 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
- package/index.ts +1 -0
- package/package.json +3 -1
- package/src/adapters/hono-adapter.ts +51 -50
- package/src/drivers/constants/apollo.constants.ts +1 -0
- package/src/drivers/constants/index.ts +1 -0
- package/src/drivers/graphql.driver.ts +52 -21
- package/src/drivers/services/plugins-explorer.service.ts +27 -0
- package/src/multer/crypto/index.ts +4 -0
- package/src/multer/decorators/index.ts +2 -0
- package/src/multer/decorators/uploaded-file-decorator.ts +12 -0
- package/src/multer/decorators/uploaded-files-decorator.ts +15 -0
- package/src/multer/fs/index.ts +22 -0
- package/src/multer/index.ts +4 -0
- package/src/multer/interceptors/any-files-interceptor.ts +46 -0
- package/src/multer/interceptors/file-fields-interceptor.ts +56 -0
- package/src/multer/interceptors/file-interceptor.ts +48 -0
- package/src/multer/interceptors/files-interceptor.ts +50 -0
- package/src/multer/interceptors/index.ts +4 -0
- package/src/multer/multipart/exceptions.ts +25 -0
- package/src/multer/multipart/file.ts +18 -0
- package/src/multer/multipart/filter.ts +38 -0
- package/src/multer/multipart/handlers/any-files.ts +39 -0
- package/src/multer/multipart/handlers/file-fields.ts +89 -0
- package/src/multer/multipart/handlers/index.ts +1 -0
- package/src/multer/multipart/handlers/multiple-files.ts +55 -0
- package/src/multer/multipart/handlers/single-file.ts +56 -0
- package/src/multer/multipart/index.ts +3 -0
- package/src/multer/multipart/options.ts +29 -0
- package/src/multer/multipart/request.ts +44 -0
- package/src/multer/storage/disk-storage.ts +107 -0
- package/src/multer/storage/index.ts +3 -0
- package/src/multer/storage/memory-storage.ts +25 -0
- package/src/multer/storage/storage.ts +15 -0
- package/src/multer/stream/index.ts +4 -0
package/index.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kiyasov/platform-hono",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"description": "Nest adapter for Hono",
|
|
5
5
|
"author": "Islam Kiiasov",
|
|
6
6
|
"license": "MIT",
|
|
@@ -29,6 +29,8 @@
|
|
|
29
29
|
"@nestjs/graphql": "^12.1.1",
|
|
30
30
|
"@swc/cli": "^0.3.12",
|
|
31
31
|
"@swc/core": "^1.5.24",
|
|
32
|
+
"@types/busboy": "^1.5.4",
|
|
33
|
+
"graphql-subscriptions": "^2.0.0",
|
|
32
34
|
"reflect-metadata": "^0.2.2",
|
|
33
35
|
"rxjs": "^7.8.1",
|
|
34
36
|
"tsc": "^2.0.4",
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import { Server } from
|
|
2
|
-
import { HttpBindings, createAdaptorServer } from
|
|
3
|
-
import { RESPONSE_ALREADY_SENT } from
|
|
4
|
-
import { RequestMethod } from
|
|
5
|
-
import { HttpStatus, Logger } from
|
|
6
|
-
import { bodyLimit } from
|
|
1
|
+
import { Server } from 'node:net';
|
|
2
|
+
import { HttpBindings, createAdaptorServer } from '@hono/node-server';
|
|
3
|
+
import { RESPONSE_ALREADY_SENT } from '@hono/node-server/utils/response';
|
|
4
|
+
import { RequestMethod } from '@nestjs/common';
|
|
5
|
+
import { HttpStatus, Logger } from '@nestjs/common';
|
|
6
|
+
import { bodyLimit } from 'hono/body-limit';
|
|
7
7
|
import {
|
|
8
8
|
ErrorHandler,
|
|
9
9
|
NestApplicationOptions,
|
|
10
10
|
RequestHandler,
|
|
11
|
-
} from
|
|
11
|
+
} from '@nestjs/common/interfaces';
|
|
12
12
|
import {
|
|
13
13
|
ServeStaticOptions,
|
|
14
14
|
serveStatic,
|
|
15
|
-
} from
|
|
16
|
-
import { AbstractHttpAdapter } from
|
|
17
|
-
import { Context, HonoRequest, Next } from
|
|
18
|
-
import { Hono } from
|
|
19
|
-
import { cors } from
|
|
20
|
-
import { RedirectStatusCode, StatusCode } from
|
|
21
|
-
import * as http from
|
|
22
|
-
import { Http2SecureServer, Http2Server } from
|
|
23
|
-
import * as https from
|
|
24
|
-
import { TypeBodyParser } from
|
|
15
|
+
} from '@hono/node-server/serve-static';
|
|
16
|
+
import { AbstractHttpAdapter } from '@nestjs/core/adapters/http-adapter';
|
|
17
|
+
import { Context, HonoRequest, Next } from 'hono';
|
|
18
|
+
import { Hono } from 'hono';
|
|
19
|
+
import { cors } from 'hono/cors';
|
|
20
|
+
import { RedirectStatusCode, StatusCode } from 'hono/utils/http-status';
|
|
21
|
+
import * as http from 'http';
|
|
22
|
+
import { Http2SecureServer, Http2Server } from 'http2';
|
|
23
|
+
import * as https from 'https';
|
|
24
|
+
import { TypeBodyParser } from '../interfaces';
|
|
25
25
|
|
|
26
26
|
type HonoHandler = RequestHandler<HonoRequest, Context>;
|
|
27
27
|
|
|
@@ -43,10 +43,10 @@ export class HonoAdapter extends AbstractHttpAdapter<
|
|
|
43
43
|
|
|
44
44
|
private getRouteAndHandler(
|
|
45
45
|
pathOrHandler: string | HonoHandler,
|
|
46
|
-
handler?: HonoHandler
|
|
46
|
+
handler?: HonoHandler,
|
|
47
47
|
): [string, HonoHandler] {
|
|
48
|
-
let path = typeof pathOrHandler ===
|
|
49
|
-
handler = typeof pathOrHandler ===
|
|
48
|
+
let path = typeof pathOrHandler === 'function' ? '' : pathOrHandler;
|
|
49
|
+
handler = typeof pathOrHandler === 'function' ? pathOrHandler : handler;
|
|
50
50
|
return [path, handler];
|
|
51
51
|
}
|
|
52
52
|
|
|
@@ -58,14 +58,14 @@ export class HonoAdapter extends AbstractHttpAdapter<
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
private send(ctx: Context) {
|
|
61
|
-
const body = ctx.get(
|
|
62
|
-
return typeof body ===
|
|
61
|
+
const body = ctx.get('body');
|
|
62
|
+
return typeof body === 'string' ? ctx.text(body) : ctx.json(body);
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
public get(pathOrHandler: string | HonoHandler, handler?: HonoHandler) {
|
|
66
66
|
const [routePath, routeHandler] = this.getRouteAndHandler(
|
|
67
67
|
pathOrHandler,
|
|
68
|
-
handler
|
|
68
|
+
handler,
|
|
69
69
|
);
|
|
70
70
|
this.instance.get(routePath, this.createRouteHandler(routeHandler));
|
|
71
71
|
}
|
|
@@ -73,7 +73,7 @@ export class HonoAdapter extends AbstractHttpAdapter<
|
|
|
73
73
|
public post(pathOrHandler: string | HonoHandler, handler?: HonoHandler) {
|
|
74
74
|
const [routePath, routeHandler] = this.getRouteAndHandler(
|
|
75
75
|
pathOrHandler,
|
|
76
|
-
handler
|
|
76
|
+
handler,
|
|
77
77
|
);
|
|
78
78
|
this.instance.post(routePath, this.createRouteHandler(routeHandler));
|
|
79
79
|
}
|
|
@@ -81,7 +81,7 @@ export class HonoAdapter extends AbstractHttpAdapter<
|
|
|
81
81
|
public put(pathOrHandler: string | HonoHandler, handler?: HonoHandler) {
|
|
82
82
|
const [routePath, routeHandler] = this.getRouteAndHandler(
|
|
83
83
|
pathOrHandler,
|
|
84
|
-
handler
|
|
84
|
+
handler,
|
|
85
85
|
);
|
|
86
86
|
this.instance.put(routePath, this.createRouteHandler(routeHandler));
|
|
87
87
|
}
|
|
@@ -89,7 +89,7 @@ export class HonoAdapter extends AbstractHttpAdapter<
|
|
|
89
89
|
public delete(pathOrHandler: string | HonoHandler, handler?: HonoHandler) {
|
|
90
90
|
const [routePath, routeHandler] = this.getRouteAndHandler(
|
|
91
91
|
pathOrHandler,
|
|
92
|
-
handler
|
|
92
|
+
handler,
|
|
93
93
|
);
|
|
94
94
|
this.instance.delete(routePath, this.createRouteHandler(routeHandler));
|
|
95
95
|
}
|
|
@@ -97,7 +97,7 @@ export class HonoAdapter extends AbstractHttpAdapter<
|
|
|
97
97
|
public use(pathOrHandler: string | HonoHandler, handler?: HonoHandler) {
|
|
98
98
|
const [routePath, routeHandler] = this.getRouteAndHandler(
|
|
99
99
|
pathOrHandler,
|
|
100
|
-
handler
|
|
100
|
+
handler,
|
|
101
101
|
);
|
|
102
102
|
this.instance.use(routePath, this.createRouteHandler(routeHandler));
|
|
103
103
|
}
|
|
@@ -105,7 +105,7 @@ export class HonoAdapter extends AbstractHttpAdapter<
|
|
|
105
105
|
public patch(pathOrHandler: string | HonoHandler, handler?: HonoHandler) {
|
|
106
106
|
const [routePath, routeHandler] = this.getRouteAndHandler(
|
|
107
107
|
pathOrHandler,
|
|
108
|
-
handler
|
|
108
|
+
handler,
|
|
109
109
|
);
|
|
110
110
|
this.instance.patch(routePath, this.createRouteHandler(routeHandler));
|
|
111
111
|
}
|
|
@@ -113,24 +113,25 @@ export class HonoAdapter extends AbstractHttpAdapter<
|
|
|
113
113
|
public options(pathOrHandler: string | HonoHandler, handler?: HonoHandler) {
|
|
114
114
|
const [routePath, routeHandler] = this.getRouteAndHandler(
|
|
115
115
|
pathOrHandler,
|
|
116
|
-
handler
|
|
116
|
+
handler,
|
|
117
117
|
);
|
|
118
118
|
this.instance.options(routePath, this.createRouteHandler(routeHandler));
|
|
119
119
|
}
|
|
120
120
|
|
|
121
121
|
public async reply(ctx: Context, body: any, statusCode?: StatusCode) {
|
|
122
122
|
if (statusCode) ctx.status(statusCode);
|
|
123
|
-
|
|
123
|
+
|
|
124
|
+
const responseContentType = this.getHeader(ctx, 'Content-Type');
|
|
124
125
|
if (
|
|
125
|
-
!responseContentType?.startsWith(
|
|
126
|
+
!responseContentType?.startsWith('application/json') &&
|
|
126
127
|
body?.statusCode >= HttpStatus.BAD_REQUEST
|
|
127
128
|
) {
|
|
128
129
|
Logger.warn(
|
|
129
|
-
"Content-Type doesn't match Reply body, you might need a custom ExceptionFilter for non-JSON responses"
|
|
130
|
+
"Content-Type doesn't match Reply body, you might need a custom ExceptionFilter for non-JSON responses",
|
|
130
131
|
);
|
|
131
|
-
this.setHeader(ctx,
|
|
132
|
+
this.setHeader(ctx, 'Content-Type', 'application/json');
|
|
132
133
|
}
|
|
133
|
-
ctx.set(
|
|
134
|
+
ctx.set('body', body);
|
|
134
135
|
}
|
|
135
136
|
|
|
136
137
|
public status(ctx: Context, statusCode: StatusCode) {
|
|
@@ -142,7 +143,7 @@ export class HonoAdapter extends AbstractHttpAdapter<
|
|
|
142
143
|
}
|
|
143
144
|
|
|
144
145
|
public render(response: any, view: string, options: any) {
|
|
145
|
-
throw new Error(
|
|
146
|
+
throw new Error('Method not implemented.');
|
|
146
147
|
}
|
|
147
148
|
|
|
148
149
|
public redirect(ctx: Context, statusCode: RedirectStatusCode, url: string) {
|
|
@@ -164,12 +165,12 @@ export class HonoAdapter extends AbstractHttpAdapter<
|
|
|
164
165
|
}
|
|
165
166
|
|
|
166
167
|
public useStaticAssets(path: string, options: ServeStaticOptions) {
|
|
167
|
-
Logger.log(
|
|
168
|
+
Logger.log('Registering static assets middleware');
|
|
168
169
|
this.instance.use(path, serveStatic(options));
|
|
169
170
|
}
|
|
170
171
|
|
|
171
172
|
public setViewEngine(options: any | string) {
|
|
172
|
-
throw new Error(
|
|
173
|
+
throw new Error('Method not implemented.');
|
|
173
174
|
}
|
|
174
175
|
|
|
175
176
|
public isHeadersSent(ctx: Context): boolean {
|
|
@@ -205,16 +206,16 @@ export class HonoAdapter extends AbstractHttpAdapter<
|
|
|
205
206
|
}
|
|
206
207
|
|
|
207
208
|
public useBodyParser(type: TypeBodyParser, bodyLimit: number = 1e6) {
|
|
208
|
-
Logger.log(
|
|
209
|
+
Logger.log('Registering body parser middleware');
|
|
209
210
|
this.instance.use(this.bodyLimit(bodyLimit), async (ctx, next) => {
|
|
210
|
-
const contentType = ctx.req.header(
|
|
211
|
+
const contentType = ctx.req.header('content-type');
|
|
211
212
|
switch (type) {
|
|
212
|
-
case
|
|
213
|
-
if (contentType ===
|
|
213
|
+
case 'application/json':
|
|
214
|
+
if (contentType === 'application/json')
|
|
214
215
|
(ctx.req as any).body = await ctx.req.json();
|
|
215
216
|
break;
|
|
216
|
-
case
|
|
217
|
-
if (contentType ===
|
|
217
|
+
case 'text/plain':
|
|
218
|
+
if (contentType === 'text/plain') {
|
|
218
219
|
(ctx.req as any).rawBody = Buffer.from(await ctx.req.text());
|
|
219
220
|
(ctx.req as any).body = await ctx.req.json();
|
|
220
221
|
}
|
|
@@ -244,14 +245,14 @@ export class HonoAdapter extends AbstractHttpAdapter<
|
|
|
244
245
|
}
|
|
245
246
|
|
|
246
247
|
public getType(): string {
|
|
247
|
-
return
|
|
248
|
+
return 'hono';
|
|
248
249
|
}
|
|
249
250
|
|
|
250
251
|
public registerParserMiddleware(prefix?: string, rawBody?: boolean) {
|
|
251
|
-
Logger.log(
|
|
252
|
-
this.useBodyParser(
|
|
253
|
-
this.useBodyParser(
|
|
254
|
-
this.useBodyParser(
|
|
252
|
+
Logger.log('Registering parser middleware');
|
|
253
|
+
this.useBodyParser('application/x-www-form-urlencoded');
|
|
254
|
+
this.useBodyParser('application/json');
|
|
255
|
+
this.useBodyParser('text/plain');
|
|
255
256
|
}
|
|
256
257
|
|
|
257
258
|
public async createMiddlewareFactory(requestMethod: RequestMethod) {
|
|
@@ -275,7 +276,7 @@ export class HonoAdapter extends AbstractHttpAdapter<
|
|
|
275
276
|
}
|
|
276
277
|
|
|
277
278
|
public applyVersionFilter(): () => () => any {
|
|
278
|
-
throw new Error(
|
|
279
|
+
throw new Error('Versioning not yet supported in Hono');
|
|
279
280
|
}
|
|
280
281
|
|
|
281
282
|
public listen(port: string | number, ...args: any[]): ServerType {
|
|
@@ -286,7 +287,7 @@ export class HonoAdapter extends AbstractHttpAdapter<
|
|
|
286
287
|
return bodyLimit({
|
|
287
288
|
maxSize,
|
|
288
289
|
onError: () => {
|
|
289
|
-
throw new Error(
|
|
290
|
+
throw new Error('Body too large');
|
|
290
291
|
},
|
|
291
292
|
});
|
|
292
293
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const PLUGIN_METADATA = 'graphql:plugin';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './apollo.constants';
|
|
@@ -1,15 +1,29 @@
|
|
|
1
|
-
import { ApolloServer, BaseContext, HeaderMap } from
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import {
|
|
1
|
+
import { ApolloServer, BaseContext, HeaderMap } from '@apollo/server';
|
|
2
|
+
import {
|
|
3
|
+
AbstractGraphQLDriver,
|
|
4
|
+
GqlSubscriptionService,
|
|
5
|
+
SubscriptionConfig,
|
|
6
|
+
} from '@nestjs/graphql';
|
|
7
|
+
import { ApolloServerPluginDrainHttpServer } from '@apollo/server/plugin/drainHttpServer';
|
|
8
|
+
import { ApolloDriverConfig } from '@nestjs/apollo';
|
|
9
|
+
import { Context, HonoRequest } from 'hono';
|
|
10
|
+
import { StatusCode } from 'hono/utils/http-status';
|
|
11
|
+
import { Logger } from '@nestjs/common';
|
|
12
|
+
|
|
13
|
+
import { PluginsExplorerService } from './services/plugins-explorer.service';
|
|
14
|
+
import { ModulesContainer } from '@nestjs/core';
|
|
8
15
|
|
|
9
16
|
export class HonoGraphQLDriver<
|
|
10
|
-
T extends Record<string, any> = ApolloDriverConfig
|
|
17
|
+
T extends Record<string, any> = ApolloDriverConfig,
|
|
11
18
|
> extends AbstractGraphQLDriver {
|
|
12
19
|
protected apolloServer: ApolloServer<BaseContext>;
|
|
20
|
+
private _subscriptionService?: GqlSubscriptionService;
|
|
21
|
+
private readonly pluginsExplorerService: PluginsExplorerService;
|
|
22
|
+
|
|
23
|
+
constructor(modulesContainer: ModulesContainer) {
|
|
24
|
+
super();
|
|
25
|
+
this.pluginsExplorerService = new PluginsExplorerService(modulesContainer);
|
|
26
|
+
}
|
|
13
27
|
|
|
14
28
|
get instance(): ApolloServer<BaseContext> {
|
|
15
29
|
return this.apolloServer;
|
|
@@ -19,16 +33,30 @@ export class HonoGraphQLDriver<
|
|
|
19
33
|
const { httpAdapter } = this.httpAdapterHost;
|
|
20
34
|
const platformName = httpAdapter.getType();
|
|
21
35
|
|
|
22
|
-
if (platformName !==
|
|
23
|
-
throw new Error(
|
|
36
|
+
if (platformName !== 'hono') {
|
|
37
|
+
throw new Error('This driver is only compatible with the Hono platform');
|
|
24
38
|
}
|
|
25
39
|
|
|
26
|
-
|
|
40
|
+
await this.registerHono(options);
|
|
41
|
+
|
|
42
|
+
if (options.installSubscriptionHandlers || options.subscriptions) {
|
|
43
|
+
const subscriptionsOptions: SubscriptionConfig =
|
|
44
|
+
options.subscriptions || { 'subscriptions-transport-ws': {} };
|
|
45
|
+
this._subscriptionService = new GqlSubscriptionService(
|
|
46
|
+
{
|
|
47
|
+
schema: options.schema,
|
|
48
|
+
path: options.path,
|
|
49
|
+
context: options.context,
|
|
50
|
+
...subscriptionsOptions,
|
|
51
|
+
},
|
|
52
|
+
this.httpAdapterHost.httpAdapter?.getHttpServer(),
|
|
53
|
+
);
|
|
54
|
+
}
|
|
27
55
|
}
|
|
28
56
|
|
|
29
57
|
protected async registerHono(
|
|
30
58
|
options: T,
|
|
31
|
-
{ preStartHook }: { preStartHook?: () => void } = {}
|
|
59
|
+
{ preStartHook }: { preStartHook?: () => void } = {},
|
|
32
60
|
) {
|
|
33
61
|
const { path, typeDefs, resolvers, schema } = options;
|
|
34
62
|
const { httpAdapter } = this.httpAdapterHost;
|
|
@@ -65,7 +93,9 @@ export class HonoGraphQLDriver<
|
|
|
65
93
|
},
|
|
66
94
|
context: () =>
|
|
67
95
|
contextFunction(ctx, {
|
|
68
|
-
|
|
96
|
+
method: ctx.req.method,
|
|
97
|
+
url: ctx.req.url,
|
|
98
|
+
body: ctx.req.raw.body,
|
|
69
99
|
headers: Object.fromEntries(ctx.req.raw.headers),
|
|
70
100
|
}),
|
|
71
101
|
});
|
|
@@ -78,7 +108,7 @@ export class HonoGraphQLDriver<
|
|
|
78
108
|
|
|
79
109
|
ctx.status(status === undefined ? 200 : (status as StatusCode));
|
|
80
110
|
|
|
81
|
-
if (body.kind ===
|
|
111
|
+
if (body.kind === 'complete') {
|
|
82
112
|
return ctx.body(body.string);
|
|
83
113
|
}
|
|
84
114
|
|
|
@@ -92,15 +122,16 @@ export class HonoGraphQLDriver<
|
|
|
92
122
|
});
|
|
93
123
|
|
|
94
124
|
return new Response(readableStream, {
|
|
95
|
-
headers: {
|
|
125
|
+
headers: { 'Content-Type': 'application/octet-stream' },
|
|
96
126
|
});
|
|
97
127
|
});
|
|
98
128
|
|
|
99
129
|
this.apolloServer = server;
|
|
100
130
|
}
|
|
101
131
|
|
|
102
|
-
public stop() {
|
|
103
|
-
|
|
132
|
+
public async stop() {
|
|
133
|
+
await this._subscriptionService?.stop();
|
|
134
|
+
await this.apolloServer?.stop();
|
|
104
135
|
}
|
|
105
136
|
|
|
106
137
|
private httpHeadersToMap(headers: Headers) {
|
|
@@ -110,12 +141,12 @@ export class HonoGraphQLDriver<
|
|
|
110
141
|
}
|
|
111
142
|
|
|
112
143
|
private async parseBody(req: HonoRequest): Promise<Record<string, unknown>> {
|
|
113
|
-
const contentType = req.header(
|
|
114
|
-
if (contentType ===
|
|
144
|
+
const contentType = req.header('content-type');
|
|
145
|
+
if (contentType === 'application/graphql')
|
|
115
146
|
return { query: await req.text() };
|
|
116
|
-
if (contentType ===
|
|
147
|
+
if (contentType === 'application/json')
|
|
117
148
|
return req.json().catch(this.logError);
|
|
118
|
-
if (contentType ===
|
|
149
|
+
if (contentType === 'application/x-www-form-urlencoded')
|
|
119
150
|
return this.parseFormURL(req);
|
|
120
151
|
return {};
|
|
121
152
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';
|
|
2
|
+
import { ModulesContainer } from '@nestjs/core/injector/modules-container';
|
|
3
|
+
import { BaseExplorerService, GqlModuleOptions } from '@nestjs/graphql';
|
|
4
|
+
import { PLUGIN_METADATA } from '../constants';
|
|
5
|
+
|
|
6
|
+
export class PluginsExplorerService extends BaseExplorerService {
|
|
7
|
+
constructor(private readonly modulesContainer: ModulesContainer) {
|
|
8
|
+
super();
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
explore(options: GqlModuleOptions) {
|
|
12
|
+
const modules = this.getModules(
|
|
13
|
+
this.modulesContainer,
|
|
14
|
+
options.include || [],
|
|
15
|
+
);
|
|
16
|
+
return this.flatMap(modules, (instance) => this.filterPlugins(instance));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
filterPlugins<T = any>(wrapper: InstanceWrapper<T>) {
|
|
20
|
+
const { instance } = wrapper;
|
|
21
|
+
if (!instance) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
const metadata = Reflect.getMetadata(PLUGIN_METADATA, instance.constructor);
|
|
25
|
+
return metadata ? instance : undefined;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
|
|
2
|
+
|
|
3
|
+
import { getMultipartRequest } from '../multipart/request';
|
|
4
|
+
import { StorageFile } from '../storage/storage';
|
|
5
|
+
|
|
6
|
+
export const UploadedFile = createParamDecorator(
|
|
7
|
+
async (_data, ctx: ExecutionContext): Promise<StorageFile | undefined> => {
|
|
8
|
+
const req = getMultipartRequest(ctx.switchToHttp());
|
|
9
|
+
|
|
10
|
+
return req?.storageFile;
|
|
11
|
+
},
|
|
12
|
+
);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
|
|
2
|
+
|
|
3
|
+
import { getMultipartRequest } from '../multipart/request';
|
|
4
|
+
import { StorageFile } from '../storage/storage';
|
|
5
|
+
|
|
6
|
+
export const UploadedFiles = createParamDecorator(
|
|
7
|
+
async (
|
|
8
|
+
_data: any,
|
|
9
|
+
ctx: ExecutionContext,
|
|
10
|
+
): Promise<Record<string, StorageFile[]> | StorageFile[] | undefined> => {
|
|
11
|
+
const req = getMultipartRequest(ctx.switchToHttp());
|
|
12
|
+
|
|
13
|
+
return req?.storageFiles;
|
|
14
|
+
},
|
|
15
|
+
);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import { extname } from 'node:path';
|
|
3
|
+
|
|
4
|
+
import { randomBytes } from '../crypto';
|
|
5
|
+
|
|
6
|
+
export const pathExists = async (path: string) => {
|
|
7
|
+
try {
|
|
8
|
+
await fs.stat(path);
|
|
9
|
+
} catch (err) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
return true;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export const getUniqueFilename = async (filename: string) => {
|
|
17
|
+
const buffer = await randomBytes(16);
|
|
18
|
+
|
|
19
|
+
const ext = extname(filename);
|
|
20
|
+
|
|
21
|
+
return buffer.toString('hex') + ext;
|
|
22
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Observable, tap } from 'rxjs';
|
|
2
|
+
import {
|
|
3
|
+
CallHandler,
|
|
4
|
+
ExecutionContext,
|
|
5
|
+
mixin,
|
|
6
|
+
NestInterceptor,
|
|
7
|
+
Type,
|
|
8
|
+
} from '@nestjs/common';
|
|
9
|
+
|
|
10
|
+
import { getMultipartRequest } from '../multipart/request';
|
|
11
|
+
import { transformUploadOptions, UploadOptions } from '../multipart/options';
|
|
12
|
+
import { handleMultipartAnyFiles } from '../multipart/handlers/any-files';
|
|
13
|
+
|
|
14
|
+
export function AnyFilesInterceptor(
|
|
15
|
+
options?: UploadOptions,
|
|
16
|
+
): Type<NestInterceptor> {
|
|
17
|
+
class MixinInterceptor implements NestInterceptor {
|
|
18
|
+
private readonly options: UploadOptions;
|
|
19
|
+
|
|
20
|
+
constructor() {
|
|
21
|
+
this.options = transformUploadOptions(options);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async intercept(
|
|
25
|
+
context: ExecutionContext,
|
|
26
|
+
next: CallHandler,
|
|
27
|
+
): Promise<Observable<any>> {
|
|
28
|
+
const ctx = context.switchToHttp();
|
|
29
|
+
const req = getMultipartRequest(ctx);
|
|
30
|
+
|
|
31
|
+
const { body, files, remove } = await handleMultipartAnyFiles(
|
|
32
|
+
req,
|
|
33
|
+
this.options,
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
req.body = body;
|
|
37
|
+
req.storageFiles = files;
|
|
38
|
+
|
|
39
|
+
return next.handle().pipe(tap(remove));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const Interceptor = mixin(MixinInterceptor);
|
|
44
|
+
|
|
45
|
+
return Interceptor;
|
|
46
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Observable, tap } from 'rxjs';
|
|
2
|
+
import {
|
|
3
|
+
CallHandler,
|
|
4
|
+
ExecutionContext,
|
|
5
|
+
mixin,
|
|
6
|
+
NestInterceptor,
|
|
7
|
+
Type,
|
|
8
|
+
} from '@nestjs/common';
|
|
9
|
+
|
|
10
|
+
import { getMultipartRequest } from '../multipart/request';
|
|
11
|
+
import { transformUploadOptions, UploadOptions } from '../multipart/options';
|
|
12
|
+
import {
|
|
13
|
+
handleMultipartFileFields,
|
|
14
|
+
UploadField,
|
|
15
|
+
UploadFieldMapEntry,
|
|
16
|
+
uploadFieldsToMap,
|
|
17
|
+
} from '../multipart/handlers/file-fields';
|
|
18
|
+
|
|
19
|
+
export function FileFieldsInterceptor(
|
|
20
|
+
uploadFields: UploadField[],
|
|
21
|
+
options?: UploadOptions,
|
|
22
|
+
): Type<NestInterceptor> {
|
|
23
|
+
class MixinInterceptor implements NestInterceptor {
|
|
24
|
+
private readonly options: UploadOptions;
|
|
25
|
+
|
|
26
|
+
private readonly fieldsMap: Map<string, UploadFieldMapEntry>;
|
|
27
|
+
|
|
28
|
+
constructor() {
|
|
29
|
+
this.options = transformUploadOptions(options);
|
|
30
|
+
this.fieldsMap = uploadFieldsToMap(uploadFields);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async intercept(
|
|
34
|
+
context: ExecutionContext,
|
|
35
|
+
next: CallHandler,
|
|
36
|
+
): Promise<Observable<any>> {
|
|
37
|
+
const ctx = context.switchToHttp();
|
|
38
|
+
const req = getMultipartRequest(ctx);
|
|
39
|
+
|
|
40
|
+
const { body, files, remove } = await handleMultipartFileFields(
|
|
41
|
+
req,
|
|
42
|
+
this.fieldsMap,
|
|
43
|
+
this.options,
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
req.body = body;
|
|
47
|
+
req.storageFiles = files;
|
|
48
|
+
|
|
49
|
+
return next.handle().pipe(tap(remove));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const Interceptor = mixin(MixinInterceptor);
|
|
54
|
+
|
|
55
|
+
return Interceptor;
|
|
56
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Observable, tap } from 'rxjs';
|
|
2
|
+
import {
|
|
3
|
+
CallHandler,
|
|
4
|
+
ExecutionContext,
|
|
5
|
+
mixin,
|
|
6
|
+
NestInterceptor,
|
|
7
|
+
Type,
|
|
8
|
+
} from '@nestjs/common';
|
|
9
|
+
|
|
10
|
+
import { getMultipartRequest } from '../multipart/request';
|
|
11
|
+
import { transformUploadOptions, UploadOptions } from '../multipart/options';
|
|
12
|
+
import { handleMultipartSingleFile } from '../multipart/handlers/single-file';
|
|
13
|
+
|
|
14
|
+
export function FileInterceptor(
|
|
15
|
+
fieldname: string,
|
|
16
|
+
options?: UploadOptions,
|
|
17
|
+
): Type<NestInterceptor> {
|
|
18
|
+
class MixinInterceptor implements NestInterceptor {
|
|
19
|
+
private readonly options: UploadOptions;
|
|
20
|
+
|
|
21
|
+
constructor() {
|
|
22
|
+
this.options = transformUploadOptions(options);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async intercept(
|
|
26
|
+
context: ExecutionContext,
|
|
27
|
+
next: CallHandler,
|
|
28
|
+
): Promise<Observable<any>> {
|
|
29
|
+
const ctx = context.switchToHttp();
|
|
30
|
+
const req = getMultipartRequest(ctx);
|
|
31
|
+
|
|
32
|
+
const { file, body, remove } = await handleMultipartSingleFile(
|
|
33
|
+
req,
|
|
34
|
+
fieldname,
|
|
35
|
+
this.options,
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
req.body = body;
|
|
39
|
+
req.storageFile = file;
|
|
40
|
+
|
|
41
|
+
return next.handle().pipe(tap(remove));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const Interceptor = mixin(MixinInterceptor);
|
|
46
|
+
|
|
47
|
+
return Interceptor;
|
|
48
|
+
}
|