@fc3/mmcadi 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (460) hide show
  1. package/LICENSE +673 -0
  2. package/README.md +5 -0
  3. package/bin/compile +63 -0
  4. package/bin/copy-static-files +13 -0
  5. package/bin/install +5 -0
  6. package/bin/precompile +55 -0
  7. package/bin/prepublish +7 -0
  8. package/bin/remap-paths +113 -0
  9. package/bin/test +9 -0
  10. package/config/tsconfig.json +37 -0
  11. package/package.json +33 -0
  12. package/src/bootstrap/start.ts +12 -0
  13. package/src/client/bootstrap.ts +5 -0
  14. package/src/client/client.ts +54 -0
  15. package/src/client/enum/key-code.ts +34 -0
  16. package/src/client/enum/page-type.ts +19 -0
  17. package/src/client/factory/page.ts +61 -0
  18. package/src/client/page/confirm-delete-block.ts +30 -0
  19. package/src/client/page/create-block.ts +6 -0
  20. package/src/client/page/day.ts +8 -0
  21. package/src/client/page/edit-block.ts +43 -0
  22. package/src/client/page/edit-custom.ts +16 -0
  23. package/src/client/page/home.ts +8 -0
  24. package/src/client/page/login.ts +8 -0
  25. package/src/client/page/logout.ts +8 -0
  26. package/src/client/page/month.ts +8 -0
  27. package/src/client/page/move-block.ts +8 -0
  28. package/src/client/page/select-block-type.ts +56 -0
  29. package/src/client/page/settings.ts +8 -0
  30. package/src/client/page/view-custom.ts +665 -0
  31. package/src/client/page/week.ts +8 -0
  32. package/src/client/page/year.ts +8 -0
  33. package/src/client/page.ts +128 -0
  34. package/src/client/shim/execute.ts +5 -0
  35. package/src/client/shim/logger.ts +44 -0
  36. package/src/client/utility/get-meta-value.ts +23 -0
  37. package/src/common/builder/block/background.ts +25 -0
  38. package/src/common/builder/block/folder.ts +43 -0
  39. package/src/common/builder/block/header.ts +15 -0
  40. package/src/common/builder/block/link.ts +32 -0
  41. package/src/common/builder/block/multicolumn.ts +16 -0
  42. package/src/common/builder/block/note.ts +13 -0
  43. package/src/common/builder/block/whitespace.ts +13 -0
  44. package/src/common/utility/get-parent-path.ts +29 -0
  45. package/src/constant/month-names.ts +16 -0
  46. package/src/enum/action-type.ts +11 -0
  47. package/src/enum/block-type.ts +18 -0
  48. package/src/enum/calendar-view-mode.ts +9 -0
  49. package/src/enum/color.ts +15 -0
  50. package/src/enum/default-role.ts +6 -0
  51. package/src/enum/directory-item-type.ts +6 -0
  52. package/src/enum/emoji.ts +94 -0
  53. package/src/enum/field-type.ts +8 -0
  54. package/src/enum/header-size.ts +7 -0
  55. package/src/enum/permission-type.ts +8 -0
  56. package/src/enum/time-place-visibility.ts +8 -0
  57. package/src/enum/tool-type.ts +14 -0
  58. package/src/index.ts +8 -0
  59. package/src/interface/hydration-callback.ts +7 -0
  60. package/src/interface/provider.ts +8 -0
  61. package/src/interface/repository.ts +12 -0
  62. package/src/lib/array/add.ts +10 -0
  63. package/src/lib/array/assert-is-empty.ts +23 -0
  64. package/src/lib/array/clone.ts +5 -0
  65. package/src/lib/array/difference.ts +8 -0
  66. package/src/lib/array/empty.ts +6 -0
  67. package/src/lib/array/equal.ts +24 -0
  68. package/src/lib/array/get-first-value.ts +5 -0
  69. package/src/lib/array/get-last-value.ts +5 -0
  70. package/src/lib/array/get-max-value.ts +5 -0
  71. package/src/lib/array/get-value-after.ts +23 -0
  72. package/src/lib/array/get-value-before.ts +23 -0
  73. package/src/lib/array/get-values-between.ts +18 -0
  74. package/src/lib/array/index.ts +5 -0
  75. package/src/lib/array/is-empty.ts +6 -0
  76. package/src/lib/array/remove.ts +19 -0
  77. package/src/lib/array/sum.ts +11 -0
  78. package/src/lib/array/unique.ts +13 -0
  79. package/src/lib/environment/bootstrap.ts +1 -0
  80. package/src/lib/environment/enum/environment-type.ts +8 -0
  81. package/src/lib/environment/enum/service-type.ts +5 -0
  82. package/src/lib/environment/index.ts +7 -0
  83. package/src/lib/environment/utility/get-environment-type.ts +28 -0
  84. package/src/lib/environment/utility/is-browser.ts +5 -0
  85. package/src/lib/environment/utility/is-development.ts +10 -0
  86. package/src/lib/environment/utility/is-production-or-staging.ts +8 -0
  87. package/src/lib/environment/utility/is-production.ts +10 -0
  88. package/src/lib/environment/utility/is-staging.ts +10 -0
  89. package/src/lib/errors/enum/error-type.ts +13 -0
  90. package/src/lib/errors/error/base.ts +40 -0
  91. package/src/lib/errors/error/conflict.ts +16 -0
  92. package/src/lib/errors/error/generic.ts +23 -0
  93. package/src/lib/errors/error/invalid.ts +14 -0
  94. package/src/lib/errors/error/invariant-violation.ts +5 -0
  95. package/src/lib/errors/error/not-allowed.ts +14 -0
  96. package/src/lib/errors/error/not-found.ts +16 -0
  97. package/src/lib/errors/error/not-implemented.ts +20 -0
  98. package/src/lib/errors/error/omitted.ts +14 -0
  99. package/src/lib/errors/error/timeout.ts +14 -0
  100. package/src/lib/errors/error/unauthorized.ts +14 -0
  101. package/src/lib/errors/index.ts +18 -0
  102. package/src/lib/errors/sugar/invariant.ts +7 -0
  103. package/src/lib/errors/type/coded-error.ts +7 -0
  104. package/src/lib/errors/type/error-data.ts +11 -0
  105. package/src/lib/errors/utility/create-error-for-error-type.ts +60 -0
  106. package/src/lib/errors/utility/create-error-from-ambiguous-json-data.ts +26 -0
  107. package/src/lib/errors/utility/error-matches.ts +28 -0
  108. package/src/lib/errors/utility/get-error-type-for-posix-error-code.ts +37 -0
  109. package/src/lib/errors/utility/get-error-type-for-status-code.ts +38 -0
  110. package/src/lib/errors/utility/get-message-for-error-type.ts +29 -0
  111. package/src/lib/errors/utility/matches-posix-error-code.ts +11 -0
  112. package/src/lib/errors/utility/wrap-error.ts +39 -0
  113. package/src/lib/event-emitter/index.ts +63 -0
  114. package/src/lib/execution-context/execution-context.ts +90 -0
  115. package/src/lib/execution-context/index.ts +8 -0
  116. package/src/lib/execution-context/type/session.ts +7 -0
  117. package/src/lib/feature/feature.ts +108 -0
  118. package/src/lib/feature/index.ts +3 -0
  119. package/src/lib/filesystem/bootstrap.ts +1 -0
  120. package/src/lib/filesystem/enum/file-extension.ts +19 -0
  121. package/src/lib/filesystem/index.ts +4 -0
  122. package/src/lib/filesystem/utility/exists.ts +21 -0
  123. package/src/lib/filesystem/utility/get-extension-for-filepath.ts +20 -0
  124. package/src/lib/filesystem/utility/strip-extension.ts +26 -0
  125. package/src/lib/grammar/index.ts +3 -0
  126. package/src/lib/grammar/noun-inflector.ts +104 -0
  127. package/src/lib/grammar/utility/get-words-from-identifier.ts +9 -0
  128. package/src/lib/grammar/verb-inflector.ts +344 -0
  129. package/src/lib/http/buffer-stream.ts +76 -0
  130. package/src/lib/http/enum/content-type.ts +19 -0
  131. package/src/lib/http/enum/cookie-attribute.ts +11 -0
  132. package/src/lib/http/enum/header.ts +29 -0
  133. package/src/lib/http/enum/method.ts +11 -0
  134. package/src/lib/http/enum/same-site-policy.ts +7 -0
  135. package/src/lib/http/enum/status-code.ts +9 -0
  136. package/src/lib/http/factory/body-parser.ts +55 -0
  137. package/src/lib/http/index.ts +24 -0
  138. package/src/lib/http/interface/client-request.ts +15 -0
  139. package/src/lib/http/interface/incoming-message.ts +24 -0
  140. package/src/lib/http/interface/network-library.ts +9 -0
  141. package/src/lib/http/interface/request-callback.ts +7 -0
  142. package/src/lib/http/isomorphic/request.ts +77 -0
  143. package/src/lib/http/isomorphic/response.ts +77 -0
  144. package/src/lib/http/isomorphic.ts +20 -0
  145. package/src/lib/http/parser/accept-header.ts +35 -0
  146. package/src/lib/http/parser/basic-auth-header.ts +48 -0
  147. package/src/lib/http/parser/body/json.ts +14 -0
  148. package/src/lib/http/parser/body/multipart.ts +89 -0
  149. package/src/lib/http/parser/body/url-encoded.ts +16 -0
  150. package/src/lib/http/parser/body.ts +44 -0
  151. package/src/lib/http/parser/cookie.ts +114 -0
  152. package/src/lib/http/parser/querystring.ts +92 -0
  153. package/src/lib/http/parser/url.ts +76 -0
  154. package/src/lib/http/request/incoming.ts +299 -0
  155. package/src/lib/http/request/outgoing.ts +276 -0
  156. package/src/lib/http/request.ts +26 -0
  157. package/src/lib/http/response/incoming.ts +243 -0
  158. package/src/lib/http/response/outgoing.ts +160 -0
  159. package/src/lib/http/response.ts +74 -0
  160. package/src/lib/http/serializer/basic-auth-header.ts +27 -0
  161. package/src/lib/http/serializer/cookie.ts +90 -0
  162. package/src/lib/http/serializer/query-data.ts +54 -0
  163. package/src/lib/http/transaction.ts +320 -0
  164. package/src/lib/http/type/basic-auth-credentials.ts +6 -0
  165. package/src/lib/http/type/header-map.ts +5 -0
  166. package/src/lib/http/type/log-attributes.ts +12 -0
  167. package/src/lib/http/type/path-parameters.ts +5 -0
  168. package/src/lib/http/type/query-data.ts +7 -0
  169. package/src/lib/http/type/query-value.ts +11 -0
  170. package/src/lib/http/type/request-options.ts +16 -0
  171. package/src/lib/http/type/transaction-data.ts +4 -0
  172. package/src/lib/http/utility/get-content-type-for-extension.ts +47 -0
  173. package/src/lib/http/utility/get-library-for-protocol.ts +25 -0
  174. package/src/lib/http/utility/get-status-code-for-error-type.ts +37 -0
  175. package/src/lib/http/utility/get-status-code-for-error.ts +13 -0
  176. package/src/lib/http/utility/is-client-error-status.ts +15 -0
  177. package/src/lib/http/utility/is-error-status.ts +9 -0
  178. package/src/lib/http/utility/is-server-error-status.ts +7 -0
  179. package/src/lib/http/utility/is-success-status.ts +7 -0
  180. package/src/lib/http/utility/proxy-request.ts +58 -0
  181. package/src/lib/http/utility/serialize-request-options.ts +9 -0
  182. package/src/lib/http/utility/slug-generator.ts +20 -0
  183. package/src/lib/key-generator/index.ts +3 -0
  184. package/src/lib/key-generator/key-generator.ts +7 -0
  185. package/src/lib/logger/enum/ansi-escape-code.ts +14 -0
  186. package/src/lib/logger/enum/log-level.ts +8 -0
  187. package/src/lib/logger/formatter.ts +59 -0
  188. package/src/lib/logger/index.ts +7 -0
  189. package/src/lib/logger/interface/error-reporter.ts +7 -0
  190. package/src/lib/logger/interface/logger.ts +13 -0
  191. package/src/lib/logger/logger.ts +239 -0
  192. package/src/lib/logger/type/error-parameters.ts +9 -0
  193. package/src/lib/logger/type/loggable-data.ts +5 -0
  194. package/src/lib/logger/type/loggable-value.ts +1 -0
  195. package/src/lib/metrics/dispatcher.ts +264 -0
  196. package/src/lib/metrics/enum/dispatch-mode.ts +6 -0
  197. package/src/lib/metrics/index.ts +2 -0
  198. package/src/lib/metrics/settings-hydrator.ts +51 -0
  199. package/src/lib/metrics/type/dispatcher-settings.ts +12 -0
  200. package/src/lib/metrics/type/tag-map.ts +5 -0
  201. package/src/lib/network/bootstrap.ts +1 -0
  202. package/src/lib/network/enum/connection-status.ts +14 -0
  203. package/src/lib/network/enum/http-status-code.ts +75 -0
  204. package/src/lib/network/enum/network-protocol.ts +10 -0
  205. package/src/lib/network/event-emitter.ts +63 -0
  206. package/src/lib/network/index.ts +7 -0
  207. package/src/lib/network/interface/socket.ts +42 -0
  208. package/src/lib/network/type/socket-options.ts +6 -0
  209. package/src/lib/network/utility/get-protocol-from-url.ts +15 -0
  210. package/src/lib/operation/index.ts +6 -0
  211. package/src/lib/operation/operation/auto-logging.ts +94 -0
  212. package/src/lib/operation/operation/silent.ts +17 -0
  213. package/src/lib/operation/operation.ts +80 -0
  214. package/src/lib/process/bootstrap.ts +1 -0
  215. package/src/lib/process/enum/posix-error-code.ts +138 -0
  216. package/src/lib/process/enum/process-signal.ts +68 -0
  217. package/src/lib/process/error.ts +6 -0
  218. package/src/lib/process/execute.ts +77 -0
  219. package/src/lib/process/index.ts +4 -0
  220. package/src/lib/process/type/command-options.ts +9 -0
  221. package/src/lib/process/utility/bind-process-lifespan-to.ts +10 -0
  222. package/src/lib/promise-wrapper/index.ts +3 -0
  223. package/src/lib/promise-wrapper/promise-wrapper.ts +51 -0
  224. package/src/lib/random/chance.ts +5 -0
  225. package/src/lib/random/element.ts +7 -0
  226. package/src/lib/random/elements.ts +12 -0
  227. package/src/lib/random/enum.ts +34 -0
  228. package/src/lib/random/enums.ts +11 -0
  229. package/src/lib/random/index.ts +3 -0
  230. package/src/lib/random/number.ts +8 -0
  231. package/src/lib/server/base.ts +194 -0
  232. package/src/lib/server/enum/server-event.ts +5 -0
  233. package/src/lib/server/enum/server-status.ts +10 -0
  234. package/src/lib/server/http/endpoint/ping.ts +21 -0
  235. package/src/lib/server/http/endpoint.ts +345 -0
  236. package/src/lib/server/http/interface/endpoint-constructor.ts +12 -0
  237. package/src/lib/server/http/interface/result-serializer.ts +5 -0
  238. package/src/lib/server/http/middleware.ts +18 -0
  239. package/src/lib/server/http/result-serializer/html.ts +92 -0
  240. package/src/lib/server/http/result-serializer/json.ts +23 -0
  241. package/src/lib/server/http/route.ts +104 -0
  242. package/src/lib/server/http/router.ts +125 -0
  243. package/src/lib/server/http/type/session-resolver.ts +8 -0
  244. package/src/lib/server/http/utility/create-server.ts +34 -0
  245. package/src/lib/server/http/utility/path-parser.ts +49 -0
  246. package/src/lib/server/http/utility/standardize-html-indentation.ts +54 -0
  247. package/src/lib/server/http/websocket-wrapper.ts +83 -0
  248. package/src/lib/server/http.ts +301 -0
  249. package/src/lib/server/index.ts +5 -0
  250. package/src/lib/server/tcp.ts +53 -0
  251. package/src/lib/server/type/server-options.ts +10 -0
  252. package/src/lib/string/calculate-length.ts +17 -0
  253. package/src/lib/string/capitalize.ts +8 -0
  254. package/src/lib/string/create-slug.ts +14 -0
  255. package/src/lib/string/enum/ansi-escape-code.ts +14 -0
  256. package/src/lib/string/enum/string-encoding.ts +9 -0
  257. package/src/lib/string/hyphenate.ts +5 -0
  258. package/src/lib/string/index.ts +3 -0
  259. package/src/lib/string/pad.ts +14 -0
  260. package/src/lib/string/trim-multiline.ts +21 -0
  261. package/src/lib/string/trim.ts +8 -0
  262. package/src/lib/tcp/channel.ts +13 -0
  263. package/src/lib/tcp/connection/incoming.ts +72 -0
  264. package/src/lib/tcp/connection/outgoing.ts +219 -0
  265. package/src/lib/tcp/connection.ts +360 -0
  266. package/src/lib/tcp/enum/connection-event.ts +12 -0
  267. package/src/lib/tcp/enum/message-type.ts +9 -0
  268. package/src/lib/tcp/index.ts +1 -0
  269. package/src/lib/tcp/type/connection-parameters.ts +6 -0
  270. package/src/lib/tcp/type/message/channel-close.ts +9 -0
  271. package/src/lib/tcp/type/message/channel-open.ts +9 -0
  272. package/src/lib/tcp/type/message.ts +10 -0
  273. package/src/lib/test/index.ts +2 -0
  274. package/src/lib/test/utility/build-config.ts +17 -0
  275. package/src/lib/test/utility/build-execution-context.ts +11 -0
  276. package/src/lib/time/bootstrap.ts +1 -0
  277. package/src/lib/time/enum/time-interval.ts +12 -0
  278. package/src/lib/time/index.ts +4 -0
  279. package/src/lib/time/utility/format-duration.ts +139 -0
  280. package/src/lib/time/utility/format-relative-duration.ts +22 -0
  281. package/src/lib/time/utility/sleep.ts +9 -0
  282. package/src/operation.ts +18 -0
  283. package/src/server/endpoint/abstract-page.ts +126 -0
  284. package/src/server/endpoint/action/create.ts +545 -0
  285. package/src/server/endpoint/action/get.ts +231 -0
  286. package/src/server/endpoint/base.ts +51 -0
  287. package/src/server/endpoint/day.ts +13 -0
  288. package/src/server/endpoint/generic-page.ts +14 -0
  289. package/src/server/endpoint/index.ts +11 -0
  290. package/src/server/endpoint/login.ts +45 -0
  291. package/src/server/endpoint/logout.ts +38 -0
  292. package/src/server/endpoint/month.ts +35 -0
  293. package/src/server/endpoint/robots.ts +18 -0
  294. package/src/server/endpoint/session/create.ts +62 -0
  295. package/src/server/endpoint/settings/get.ts +40 -0
  296. package/src/server/endpoint/settings/update.ts +44 -0
  297. package/src/server/endpoint/today.ts +15 -0
  298. package/src/server/endpoint/week.ts +34 -0
  299. package/src/server/endpoint/year.ts +34 -0
  300. package/src/server/enum/custom-page-type.ts +10 -0
  301. package/src/server/factory/block-result-serializer.ts +115 -0
  302. package/src/server/middleware/base.ts +6 -0
  303. package/src/server/middleware/error-handler.ts +177 -0
  304. package/src/server/middleware/static-file.ts +83 -0
  305. package/src/server/operation/add-block.ts +110 -0
  306. package/src/server/operation/create-session.ts +43 -0
  307. package/src/server/operation/delete-block.ts +96 -0
  308. package/src/server/operation/demote-block.ts +108 -0
  309. package/src/server/operation/destroy-session.ts +26 -0
  310. package/src/server/operation/load-account.ts +30 -0
  311. package/src/server/operation/load-block.ts +48 -0
  312. package/src/server/operation/load-directory-items.ts +75 -0
  313. package/src/server/operation/load-page.ts +368 -0
  314. package/src/server/operation/promote-block.ts +104 -0
  315. package/src/server/operation/save-page.ts +60 -0
  316. package/src/server/operation/update-account-settings.ts +52 -0
  317. package/src/server/operation/update-block.ts +124 -0
  318. package/src/server/repository/memory.ts +112 -0
  319. package/src/server/result-serializer/action.ts +939 -0
  320. package/src/server/result-serializer/base.ts +1267 -0
  321. package/src/server/result-serializer/block/audio.ts +33 -0
  322. package/src/server/result-serializer/block/background.ts +20 -0
  323. package/src/server/result-serializer/block/calendar.ts +148 -0
  324. package/src/server/result-serializer/block/directory.ts +57 -0
  325. package/src/server/result-serializer/block/ephemeral.ts +14 -0
  326. package/src/server/result-serializer/block/folder.ts +106 -0
  327. package/src/server/result-serializer/block/header.ts +31 -0
  328. package/src/server/result-serializer/block/image.ts +46 -0
  329. package/src/server/result-serializer/block/link.ts +40 -0
  330. package/src/server/result-serializer/block/list.ts +140 -0
  331. package/src/server/result-serializer/block/multi-column.ts +97 -0
  332. package/src/server/result-serializer/block/note.ts +44 -0
  333. package/src/server/result-serializer/block/todo.ts +78 -0
  334. package/src/server/result-serializer/block/whitespace.ts +15 -0
  335. package/src/server/result-serializer/block.ts +248 -0
  336. package/src/server/result-serializer/common/time-place-options.ts +33 -0
  337. package/src/server/result-serializer/login.ts +58 -0
  338. package/src/server/result-serializer/month.ts +170 -0
  339. package/src/server/result-serializer/page.ts +548 -0
  340. package/src/server/result-serializer/settings.ts +85 -0
  341. package/src/server/result-serializer/week.ts +195 -0
  342. package/src/server/result-serializer/year.ts +160 -0
  343. package/src/server/utility/accepts-content-type.ts +16 -0
  344. package/src/server/utility/accepts-html.ts +9 -0
  345. package/src/server/utility/accepts-json.ts +9 -0
  346. package/src/server/utility/add-days.ts +11 -0
  347. package/src/server/utility/create-date.ts +23 -0
  348. package/src/server/utility/create-index-path.ts +5 -0
  349. package/src/server/utility/create-slug.ts +9 -0
  350. package/src/server/utility/create-toast-path.ts +19 -0
  351. package/src/server/utility/date-less-than.ts +5 -0
  352. package/src/server/utility/date-occurs-before.ts +22 -0
  353. package/src/server/utility/date-to-key.ts +7 -0
  354. package/src/server/utility/date-to-label.ts +5 -0
  355. package/src/server/utility/date-to-path.ts +9 -0
  356. package/src/server/utility/dates-are-equal.ts +22 -0
  357. package/src/server/utility/dates-are-in-order.ts +9 -0
  358. package/src/server/utility/dates-are-on-the-same-day.ts +9 -0
  359. package/src/server/utility/dates-in-same-month.ts +8 -0
  360. package/src/server/utility/day-to-date.ts +40 -0
  361. package/src/server/utility/decrement-date.ts +11 -0
  362. package/src/server/utility/get-block-at-index-path.ts +32 -0
  363. package/src/server/utility/get-block-permissions.ts +15 -0
  364. package/src/server/utility/get-compact-label-for-date.ts +8 -0
  365. package/src/server/utility/get-custom-page-type-for-path.ts +37 -0
  366. package/src/server/utility/get-element-id-for-block.ts +15 -0
  367. package/src/server/utility/get-emoji-for-block-type.ts +39 -0
  368. package/src/server/utility/get-emoji-for-tool-type.ts +20 -0
  369. package/src/server/utility/get-end-of-month.ts +13 -0
  370. package/src/server/utility/get-end-of-week.ts +13 -0
  371. package/src/server/utility/get-filepath-for-folder-block.ts +23 -0
  372. package/src/server/utility/get-hex-for-color.ts +31 -0
  373. package/src/server/utility/get-label-for-time-place-visibility.ts +23 -0
  374. package/src/server/utility/get-month-name.ts +18 -0
  375. package/src/server/utility/get-next-day.ts +7 -0
  376. package/src/server/utility/get-next-month.ts +12 -0
  377. package/src/server/utility/get-next-week.ts +12 -0
  378. package/src/server/utility/get-next-year.ts +13 -0
  379. package/src/server/utility/get-ordinal-label-for-week.ts +11 -0
  380. package/src/server/utility/get-ordinal-of-week-within-month.ts +15 -0
  381. package/src/server/utility/get-padded-date.ts +11 -0
  382. package/src/server/utility/get-parent-index-path.ts +18 -0
  383. package/src/server/utility/get-path-for-folder-block.ts +25 -0
  384. package/src/server/utility/get-path-from-url.ts +13 -0
  385. package/src/server/utility/get-previous-index-path.ts +27 -0
  386. package/src/server/utility/get-previous-month.ts +12 -0
  387. package/src/server/utility/get-previous-week.ts +11 -0
  388. package/src/server/utility/get-previous-year.ts +13 -0
  389. package/src/server/utility/get-random-emoji-for-date.ts +109 -0
  390. package/src/server/utility/get-short-label-for-date.ts +11 -0
  391. package/src/server/utility/get-short-month-name.ts +9 -0
  392. package/src/server/utility/get-short-ordinal.ts +26 -0
  393. package/src/server/utility/get-siblings-and-index-for-index-path.ts +67 -0
  394. package/src/server/utility/get-start-of-month.ts +11 -0
  395. package/src/server/utility/get-start-of-week.ts +12 -0
  396. package/src/server/utility/get-start-of-year.ts +12 -0
  397. package/src/server/utility/get-weekday-name.ts +24 -0
  398. package/src/server/utility/increment-date.ts +15 -0
  399. package/src/server/utility/is-index-path.ts +5 -0
  400. package/src/server/utility/key-to-date.ts +25 -0
  401. package/src/server/utility/month-has-week-containing-date.ts +13 -0
  402. package/src/server/utility/month-to-date.ts +28 -0
  403. package/src/server/utility/month-to-path.ts +10 -0
  404. package/src/server/utility/months-are-equal.ts +8 -0
  405. package/src/server/utility/parse-index-path.ts +23 -0
  406. package/src/server/utility/path-is-date.ts +13 -0
  407. package/src/server/utility/path-to-date.ts +24 -0
  408. package/src/server/utility/subtract-days.ts +7 -0
  409. package/src/server/utility/validate-month.ts +10 -0
  410. package/src/server/utility/validate-page.ts +46 -0
  411. package/src/server/utility/validate-path.ts +9 -0
  412. package/src/server/utility/validate-url.ts +12 -0
  413. package/src/server/utility/week-greater-than.ts +10 -0
  414. package/src/server/utility/week-to-date.ts +8 -0
  415. package/src/server/utility/week-to-path.ts +12 -0
  416. package/src/server/utility/weeks-are-equal.ts +8 -0
  417. package/src/server/utility/year-to-date.ts +26 -0
  418. package/src/server/utility/year-to-path.ts +7 -0
  419. package/src/server/utility/years-are-equal.ts +8 -0
  420. package/src/server.ts +140 -0
  421. package/src/test.ts +195 -0
  422. package/src/type/account-settings.ts +9 -0
  423. package/src/type/account.ts +11 -0
  424. package/src/type/action/add-block.ts +74 -0
  425. package/src/type/action/complete-block.ts +10 -0
  426. package/src/type/action/delete-block.ts +11 -0
  427. package/src/type/action/demote-block.ts +9 -0
  428. package/src/type/action/edit-block.ts +11 -0
  429. package/src/type/action/promote-block.ts +9 -0
  430. package/src/type/action.ts +9 -0
  431. package/src/type/block/audio.ts +8 -0
  432. package/src/type/block/background.ts +10 -0
  433. package/src/type/block/directory.ts +18 -0
  434. package/src/type/block/ephemeral.ts +9 -0
  435. package/src/type/block/folder.ts +14 -0
  436. package/src/type/block/header.ts +11 -0
  437. package/src/type/block/image.ts +8 -0
  438. package/src/type/block/link.ts +12 -0
  439. package/src/type/block/list.ts +24 -0
  440. package/src/type/block/multi-column.ts +10 -0
  441. package/src/type/block/note.ts +9 -0
  442. package/src/type/block/todo.ts +10 -0
  443. package/src/type/block/whitespace.ts +9 -0
  444. package/src/type/block-metadata.ts +14 -0
  445. package/src/type/block.ts +18 -0
  446. package/src/type/day.ts +5 -0
  447. package/src/type/field-definition.ts +8 -0
  448. package/src/type/field-value.ts +5 -0
  449. package/src/type/file.ts +6 -0
  450. package/src/type/month.ts +5 -0
  451. package/src/type/page.ts +8 -0
  452. package/src/type/price.ts +11 -0
  453. package/src/type/resource.ts +5 -0
  454. package/src/type/runtime-config.ts +13 -0
  455. package/src/type/server-settings.ts +17 -0
  456. package/src/type/toast.ts +8 -0
  457. package/src/type/week.ts +5 -0
  458. package/src/type/year.ts +5 -0
  459. package/test/unit/index.ts +11 -0
  460. package/test/unit/server/operation/promote-block.ts +84 -0
@@ -0,0 +1,76 @@
1
+ import {NetworkProtocol} from 'lib/network';
2
+ import {InvalidError} from 'lib/errors';
3
+
4
+ const URL_REGEX = /^([a-z]+):\/\/([^\/]+)(.*)$/;
5
+
6
+ interface ParsedUrl {
7
+ readonly protocol: NetworkProtocol;
8
+ readonly hostname: string;
9
+ readonly port: number;
10
+ readonly path: string;
11
+ }
12
+
13
+ class UrlParser {
14
+ private url: string;
15
+
16
+ public constructor(url: string) {
17
+ this.url = url;
18
+ }
19
+
20
+ public parse(): ParsedUrl {
21
+ const url = this.getUrl();
22
+ const match = url.match(URL_REGEX);
23
+
24
+ if (match === null) {
25
+ throw new InvalidError(`Unable to parse invalid url: ${url}`);
26
+ }
27
+
28
+ const protocol = match[1] as NetworkProtocol;
29
+ const prefix = match[2];
30
+ const path = match[3];
31
+
32
+ let hostname: string;
33
+ let port: number;
34
+
35
+ const colon_index = prefix.indexOf(':');
36
+
37
+ if (colon_index !== -1) {
38
+ hostname = prefix.slice(0, colon_index);
39
+
40
+ const raw_port = prefix.slice(colon_index + 1);
41
+
42
+ port = parseInt(raw_port);
43
+ } else {
44
+ hostname = prefix;
45
+ port = this.getDefaultPortForProtocol(protocol);
46
+ }
47
+
48
+ return {
49
+ protocol,
50
+ hostname,
51
+ port,
52
+ path
53
+ };
54
+ }
55
+
56
+ private getDefaultPortForProtocol(protocol: NetworkProtocol): number {
57
+ switch (protocol) {
58
+ case NetworkProtocol.HTTP:
59
+ case NetworkProtocol.WEBSOCKET:
60
+ return 80;
61
+
62
+ case NetworkProtocol.HTTPS:
63
+ case NetworkProtocol.SECURE_WEBSOCKET:
64
+ return 443;
65
+
66
+ default:
67
+ throw new InvalidError(`Unsupported protocol: ${protocol}`);
68
+ }
69
+ }
70
+
71
+ private getUrl(): string {
72
+ return this.url;
73
+ }
74
+ }
75
+
76
+ export default UrlParser;
@@ -0,0 +1,299 @@
1
+ import URL from 'url';
2
+ import HTTP from 'http';
3
+ import {TLSSocket} from 'tls';
4
+ import Stream from 'stream';
5
+
6
+ import ExecutionContext, {Session} from 'lib/execution-context';
7
+ import {NetworkProtocol} from 'lib/network';
8
+ import {TagMap} from 'lib/metrics';
9
+
10
+ import Request from 'lib/http/request';
11
+ import HeaderMap from 'lib/http/type/header-map';
12
+ import HttpHeader from 'lib/http/enum/header';
13
+ import HttpMethod from 'lib/http/enum/method';
14
+ import ContentType from 'lib/http/enum/content-type';
15
+ import CookieParser from 'lib/http/parser/cookie';
16
+ import PathParameters from 'lib/http/type/path-parameters';
17
+ import BodyParserFactory from 'lib/http/factory/body-parser';
18
+
19
+ const KNOWN_CONTENT_TYPES = Object.values(ContentType);
20
+
21
+ class IncomingRequest extends Request {
22
+ private native_request: HTTP.IncomingMessage;
23
+ private path_parameters: PathParameters | undefined;
24
+
25
+ public constructor(
26
+ native_request: HTTP.IncomingMessage,
27
+ execution_context: ExecutionContext
28
+ ) {
29
+ super(execution_context);
30
+
31
+ this.native_request = native_request;
32
+
33
+ const parsed_url = URL.parse(native_request.url || '/', true);
34
+
35
+ this.setPath(parsed_url.pathname as string);
36
+ this.setHeaders(native_request.headers as HeaderMap);
37
+ this.setMethod(native_request.method as HttpMethod);
38
+ this.updateExecutionContext();
39
+ }
40
+
41
+ public setPathParameters(path_parameters: PathParameters): void {
42
+ this.path_parameters = path_parameters;
43
+ }
44
+
45
+ public getProtocol(): NetworkProtocol {
46
+ const native_request = this.getNativeRequest();
47
+ const tls_socket = native_request.socket as TLSSocket;
48
+ const encrypted = tls_socket.encrypted;
49
+
50
+ if (encrypted) {
51
+ return NetworkProtocol.HTTPS;
52
+ } else {
53
+ return NetworkProtocol.HTTP;
54
+ }
55
+ }
56
+
57
+ public getOrigin(): string {
58
+ const origin = this.getHeaderValue(HttpHeader.ORIGIN);
59
+
60
+ return origin || '';
61
+ }
62
+
63
+ public getRemoteAddress(): string {
64
+ const forwarded_for_header = this.getHeaderValue(
65
+ HttpHeader.X_FORWARDED_FOR
66
+ );
67
+
68
+ if (forwarded_for_header) {
69
+ return forwarded_for_header;
70
+ }
71
+
72
+ const native_request = this.getNativeRequest();
73
+
74
+ return native_request.socket.remoteAddress || '<not set>';
75
+ }
76
+
77
+ public getAcceptedContentTypes(): ContentType[] {
78
+ const header_value = this.getHeaderValue(HttpHeader.ACCEPT);
79
+
80
+ if (header_value === undefined) {
81
+ return [ContentType.JSON];
82
+ }
83
+
84
+ const parts = header_value.split(',');
85
+ const content_types: ContentType[] = [];
86
+
87
+ parts.forEach((part) => {
88
+ // Trim off any trailing relative quality factor values.
89
+ // (See https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4)
90
+ const subparts = part.split(';');
91
+ const content_type = subparts[0] as ContentType;
92
+
93
+ if (KNOWN_CONTENT_TYPES.includes(content_type)) {
94
+ content_types.push(content_type);
95
+ }
96
+ });
97
+
98
+ return content_types;
99
+ }
100
+
101
+ public hasOrigin(): boolean {
102
+ return this.getOrigin() !== '';
103
+ }
104
+
105
+ public hasParameter(key: string): boolean {
106
+ return this.getParameter(key) !== undefined;
107
+ }
108
+
109
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
110
+ public getParameter(key: string): any {
111
+ if (this.hasBodyParameter(key)) {
112
+ return this.getBodyParameter(key);
113
+ }
114
+
115
+ if (this.hasPathParameter(key)) {
116
+ return this.getPathParameter(key);
117
+ }
118
+
119
+ if (this.hasQueryParameter(key)) {
120
+ return this.getQueryParameter(key);
121
+ }
122
+
123
+ return undefined;
124
+ }
125
+
126
+ public getQueryParameter(key: string): string | string[] | undefined {
127
+ const native_request = this.getNativeRequest();
128
+ const url_parts = URL.parse(native_request.url || '/', true);
129
+
130
+ return url_parts.query[key];
131
+ }
132
+
133
+ public getPathParameter(key: string): string | undefined {
134
+ const path_parameters = this.getPathParameters();
135
+
136
+ return path_parameters[key];
137
+ }
138
+
139
+ /**
140
+ * We want this method to be publicly accessible, but only for this class,
141
+ * as opposed to all HttpTransaction subclasses.
142
+ */
143
+ public end(): void {
144
+ super.end();
145
+ }
146
+
147
+ public getSessionIdFromCookie(): string | undefined {
148
+ const cookie_header = this.getHeaderValue(HttpHeader.COOKIE);
149
+
150
+ if (!cookie_header) {
151
+ return undefined;
152
+ }
153
+
154
+ const cookie_parser = new CookieParser(cookie_header);
155
+
156
+ return cookie_parser.getSessionId();
157
+ }
158
+
159
+ public hasSessionIdFromCookie(): boolean {
160
+ return this.getSessionIdFromCookie() !== undefined;
161
+ }
162
+
163
+ public setSession(session: Session): this {
164
+ this.getExecutionContext().setSession(session);
165
+
166
+ return this;
167
+ }
168
+
169
+ public getSession(): Session | undefined {
170
+ return this.getExecutionContext().getSession();
171
+ }
172
+
173
+ public getStream(): Stream.Readable {
174
+ const native_request = this.getNativeRequest();
175
+
176
+ return native_request as Stream.Readable;
177
+ }
178
+
179
+ public async parseBody(): Promise<void> {
180
+ if (!this.hasParsableMethod()) {
181
+ this.setData({});
182
+
183
+ return Promise.resolve();
184
+ }
185
+
186
+ const stream = this.getStream();
187
+ const content_type = this.getContentType() || ContentType.TEXT;
188
+ const native_request = this.getNativeRequest();
189
+ const factory = new BodyParserFactory(stream, content_type, native_request);
190
+ const parser = factory.getParser();
191
+ const body = await parser.parse();
192
+
193
+ this.setData(body);
194
+ }
195
+
196
+ public getAllowedCorsOrigin(): string {
197
+ if (this.hasOrigin()) {
198
+ return this.getOrigin();
199
+ } else {
200
+ return 'null';
201
+ }
202
+ }
203
+
204
+ /**
205
+ * When the browser makes a CORS request, it will normally request the ability
206
+ * to send certain headers to the server. We should just parrot back whatever
207
+ * value they request if so. However, if they *don't* explicitly request a
208
+ * list of headers, we should return the ones that we think it is most likely
209
+ * to send.
210
+ */
211
+ public getAllowedCorsHeaders(): HttpHeader[] {
212
+ const header_string = this.getHeaderValue(
213
+ HttpHeader.ACCESS_CONTROL_REQUEST_HEADERS
214
+ );
215
+
216
+ if (header_string === undefined) {
217
+ return [HttpHeader.CONTENT_LENGTH, HttpHeader.CONTENT_TYPE];
218
+ }
219
+
220
+ const headers = header_string.split(',');
221
+
222
+ return headers as HttpHeader[];
223
+ }
224
+
225
+ public getNativeRequest(): HTTP.IncomingMessage {
226
+ return this.native_request;
227
+ }
228
+
229
+ protected getCountMetricName(): string {
230
+ return 'incoming_requests';
231
+ }
232
+
233
+ protected getTimingMetricName(): string {
234
+ return 'incoming_request_time';
235
+ }
236
+
237
+ protected getMetricTags(): TagMap {
238
+ return {
239
+ // TODO: yeah.
240
+ endpoint: 'REPLACE ME'
241
+ };
242
+ }
243
+
244
+ private hasPathParameter(key: string): boolean {
245
+ return this.getPathParameter(key) !== undefined;
246
+ }
247
+
248
+ private hasQueryParameter(key: string): boolean {
249
+ return this.getQueryParameter(key) !== undefined;
250
+ }
251
+
252
+ private hasParsableMethod(): boolean {
253
+ const method = this.getMethod();
254
+
255
+ switch (method) {
256
+ case HttpMethod.POST:
257
+ case HttpMethod.PUT:
258
+ case HttpMethod.PATCH:
259
+ return true;
260
+ default:
261
+ return false;
262
+ }
263
+ }
264
+
265
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
266
+ private getBodyParameter(key: string): any {
267
+ if (!this.hasData()) {
268
+ throw new Error('Tried to read body parameter, but data was not set');
269
+ }
270
+
271
+ const data = this.getData();
272
+
273
+ if (Array.isArray(data)) {
274
+ throw new Error('Tried to read body parameter, but data was array');
275
+ }
276
+
277
+ return data[key];
278
+ }
279
+
280
+ private hasBodyParameter(key: string): boolean {
281
+ return this.getBodyParameter(key) !== undefined;
282
+ }
283
+
284
+ private getPathParameters(): PathParameters {
285
+ if (this.path_parameters === undefined) {
286
+ throw new Error('Tried to read URL parameters, but they were not set');
287
+ }
288
+
289
+ return this.path_parameters;
290
+ }
291
+
292
+ private updateExecutionContext(): void {
293
+ const context = this.getExecutionContext();
294
+
295
+ context.setRemoteAddress(this.getRemoteAddress());
296
+ }
297
+ }
298
+
299
+ export default IncomingRequest;
@@ -0,0 +1,276 @@
1
+ import HTTP from 'http';
2
+ import {URL} from 'url';
3
+ import Stream from 'stream';
4
+
5
+ import PromiseWrapper from 'lib/promise-wrapper';
6
+ import {NetworkProtocol} from 'lib/network';
7
+ import {InvariantViolation} from 'lib/errors';
8
+ import ExecutionContext from 'lib/execution-context';
9
+ import {TagMap} from 'lib/metrics';
10
+
11
+ import Request from 'lib/http/request';
12
+ import UrlParser from 'lib/http/parser/url';
13
+ import HttpHeader from 'lib/http/enum/header';
14
+ import HttpMethod from 'lib/http/enum/method';
15
+ import ContentType from 'lib/http/enum/content-type';
16
+ import ClientRequest from 'lib/http/interface/client-request';
17
+ import RequestOptions from 'lib/http/type/request-options';
18
+ import IncomingResponse from 'lib/http/response/incoming';
19
+ import BasicAuthCredentials from 'lib/http/type/basic-auth-credentials';
20
+ import getLibraryForProtocol from 'lib/http/utility/get-library-for-protocol';
21
+ import BasicAuthHeaderSerializer from 'lib/http/serializer/basic-auth-header';
22
+
23
+ class OutgoingRequest extends Request {
24
+ private response: IncomingResponse | undefined;
25
+ private sent: boolean;
26
+ private stream: Stream.Readable | undefined;
27
+ private url: string;
28
+
29
+ public constructor(url: string, execution_context: ExecutionContext) {
30
+ super(execution_context);
31
+
32
+ this.sent = false;
33
+ this.url = '';
34
+ this.setUrl(url);
35
+ }
36
+
37
+ public setUrl(url: string): this {
38
+ this.url = url;
39
+
40
+ const parsed_url = new URL(url);
41
+
42
+ return this.setPath(parsed_url.pathname);
43
+ }
44
+
45
+ public getUrl(): string {
46
+ if (this.url === undefined) {
47
+ throw new Error('Tried to read url, but it was not set');
48
+ }
49
+
50
+ return this.url;
51
+ }
52
+
53
+ public getContentType(): ContentType {
54
+ const explicit_content_type = super.getContentType();
55
+
56
+ if (explicit_content_type) {
57
+ return explicit_content_type;
58
+ }
59
+
60
+ if (this.hasData()) {
61
+ return ContentType.JSON;
62
+ }
63
+
64
+ if (this.hasStream()) {
65
+ throw new InvariantViolation(
66
+ 'Content type should be set when reading from stream'
67
+ );
68
+ }
69
+
70
+ return ContentType.TEXT;
71
+ }
72
+
73
+ // eslint-disable-next-line @typescript-eslint/ban-types
74
+ public get(): Promise<object> {
75
+ this.setMethod(HttpMethod.GET);
76
+ return this.send();
77
+ }
78
+
79
+ // eslint-disable-next-line @typescript-eslint/ban-types
80
+ public post(): Promise<object> {
81
+ this.setMethod(HttpMethod.POST);
82
+ return this.send();
83
+ }
84
+
85
+ // eslint-disable-next-line @typescript-eslint/ban-types
86
+ public put(): Promise<object> {
87
+ this.setMethod(HttpMethod.PUT);
88
+ return this.send();
89
+ }
90
+
91
+ // eslint-disable-next-line @typescript-eslint/ban-types
92
+ public patch(): Promise<object> {
93
+ this.setMethod(HttpMethod.PATCH);
94
+ return this.send();
95
+ }
96
+
97
+ // TODO: make this private
98
+ // eslint-disable-next-line @typescript-eslint/ban-types
99
+ public async send(): Promise<object> {
100
+ if (this.wasSent()) {
101
+ return Promise.reject(new Error('Request was already sent'));
102
+ }
103
+
104
+ this.sent = true;
105
+ this.assignHeaders();
106
+
107
+ const options = this.getOptions();
108
+ const response = this.getResponse();
109
+ const response_promise = response.getPromise();
110
+ const protocol = this.getProtocol();
111
+ const network_library = getLibraryForProtocol(protocol);
112
+
113
+ const request = network_library.request(options, (native_response) => {
114
+ response.setNativeResponse(native_response);
115
+ });
116
+
117
+ // eslint-disable-next-line @typescript-eslint/ban-types
118
+ const promise_wrapper = new PromiseWrapper<object>();
119
+
120
+ request.on('error', (error) => {
121
+ promise_wrapper.reject(error);
122
+ });
123
+
124
+ response_promise
125
+ .then((result) => {
126
+ promise_wrapper.resolve(result);
127
+ })
128
+ .catch((error) => {
129
+ promise_wrapper.reject(error);
130
+ });
131
+
132
+ await this.writeBody(request);
133
+
134
+ request.end();
135
+ this.end();
136
+
137
+ return promise_wrapper.getPromise();
138
+ }
139
+
140
+ public getResponse(): IncomingResponse {
141
+ if (this.response === undefined) {
142
+ this.response = this.createResponse();
143
+ }
144
+
145
+ return this.response;
146
+ }
147
+
148
+ public setBasicAuthCredentials(credentials: BasicAuthCredentials): this {
149
+ const serializer = new BasicAuthHeaderSerializer(credentials);
150
+ const header_value = serializer.serialize();
151
+
152
+ this.setHeaderValue(HttpHeader.AUTHORIZATION, header_value);
153
+
154
+ return this;
155
+ }
156
+
157
+ public setStream(stream: Stream.Readable, content_type: ContentType): this {
158
+ this.stream = stream;
159
+ this.setContentType(content_type);
160
+
161
+ return this;
162
+ }
163
+
164
+ protected getCountMetricName(): string {
165
+ return 'outgoing_requests';
166
+ }
167
+
168
+ protected getTimingMetricName(): string {
169
+ return 'outgoing_request_time';
170
+ }
171
+
172
+ protected getMetricTags(): TagMap {
173
+ return {};
174
+ }
175
+
176
+ private wasSent(): boolean {
177
+ return this.sent;
178
+ }
179
+
180
+ private getProtocol(): NetworkProtocol {
181
+ const url = this.getUrl();
182
+ const index = url.indexOf('://');
183
+
184
+ if (index === -1) {
185
+ throw new Error(`Unable to determine protocol for url: ${url}`);
186
+ }
187
+
188
+ const prefix = url.slice(0, index);
189
+
190
+ return prefix as NetworkProtocol;
191
+ }
192
+
193
+ private assignHeaders(): void {
194
+ if (!this.hasHeaderValue(HttpHeader.CONTENT_LENGTH) && !this.hasStream()) {
195
+ this.setHeaderValue(HttpHeader.CONTENT_LENGTH, this.getContentLength());
196
+ }
197
+
198
+ if (!this.hasHeaderValue(HttpHeader.CONTENT_TYPE)) {
199
+ this.setHeaderValue(HttpHeader.CONTENT_TYPE, this.getContentType());
200
+ }
201
+ }
202
+
203
+ private getContentLength(): number {
204
+ return Buffer.byteLength(this.getBody());
205
+ }
206
+
207
+ private getOptions(): RequestOptions {
208
+ const url = this.getUrl();
209
+ const parser = new UrlParser(url);
210
+ const parsed_url = parser.parse();
211
+
212
+ // TODO: Verify that the parsed protocol matches this.getProtocol() maybe?
213
+
214
+ return {
215
+ // Node requires that the protocol end with a trailing colon:
216
+ protocol: `${parsed_url.protocol}:`,
217
+ hostname: parsed_url.hostname,
218
+ port: parsed_url.port,
219
+ path: parsed_url.path,
220
+ method: this.getMethod(),
221
+ headers: this.getHeaders()
222
+ };
223
+ }
224
+
225
+ private async writeBody(request: ClientRequest): Promise<void> {
226
+ if (this.hasBody()) {
227
+ request.write(this.getBody());
228
+
229
+ return Promise.resolve();
230
+ }
231
+
232
+ const stream = this.getStream();
233
+
234
+ if (stream === undefined) {
235
+ return Promise.resolve();
236
+ }
237
+
238
+ const promise_wrapper = new PromiseWrapper<void>();
239
+ const cast_request = request as HTTP.ClientRequest;
240
+ const cast_stream = stream;
241
+
242
+ // cast_stream.pipe(cast_request);
243
+ cast_stream.on('data', (data) => {
244
+ cast_request.write(data);
245
+ });
246
+
247
+ cast_stream.on('end', () => {
248
+ promise_wrapper.resolve();
249
+ });
250
+
251
+ return promise_wrapper.getPromise();
252
+ }
253
+
254
+ private getStream(): Stream.Readable | undefined {
255
+ return this.stream;
256
+ }
257
+
258
+ private hasStream(): boolean {
259
+ return this.stream !== undefined;
260
+ }
261
+
262
+ private createResponse(): IncomingResponse {
263
+ const response = new IncomingResponse()
264
+ .setExecutionContext(this.getExecutionContext())
265
+ .setUrl(this.getUrl())
266
+ .setMethod(this.getMethod());
267
+
268
+ if (this.loggingIsDisabled()) {
269
+ response.disableLogging();
270
+ }
271
+
272
+ return response;
273
+ }
274
+ }
275
+
276
+ export default OutgoingRequest;
@@ -0,0 +1,26 @@
1
+ import {LogLevel} from 'lib/logger';
2
+ import ExecutionContext from 'lib/execution-context';
3
+
4
+ import Transaction from 'lib/http/transaction';
5
+ import LogAttributes from 'lib/http/type/log-attributes';
6
+
7
+ abstract class Request extends Transaction {
8
+ public constructor(execution_context: ExecutionContext) {
9
+ super(execution_context);
10
+ }
11
+
12
+ protected getLogAttributes(): LogAttributes {
13
+ return {
14
+ class_name: this.constructor.name,
15
+ http_method: this.getMethod(),
16
+ path: this.getSanitizedPath(),
17
+ body: this.getBodyAsString()
18
+ };
19
+ }
20
+
21
+ protected getLogLevel(): LogLevel {
22
+ return LogLevel.INFO;
23
+ }
24
+ }
25
+
26
+ export default Request;