@toa.io/extensions.exposition 0.24.0-alpha.9 → 1.0.0-alpha.10

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 (444) hide show
  1. package/components/context.toa.yaml +12 -0
  2. package/components/identity.bans/manifest.toa.yaml +2 -1
  3. package/components/identity.basic/manifest.toa.yaml +5 -1
  4. package/components/identity.basic/operations/authenticate.js +1 -2
  5. package/components/identity.basic/operations/authenticate.js.map +1 -1
  6. package/components/identity.basic/operations/transit.js.map +1 -1
  7. package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
  8. package/components/identity.basic/source/authenticate.ts +0 -1
  9. package/components/identity.federation/events/principal.js +22 -0
  10. package/components/identity.federation/manifest.toa.yaml +94 -0
  11. package/components/identity.federation/operations/authenticate.d.ts +3 -0
  12. package/components/identity.federation/operations/authenticate.js +20 -0
  13. package/components/identity.federation/operations/authenticate.js.map +1 -0
  14. package/components/identity.federation/operations/create.d.ts +10 -0
  15. package/components/identity.federation/operations/create.js +15 -0
  16. package/components/identity.federation/operations/create.js.map +1 -0
  17. package/components/identity.federation/operations/lib/assertions-as-values.d.ts +4 -0
  18. package/components/identity.federation/operations/lib/assertions-as-values.js +45 -0
  19. package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -0
  20. package/components/identity.federation/operations/lib/jwt.d.ts +20 -0
  21. package/components/identity.federation/operations/lib/jwt.js +136 -0
  22. package/components/identity.federation/operations/lib/jwt.js.map +1 -0
  23. package/components/identity.federation/operations/schemas.d.ts +59 -0
  24. package/components/identity.federation/operations/schemas.js +9 -0
  25. package/components/identity.federation/operations/schemas.js.map +1 -0
  26. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -0
  27. package/components/identity.federation/operations/types.d.ts +51 -0
  28. package/components/identity.federation/operations/types.js +3 -0
  29. package/components/identity.federation/operations/types.js.map +1 -0
  30. package/components/identity.federation/source/authenticate.ts +28 -0
  31. package/components/identity.federation/source/create.ts +26 -0
  32. package/components/identity.federation/source/lib/assertions-as-values.ts +19 -0
  33. package/components/identity.federation/source/lib/jwt.test.ts +56 -0
  34. package/components/identity.federation/source/lib/jwt.ts +171 -0
  35. package/components/identity.federation/source/schemas.ts +61 -0
  36. package/components/identity.federation/source/types.ts +56 -0
  37. package/components/identity.federation/tsconfig.json +9 -0
  38. package/components/identity.roles/manifest.toa.yaml +17 -5
  39. package/components/identity.roles/operations/grant.d.ts +10 -0
  40. package/components/identity.roles/operations/grant.js +20 -0
  41. package/components/identity.roles/operations/grant.js.map +1 -0
  42. package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
  43. package/components/identity.roles/operations/lib/Entity.js +3 -0
  44. package/components/identity.roles/operations/lib/Entity.js.map +1 -0
  45. package/components/identity.roles/operations/list.d.ts +1 -4
  46. package/components/identity.roles/operations/list.js.map +1 -1
  47. package/components/identity.roles/operations/principal.d.ts +4 -6
  48. package/components/identity.roles/operations/principal.js +6 -1
  49. package/components/identity.roles/operations/principal.js.map +1 -1
  50. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
  51. package/components/identity.roles/source/grant.ts +31 -0
  52. package/components/identity.roles/source/lib/Entity.ts +5 -0
  53. package/components/identity.roles/source/list.ts +2 -4
  54. package/components/identity.roles/source/principal.ts +10 -8
  55. package/components/identity.tokens/manifest.toa.yaml +1 -1
  56. package/components/identity.tokens/operations/authenticate.js.map +1 -1
  57. package/components/identity.tokens/operations/decrypt.js.map +1 -1
  58. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
  59. package/components/octets.storage/manifest.toa.yaml +1 -0
  60. package/components/octets.storage/operations/store.js +3 -3
  61. package/cucumber.js +0 -1
  62. package/documentation/access.md +11 -11
  63. package/documentation/components.md +48 -12
  64. package/documentation/identity.md +14 -7
  65. package/documentation/io.md +56 -0
  66. package/documentation/octets.md +102 -37
  67. package/documentation/protocol.md +21 -1
  68. package/documentation/query.md +51 -6
  69. package/documentation/tree.md +22 -4
  70. package/documentation/vary.md +69 -0
  71. package/features/access.feature +13 -2
  72. package/features/annotation.feature +1 -0
  73. package/features/body.feature +3 -1
  74. package/features/cache.feature +3 -0
  75. package/features/cors.feature +72 -0
  76. package/features/directives.feature +2 -0
  77. package/features/dynamic.feature +14 -7
  78. package/features/errors.feature +4 -3
  79. package/features/etag.feature +97 -0
  80. package/features/identity.basic.feature +68 -0
  81. package/features/identity.feature +19 -3
  82. package/features/identity.federation.feature +153 -0
  83. package/features/identity.roles.feature +151 -0
  84. package/features/identity.tokens.feature +3 -0
  85. package/features/io.feature +167 -0
  86. package/features/octets.entries.feature +123 -0
  87. package/features/octets.feature +4 -28
  88. package/features/octets.meta.feature +66 -0
  89. package/features/octets.workflows.feature +177 -4
  90. package/features/queries.feature +9 -1
  91. package/features/response.feature +68 -0
  92. package/features/routes.feature +54 -10
  93. package/features/steps/Captures.ts +6 -0
  94. package/features/steps/Components.ts +18 -6
  95. package/features/steps/Database.ts +1 -1
  96. package/features/steps/Gateway.ts +4 -2
  97. package/features/steps/HTTP.ts +34 -6
  98. package/features/steps/IdP.ts +149 -0
  99. package/features/steps/Parameters.ts +8 -2
  100. package/features/steps/Workspace.ts +5 -7
  101. package/features/steps/components/echo/manifest.toa.yaml +1 -0
  102. package/features/steps/components/echo/operations/error.js +11 -0
  103. package/features/steps/components/greeter/manifest.toa.yaml +1 -0
  104. package/features/steps/components/octets.tester/manifest.toa.yaml +4 -0
  105. package/features/steps/components/octets.tester/operations/concat.js +7 -0
  106. package/features/steps/components/octets.tester/operations/echo.js +7 -0
  107. package/features/steps/components/pots/manifest.toa.yaml +12 -3
  108. package/features/steps/components/sequences/manifest.toa.yaml +1 -0
  109. package/features/steps/components/users/manifest.toa.yaml +4 -0
  110. package/features/steps/components/users.properties/manifest.toa.yaml +14 -0
  111. package/features/steps/tsconfig.json +1 -1
  112. package/features/timing.feature +66 -0
  113. package/features/vary.feature +180 -0
  114. package/package.json +16 -20
  115. package/readme.md +7 -6
  116. package/schemas/annotation.cos.yaml +1 -0
  117. package/schemas/io/input.cos.yaml +3 -0
  118. package/schemas/io/message.cos.yaml +5 -0
  119. package/schemas/io/output.cos.yaml +5 -0
  120. package/schemas/octets/delete.cos.yaml +2 -1
  121. package/schemas/octets/list.cos.yaml +2 -1
  122. package/schemas/octets/workflow.cos.yaml +12 -0
  123. package/schemas/querystring.cos.yaml +1 -0
  124. package/source/Annotation.ts +1 -0
  125. package/source/Context.ts +6 -4
  126. package/source/Directive.test.ts +14 -8
  127. package/source/Directive.ts +26 -49
  128. package/source/Endpoint.ts +53 -6
  129. package/source/Factory.ts +23 -12
  130. package/source/Gateway.ts +45 -42
  131. package/source/HTTP/Context.ts +67 -0
  132. package/source/HTTP/Server.test.ts +61 -134
  133. package/source/HTTP/Server.ts +83 -87
  134. package/source/HTTP/Timing.ts +40 -0
  135. package/source/HTTP/formats/msgpack.ts +9 -6
  136. package/source/HTTP/formats/text.ts +1 -1
  137. package/source/HTTP/formats/yaml.ts +1 -1
  138. package/source/HTTP/index.ts +1 -0
  139. package/source/HTTP/messages.test.ts +27 -8
  140. package/source/HTTP/messages.ts +38 -42
  141. package/source/Interception.ts +24 -0
  142. package/source/Mapping.ts +7 -8
  143. package/source/RTD/Context.ts +7 -10
  144. package/source/RTD/Directives.ts +28 -4
  145. package/source/RTD/Endpoint.ts +6 -4
  146. package/source/RTD/Match.ts +2 -7
  147. package/source/RTD/Method.ts +7 -13
  148. package/source/RTD/Node.ts +13 -14
  149. package/source/RTD/Tree.ts +19 -15
  150. package/source/RTD/factory.ts +2 -5
  151. package/source/RTD/syntax/parse.ts +6 -6
  152. package/source/RTD/syntax/types.ts +1 -1
  153. package/source/deployment.ts +7 -2
  154. package/source/directives/auth/Anonymous.ts +3 -2
  155. package/source/directives/auth/{Family.ts → Authorization.ts} +39 -40
  156. package/source/directives/auth/Delegate.ts +32 -0
  157. package/source/directives/auth/Incept.ts +11 -6
  158. package/source/directives/auth/Role.ts +5 -3
  159. package/source/directives/auth/Rule.ts +2 -2
  160. package/source/directives/auth/Scheme.ts +2 -2
  161. package/source/directives/auth/index.ts +2 -2
  162. package/source/directives/auth/schemes.ts +2 -1
  163. package/source/directives/auth/types.ts +9 -6
  164. package/source/directives/cache/{Family.ts → Cache.ts} +6 -7
  165. package/source/directives/cache/Control.ts +5 -5
  166. package/source/directives/cache/index.ts +2 -2
  167. package/source/directives/cache/types.ts +2 -2
  168. package/source/directives/cors/CORS.ts +62 -0
  169. package/source/directives/cors/index.ts +3 -0
  170. package/source/directives/dev/{Family.ts → Development.ts} +4 -5
  171. package/source/directives/dev/Stub.ts +4 -4
  172. package/source/directives/dev/Throw.ts +4 -4
  173. package/source/directives/dev/index.ts +2 -2
  174. package/source/directives/dev/types.ts +1 -1
  175. package/source/directives/index.ts +11 -6
  176. package/source/directives/io/Directive.ts +11 -0
  177. package/source/directives/io/IO.ts +43 -0
  178. package/source/directives/io/Input.ts +50 -0
  179. package/source/directives/io/Message.ts +1 -0
  180. package/source/directives/io/Output.ts +69 -0
  181. package/source/directives/io/index.ts +3 -0
  182. package/source/directives/io/schemas.ts +12 -0
  183. package/source/directives/octets/Context.ts +6 -5
  184. package/source/directives/octets/Delete.ts +64 -11
  185. package/source/directives/octets/Directive.ts +10 -0
  186. package/source/directives/octets/Fetch.ts +44 -29
  187. package/source/directives/octets/List.ts +50 -10
  188. package/source/directives/octets/{Family.ts → Octets.ts} +14 -9
  189. package/source/directives/octets/Permute.ts +18 -11
  190. package/source/directives/octets/Store.ts +70 -102
  191. package/source/directives/octets/Workflow.ts +48 -0
  192. package/source/directives/octets/index.ts +2 -2
  193. package/source/directives/octets/schemas.test.ts +21 -0
  194. package/source/directives/octets/schemas.ts +13 -6
  195. package/source/directives/octets/types.ts +2 -8
  196. package/source/directives/octets/workflows/Execution.ts +76 -0
  197. package/source/directives/octets/workflows/Workflow.ts +37 -0
  198. package/source/directives/octets/workflows/index.ts +1 -0
  199. package/source/directives/vary/Directive.ts +6 -0
  200. package/source/directives/vary/Embed.ts +62 -0
  201. package/source/directives/vary/Properties.ts +17 -0
  202. package/source/directives/vary/Vary.ts +48 -0
  203. package/source/directives/vary/embeddings/Embedding.ts +6 -0
  204. package/source/directives/vary/embeddings/Header.ts +32 -0
  205. package/source/directives/vary/embeddings/Language.ts +31 -0
  206. package/source/directives/vary/embeddings/index.ts +11 -0
  207. package/source/directives/vary/index.ts +3 -0
  208. package/source/exceptions.ts +13 -9
  209. package/source/io.ts +4 -0
  210. package/source/manifest.test.ts +6 -14
  211. package/source/manifest.ts +9 -6
  212. package/source/root.ts +5 -0
  213. package/source/schemas.ts +7 -3
  214. package/transpiled/Annotation.d.ts +1 -0
  215. package/transpiled/Composition.js.map +1 -1
  216. package/transpiled/Context.d.ts +6 -4
  217. package/transpiled/Directive.d.ts +11 -25
  218. package/transpiled/Directive.js +17 -18
  219. package/transpiled/Directive.js.map +1 -1
  220. package/transpiled/Endpoint.d.ts +7 -5
  221. package/transpiled/Endpoint.js +58 -2
  222. package/transpiled/Endpoint.js.map +1 -1
  223. package/transpiled/Factory.d.ts +0 -1
  224. package/transpiled/Factory.js +14 -7
  225. package/transpiled/Factory.js.map +1 -1
  226. package/transpiled/Gateway.d.ts +7 -8
  227. package/transpiled/Gateway.js +25 -25
  228. package/transpiled/Gateway.js.map +1 -1
  229. package/transpiled/HTTP/Context.d.ts +24 -0
  230. package/transpiled/HTTP/Context.js +47 -0
  231. package/transpiled/HTTP/Context.js.map +1 -0
  232. package/transpiled/HTTP/Server.d.ts +10 -7
  233. package/transpiled/HTTP/Server.js +80 -70
  234. package/transpiled/HTTP/Server.js.map +1 -1
  235. package/transpiled/HTTP/Timing.d.ts +10 -0
  236. package/transpiled/HTTP/Timing.js +29 -0
  237. package/transpiled/HTTP/Timing.js.map +1 -0
  238. package/transpiled/HTTP/formats/msgpack.d.ts +2 -2
  239. package/transpiled/HTTP/formats/msgpack.js +8 -29
  240. package/transpiled/HTTP/formats/msgpack.js.map +1 -1
  241. package/transpiled/HTTP/formats/text.d.ts +3 -1
  242. package/transpiled/HTTP/formats/text.js.map +1 -1
  243. package/transpiled/HTTP/formats/yaml.js +1 -1
  244. package/transpiled/HTTP/formats/yaml.js.map +1 -1
  245. package/transpiled/HTTP/index.d.ts +1 -0
  246. package/transpiled/HTTP/index.js +1 -0
  247. package/transpiled/HTTP/index.js.map +1 -1
  248. package/transpiled/HTTP/messages.d.ts +7 -16
  249. package/transpiled/HTTP/messages.js +28 -25
  250. package/transpiled/HTTP/messages.js.map +1 -1
  251. package/transpiled/Interception.d.ts +9 -0
  252. package/transpiled/Interception.js +19 -0
  253. package/transpiled/Interception.js.map +1 -0
  254. package/transpiled/Mapping.js +7 -7
  255. package/transpiled/Mapping.js.map +1 -1
  256. package/transpiled/Query.js.map +1 -1
  257. package/transpiled/RTD/Context.d.ts +7 -6
  258. package/transpiled/RTD/Directives.d.ts +19 -4
  259. package/transpiled/RTD/Endpoint.d.ts +6 -4
  260. package/transpiled/RTD/Match.d.ts +2 -4
  261. package/transpiled/RTD/Method.d.ts +7 -7
  262. package/transpiled/RTD/Method.js.map +1 -1
  263. package/transpiled/RTD/Node.d.ts +4 -6
  264. package/transpiled/RTD/Node.js +2 -1
  265. package/transpiled/RTD/Node.js.map +1 -1
  266. package/transpiled/RTD/Route.js.map +1 -1
  267. package/transpiled/RTD/Tree.d.ts +6 -6
  268. package/transpiled/RTD/Tree.js +5 -0
  269. package/transpiled/RTD/Tree.js.map +1 -1
  270. package/transpiled/RTD/factory.d.ts +2 -4
  271. package/transpiled/RTD/factory.js.map +1 -1
  272. package/transpiled/RTD/syntax/parse.js +1 -1
  273. package/transpiled/RTD/syntax/parse.js.map +1 -1
  274. package/transpiled/RTD/syntax/types.js +1 -1
  275. package/transpiled/RTD/syntax/types.js.map +1 -1
  276. package/transpiled/deployment.js +6 -2
  277. package/transpiled/deployment.js.map +1 -1
  278. package/transpiled/directives/auth/Anonymous.js +3 -4
  279. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  280. package/transpiled/directives/auth/{Family.d.ts → Authorization.d.ts} +4 -5
  281. package/transpiled/directives/auth/{Family.js → Authorization.js} +22 -13
  282. package/transpiled/directives/auth/Authorization.js.map +1 -0
  283. package/transpiled/directives/auth/Delegate.d.ts +8 -0
  284. package/transpiled/directives/auth/Delegate.js +27 -0
  285. package/transpiled/directives/auth/Delegate.js.map +1 -0
  286. package/transpiled/directives/auth/Incept.d.ts +1 -1
  287. package/transpiled/directives/auth/Incept.js +11 -6
  288. package/transpiled/directives/auth/Incept.js.map +1 -1
  289. package/transpiled/directives/auth/Role.js +5 -3
  290. package/transpiled/directives/auth/Role.js.map +1 -1
  291. package/transpiled/directives/auth/Rule.d.ts +2 -2
  292. package/transpiled/directives/auth/Rule.js.map +1 -1
  293. package/transpiled/directives/auth/Scheme.js +2 -2
  294. package/transpiled/directives/auth/Scheme.js.map +1 -1
  295. package/transpiled/directives/auth/index.d.ts +2 -2
  296. package/transpiled/directives/auth/index.js +4 -5
  297. package/transpiled/directives/auth/index.js.map +1 -1
  298. package/transpiled/directives/auth/schemes.js +2 -1
  299. package/transpiled/directives/auth/schemes.js.map +1 -1
  300. package/transpiled/directives/auth/types.d.ts +4 -4
  301. package/transpiled/directives/cache/Cache.d.ts +11 -0
  302. package/transpiled/directives/cache/{Family.js → Cache.js} +6 -4
  303. package/transpiled/directives/cache/Cache.js.map +1 -0
  304. package/transpiled/directives/cache/Control.d.ts +3 -3
  305. package/transpiled/directives/cache/Control.js +3 -3
  306. package/transpiled/directives/cache/Control.js.map +1 -1
  307. package/transpiled/directives/cache/index.d.ts +2 -2
  308. package/transpiled/directives/cache/index.js +4 -5
  309. package/transpiled/directives/cache/index.js.map +1 -1
  310. package/transpiled/directives/cache/types.d.ts +2 -2
  311. package/transpiled/directives/cors/CORS.d.ts +10 -0
  312. package/transpiled/directives/cors/CORS.js +51 -0
  313. package/transpiled/directives/cors/CORS.js.map +1 -0
  314. package/transpiled/directives/cors/index.d.ts +2 -0
  315. package/transpiled/directives/cors/index.js +6 -0
  316. package/transpiled/directives/cors/index.js.map +1 -0
  317. package/transpiled/directives/dev/Development.d.ts +9 -0
  318. package/transpiled/directives/dev/{Family.js → Development.js} +4 -2
  319. package/transpiled/directives/dev/Development.js.map +1 -0
  320. package/transpiled/directives/dev/Stub.d.ts +3 -3
  321. package/transpiled/directives/dev/Stub.js.map +1 -1
  322. package/transpiled/directives/dev/Throw.d.ts +3 -3
  323. package/transpiled/directives/dev/Throw.js.map +1 -1
  324. package/transpiled/directives/dev/index.d.ts +2 -2
  325. package/transpiled/directives/dev/index.js +4 -5
  326. package/transpiled/directives/dev/index.js.map +1 -1
  327. package/transpiled/directives/dev/types.d.ts +1 -1
  328. package/transpiled/directives/index.d.ts +4 -2
  329. package/transpiled/directives/index.js +10 -9
  330. package/transpiled/directives/index.js.map +1 -1
  331. package/transpiled/directives/io/Directive.d.ts +8 -0
  332. package/transpiled/directives/io/Directive.js +3 -0
  333. package/transpiled/directives/io/Directive.js.map +1 -0
  334. package/transpiled/directives/io/IO.d.ts +9 -0
  335. package/transpiled/directives/io/IO.js +33 -0
  336. package/transpiled/directives/io/IO.js.map +1 -0
  337. package/transpiled/directives/io/Input.d.ts +11 -0
  338. package/transpiled/directives/io/Input.js +63 -0
  339. package/transpiled/directives/io/Input.js.map +1 -0
  340. package/transpiled/directives/io/Message.d.ts +1 -0
  341. package/transpiled/directives/io/Message.js +3 -0
  342. package/transpiled/directives/io/Message.js.map +1 -0
  343. package/transpiled/directives/io/Output.d.ts +13 -0
  344. package/transpiled/directives/io/Output.js +76 -0
  345. package/transpiled/directives/io/Output.js.map +1 -0
  346. package/transpiled/directives/io/index.d.ts +2 -0
  347. package/transpiled/directives/io/index.js +6 -0
  348. package/transpiled/directives/io/index.js.map +1 -0
  349. package/transpiled/directives/io/schemas.d.ts +7 -0
  350. package/transpiled/directives/io/schemas.js +14 -0
  351. package/transpiled/directives/io/schemas.js.map +1 -0
  352. package/transpiled/directives/octets/Context.d.ts +5 -5
  353. package/transpiled/directives/octets/Context.js +4 -2
  354. package/transpiled/directives/octets/Context.js.map +1 -1
  355. package/transpiled/directives/octets/Delete.d.ts +15 -5
  356. package/transpiled/directives/octets/Delete.js +45 -8
  357. package/transpiled/directives/octets/Delete.js.map +1 -1
  358. package/transpiled/directives/octets/Directive.d.ts +8 -0
  359. package/transpiled/directives/octets/Directive.js +8 -0
  360. package/transpiled/directives/octets/Directive.js.map +1 -0
  361. package/transpiled/directives/octets/Fetch.d.ts +9 -9
  362. package/transpiled/directives/octets/Fetch.js +36 -21
  363. package/transpiled/directives/octets/Fetch.js.map +1 -1
  364. package/transpiled/directives/octets/List.d.ts +11 -5
  365. package/transpiled/directives/octets/List.js +34 -7
  366. package/transpiled/directives/octets/List.js.map +1 -1
  367. package/transpiled/directives/octets/Octets.d.ts +12 -0
  368. package/transpiled/directives/octets/{Family.js → Octets.js} +12 -6
  369. package/transpiled/directives/octets/Octets.js.map +1 -0
  370. package/transpiled/directives/octets/Permute.d.ts +5 -4
  371. package/transpiled/directives/octets/Permute.js +15 -8
  372. package/transpiled/directives/octets/Permute.js.map +1 -1
  373. package/transpiled/directives/octets/Store.d.ts +14 -23
  374. package/transpiled/directives/octets/Store.js +41 -70
  375. package/transpiled/directives/octets/Store.js.map +1 -1
  376. package/transpiled/directives/octets/Workflow.d.ts +15 -0
  377. package/transpiled/directives/octets/Workflow.js +59 -0
  378. package/transpiled/directives/octets/Workflow.js.map +1 -0
  379. package/transpiled/directives/octets/index.d.ts +2 -2
  380. package/transpiled/directives/octets/index.js +4 -5
  381. package/transpiled/directives/octets/index.js.map +1 -1
  382. package/transpiled/directives/octets/schemas.d.ts +13 -6
  383. package/transpiled/directives/octets/schemas.js +2 -1
  384. package/transpiled/directives/octets/schemas.js.map +1 -1
  385. package/transpiled/directives/octets/types.d.ts +2 -6
  386. package/transpiled/directives/octets/workflows/Execution.d.ts +25 -0
  387. package/transpiled/directives/octets/workflows/Execution.js +54 -0
  388. package/transpiled/directives/octets/workflows/Execution.js.map +1 -0
  389. package/transpiled/directives/octets/workflows/Workflow.d.ts +12 -0
  390. package/transpiled/directives/octets/workflows/Workflow.js +25 -0
  391. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -0
  392. package/transpiled/directives/octets/workflows/index.d.ts +1 -0
  393. package/transpiled/directives/octets/workflows/index.js +6 -0
  394. package/transpiled/directives/octets/workflows/index.js.map +1 -0
  395. package/transpiled/directives/vary/Directive.d.ts +5 -0
  396. package/transpiled/directives/vary/Directive.js +3 -0
  397. package/transpiled/directives/vary/Directive.js.map +1 -0
  398. package/transpiled/directives/vary/Embed.d.ts +10 -0
  399. package/transpiled/directives/vary/Embed.js +49 -0
  400. package/transpiled/directives/vary/Embed.js.map +1 -0
  401. package/transpiled/directives/vary/Properties.d.ts +9 -0
  402. package/transpiled/directives/vary/Properties.js +16 -0
  403. package/transpiled/directives/vary/Properties.js.map +1 -0
  404. package/transpiled/directives/vary/Vary.d.ts +10 -0
  405. package/transpiled/directives/vary/Vary.js +36 -0
  406. package/transpiled/directives/vary/Vary.js.map +1 -0
  407. package/transpiled/directives/vary/embeddings/Embedding.d.ts +5 -0
  408. package/transpiled/directives/vary/embeddings/Embedding.js +3 -0
  409. package/transpiled/directives/vary/embeddings/Embedding.js.map +1 -0
  410. package/transpiled/directives/vary/embeddings/Header.d.ts +7 -0
  411. package/transpiled/directives/vary/embeddings/Header.js +28 -0
  412. package/transpiled/directives/vary/embeddings/Header.js.map +1 -0
  413. package/transpiled/directives/vary/embeddings/Language.d.ts +7 -0
  414. package/transpiled/directives/vary/embeddings/Language.js +28 -0
  415. package/transpiled/directives/vary/embeddings/Language.js.map +1 -0
  416. package/transpiled/directives/vary/embeddings/index.d.ts +5 -0
  417. package/transpiled/directives/vary/embeddings/index.js +10 -0
  418. package/transpiled/directives/vary/embeddings/index.js.map +1 -0
  419. package/transpiled/directives/vary/index.d.ts +2 -0
  420. package/transpiled/directives/vary/index.js +6 -0
  421. package/transpiled/directives/vary/index.js.map +1 -0
  422. package/transpiled/exceptions.js +7 -7
  423. package/transpiled/exceptions.js.map +1 -1
  424. package/transpiled/io.d.ts +3 -0
  425. package/transpiled/io.js +3 -0
  426. package/transpiled/io.js.map +1 -0
  427. package/transpiled/manifest.js +10 -5
  428. package/transpiled/manifest.js.map +1 -1
  429. package/transpiled/root.js +5 -0
  430. package/transpiled/root.js.map +1 -1
  431. package/transpiled/schemas.d.ts +7 -3
  432. package/transpiled/schemas.js.map +1 -1
  433. package/transpiled/tsconfig.tsbuildinfo +1 -1
  434. package/source/HTTP/Server.fixtures.ts +0 -41
  435. package/transpiled/HTTP/Server.fixtures.d.ts +0 -11
  436. package/transpiled/HTTP/Server.fixtures.js +0 -32
  437. package/transpiled/HTTP/Server.fixtures.js.map +0 -1
  438. package/transpiled/directives/auth/Family.js.map +0 -1
  439. package/transpiled/directives/cache/Family.d.ts +0 -12
  440. package/transpiled/directives/cache/Family.js.map +0 -1
  441. package/transpiled/directives/dev/Family.d.ts +0 -10
  442. package/transpiled/directives/dev/Family.js.map +0 -1
  443. package/transpiled/directives/octets/Family.d.ts +0 -12
  444. package/transpiled/directives/octets/Family.js.map +0 -1
@@ -1,144 +1,136 @@
1
1
  import fs from 'node:fs'
2
2
  import os from 'node:os'
3
- import express from 'express'
4
- import cors from 'cors'
3
+ import * as http from 'node:http'
4
+ import assert from 'node:assert'
5
+ import { once } from 'node:events'
5
6
  import { Connector } from '@toa.io/core'
6
7
  import { promex } from '@toa.io/generic'
7
- import Negotiator from 'negotiator'
8
- import { read, write, type IncomingMessage, type OutgoingMessage } from './messages'
8
+ import { type OutgoingMessage, write } from './messages'
9
9
  import { ClientError, Exception } from './exceptions'
10
- import { formats, types } from './formats'
11
- import type { Format } from './formats'
12
- import type * as http from 'node:http'
13
- import type { Express, Request, Response, NextFunction } from 'express'
10
+ import { Context } from './Context'
11
+ import type { IncomingMessage } from './Context'
14
12
 
15
13
  export class Server extends Connector {
16
- private readonly debug: boolean
17
- private readonly app: Express
18
- private server?: http.Server
14
+ private readonly server: http.Server = http.createServer()
15
+ private readonly properties: Properties
16
+ private process?: Processing
19
17
 
20
- private constructor (app: Express, debug: boolean) {
18
+ private constructor (properties: Properties) {
21
19
  super()
22
20
 
23
- this.app = app
24
- this.debug = debug
21
+ this.properties = properties
22
+
23
+ this.server.on('request', (req, res) => this.listener(req, res))
24
+ }
25
+
26
+ public get port (): number {
27
+ if (this.properties.port !== 0)
28
+ return this.properties.port
29
+
30
+ const address = this.server.address()
31
+
32
+ if (address === null || typeof address === 'string')
33
+ throw new Error('Server is not listening on a port.')
34
+
35
+ return address.port
25
36
  }
26
37
 
27
38
  public static create (options?: Partial<Properties>): Server {
28
- const properties: Properties = options === undefined
39
+ const properties = options === undefined
29
40
  ? DEFAULTS
30
41
  : { ...DEFAULTS, ...options }
31
42
 
32
- const app = express()
33
-
34
- app.disable('x-powered-by')
35
- app.use(cors({ allowedHeaders: ['content-type'] }))
36
- app.use(supportedMethods(properties.methods))
37
-
38
- return new Server(app, properties.debug)
43
+ return new Server(properties)
39
44
  }
40
45
 
41
46
  public attach (process: Processing): void {
42
- this.app.use((request: any, response: Response) => {
43
- this.extend(request)
44
- .then(process)
45
- .then(this.success(request, response))
46
- .catch(this.fail(request, response))
47
- })
47
+ this.process = process
48
48
  }
49
49
 
50
50
  protected override async open (): Promise<void> {
51
- const listening = promex()
52
-
53
- this.server = this.app.listen(8000, listening.callback)
51
+ this.server.listen(this.properties.port)
54
52
 
55
- await listening
53
+ await once(this.server, 'listening')
56
54
 
57
55
  console.info('HTTP Server is listening.')
58
56
  }
59
57
 
60
58
  protected override async close (): Promise<void> {
61
- const stopped = promex()
59
+ this.server.close()
62
60
 
63
- this.server?.close(stopped.callback)
61
+ console.info('HTTP Server stopped accepting new connections.')
64
62
 
65
- await stopped
66
- }
63
+ await once(this.server, 'close')
67
64
 
68
- protected override dispose (): void {
69
65
  console.info('HTTP Server has been stopped.')
70
66
  }
71
67
 
72
- private async extend (request: IncomingMessage): Promise<IncomingMessage> {
73
- const message = request as unknown as IncomingMessage
68
+ private listener (request: http.IncomingMessage, response: http.ServerResponse): void {
69
+ if (request.method === undefined || !this.properties.methods.has(request.method)) {
70
+ response.writeHead(501).end()
71
+
72
+ return
73
+ }
74
74
 
75
- message.encoder = negotiate(request)
76
- message.parse = async <T> (): Promise<T> => await read(request)
75
+ if (request.url === undefined) {
76
+ response.writeHead(400).end()
77
77
 
78
- return message
78
+ return
79
+ }
80
+
81
+ assert.ok(this.process !== undefined,
82
+ 'No processing function has been attached to the server.')
83
+
84
+ const context = new Context(request as IncomingMessage, this.properties.trace)
85
+
86
+ this.process(context)
87
+ .then(this.success(context, response))
88
+ .catch(this.fail(context, response))
79
89
  }
80
90
 
81
- private success (request: IncomingMessage, response: Response) {
91
+ private success (context: Context, response: http.ServerResponse) {
82
92
  return (message: OutgoingMessage) => {
83
93
  let status = message.status
84
94
 
85
95
  if (status === undefined)
86
- if (message.body === null) status = 404
87
- else if (request.method === 'POST') status = 201
88
- else if (message.body === undefined) status = 204
89
- else status = 200
90
-
91
- response.status(status)
92
- message.headers?.forEach((value, key) => response.set(key, value))
93
-
94
- if (message.body !== undefined && message.body !== null)
95
- write(request, response, message)
96
- else
97
- response.end()
96
+ if (message.body === null)
97
+ status = 404
98
+ else if (context.request.method === 'POST')
99
+ status = 201
100
+ else if (message.body === undefined)
101
+ status = 204
102
+ else
103
+ status = 200
104
+
105
+ response.statusCode = message.status = status
106
+ write(context, response, message)
98
107
  }
99
108
  }
100
109
 
101
- private fail (request: IncomingMessage, response: Response) {
110
+ private fail (context: Context, response: http.ServerResponse) {
102
111
  return async (exception: Error) => {
103
- if (!request.complete)
104
- await adam(request)
112
+ if (!context.request.complete)
113
+ await adam(context.request)
105
114
 
106
- const status = exception instanceof Exception
115
+ response.statusCode = exception instanceof Exception
107
116
  ? exception.status
108
117
  : 500
109
118
 
110
- response.status(status)
111
-
112
- const outputAllowed = exception instanceof ClientError || this.debug
119
+ const message: OutgoingMessage = { status: response.statusCode }
120
+ const verbose = exception instanceof ClientError || this.properties.debug
113
121
 
114
- if (outputAllowed) {
115
- const body = exception instanceof Exception
122
+ if (verbose)
123
+ message.body = exception instanceof Exception
116
124
  ? exception.body
117
125
  : (exception.stack ?? exception.message)
118
126
 
119
- write(request, response, { body })
120
- } else
121
- response.end()
127
+ write(context, response, message)
122
128
  }
123
129
  }
124
130
  }
125
131
 
126
- function supportedMethods (methods: Set<string>) {
127
- return (req: Request, res: Response, next: NextFunction): void => {
128
- if (methods.has(req.method)) next()
129
- else res.sendStatus(501)
130
- }
131
- }
132
-
133
- function negotiate (request: Request): Format | null {
134
- const negotiator = new Negotiator(request)
135
- const mediaType = negotiator.mediaType(types)
136
-
137
- return mediaType === undefined ? null : formats[mediaType]
138
- }
139
-
140
132
  // https://github.com/whatwg/fetch/issues/1254
141
- async function adam (request: Request): Promise<void> {
133
+ async function adam (request: http.IncomingMessage): Promise<void> {
142
134
  const completed = promex()
143
135
  const devnull = fs.createWriteStream(os.devNull)
144
136
 
@@ -146,17 +138,21 @@ async function adam (request: Request): Promise<void> {
146
138
  .on('end', completed.callback)
147
139
  .pipe(devnull)
148
140
 
149
- return await completed
141
+ return completed
150
142
  }
151
143
 
152
- const DEFAULTS = {
153
- methods: new Set<string>(['GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE']),
154
- debug: false
144
+ const DEFAULTS: Properties = {
145
+ methods: new Set<string>(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS']),
146
+ debug: false,
147
+ trace: false,
148
+ port: 8000
155
149
  }
156
150
 
157
151
  interface Properties {
158
152
  methods: Set<string>
159
153
  debug: boolean
154
+ trace: boolean
155
+ port: number
160
156
  }
161
157
 
162
- export type Processing = (input: IncomingMessage) => Promise<OutgoingMessage>
158
+ export type Processing = (input: Context) => Promise<OutgoingMessage>
@@ -0,0 +1,40 @@
1
+ import { performance } from 'node:perf_hooks'
2
+ import type { ServerResponse } from 'node:http'
3
+
4
+ export class Timing {
5
+ private readonly skip: boolean
6
+ private readonly start = performance.now()
7
+ private readonly breakpoints: Breakpoint[] = []
8
+
9
+ public constructor (enabled: boolean) {
10
+ this.skip = !enabled
11
+ }
12
+
13
+ public async capture<T> (id: string, promise: Promise<T>): Promise<T> {
14
+ if (this.skip)
15
+ return promise
16
+
17
+ const start = performance.now()
18
+ const result = promise instanceof Promise ? await promise : promise
19
+
20
+ this.breakpoints.push({ id, duration: performance.now() - start })
21
+
22
+ return result
23
+ }
24
+
25
+ public append (response: ServerResponse): void {
26
+ if (this.skip)
27
+ return
28
+
29
+ this.breakpoints.push({ id: 'total', duration: performance.now() - this.start })
30
+
31
+ for (const breakpoint of this.breakpoints)
32
+ response.appendHeader('server-timing',
33
+ `${breakpoint.id};dur=${breakpoint.duration.toFixed(3)}`)
34
+ }
35
+ }
36
+
37
+ interface Breakpoint {
38
+ id: string
39
+ duration: number
40
+ }
@@ -1,13 +1,16 @@
1
1
  import { type Buffer } from 'node:buffer'
2
- import * as msgpack from 'msgpackr'
3
-
4
- export const type = 'application/msgpack'
5
- export const multipart = 'multipart/msgpack'
2
+ import { pack, unpack } from 'msgpackr'
6
3
 
7
4
  export function decode (buffer: Buffer): any {
8
- return msgpack.decode(buffer)
5
+ return unpack(buffer)
9
6
  }
10
7
 
11
8
  export function encode (value: any): Buffer {
12
- return msgpack.encode(value)
9
+ if (typeof value === 'object' && value !== null)
10
+ Object.setPrototypeOf(value, null)
11
+
12
+ return pack(value)
13
13
  }
14
+
15
+ export const type = 'application/msgpack'
16
+ export const multipart = 'multipart/msgpack'
@@ -7,6 +7,6 @@ export function decode (buffer: Buffer): any {
7
7
  return buffer.toString()
8
8
  }
9
9
 
10
- export function encode (value: any): Buffer {
10
+ export function encode (value: { toString: () => string }): Buffer {
11
11
  return Buffer.from(value.toString())
12
12
  }
@@ -11,7 +11,7 @@ export function decode (buffer: Buffer): any {
11
11
  }
12
12
 
13
13
  export function encode (value: any): Buffer {
14
- const text = yaml.dump(value)
14
+ const text = yaml.dump(value, { lineWidth: -1, noRefs: true })
15
15
 
16
16
  return Buffer.from(text)
17
17
  }
@@ -1,3 +1,4 @@
1
1
  export * from './Server'
2
2
  export * from './messages'
3
3
  export * from './exceptions'
4
+ export * from './Context'
@@ -1,8 +1,10 @@
1
+ import { Readable } from 'node:stream'
1
2
  import { generate } from 'randomstring'
2
3
  import * as msgpack from 'msgpackr'
3
4
  import { read } from './messages'
4
- import { createRequest } from './Server.fixtures'
5
5
  import { BadRequest, UnsupportedMediaType } from './exceptions'
6
+ import { Timing } from './Timing'
7
+ import type { Context } from './Context'
6
8
 
7
9
  beforeEach(() => {
8
10
  jest.clearAllMocks()
@@ -14,8 +16,8 @@ describe('read', () => {
14
16
  const headers = { 'content-type': 'application/json' }
15
17
  const input = { [generate()]: generate() }
16
18
  const json = JSON.stringify(input)
17
- const request = createRequest({ path, headers }, json)
18
- const output = await read(request)
19
+ const context = createContext(path, headers, json)
20
+ const output = await read(context)
19
21
 
20
22
  expect(output).toStrictEqual(input)
21
23
  })
@@ -24,7 +26,7 @@ describe('read', () => {
24
26
  const path = generate()
25
27
  const headers = { 'content-type': 'application/yaml' }
26
28
  const yaml = 'foo: 1'
27
- const request = createRequest({ path, headers }, yaml)
29
+ const request = createContext(path, headers, yaml)
28
30
  const value = await read(request)
29
31
 
30
32
  expect(value).toStrictEqual({ foo: 1 })
@@ -35,7 +37,7 @@ describe('read', () => {
35
37
  const headers = { 'content-type': 'application/msgpack' }
36
38
  const input = { [generate()]: generate() }
37
39
  const msg = msgpack.encode(input)
38
- const request = createRequest({ path, headers }, msg)
40
+ const request = createContext(path, headers, msg)
39
41
  const output = await read(request)
40
42
 
41
43
  expect(output).toStrictEqual(input)
@@ -45,7 +47,7 @@ describe('read', () => {
45
47
  const path = generate()
46
48
  const headers = { 'content-type': 'text/plain' }
47
49
  const input = generate()
48
- const request = createRequest({ path, headers }, input)
50
+ const request = createContext(path, headers, input)
49
51
  const output = await read(request)
50
52
 
51
53
  expect(output).toStrictEqual(input)
@@ -54,7 +56,7 @@ describe('read', () => {
54
56
  it('should throw on unsupported request media type', async () => {
55
57
  const path = generate()
56
58
  const headers = { 'content-type': 'wtf/' + generate() }
57
- const request = createRequest({ path, headers })
59
+ const request = createContext(path, headers)
58
60
 
59
61
  await expect(read(request)).rejects.toThrow(UnsupportedMediaType)
60
62
  })
@@ -63,8 +65,25 @@ describe('read', () => {
63
65
  const path = generate()
64
66
  const text = '{ "foo": "val... oops '
65
67
  const headers = { 'content-type': 'application/json' }
66
- const request = createRequest({ path, headers }, text)
68
+ const request = createContext(path, headers, text)
67
69
 
68
70
  await expect(read(request)).rejects.toThrow(BadRequest)
69
71
  })
70
72
  })
73
+
74
+ export function createContext
75
+ (url: string, headers: Record<string, string> = {}, content: string | Buffer = ''):
76
+ jest.MockedObject<Context> {
77
+ const buffer = Buffer.isBuffer(content) ? content : Buffer.from(content)
78
+ const stream = Readable.from(buffer)
79
+
80
+ const mock: Partial<Context> = {
81
+ request: Object.assign(stream, {
82
+ url,
83
+ headers
84
+ }) as unknown as Context['request'],
85
+ timing: new Timing(false)
86
+ }
87
+
88
+ return mock as unknown as jest.MockedObject<Context>
89
+ }
@@ -1,22 +1,26 @@
1
- import { type IncomingHttpHeaders } from 'node:http'
2
1
  import { Readable } from 'node:stream'
3
- import { type Request, type Response } from 'express'
4
- import { buffer } from '@toa.io/streams'
2
+ import { buffer } from 'node:stream/consumers'
5
3
  import { formats } from './formats'
6
4
  import { BadRequest, NotAcceptable, UnsupportedMediaType } from './exceptions'
7
- import type { ParsedQs } from 'qs'
8
- import type { Format } from './formats'
5
+ import type { Context } from './Context'
6
+ import type * as http from 'node:http'
9
7
 
10
8
  export function write
11
- (request: IncomingMessage, response: Response, message: OutgoingMessage): void {
9
+ (context: Context, response: http.ServerResponse, message: OutgoingMessage): void {
10
+ for (const transform of context.pipelines.response)
11
+ transform(message)
12
+
13
+ message.headers?.forEach((value, key) => response.setHeader(key, value))
14
+ context.timing.append(response)
15
+
12
16
  if (message.body instanceof Readable)
13
- stream(message, request, response)
17
+ stream(message, context, response)
14
18
  else
15
- send(message, request, response)
19
+ send(message, context, response)
16
20
  }
17
21
 
18
- export async function read (request: Request): Promise<any> {
19
- const type = request.headers['content-type']
22
+ export async function read (context: Context): Promise<any> {
23
+ const type = context.request.headers['content-type']
20
24
 
21
25
  if (type === undefined)
22
26
  return undefined
@@ -25,8 +29,7 @@ export async function read (request: Request): Promise<any> {
25
29
  throw new UnsupportedMediaType()
26
30
 
27
31
  const format = formats[type]
28
-
29
- const buf = await buffer(request)
32
+ const buf = await context.timing.capture('buffer', buffer(context.request))
30
33
 
31
34
  try {
32
35
  return format.decode(buf)
@@ -35,30 +38,33 @@ export async function read (request: Request): Promise<any> {
35
38
  }
36
39
  }
37
40
 
38
- function send (message: OutgoingMessage, request: IncomingMessage, response: Response): void {
39
- if (message.body === undefined) {
41
+ function send
42
+ (message: OutgoingMessage, context: Context, response: http.ServerResponse): void {
43
+ if (message.body === undefined || message.body === null) {
40
44
  response.end()
41
45
 
42
46
  return
43
47
  }
44
48
 
45
- if (request.encoder === null)
49
+ if (context.encoder === null)
46
50
  throw new NotAcceptable()
47
51
 
48
- const buf = request.encoder.encode(message.body)
52
+ const buf = context.encoder.encode(message.body)
49
53
 
50
- response.set('content-type', request.encoder.type)
51
- response.end(buf)
54
+ response
55
+ .setHeader('content-type', context.encoder.type)
56
+ .appendHeader('vary', 'accept')
57
+ .end(buf)
52
58
  }
53
59
 
54
60
  function stream
55
- (message: OutgoingMessage, request: IncomingMessage, response: Response): void {
61
+ (message: OutgoingMessage, context: Context, response: http.ServerResponse): void {
56
62
  const encoded = message.headers !== undefined && message.headers.has('content-type')
57
63
 
58
64
  if (encoded)
59
- pipe(message, response)
65
+ message.body.pipe(response)
60
66
  else
61
- multipart(message, request, response)
67
+ multipart(message, context, response)
62
68
 
63
69
  message.body.on('error', (e: Error) => {
64
70
  console.error(e)
@@ -66,49 +72,39 @@ function stream
66
72
  })
67
73
  }
68
74
 
69
- function pipe (message: OutgoingMessage, response: Response): void {
70
- message.headers?.forEach((value, key) => response.set(key, value))
71
- message.body.pipe(response)
72
- }
73
-
74
- function multipart (message: OutgoingMessage, request: IncomingMessage, response: Response): void {
75
- if (request.encoder === null)
75
+ function multipart
76
+ (message: OutgoingMessage, context: Context, response: http.ServerResponse): void {
77
+ if (context.encoder === null)
76
78
  throw new NotAcceptable()
77
79
 
78
- const encoder = request.encoder
80
+ const encoder = context.encoder
79
81
 
80
- response.set('content-type', `${encoder.multipart}; boundary=${BOUNDARY}`)
82
+ response.setHeader('content-type', `${encoder.multipart}; boundary=${BOUNDARY}`)
81
83
 
82
84
  message.body
83
- .map((part: unknown) => Buffer.concat([CUT, encoder.encode(part)]))
85
+ .map((part: unknown) => Buffer.concat([CUT, encoder.encode(part), CRLF]))
84
86
  .on('end', () => response.end(FINALCUT))
85
87
  .pipe(response)
86
88
  }
87
89
 
88
90
  const BOUNDARY = 'cut'
89
91
  const CUT = Buffer.from(`--${BOUNDARY}\r\n`)
92
+ const CRLF = Buffer.from('\r\n')
90
93
  const FINALCUT = Buffer.from(`--${BOUNDARY}--`)
91
94
 
92
- export interface IncomingMessage extends Request {
93
- method: string
94
- path: string
95
- url: string
96
- headers: IncomingHttpHeaders
97
- query: Query
98
- parse: <T> () => Promise<T>
99
- encoder: Format | null
100
- }
101
-
102
95
  export interface OutgoingMessage {
103
96
  status?: number
104
97
  headers?: Headers
105
98
  body?: any
106
99
  }
107
100
 
108
- export interface Query extends ParsedQs {
101
+ export interface Query {
102
+ [key: string]: string | number | undefined
103
+
109
104
  id?: string
110
105
  criteria?: string
111
106
  sort?: string
112
107
  omit?: string
113
108
  limit?: string
109
+ version?: number
114
110
  }
@@ -0,0 +1,24 @@
1
+ import type { Input, Output } from './io'
2
+
3
+ export class Interception implements Interceptor {
4
+ private readonly interceptors: Interceptor[]
5
+
6
+ public constructor (interceptors: Interceptor[]) {
7
+ this.interceptors = interceptors
8
+ }
9
+
10
+ public async intercept (input: Input): Promise<Output> {
11
+ for (const interceptor of this.interceptors) {
12
+ const output = await interceptor.intercept(input)
13
+
14
+ if (output !== null)
15
+ return output
16
+ }
17
+
18
+ return null
19
+ }
20
+ }
21
+
22
+ export interface Interceptor {
23
+ intercept: (input: Input) => Output | Promise<Output>
24
+ }
package/source/Mapping.ts CHANGED
@@ -29,7 +29,10 @@ class QueryableMapping extends Mapping {
29
29
  public fit (input: any, qs: http.Query, parameters: Parameter[]): core.Request {
30
30
  const query = this.query.fit(qs, parameters)
31
31
 
32
- return { input, query }
32
+ return {
33
+ input,
34
+ query
35
+ }
33
36
  }
34
37
  }
35
38
 
@@ -38,14 +41,10 @@ class InputMapping extends Mapping {
38
41
  if (input === undefined && parameters.length > 0)
39
42
  input = {}
40
43
 
41
- if (typeof input === 'object')
42
- this.assign(input, parameters)
44
+ if (typeof input === 'object' && input !== null)
45
+ for (const parameter of parameters)
46
+ input[parameter.name] = parameter.value
43
47
 
44
48
  return { input }
45
49
  }
46
-
47
- private assign (input: Record<string, any>, parameters: Parameter[]): void {
48
- for (const parameter of parameters)
49
- input[parameter.name] = parameter.value
50
- }
51
50
  }
@@ -1,16 +1,13 @@
1
- import { type Directives, type DirectivesFactory } from './Directives'
2
- import { type Endpoint, type EndpointsFactory } from './Endpoint'
1
+ import { type DirectiveFactory } from './Directives'
2
+ import { type EndpointsFactory } from './Endpoint'
3
+ import type { Directive } from './syntax'
3
4
 
4
- export interface Context<
5
- TEndpoint extends Endpoint = any,
6
- TDirectives extends Directives<TDirectives> = any,
7
- TExtension = any
8
- > {
5
+ export interface Context<TExtension = any> {
9
6
  readonly protected: boolean
10
- readonly endpoints: EndpointsFactory<TEndpoint>
7
+ readonly endpoints: EndpointsFactory
11
8
  readonly directives: {
12
- readonly factory: DirectivesFactory
13
- stack: TDirectives[]
9
+ readonly factory: DirectiveFactory
10
+ stack: Directive[]
14
11
  }
15
12
  readonly extension?: TExtension
16
13
  }