@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.
Files changed (284) hide show
  1. package/.yarn/install-state.gz +0 -0
  2. package/Readme.md +0 -7
  3. package/dist/cjs/index.d.ts +1 -0
  4. package/dist/cjs/index.js +1 -0
  5. package/dist/cjs/index.js.map +1 -1
  6. package/dist/cjs/src/adapters/hono-adapter.d.ts +11 -11
  7. package/dist/cjs/src/adapters/hono-adapter.js +24 -24
  8. package/dist/cjs/src/adapters/hono-adapter.js.map +1 -1
  9. package/dist/cjs/src/drivers/constants/apollo.constants.d.ts +1 -0
  10. package/dist/cjs/src/drivers/constants/apollo.constants.js +5 -0
  11. package/dist/cjs/src/drivers/constants/apollo.constants.js.map +1 -0
  12. package/dist/cjs/src/drivers/constants/index.d.ts +1 -0
  13. package/dist/cjs/src/drivers/constants/index.js +18 -0
  14. package/dist/cjs/src/drivers/constants/index.js.map +1 -0
  15. package/dist/cjs/src/drivers/graphQLUpload/GraphQLUpload.d.ts +3 -0
  16. package/dist/cjs/src/drivers/graphQLUpload/GraphQLUpload.js +21 -0
  17. package/dist/cjs/src/drivers/graphQLUpload/GraphQLUpload.js.map +1 -0
  18. package/dist/cjs/src/drivers/graphQLUpload/Upload.d.ts +16 -0
  19. package/dist/cjs/src/drivers/graphQLUpload/Upload.js +17 -0
  20. package/dist/cjs/src/drivers/graphQLUpload/Upload.js.map +1 -0
  21. package/dist/cjs/src/drivers/graphQLUpload/fs-capacitor.d.ts +44 -0
  22. package/dist/cjs/src/drivers/graphQLUpload/fs-capacitor.js +190 -0
  23. package/dist/cjs/src/drivers/graphQLUpload/fs-capacitor.js.map +1 -0
  24. package/dist/cjs/src/drivers/graphQLUpload/index.d.ts +4 -0
  25. package/dist/cjs/src/drivers/graphQLUpload/index.js +21 -0
  26. package/dist/cjs/src/drivers/graphQLUpload/index.js.map +1 -0
  27. package/dist/cjs/src/drivers/graphQLUpload/processRequest.d.ts +2 -0
  28. package/dist/cjs/src/drivers/graphQLUpload/processRequest.js +45 -0
  29. package/dist/cjs/src/drivers/graphQLUpload/processRequest.js.map +1 -0
  30. package/dist/cjs/src/drivers/graphql.driver.d.ts +7 -0
  31. package/dist/cjs/src/drivers/graphql.driver.js +32 -5
  32. package/dist/cjs/src/drivers/graphql.driver.js.map +1 -1
  33. package/dist/cjs/src/drivers/index.d.ts +1 -0
  34. package/dist/cjs/src/drivers/index.js +1 -0
  35. package/dist/cjs/src/drivers/index.js.map +1 -1
  36. package/dist/cjs/src/drivers/services/plugins-explorer.service.d.ts +9 -0
  37. package/dist/cjs/src/drivers/services/plugins-explorer.service.js +25 -0
  38. package/dist/cjs/src/drivers/services/plugins-explorer.service.js.map +1 -0
  39. package/dist/cjs/src/drivers/services/processRequest.d.ts +2 -0
  40. package/dist/cjs/src/drivers/services/processRequest.js +45 -0
  41. package/dist/cjs/src/drivers/services/processRequest.js.map +1 -0
  42. package/dist/cjs/src/multer/crypto/index.d.ts +2 -0
  43. package/dist/cjs/src/multer/crypto/index.js +7 -0
  44. package/dist/cjs/src/multer/crypto/index.js.map +1 -0
  45. package/dist/cjs/src/multer/decorators/index.d.ts +2 -0
  46. package/dist/cjs/src/multer/decorators/index.js +19 -0
  47. package/dist/cjs/src/multer/decorators/index.js.map +1 -0
  48. package/dist/cjs/src/multer/decorators/uploaded-file-decorator.d.ts +1 -0
  49. package/dist/cjs/src/multer/decorators/uploaded-file-decorator.js +10 -0
  50. package/dist/cjs/src/multer/decorators/uploaded-file-decorator.js.map +1 -0
  51. package/dist/cjs/src/multer/decorators/uploaded-files-decorator.d.ts +1 -0
  52. package/dist/cjs/src/multer/decorators/uploaded-files-decorator.js +10 -0
  53. package/dist/cjs/src/multer/decorators/uploaded-files-decorator.js.map +1 -0
  54. package/dist/cjs/src/multer/fs/index.d.ts +2 -0
  55. package/dist/cjs/src/multer/fs/index.js +23 -0
  56. package/dist/cjs/src/multer/fs/index.js.map +1 -0
  57. package/dist/cjs/src/multer/index.d.ts +4 -0
  58. package/dist/cjs/src/multer/index.js +21 -0
  59. package/dist/cjs/src/multer/index.js.map +1 -0
  60. package/dist/cjs/src/multer/interceptors/any-files-interceptor.d.ts +3 -0
  61. package/dist/cjs/src/multer/interceptors/any-files-interceptor.js +27 -0
  62. package/dist/cjs/src/multer/interceptors/any-files-interceptor.js.map +1 -0
  63. package/dist/cjs/src/multer/interceptors/file-fields-interceptor.d.ts +4 -0
  64. package/dist/cjs/src/multer/interceptors/file-fields-interceptor.js +28 -0
  65. package/dist/cjs/src/multer/interceptors/file-fields-interceptor.js.map +1 -0
  66. package/dist/cjs/src/multer/interceptors/file-interceptor.d.ts +3 -0
  67. package/dist/cjs/src/multer/interceptors/file-interceptor.js +27 -0
  68. package/dist/cjs/src/multer/interceptors/file-interceptor.js.map +1 -0
  69. package/dist/cjs/src/multer/interceptors/files-interceptor.d.ts +3 -0
  70. package/dist/cjs/src/multer/interceptors/files-interceptor.js +27 -0
  71. package/dist/cjs/src/multer/interceptors/files-interceptor.js.map +1 -0
  72. package/dist/cjs/src/multer/interceptors/index.d.ts +4 -0
  73. package/dist/cjs/src/multer/interceptors/index.js +21 -0
  74. package/dist/cjs/src/multer/interceptors/index.js.map +1 -0
  75. package/dist/cjs/src/multer/multipart/exceptions.d.ts +1 -0
  76. package/dist/cjs/src/multer/multipart/exceptions.js +22 -0
  77. package/dist/cjs/src/multer/multipart/exceptions.js.map +1 -0
  78. package/dist/cjs/src/multer/multipart/file.d.ts +10 -0
  79. package/dist/cjs/src/multer/multipart/file.js +10 -0
  80. package/dist/cjs/src/multer/multipart/file.js.map +1 -0
  81. package/dist/cjs/src/multer/multipart/filter.d.ts +6 -0
  82. package/dist/cjs/src/multer/multipart/filter.js +22 -0
  83. package/dist/cjs/src/multer/multipart/filter.js.map +1 -0
  84. package/dist/cjs/src/multer/multipart/handlers/any-files.d.ts +8 -0
  85. package/dist/cjs/src/multer/multipart/handlers/any-files.js +33 -0
  86. package/dist/cjs/src/multer/multipart/handlers/any-files.js.map +1 -0
  87. package/dist/cjs/src/multer/multipart/handlers/file-fields.d.ts +14 -0
  88. package/dist/cjs/src/multer/multipart/handlers/file-fields.js +57 -0
  89. package/dist/cjs/src/multer/multipart/handlers/file-fields.js.map +1 -0
  90. package/dist/cjs/src/multer/multipart/handlers/index.d.ts +1 -0
  91. package/dist/cjs/src/multer/multipart/handlers/index.js +3 -0
  92. package/dist/cjs/src/multer/multipart/handlers/index.js.map +1 -0
  93. package/dist/cjs/src/multer/multipart/handlers/multiple-files.d.ts +8 -0
  94. package/dist/cjs/src/multer/multipart/handlers/multiple-files.js +40 -0
  95. package/dist/cjs/src/multer/multipart/handlers/multiple-files.js.map +1 -0
  96. package/dist/cjs/src/multer/multipart/handlers/single-file.d.ts +8 -0
  97. package/dist/cjs/src/multer/multipart/handlers/single-file.js +45 -0
  98. package/dist/cjs/src/multer/multipart/handlers/single-file.js.map +1 -0
  99. package/dist/cjs/src/multer/multipart/index.d.ts +3 -0
  100. package/dist/cjs/src/multer/multipart/index.js +19 -0
  101. package/dist/cjs/src/multer/multipart/index.js.map +1 -0
  102. package/dist/cjs/src/multer/multipart/options.d.ts +22 -0
  103. package/dist/cjs/src/multer/multipart/options.js +23 -0
  104. package/dist/cjs/src/multer/multipart/options.js.map +1 -0
  105. package/dist/cjs/src/multer/multipart/request.d.ts +16 -0
  106. package/dist/cjs/src/multer/multipart/request.js +25 -0
  107. package/dist/cjs/src/multer/multipart/request.js.map +1 -0
  108. package/dist/cjs/src/multer/storage/disk-storage.d.ts +31 -0
  109. package/dist/cjs/src/multer/storage/disk-storage.js +62 -0
  110. package/dist/cjs/src/multer/storage/disk-storage.js.map +1 -0
  111. package/dist/cjs/src/multer/storage/index.d.ts +3 -0
  112. package/dist/cjs/src/multer/storage/index.js +20 -0
  113. package/dist/cjs/src/multer/storage/index.js.map +1 -0
  114. package/dist/cjs/src/multer/storage/memory-storage.d.ts +17 -0
  115. package/dist/cjs/src/multer/storage/memory-storage.js +21 -0
  116. package/dist/cjs/src/multer/storage/memory-storage.js.map +1 -0
  117. package/dist/cjs/src/multer/storage/storage.d.ts +13 -0
  118. package/dist/cjs/src/multer/storage/storage.js +3 -0
  119. package/dist/cjs/src/multer/storage/storage.js.map +1 -0
  120. package/dist/cjs/src/multer/stream/index.d.ts +3 -0
  121. package/dist/cjs/src/multer/stream/index.js +7 -0
  122. package/dist/cjs/src/multer/stream/index.js.map +1 -0
  123. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  124. package/dist/esm/index.d.ts +1 -0
  125. package/dist/esm/index.js +1 -0
  126. package/dist/esm/index.js.map +1 -1
  127. package/dist/esm/src/adapters/hono-adapter.d.ts +11 -11
  128. package/dist/esm/src/adapters/hono-adapter.js +35 -35
  129. package/dist/esm/src/adapters/hono-adapter.js.map +1 -1
  130. package/dist/esm/src/drivers/constants/apollo.constants.d.ts +1 -0
  131. package/dist/esm/src/drivers/constants/apollo.constants.js +2 -0
  132. package/dist/esm/src/drivers/constants/apollo.constants.js.map +1 -0
  133. package/dist/esm/src/drivers/constants/index.d.ts +1 -0
  134. package/dist/esm/src/drivers/constants/index.js +2 -0
  135. package/dist/esm/src/drivers/constants/index.js.map +1 -0
  136. package/dist/esm/src/drivers/graphQLUpload/GraphQLUpload.d.ts +3 -0
  137. package/dist/esm/src/drivers/graphQLUpload/GraphQLUpload.js +18 -0
  138. package/dist/esm/src/drivers/graphQLUpload/GraphQLUpload.js.map +1 -0
  139. package/dist/esm/src/drivers/graphQLUpload/Upload.d.ts +16 -0
  140. package/dist/esm/src/drivers/graphQLUpload/Upload.js +13 -0
  141. package/dist/esm/src/drivers/graphQLUpload/Upload.js.map +1 -0
  142. package/dist/esm/src/drivers/graphQLUpload/fs-capacitor.d.ts +44 -0
  143. package/dist/esm/src/drivers/graphQLUpload/fs-capacitor.js +183 -0
  144. package/dist/esm/src/drivers/graphQLUpload/fs-capacitor.js.map +1 -0
  145. package/dist/esm/src/drivers/graphQLUpload/index.d.ts +4 -0
  146. package/dist/esm/src/drivers/graphQLUpload/index.js +5 -0
  147. package/dist/esm/src/drivers/graphQLUpload/index.js.map +1 -0
  148. package/dist/esm/src/drivers/graphQLUpload/processRequest.d.ts +2 -0
  149. package/dist/esm/src/drivers/graphQLUpload/processRequest.js +41 -0
  150. package/dist/esm/src/drivers/graphQLUpload/processRequest.js.map +1 -0
  151. package/dist/esm/src/drivers/graphql.driver.d.ts +7 -0
  152. package/dist/esm/src/drivers/graphql.driver.js +33 -6
  153. package/dist/esm/src/drivers/graphql.driver.js.map +1 -1
  154. package/dist/esm/src/drivers/index.d.ts +1 -0
  155. package/dist/esm/src/drivers/index.js +1 -0
  156. package/dist/esm/src/drivers/index.js.map +1 -1
  157. package/dist/esm/src/drivers/services/plugins-explorer.service.d.ts +9 -0
  158. package/dist/esm/src/drivers/services/plugins-explorer.service.js +21 -0
  159. package/dist/esm/src/drivers/services/plugins-explorer.service.js.map +1 -0
  160. package/dist/esm/src/drivers/services/processRequest.d.ts +2 -0
  161. package/dist/esm/src/drivers/services/processRequest.js +41 -0
  162. package/dist/esm/src/drivers/services/processRequest.js.map +1 -0
  163. package/dist/esm/src/multer/crypto/index.d.ts +2 -0
  164. package/dist/esm/src/multer/crypto/index.js +4 -0
  165. package/dist/esm/src/multer/crypto/index.js.map +1 -0
  166. package/dist/esm/src/multer/decorators/index.d.ts +2 -0
  167. package/dist/esm/src/multer/decorators/index.js +3 -0
  168. package/dist/esm/src/multer/decorators/index.js.map +1 -0
  169. package/dist/esm/src/multer/decorators/uploaded-file-decorator.d.ts +1 -0
  170. package/dist/esm/src/multer/decorators/uploaded-file-decorator.js +7 -0
  171. package/dist/esm/src/multer/decorators/uploaded-file-decorator.js.map +1 -0
  172. package/dist/esm/src/multer/decorators/uploaded-files-decorator.d.ts +1 -0
  173. package/dist/esm/src/multer/decorators/uploaded-files-decorator.js +7 -0
  174. package/dist/esm/src/multer/decorators/uploaded-files-decorator.js.map +1 -0
  175. package/dist/esm/src/multer/fs/index.d.ts +2 -0
  176. package/dist/esm/src/multer/fs/index.js +18 -0
  177. package/dist/esm/src/multer/fs/index.js.map +1 -0
  178. package/dist/esm/src/multer/index.d.ts +4 -0
  179. package/dist/esm/src/multer/index.js +5 -0
  180. package/dist/esm/src/multer/index.js.map +1 -0
  181. package/dist/esm/src/multer/interceptors/any-files-interceptor.d.ts +3 -0
  182. package/dist/esm/src/multer/interceptors/any-files-interceptor.js +23 -0
  183. package/dist/esm/src/multer/interceptors/any-files-interceptor.js.map +1 -0
  184. package/dist/esm/src/multer/interceptors/file-fields-interceptor.d.ts +4 -0
  185. package/dist/esm/src/multer/interceptors/file-fields-interceptor.js +24 -0
  186. package/dist/esm/src/multer/interceptors/file-fields-interceptor.js.map +1 -0
  187. package/dist/esm/src/multer/interceptors/file-interceptor.d.ts +3 -0
  188. package/dist/esm/src/multer/interceptors/file-interceptor.js +23 -0
  189. package/dist/esm/src/multer/interceptors/file-interceptor.js.map +1 -0
  190. package/dist/esm/src/multer/interceptors/files-interceptor.d.ts +3 -0
  191. package/dist/esm/src/multer/interceptors/files-interceptor.js +23 -0
  192. package/dist/esm/src/multer/interceptors/files-interceptor.js.map +1 -0
  193. package/dist/esm/src/multer/interceptors/index.d.ts +4 -0
  194. package/dist/esm/src/multer/interceptors/index.js +5 -0
  195. package/dist/esm/src/multer/interceptors/index.js.map +1 -0
  196. package/dist/esm/src/multer/multipart/exceptions.d.ts +1 -0
  197. package/dist/esm/src/multer/multipart/exceptions.js +18 -0
  198. package/dist/esm/src/multer/multipart/exceptions.js.map +1 -0
  199. package/dist/esm/src/multer/multipart/file.d.ts +10 -0
  200. package/dist/esm/src/multer/multipart/file.js +6 -0
  201. package/dist/esm/src/multer/multipart/file.js.map +1 -0
  202. package/dist/esm/src/multer/multipart/filter.d.ts +6 -0
  203. package/dist/esm/src/multer/multipart/filter.js +18 -0
  204. package/dist/esm/src/multer/multipart/filter.js.map +1 -0
  205. package/dist/esm/src/multer/multipart/handlers/any-files.d.ts +8 -0
  206. package/dist/esm/src/multer/multipart/handlers/any-files.js +29 -0
  207. package/dist/esm/src/multer/multipart/handlers/any-files.js.map +1 -0
  208. package/dist/esm/src/multer/multipart/handlers/file-fields.d.ts +14 -0
  209. package/dist/esm/src/multer/multipart/handlers/file-fields.js +52 -0
  210. package/dist/esm/src/multer/multipart/handlers/file-fields.js.map +1 -0
  211. package/dist/esm/src/multer/multipart/handlers/index.d.ts +1 -0
  212. package/dist/esm/src/multer/multipart/handlers/index.js +2 -0
  213. package/dist/esm/src/multer/multipart/handlers/index.js.map +1 -0
  214. package/dist/esm/src/multer/multipart/handlers/multiple-files.d.ts +8 -0
  215. package/dist/esm/src/multer/multipart/handlers/multiple-files.js +36 -0
  216. package/dist/esm/src/multer/multipart/handlers/multiple-files.js.map +1 -0
  217. package/dist/esm/src/multer/multipart/handlers/single-file.d.ts +8 -0
  218. package/dist/esm/src/multer/multipart/handlers/single-file.js +41 -0
  219. package/dist/esm/src/multer/multipart/handlers/single-file.js.map +1 -0
  220. package/dist/esm/src/multer/multipart/index.d.ts +3 -0
  221. package/dist/esm/src/multer/multipart/index.js +3 -0
  222. package/dist/esm/src/multer/multipart/index.js.map +1 -0
  223. package/dist/esm/src/multer/multipart/options.d.ts +22 -0
  224. package/dist/esm/src/multer/multipart/options.js +19 -0
  225. package/dist/esm/src/multer/multipart/options.js.map +1 -0
  226. package/dist/esm/src/multer/multipart/request.d.ts +16 -0
  227. package/dist/esm/src/multer/multipart/request.js +20 -0
  228. package/dist/esm/src/multer/multipart/request.js.map +1 -0
  229. package/dist/esm/src/multer/storage/disk-storage.d.ts +31 -0
  230. package/dist/esm/src/multer/storage/disk-storage.js +58 -0
  231. package/dist/esm/src/multer/storage/disk-storage.js.map +1 -0
  232. package/dist/esm/src/multer/storage/index.d.ts +3 -0
  233. package/dist/esm/src/multer/storage/index.js +4 -0
  234. package/dist/esm/src/multer/storage/index.js.map +1 -0
  235. package/dist/esm/src/multer/storage/memory-storage.d.ts +17 -0
  236. package/dist/esm/src/multer/storage/memory-storage.js +17 -0
  237. package/dist/esm/src/multer/storage/memory-storage.js.map +1 -0
  238. package/dist/esm/src/multer/storage/storage.d.ts +13 -0
  239. package/dist/esm/src/multer/storage/storage.js +2 -0
  240. package/dist/esm/src/multer/storage/storage.js.map +1 -0
  241. package/dist/esm/src/multer/stream/index.d.ts +3 -0
  242. package/dist/esm/src/multer/stream/index.js +4 -0
  243. package/dist/esm/src/multer/stream/index.js.map +1 -0
  244. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  245. package/index.ts +1 -0
  246. package/package.json +3 -1
  247. package/src/adapters/hono-adapter.ts +51 -50
  248. package/src/drivers/constants/apollo.constants.ts +1 -0
  249. package/src/drivers/constants/index.ts +1 -0
  250. package/src/drivers/graphQLUpload/GraphQLUpload.ts +86 -0
  251. package/src/drivers/graphQLUpload/Upload.ts +35 -0
  252. package/src/drivers/graphQLUpload/fs-capacitor.ts +285 -0
  253. package/src/drivers/graphQLUpload/index.ts +4 -0
  254. package/src/drivers/graphQLUpload/processRequest.ts +50 -0
  255. package/src/drivers/graphql.driver.ts +50 -6
  256. package/src/drivers/index.ts +1 -0
  257. package/src/drivers/services/plugins-explorer.service.ts +27 -0
  258. package/src/multer/crypto/index.ts +4 -0
  259. package/src/multer/decorators/index.ts +2 -0
  260. package/src/multer/decorators/uploaded-file-decorator.ts +12 -0
  261. package/src/multer/decorators/uploaded-files-decorator.ts +15 -0
  262. package/src/multer/fs/index.ts +22 -0
  263. package/src/multer/index.ts +4 -0
  264. package/src/multer/interceptors/any-files-interceptor.ts +46 -0
  265. package/src/multer/interceptors/file-fields-interceptor.ts +56 -0
  266. package/src/multer/interceptors/file-interceptor.ts +48 -0
  267. package/src/multer/interceptors/files-interceptor.ts +50 -0
  268. package/src/multer/interceptors/index.ts +4 -0
  269. package/src/multer/multipart/exceptions.ts +25 -0
  270. package/src/multer/multipart/file.ts +18 -0
  271. package/src/multer/multipart/filter.ts +38 -0
  272. package/src/multer/multipart/handlers/any-files.ts +39 -0
  273. package/src/multer/multipart/handlers/file-fields.ts +89 -0
  274. package/src/multer/multipart/handlers/index.ts +1 -0
  275. package/src/multer/multipart/handlers/multiple-files.ts +55 -0
  276. package/src/multer/multipart/handlers/single-file.ts +56 -0
  277. package/src/multer/multipart/index.ts +3 -0
  278. package/src/multer/multipart/options.ts +29 -0
  279. package/src/multer/multipart/request.ts +44 -0
  280. package/src/multer/storage/disk-storage.ts +107 -0
  281. package/src/multer/storage/index.ts +3 -0
  282. package/src/multer/storage/memory-storage.ts +25 -0
  283. package/src/multer/storage/storage.ts +15 -0
  284. package/src/multer/stream/index.ts +4 -0
package/index.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from "./src/adapters";
2
2
  export * from "./src/interfaces";
3
3
  export * from "./src/drivers";
4
+ export * from "./src/multer";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kiyasov/platform-hono",
3
- "version": "1.0.7",
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 "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";
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 "@nestjs/common/interfaces";
11
+ } from '@nestjs/common/interfaces';
12
12
  import {
13
13
  ServeStaticOptions,
14
14
  serveStatic,
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";
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 === "function" ? "" : pathOrHandler;
49
- handler = typeof pathOrHandler === "function" ? pathOrHandler : handler;
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("body");
62
- return typeof body === "string" ? ctx.text(body) : ctx.json(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
- const responseContentType = this.getHeader(ctx, "Content-Type");
123
+
124
+ const responseContentType = this.getHeader(ctx, 'Content-Type');
124
125
  if (
125
- !responseContentType?.startsWith("application/json") &&
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, "Content-Type", "application/json");
132
+ this.setHeader(ctx, 'Content-Type', 'application/json');
132
133
  }
133
- ctx.set("body", body);
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("Method not implemented.");
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("Registering static assets middleware");
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("Method not implemented.");
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("Registering body parser middleware");
209
+ Logger.log('Registering body parser middleware');
209
210
  this.instance.use(this.bodyLimit(bodyLimit), async (ctx, next) => {
210
- const contentType = ctx.req.header("content-type");
211
+ const contentType = ctx.req.header('content-type');
211
212
  switch (type) {
212
- case "application/json":
213
- if (contentType === "application/json")
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 "text/plain":
217
- if (contentType === "text/plain") {
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 "hono";
248
+ return 'hono';
248
249
  }
249
250
 
250
251
  public registerParserMiddleware(prefix?: string, rawBody?: boolean) {
251
- Logger.log("Registering parser middleware");
252
- this.useBodyParser("application/x-www-form-urlencoded");
253
- this.useBodyParser("application/json");
254
- this.useBodyParser("text/plain");
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("Versioning not yet supported in Hono");
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("Body too large");
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
+ };
@@ -0,0 +1,4 @@
1
+ export * from "./fs-capacitor";
2
+ export * from "./Upload";
3
+ export * from "./GraphQLUpload";
4
+ export * from "./processRequest";