@kiyasov/platform-hono 1.0.7 → 1.0.9
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/Readme.md +0 -7
- 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/graphQLUpload/GraphQLUpload.d.ts +3 -0
- package/dist/cjs/src/drivers/graphQLUpload/GraphQLUpload.js +21 -0
- package/dist/cjs/src/drivers/graphQLUpload/GraphQLUpload.js.map +1 -0
- package/dist/cjs/src/drivers/graphQLUpload/Upload.d.ts +16 -0
- package/dist/cjs/src/drivers/graphQLUpload/Upload.js +17 -0
- package/dist/cjs/src/drivers/graphQLUpload/Upload.js.map +1 -0
- package/dist/cjs/src/drivers/graphQLUpload/fs-capacitor.d.ts +44 -0
- package/dist/cjs/src/drivers/graphQLUpload/fs-capacitor.js +190 -0
- package/dist/cjs/src/drivers/graphQLUpload/fs-capacitor.js.map +1 -0
- package/dist/cjs/src/drivers/graphQLUpload/index.d.ts +4 -0
- package/dist/cjs/src/drivers/graphQLUpload/index.js +21 -0
- package/dist/cjs/src/drivers/graphQLUpload/index.js.map +1 -0
- package/dist/cjs/src/drivers/graphQLUpload/processRequest.d.ts +2 -0
- package/dist/cjs/src/drivers/graphQLUpload/processRequest.js +45 -0
- package/dist/cjs/src/drivers/graphQLUpload/processRequest.js.map +1 -0
- package/dist/cjs/src/drivers/graphql.driver.d.ts +7 -0
- package/dist/cjs/src/drivers/graphql.driver.js +32 -5
- package/dist/cjs/src/drivers/graphql.driver.js.map +1 -1
- package/dist/cjs/src/drivers/index.d.ts +1 -0
- package/dist/cjs/src/drivers/index.js +1 -0
- package/dist/cjs/src/drivers/index.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/drivers/services/processRequest.d.ts +2 -0
- package/dist/cjs/src/drivers/services/processRequest.js +45 -0
- package/dist/cjs/src/drivers/services/processRequest.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/graphQLUpload/GraphQLUpload.d.ts +3 -0
- package/dist/esm/src/drivers/graphQLUpload/GraphQLUpload.js +18 -0
- package/dist/esm/src/drivers/graphQLUpload/GraphQLUpload.js.map +1 -0
- package/dist/esm/src/drivers/graphQLUpload/Upload.d.ts +16 -0
- package/dist/esm/src/drivers/graphQLUpload/Upload.js +13 -0
- package/dist/esm/src/drivers/graphQLUpload/Upload.js.map +1 -0
- package/dist/esm/src/drivers/graphQLUpload/fs-capacitor.d.ts +44 -0
- package/dist/esm/src/drivers/graphQLUpload/fs-capacitor.js +183 -0
- package/dist/esm/src/drivers/graphQLUpload/fs-capacitor.js.map +1 -0
- package/dist/esm/src/drivers/graphQLUpload/index.d.ts +4 -0
- package/dist/esm/src/drivers/graphQLUpload/index.js +5 -0
- package/dist/esm/src/drivers/graphQLUpload/index.js.map +1 -0
- package/dist/esm/src/drivers/graphQLUpload/processRequest.d.ts +2 -0
- package/dist/esm/src/drivers/graphQLUpload/processRequest.js +41 -0
- package/dist/esm/src/drivers/graphQLUpload/processRequest.js.map +1 -0
- package/dist/esm/src/drivers/graphql.driver.d.ts +7 -0
- package/dist/esm/src/drivers/graphql.driver.js +33 -6
- package/dist/esm/src/drivers/graphql.driver.js.map +1 -1
- package/dist/esm/src/drivers/index.d.ts +1 -0
- package/dist/esm/src/drivers/index.js +1 -0
- package/dist/esm/src/drivers/index.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/drivers/services/processRequest.d.ts +2 -0
- package/dist/esm/src/drivers/services/processRequest.js +41 -0
- package/dist/esm/src/drivers/services/processRequest.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/graphQLUpload/GraphQLUpload.ts +86 -0
- package/src/drivers/graphQLUpload/Upload.ts +35 -0
- package/src/drivers/graphQLUpload/fs-capacitor.ts +285 -0
- package/src/drivers/graphQLUpload/index.ts +4 -0
- package/src/drivers/graphQLUpload/processRequest.ts +50 -0
- package/src/drivers/graphql.driver.ts +50 -6
- package/src/drivers/index.ts +1 -0
- 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.9",
|
|
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';
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { Upload } from "./Upload";
|
|
2
|
+
import { ASTNode, GraphQLError, GraphQLScalarType } from "graphql";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* A GraphQL `Upload` scalar that can be used in a
|
|
6
|
+
* [`GraphQLSchema`](https://graphql.org/graphql-js/type/#graphqlschema).
|
|
7
|
+
* It's value in resolvers is a promise that resolves
|
|
8
|
+
* [file upload details]{@link FileUpload} for processing and storage.
|
|
9
|
+
* @example <caption>Ways to `import`.</caption>
|
|
10
|
+
* ```js
|
|
11
|
+
* import { GraphQLUpload } from 'graphql-upload-ts';
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* ```js
|
|
15
|
+
* import GraphQLUpload from 'graphql-upload-ts/dist/GraphQLUpload.js';
|
|
16
|
+
* ```
|
|
17
|
+
* @example <caption>Ways to `require`.</caption>
|
|
18
|
+
* ```js
|
|
19
|
+
* const { GraphQLUpload } = require('graphql-upload-ts');
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* ```js
|
|
23
|
+
* const GraphQLUpload = require('graphql-upload-ts/dist/GraphQLUpload');
|
|
24
|
+
* ```
|
|
25
|
+
* @example <caption>Setup for a schema built with [`makeExecutableSchema`](https://apollographql.com/docs/graphql-tools/generate-schema#makeExecutableSchema).</caption>
|
|
26
|
+
* ```js
|
|
27
|
+
* const { makeExecutableSchema } = require('graphql-tools');
|
|
28
|
+
* const { GraphQLUpload } = require('graphql-upload-ts');
|
|
29
|
+
*
|
|
30
|
+
* const schema = makeExecutableSchema({
|
|
31
|
+
* typeDefs: /* GraphQL *\/ `
|
|
32
|
+
* scalar Upload
|
|
33
|
+
* `,
|
|
34
|
+
* resolvers: {
|
|
35
|
+
* Upload: GraphQLUpload,
|
|
36
|
+
* },
|
|
37
|
+
* });
|
|
38
|
+
* ```
|
|
39
|
+
* @example <caption>A manually constructed schema with an image upload mutation.</caption>
|
|
40
|
+
* ```js
|
|
41
|
+
* const {
|
|
42
|
+
* GraphQLSchema,
|
|
43
|
+
* GraphQLObjectType,
|
|
44
|
+
* GraphQLBoolean,
|
|
45
|
+
* } = require('graphql');
|
|
46
|
+
* const { GraphQLUpload } = require('graphql-upload-ts');
|
|
47
|
+
*
|
|
48
|
+
* const schema = new GraphQLSchema({
|
|
49
|
+
* mutation: new GraphQLObjectType({
|
|
50
|
+
* name: 'Mutation',
|
|
51
|
+
* fields: {
|
|
52
|
+
* uploadImage: {
|
|
53
|
+
* description: 'Uploads an image.',
|
|
54
|
+
* type: GraphQLBoolean,
|
|
55
|
+
* args: {
|
|
56
|
+
* image: {
|
|
57
|
+
* description: 'Image file.',
|
|
58
|
+
* type: GraphQLUpload,
|
|
59
|
+
* },
|
|
60
|
+
* },
|
|
61
|
+
* async resolve(parent, { image }) {
|
|
62
|
+
* const { filename, fieldName, mimetype, createReadStream } = await image;
|
|
63
|
+
* const stream = createReadStream();
|
|
64
|
+
* // Promisify the stream and store the file, then…
|
|
65
|
+
* return true;
|
|
66
|
+
* },
|
|
67
|
+
* },
|
|
68
|
+
* },
|
|
69
|
+
* }),
|
|
70
|
+
* });
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export const GraphQLUpload = new GraphQLScalarType({
|
|
74
|
+
name: "Upload",
|
|
75
|
+
description: "The `Upload` scalar type represents a file upload.",
|
|
76
|
+
parseValue(value: { promise: Promise<Upload> }) {
|
|
77
|
+
if (value instanceof Upload) return value.promise;
|
|
78
|
+
throw new GraphQLError("Upload value invalid.");
|
|
79
|
+
},
|
|
80
|
+
parseLiteral(node: ASTNode | ASTNode[]) {
|
|
81
|
+
throw new GraphQLError("Upload literal unsupported.", { nodes: node });
|
|
82
|
+
},
|
|
83
|
+
serialize() {
|
|
84
|
+
throw new GraphQLError("Upload serialization unsupported.");
|
|
85
|
+
},
|
|
86
|
+
});
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ReadStream, ReadStreamOptions, WriteStream } from "./fs-capacitor";
|
|
2
|
+
|
|
3
|
+
export interface FileUpload {
|
|
4
|
+
filename: string;
|
|
5
|
+
fieldName: string;
|
|
6
|
+
mimetype: string;
|
|
7
|
+
encoding: string;
|
|
8
|
+
|
|
9
|
+
createReadStream(options?: ReadStreamOptions): ReadStream;
|
|
10
|
+
|
|
11
|
+
capacitor: WriteStream;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export class Upload {
|
|
15
|
+
promise: Promise<FileUpload>;
|
|
16
|
+
resolve: (file?: FileUpload) => void;
|
|
17
|
+
reject: (error?: Error | string) => void;
|
|
18
|
+
file?: FileUpload;
|
|
19
|
+
|
|
20
|
+
constructor() {
|
|
21
|
+
this.promise = new Promise((resolve, reject) => {
|
|
22
|
+
this.resolve = (file) => {
|
|
23
|
+
this.file = file;
|
|
24
|
+
|
|
25
|
+
resolve(file);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
this.reject = reject;
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
// Prevent errors crashing Node.js, see:
|
|
32
|
+
// https://github.com/nodejs/node/issues/20392
|
|
33
|
+
this.promise.catch(() => {});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { randomBytes } from "crypto";
|
|
2
|
+
import { read, open, closeSync, unlinkSync, write, close, unlink } from "fs";
|
|
3
|
+
import { tmpdir } from "os";
|
|
4
|
+
import { join } from "path";
|
|
5
|
+
import { Readable, ReadableOptions, Writable, WritableOptions } from "stream";
|
|
6
|
+
import { EventEmitter } from "events";
|
|
7
|
+
|
|
8
|
+
export class ReadAfterDestroyedError extends Error {}
|
|
9
|
+
export class ReadAfterReleasedError extends Error {}
|
|
10
|
+
|
|
11
|
+
export interface ReadStreamOptions {
|
|
12
|
+
highWaterMark?: ReadableOptions["highWaterMark"];
|
|
13
|
+
encoding?: ReadableOptions["encoding"];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Use a “proxy” event emitter configured to have an infinite maximum number of
|
|
17
|
+
// listeners to prevent Node.js max listeners exceeded warnings if many
|
|
18
|
+
// `fs-capacitor` `ReadStream` instances are created at the same time. See:
|
|
19
|
+
// https://github.com/mike-marcacci/fs-capacitor/issues/30
|
|
20
|
+
const processExitProxy = new EventEmitter();
|
|
21
|
+
processExitProxy.setMaxListeners(Infinity);
|
|
22
|
+
process.once("exit", () => processExitProxy.emit("exit"));
|
|
23
|
+
|
|
24
|
+
export class ReadStream extends Readable {
|
|
25
|
+
private _pos: number = 0;
|
|
26
|
+
private _writeStream: WriteStream;
|
|
27
|
+
|
|
28
|
+
constructor(writeStream: WriteStream, options?: ReadStreamOptions) {
|
|
29
|
+
super({
|
|
30
|
+
highWaterMark: options?.highWaterMark,
|
|
31
|
+
encoding: options?.encoding,
|
|
32
|
+
autoDestroy: true,
|
|
33
|
+
});
|
|
34
|
+
this._writeStream = writeStream;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
_read(n: number): void {
|
|
38
|
+
if (this.destroyed) return;
|
|
39
|
+
|
|
40
|
+
if (typeof this._writeStream["_fd"] !== "number") {
|
|
41
|
+
this._writeStream.once("ready", () => this._read(n));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Using `allocUnsafe` here is OK because we return a slice the length of
|
|
46
|
+
// `bytesRead`, and discard the rest. This prevents node from having to zero
|
|
47
|
+
// out the entire allocation first.
|
|
48
|
+
const buf = Buffer.allocUnsafe(n);
|
|
49
|
+
read(this._writeStream["_fd"], buf, 0, n, this._pos, (error, bytesRead) => {
|
|
50
|
+
if (error) this.destroy(error);
|
|
51
|
+
|
|
52
|
+
// Push any read bytes into the local stream buffer.
|
|
53
|
+
if (bytesRead) {
|
|
54
|
+
this._pos += bytesRead;
|
|
55
|
+
this.push(buf.slice(0, bytesRead));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// If there were no more bytes to read and the write stream is finished,
|
|
60
|
+
// then this stream has reached the end.
|
|
61
|
+
if (
|
|
62
|
+
(
|
|
63
|
+
this._writeStream as any as {
|
|
64
|
+
_writableState: { finished: boolean };
|
|
65
|
+
}
|
|
66
|
+
)._writableState.finished
|
|
67
|
+
) {
|
|
68
|
+
// Check if we have consumed the whole file up to where
|
|
69
|
+
// the write stream has written before ending the stream
|
|
70
|
+
if (this._pos < (this._writeStream as any as { _pos: number })._pos)
|
|
71
|
+
this._read(n);
|
|
72
|
+
else this.push(null);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Otherwise, wait for the write stream to add more data or finish.
|
|
77
|
+
const retry = (): void => {
|
|
78
|
+
this._writeStream.off("finish", retry);
|
|
79
|
+
this._writeStream.off("write", retry);
|
|
80
|
+
this._read(n);
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
this._writeStream.on("finish", retry);
|
|
84
|
+
this._writeStream.on("write", retry);
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export interface WriteStreamOptions {
|
|
90
|
+
highWaterMark?: WritableOptions["highWaterMark"];
|
|
91
|
+
defaultEncoding?: WritableOptions["defaultEncoding"];
|
|
92
|
+
tmpdir?: () => string;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export class WriteStream extends Writable {
|
|
96
|
+
private _fd: null | number = null;
|
|
97
|
+
private _path: null | string = null;
|
|
98
|
+
private _pos: number = 0;
|
|
99
|
+
private _readStreams: Set<ReadStream> = new Set();
|
|
100
|
+
private _released: boolean = false;
|
|
101
|
+
|
|
102
|
+
constructor(options?: WriteStreamOptions) {
|
|
103
|
+
super({
|
|
104
|
+
highWaterMark: options?.highWaterMark,
|
|
105
|
+
defaultEncoding: options?.defaultEncoding,
|
|
106
|
+
autoDestroy: false,
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// Generate a random filename.
|
|
110
|
+
randomBytes(16, (error, buffer) => {
|
|
111
|
+
if (error) {
|
|
112
|
+
this.destroy(error);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
this._path = join(
|
|
117
|
+
(options?.tmpdir ?? tmpdir)(),
|
|
118
|
+
`capacitor-${buffer.toString("hex")}.tmp`
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
// Create a file in the OS's temporary files directory.
|
|
122
|
+
open(this._path, "wx+", 0o600, (error, fd) => {
|
|
123
|
+
if (error) {
|
|
124
|
+
this.destroy(error);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Cleanup when the process exits or is killed.
|
|
129
|
+
processExitProxy.once("exit", this._cleanupSync);
|
|
130
|
+
|
|
131
|
+
this._fd = fd;
|
|
132
|
+
this.emit("ready");
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
_cleanup = (callback: (error: null | Error) => void): void => {
|
|
138
|
+
const fd = this._fd;
|
|
139
|
+
const path = this._path;
|
|
140
|
+
|
|
141
|
+
if (typeof fd !== "number" || typeof path !== "string") {
|
|
142
|
+
callback(null);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Close the file descriptor.
|
|
147
|
+
close(fd, (closeError) => {
|
|
148
|
+
// An error here probably means the fd was already closed, but we can
|
|
149
|
+
// still try to unlink the file.
|
|
150
|
+
unlink(path, (unlinkError) => {
|
|
151
|
+
// If we are unable to unlink the file, the operating system will
|
|
152
|
+
// clean up on next restart, since we use store thes in `os.tmpdir()`
|
|
153
|
+
this._fd = null;
|
|
154
|
+
|
|
155
|
+
// We avoid removing this until now in case an exit occurs while
|
|
156
|
+
// asyncronously cleaning up.
|
|
157
|
+
processExitProxy.off("exit", this._cleanupSync);
|
|
158
|
+
callback(unlinkError ?? closeError);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
_cleanupSync = (): void => {
|
|
164
|
+
processExitProxy.off("exit", this._cleanupSync);
|
|
165
|
+
|
|
166
|
+
if (typeof this._fd === "number")
|
|
167
|
+
try {
|
|
168
|
+
closeSync(this._fd);
|
|
169
|
+
} catch (error) {
|
|
170
|
+
// An error here probably means the fd was already closed, but we can
|
|
171
|
+
// still try to unlink the file.
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
try {
|
|
175
|
+
if (this._path !== null) {
|
|
176
|
+
unlinkSync(this._path);
|
|
177
|
+
}
|
|
178
|
+
} catch (error) {
|
|
179
|
+
// If we are unable to unlink the file, the operating system will clean
|
|
180
|
+
// up on next restart, since we use store thes in `os.tmpdir()`
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
_final(callback: (error?: null | Error) => any): void {
|
|
185
|
+
if (typeof this._fd !== "number") {
|
|
186
|
+
this.once("ready", () => this._final(callback));
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
callback();
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
_write(
|
|
193
|
+
chunk: Buffer,
|
|
194
|
+
encoding: string,
|
|
195
|
+
callback: (error?: null | Error) => any
|
|
196
|
+
): void {
|
|
197
|
+
if (typeof this._fd !== "number") {
|
|
198
|
+
this.once("ready", () => this._write(chunk, encoding, callback));
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
write(this._fd, chunk, 0, chunk.length, this._pos, (error) => {
|
|
203
|
+
if (error) {
|
|
204
|
+
callback(error);
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// It's safe to increment `this._pos` after flushing to the filesystem
|
|
209
|
+
// because node streams ensure that only one `_write()` is active at a
|
|
210
|
+
// time. If this assumption is broken, the behavior of this library is
|
|
211
|
+
// undefined, regardless of where this is incremented. Relocating this
|
|
212
|
+
// to increment syncronously would result in correct file contents, but
|
|
213
|
+
// the out-of-order writes would still open the potential for read streams
|
|
214
|
+
// to scan positions that have not yet been written.
|
|
215
|
+
this._pos += chunk.length;
|
|
216
|
+
this.emit("write");
|
|
217
|
+
callback();
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
release(): void {
|
|
222
|
+
this._released = true;
|
|
223
|
+
if (this._readStreams.size === 0) this.destroy();
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
_destroy(
|
|
227
|
+
error: undefined | null | Error,
|
|
228
|
+
callback: (error?: null | Error) => any
|
|
229
|
+
): void {
|
|
230
|
+
// Destroy all attached read streams.
|
|
231
|
+
for (const readStream of this._readStreams) {
|
|
232
|
+
readStream.destroy(error || undefined);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// This capacitor is fully initialized.
|
|
236
|
+
if (typeof this._fd === "number" && typeof this._path === "string") {
|
|
237
|
+
this._cleanup((cleanupError) => callback(cleanupError ?? error));
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// This capacitor has not yet finished initialization; if initialization
|
|
242
|
+
// does complete, immediately clean up after.
|
|
243
|
+
this.once("ready", () => {
|
|
244
|
+
this._cleanup((cleanupError) => {
|
|
245
|
+
if (cleanupError) {
|
|
246
|
+
this.emit("error", cleanupError);
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
callback(error);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
createReadStream(options?: ReadStreamOptions): ReadStream {
|
|
255
|
+
if (this.destroyed)
|
|
256
|
+
throw new ReadAfterDestroyedError(
|
|
257
|
+
"A ReadStream cannot be created from a destroyed WriteStream."
|
|
258
|
+
);
|
|
259
|
+
|
|
260
|
+
if (this._released)
|
|
261
|
+
throw new ReadAfterReleasedError(
|
|
262
|
+
"A ReadStream cannot be created from a released WriteStream."
|
|
263
|
+
);
|
|
264
|
+
|
|
265
|
+
const readStream = new ReadStream(this, options);
|
|
266
|
+
this._readStreams.add(readStream);
|
|
267
|
+
|
|
268
|
+
readStream.once("close", (): void => {
|
|
269
|
+
this._readStreams.delete(readStream);
|
|
270
|
+
|
|
271
|
+
if (this._released && this._readStreams.size === 0) {
|
|
272
|
+
this.destroy();
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
return readStream;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
export default {
|
|
281
|
+
WriteStream,
|
|
282
|
+
ReadStream,
|
|
283
|
+
ReadAfterDestroyedError,
|
|
284
|
+
ReadAfterReleasedError,
|
|
285
|
+
};
|