@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
@@ -0,0 +1,76 @@
1
+ import { Readable } from 'stream'
2
+ import type { Unit } from './Workflow'
3
+ import type { Remotes } from '../../../Remotes'
4
+ import type { Component } from '@toa.io/core'
5
+ import type { Maybe } from '@toa.io/types'
6
+ import type { Entry } from '@toa.io/extensions.storages'
7
+
8
+ export class Execution extends Readable {
9
+ private readonly units: Unit[]
10
+ private readonly remotes: Remotes
11
+ private readonly context: Context
12
+ private readonly components: Record<string, Component> = {}
13
+ private readonly discovery: Record<string, Promise<Component>> = {}
14
+ private interrupted = false
15
+
16
+ public constructor (context: Context, units: Unit[], remotes: Remotes) {
17
+ super({ objectMode: true })
18
+
19
+ this.context = context
20
+ this.units = units
21
+ this.remotes = remotes
22
+
23
+ void this.run()
24
+ }
25
+
26
+ public override _read (): void {
27
+ }
28
+
29
+ private async run (): Promise<void> {
30
+ for (const unit of this.units) {
31
+ await this.execute(unit)
32
+
33
+ if (this.interrupted)
34
+ break
35
+ }
36
+
37
+ this.push(null)
38
+ }
39
+
40
+ private async execute (unit: Unit): Promise<void> {
41
+ const promises = Object.entries(unit).map(async ([step, endpoint]) => {
42
+ const result = await this.call(endpoint).catch((error: Error) => console.error(error))
43
+
44
+ if (result instanceof Error) {
45
+ this.push({ error: { step, ...result } })
46
+ this.interrupted = true
47
+ } else
48
+ this.push({ [step]: result ?? null })
49
+ })
50
+
51
+ await Promise.all(promises)
52
+ }
53
+
54
+ private async call (endpoint: string): Promise<Maybe<unknown>> {
55
+ const [operation, component, namespace = 'default'] = endpoint.split('.').reverse()
56
+ const key = `${namespace}.${component}`
57
+
58
+ this.components[key] ??= await this.discover(key, namespace, component)
59
+
60
+ return await this.components[key].invoke(operation, { input: this.context })
61
+ }
62
+
63
+ private async discover (key: string, namespace: string, component: string): Promise<Component> {
64
+ if (this.discovery[key] === undefined)
65
+ this.discovery[key] = this.remotes.discover(namespace, component)
66
+
67
+ return await this.discovery[key]
68
+ }
69
+ }
70
+
71
+ export interface Context {
72
+ storage: string
73
+ path: string
74
+ entry: Entry
75
+ parameters: Record<string, string>
76
+ }
@@ -0,0 +1,37 @@
1
+ import { posix } from 'node:path'
2
+ import { match } from 'matchacho'
3
+ import { Execution } from './Execution'
4
+ import type { Context } from './Execution'
5
+ import type { Parameter } from '../../../RTD'
6
+ import type { Input } from '../types'
7
+ import type { Entry } from '@toa.io/extensions.storages'
8
+ import type { Remotes } from '../../../Remotes'
9
+
10
+ export class Workflow {
11
+ private readonly units: Unit[]
12
+ private readonly remotes: Remotes
13
+
14
+ public constructor (units: Unit[] | Unit, remotes: Remotes) {
15
+ this.units = match<Unit[]>(units,
16
+ Array, (units: Unit[]) => units,
17
+ Object, (unit: Unit) => [unit])
18
+
19
+ this.remotes = remotes
20
+ }
21
+
22
+ // eslint-disable-next-line max-params
23
+ public execute
24
+ (input: Input, storage: string, entry: Entry, params: Parameter[]): Execution {
25
+ const path = posix.join(input.request.url, entry.id)
26
+ const parameters: Record<string, string> = {}
27
+
28
+ for (const { name, value } of params)
29
+ parameters[name] = value
30
+
31
+ const context: Context = { storage, path, entry, parameters }
32
+
33
+ return new Execution(context, this.units, this.remotes)
34
+ }
35
+ }
36
+
37
+ export type Unit = Record<string, string>
@@ -0,0 +1 @@
1
+ export { Workflow, type Unit } from './Workflow'
@@ -0,0 +1,6 @@
1
+ import type { Properties } from './Properties'
2
+ import type { Input } from '../../io'
3
+
4
+ export interface Directive {
5
+ preflight: (request: Input, properties: Properties) => void
6
+ }
@@ -0,0 +1,62 @@
1
+ import assert from 'node:assert'
2
+ import { Header, embeddings } from './embeddings'
3
+ import type { Embedding } from './embeddings'
4
+ import type { Input } from '../../io'
5
+ import type { Directive } from './Directive'
6
+ import type { Properties } from './Properties'
7
+
8
+ export class Embed implements Directive {
9
+ private readonly embeddings: Array<[string, Embedding[]]> = []
10
+
11
+ public constructor (map: Record<string, string | string[]>) {
12
+ for (const [key, values] of Object.entries(map)) {
13
+ const names = Array.isArray(values) ? values : [values]
14
+
15
+ const instances = names.map((name) => {
16
+ if (name[0] === ':')
17
+ return new Header(name.slice(1))
18
+
19
+ assert.ok(name in embeddings, `Unknown embedding: ${name}`)
20
+
21
+ return new embeddings[name]()
22
+ })
23
+
24
+ this.embeddings.push([key, instances])
25
+ }
26
+ }
27
+
28
+ public preflight (input: Input, properties: Properties): void {
29
+ const values: Record<string, unknown> = {}
30
+
31
+ for (const [key, instances] of this.embeddings)
32
+ values[key] = this.resolve(instances, input, properties)
33
+
34
+ input.pipelines.body.push(this.embedding(values))
35
+ }
36
+
37
+ private resolve (instances: Embedding[], input: Input, properties: Properties): unknown {
38
+ let value
39
+
40
+ for (const instance of instances) {
41
+ value = instance.resolve(input, properties)
42
+
43
+ if (value !== undefined)
44
+ break
45
+ }
46
+
47
+ assert.ok(value !== undefined, 'Neither embedding resolved a value.')
48
+
49
+ return value
50
+ }
51
+
52
+ private embedding (values: Record<string, unknown>) {
53
+ return (body: unknown): object => {
54
+ if (body === undefined || body === null || typeof body !== 'object')
55
+ return values
56
+
57
+ Object.assign(body, values)
58
+
59
+ return body
60
+ }
61
+ }
62
+ }
@@ -0,0 +1,17 @@
1
+ export interface Properties {
2
+ languages?: string[]
3
+ }
4
+
5
+ export class Property<K extends keyof Properties = keyof Properties> {
6
+ public readonly name: K
7
+ public readonly value: Properties[K]
8
+
9
+ public constructor (name: K, value: Properties[K]) {
10
+ this.name = name
11
+ this.value = value
12
+ }
13
+ }
14
+
15
+ export const properties: Properties = {
16
+ languages: []
17
+ }
@@ -0,0 +1,48 @@
1
+ import { match } from 'matchacho'
2
+ import { properties, Property } from './Properties'
3
+ import { Embed } from './Embed'
4
+ import type { Properties } from './Properties'
5
+ import type { Directive } from './Directive'
6
+ import type { DirectiveFamily } from '../../RTD'
7
+ import type { Input, Output } from '../../io'
8
+
9
+ export class Vary implements DirectiveFamily {
10
+ public readonly name = 'vary'
11
+ public readonly mandatory = false
12
+
13
+ public create (name: string, value: unknown): Property | Directive {
14
+ return match(name,
15
+ () => name in properties, (name: PN) => new Property(name, value as PV),
16
+ () => name in directives, (name: keyof typeof directives) => new directives[name](value),
17
+ () => {
18
+ throw new Error(`Unknown directive 'vary:${name}'`)
19
+ })
20
+ }
21
+
22
+ public preflight (instances: Array<Directive | Property>, request: Input): Output {
23
+ /*
24
+ To stop constructing `properties` object on each request, Directive Families must be refactored
25
+ from singleton factories to per-Node instances on the Tree.
26
+ */
27
+ const properties: Properties = {}
28
+ const directives: Directive[] = []
29
+
30
+ for (const instance of instances)
31
+ if (instance instanceof Property)
32
+ properties[instance.name] = instance.value
33
+ else
34
+ directives.push(instance)
35
+
36
+ for (const directive of directives)
37
+ directive.preflight(request, properties)
38
+
39
+ return null
40
+ }
41
+ }
42
+
43
+ type PN = keyof Properties
44
+ type PV = Properties[PN]
45
+
46
+ const directives: Record<string, new (value: any) => Directive> = {
47
+ embed: Embed
48
+ }
@@ -0,0 +1,6 @@
1
+ import type { Properties } from '../Properties'
2
+ import type { Input } from '../../../io'
3
+
4
+ export interface Embedding {
5
+ resolve: (input: Input, properties: Properties) => string | undefined
6
+ }
@@ -0,0 +1,32 @@
1
+ import { cors } from '../../cors'
2
+ import type { Input } from '../../../io'
3
+ import type { Embedding } from './Embedding'
4
+
5
+ export class Header implements Embedding {
6
+ private readonly name: string
7
+
8
+ public constructor (name: string) {
9
+ this.name = name.toLowerCase()
10
+
11
+ if (this.name !== 'host')
12
+ cors.allow(this.name)
13
+ }
14
+
15
+ public resolve (input: Input): string | undefined {
16
+ const value = input.request.headers[this.name]
17
+
18
+ if (value === undefined)
19
+ return value
20
+
21
+ if (this.name !== 'host')
22
+ input.pipelines.response.push((response) => {
23
+ response.headers ??= new Headers()
24
+ response.headers.append('vary', this.name)
25
+ })
26
+
27
+ if (Array.isArray(value))
28
+ return value.join(', ')
29
+ else
30
+ return value
31
+ }
32
+ }
@@ -0,0 +1,31 @@
1
+ import assert from 'node:assert'
2
+ import Negotiator from 'negotiator'
3
+ import { cors } from '../../cors'
4
+ import type { Properties } from '../Properties'
5
+ import type { Embedding } from './Embedding'
6
+ import type { Input } from '../../../io'
7
+
8
+ export class Language implements Embedding {
9
+ public constructor () {
10
+ cors.allow('accept-language')
11
+ }
12
+
13
+ public resolve (input: Input, properties: Properties): string | undefined {
14
+ assert.ok(properties.languages !== undefined,
15
+ 'Supported languages are not defined. Use `vary:languages` directive.')
16
+
17
+ assert.ok(properties.languages.length > 0,
18
+ 'List of supported languages is empty.')
19
+
20
+ const negotiator = new Negotiator(input.request)
21
+ const language = negotiator.language(properties.languages) ?? properties.languages[0]
22
+
23
+ input.pipelines.response.push((response) => {
24
+ response.headers ??= new Headers()
25
+ response.headers.set('content-language', language)
26
+ response.headers.append('vary', 'accept-language')
27
+ })
28
+
29
+ return language
30
+ }
31
+ }
@@ -0,0 +1,11 @@
1
+ import { Language } from './Language'
2
+ import { Header } from './Header'
3
+
4
+ import type { Embedding } from './Embedding'
5
+
6
+ export const embeddings: Record<string, new () => Embedding> = {
7
+ language: Language
8
+ }
9
+
10
+ export { Header }
11
+ export type { Embedding }
@@ -0,0 +1,3 @@
1
+ import { Vary } from './Vary'
2
+
3
+ export const vary = new Vary()
@@ -1,17 +1,21 @@
1
1
  import { type Exception } from '@toa.io/core'
2
+ import { match } from 'matchacho'
2
3
  import * as http from './HTTP'
3
4
 
4
5
  export function rethrow (exception: Exception): void {
5
6
  // see /runtime/core/src/exceptions.js
6
7
 
7
- if ((exception.code >= 200 && exception.code < 210) || exception.code === 221)
8
- throw new http.BadRequest(exception.message)
9
-
10
- if (exception.code === 302)
11
- throw new http.NotFound()
12
-
13
- if (exception.code === 303)
14
- throw new http.PreconditionFailed()
8
+ throw match<Error>(exception.code,
9
+ badRequest, () => new http.BadRequest(exception.message),
10
+ 302, NOT_FOUND,
11
+ 303, PRECONDITION_FAILED,
12
+ 306, () => new http.Conflict(exception.message),
13
+ () => exception)
14
+ }
15
15
 
16
- throw exception as unknown as Error
16
+ function badRequest (code: number): boolean {
17
+ return (code >= 200 && code < 210) || code === 221
17
18
  }
19
+
20
+ const NOT_FOUND = new http.NotFound()
21
+ const PRECONDITION_FAILED = new http.PreconditionFailed()
package/source/io.ts ADDED
@@ -0,0 +1,4 @@
1
+ import type { Context, OutgoingMessage } from './HTTP'
2
+
3
+ export type Input = Context
4
+ export type Output = OutgoingMessage | null
@@ -21,16 +21,8 @@ it('should create branch', async () => {
21
21
  const node = manifest(declaration, mf)
22
22
 
23
23
  expect(node).toBeDefined()
24
-
25
- // namespace route
26
24
  expect(node.routes).toHaveLength(1)
27
- expect(node.routes[0].path).toBe('/' + namespace)
28
-
29
- const ns = node.routes[0].node
30
-
31
- // component route
32
- expect(ns.routes).toHaveLength(1)
33
- expect(ns.routes[0].path).toBe('/' + name)
25
+ expect(node.routes[0].path).toBe('/' + namespace + '/' + name)
34
26
  })
35
27
 
36
28
  it('should not create node for default namespace', async () => {
@@ -43,16 +35,16 @@ it('should not create node for default namespace', async () => {
43
35
  })
44
36
 
45
37
  it('should throw on invalid declaration type', async () => {
46
- expect(() => manifest('hello' as unknown as object, mf)).toThrow('RTD parse error')
38
+ expect(() => manifest('hello' as unknown as object, mf))
39
+ .toThrow('Exposition declaration must be an object')
47
40
  })
48
41
 
49
42
  it('should set namespace and component', async () => {
50
43
  const node = manifest(declaration, mf)
51
44
 
52
- const ns = node.routes[0].node
53
- const cm = ns.routes[0].node
54
- const root = cm.routes[0].node
55
- const GET = root.methods[0]
45
+ const root = node.routes[0].node
46
+ const intemediate = root.routes[0].node
47
+ const GET = intemediate.methods[0]
56
48
 
57
49
  expect(GET.mapping?.namespace).toBe(namespace)
58
50
  expect(GET.mapping?.component).toBe(name)
@@ -1,25 +1,28 @@
1
+ import assert from 'node:assert'
1
2
  import { parse, type Node, type Method, type Query } from './RTD/syntax'
2
3
  import { shortcuts } from './Directive'
3
4
  import * as schemas from './schemas'
4
5
  import type { Manifest } from '@toa.io/norm'
5
6
 
6
7
  export function manifest (declaration: object, manifest: Manifest): Node {
7
- declaration = wrap(manifest.name, declaration)
8
+ assert.ok(typeof declaration === 'object' && declaration !== null,
9
+ 'Exposition declaration must be an object')
8
10
 
9
- if (manifest.namespace !== undefined && manifest.namespace !== 'default')
10
- declaration = wrap(manifest.namespace, declaration)
11
+ declaration = wrap(declaration, manifest.namespace, manifest.name)
11
12
 
12
13
  const node = parse(declaration, shortcuts)
13
14
 
14
15
  concretize(node, manifest)
15
-
16
16
  schemas.node.validate(node)
17
17
 
18
18
  return node
19
19
  }
20
20
 
21
- function wrap (segment: string, declaration: object): object {
22
- return { ['/' + segment]: { protected: true, ...declaration } }
21
+ function wrap (declaration: object, namespace: string, name: string): object {
22
+ const path = (namespace === undefined || namespace === 'default' ? '' : '/' + namespace) +
23
+ '/' + name
24
+
25
+ return { [path]: { protected: true, ...declaration } }
23
26
  }
24
27
 
25
28
  function concretize (node: Node, manifest: Manifest): void {
package/source/root.ts CHANGED
@@ -25,6 +25,11 @@ const PREDEFINED: syntax.Node = {
25
25
  family: 'auth',
26
26
  name: 'echo',
27
27
  value: null
28
+ },
29
+ {
30
+ family: 'io',
31
+ name: 'output',
32
+ value: ['id', 'roles']
28
33
  }
29
34
  ]
30
35
  }
package/source/schemas.ts CHANGED
@@ -1,9 +1,13 @@
1
1
  import { resolve } from 'node:path'
2
2
  import schemas from '@toa.io/schemas'
3
+ import type { Query } from './HTTP'
4
+ import type { Node } from './RTD'
5
+ import type { Schema } from '@toa.io/schemas'
6
+ import type { Annotation } from './Annotation'
3
7
 
4
8
  const path = resolve(__dirname, '../schemas')
5
9
  const namespace = schemas.namespace(path)
6
10
 
7
- export const querystring = namespace.schema('querystring')
8
- export const annotaion = namespace.schema('annotation')
9
- export const node = namespace.schema('node')
11
+ export const querystring: Schema<Query> = namespace.schema('querystring')
12
+ export const annotaion: Schema<Annotation> = namespace.schema('annotation')
13
+ export const node: Schema<Node> = namespace.schema('node')
@@ -3,5 +3,6 @@ export interface Annotation {
3
3
  class?: string;
4
4
  annotations?: Record<string, string>;
5
5
  debug: boolean;
6
+ trace: boolean;
6
7
  '/'?: object;
7
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Composition.js","sourceRoot":"","sources":["../source/Composition.ts"],"names":[],"mappings":";;;AAAA,qCAAkD;AAClD,yCAAmC;AACnC,uCAAwC;AAGxC,MAAa,WAAY,SAAQ,gBAAS;IACvB,IAAI,CAAY;IAEjC,YAAoB,IAAgB;QAClC,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAEkB,KAAK,CAAC,IAAI;QAC3B,MAAM,KAAK,GAAG,IAAI,EAAE,CAAA;QACpB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QAEtD,MAAM,WAAW,CAAC,OAAO,EAAE,CAAA;QAE3B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAEzB,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;IACvC,CAAC;IAEkB,OAAO;QACxB,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;IAChD,CAAC;CACF;AAtBD,kCAsBC;AAED,SAAS,IAAI;IACX,OAAO,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,mBAAO,EAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;AAC5D,CAAC;AAED,SAAS,OAAO;IACd,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;IAE1D,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;AACvD,CAAC;AAED,SAAgB,UAAU;IACxB,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,EAAE;QAC7B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;QACzC,KAAK,CAAC,IAAI,CAAC,IAAA,mBAAO,EAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;KACtC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;AAC1B,CAAC;AAVD,gCAUC;AAOD,MAAM,IAAI,GAAG,IAAA,mBAAO,EAAC,SAAS,EAAE,gBAAgB,CAAC,CAAA"}
1
+ {"version":3,"file":"Composition.js","sourceRoot":"","sources":["../source/Composition.ts"],"names":[],"mappings":";;;AAAA,qCAAkD;AAClD,yCAAmC;AACnC,uCAAwC;AAGxC,MAAa,WAAY,SAAQ,gBAAS;IACvB,IAAI,CAAY;IAEjC,YAAoB,IAAgB;QAClC,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IAEkB,KAAK,CAAC,IAAI;QAC3B,MAAM,KAAK,GAAG,IAAI,EAAE,CAAA;QACpB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QAEtD,MAAM,WAAW,CAAC,OAAO,EAAE,CAAA;QAE3B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAEzB,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;IACvC,CAAC;IAEkB,OAAO;QACxB,OAAO,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;IAChD,CAAC;CACF;AAtBD,kCAsBC;AAED,SAAS,IAAI;IACX,OAAO,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,mBAAO,EAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;AAC5D,CAAC;AAED,SAAS,OAAO;IACd,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;IAE1D,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;AACvD,CAAC;AAED,SAAgB,UAAU;IACxB,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,EAAE,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;QACzC,KAAK,CAAC,IAAI,CAAC,IAAA,mBAAO,EAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IACvC,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;AAC1B,CAAC;AAVD,gCAUC;AAOD,MAAM,IAAI,GAAG,IAAA,mBAAO,EAAC,SAAS,EAAE,gBAAgB,CAAC,CAAA"}
@@ -1,5 +1,7 @@
1
- import { type Endpoint } from './Endpoint';
2
- import { type Directives } from './Directive';
3
- import { type Branch } from './Branch';
4
1
  import type * as RTD from './RTD';
5
- export type Context = RTD.Context<Endpoint, Directives, Branch>;
2
+ export type Context = RTD.Context<Extension>;
3
+ interface Extension {
4
+ namespace: string;
5
+ component: string;
6
+ }
7
+ export {};
@@ -1,32 +1,18 @@
1
- import { type IncomingMessage, type OutgoingMessage } from './HTTP';
2
- import { type Remotes } from './Remotes';
1
+ import type { Context, OutgoingMessage } from './HTTP';
2
+ import type { Remotes } from './Remotes';
3
+ import type { Output } from './io';
3
4
  import type * as RTD from './RTD';
4
- export declare class Directives implements RTD.Directives<Directives> {
5
- private readonly directives;
6
- constructor(directives: DirectiveSet[]);
7
- preflight(request: IncomingMessage, parameters: RTD.Parameter[]): Promise<Output>;
8
- settle(request: IncomingMessage, response: OutgoingMessage): Promise<void>;
9
- merge(directives: Directives): void;
5
+ export declare class Directives implements RTD.Directives {
6
+ private readonly sets;
7
+ constructor(sets: RTD.DirectiveSet[]);
8
+ preflight(context: Context, parameters: RTD.Parameter[]): Promise<Output>;
9
+ settle(context: Context, response: OutgoingMessage): Promise<void>;
10
10
  }
11
- export declare class DirectivesFactory implements RTD.DirectivesFactory<Directives> {
12
- private readonly remtoes;
11
+ export declare class DirectivesFactory implements RTD.DirectiveFactory {
12
+ private readonly remotes;
13
13
  private readonly families;
14
14
  private readonly mandatory;
15
- constructor(families: Family[], remotes: Remotes);
15
+ constructor(families: RTD.DirectiveFamily[], remotes: Remotes);
16
16
  create(declarations: RTD.syntax.Directive[]): Directives;
17
17
  }
18
18
  export declare const shortcuts: RTD.syntax.Shortcuts;
19
- export interface Family<TDirective = any, TExtension = any> {
20
- readonly name: string;
21
- readonly mandatory: boolean;
22
- create: (name: string, value: any, remotes: Remotes) => TDirective;
23
- preflight: (directives: TDirective[], request: IncomingMessage & TExtension, parameters: RTD.Parameter[]) => Output | Promise<Output>;
24
- settle?: (directives: TDirective[], request: IncomingMessage & TExtension, response: OutgoingMessage) => void | Promise<void>;
25
- }
26
- interface DirectiveSet {
27
- family: Family;
28
- directives: any[];
29
- }
30
- export type Input = IncomingMessage;
31
- export type Output = OutgoingMessage | null;
32
- export {};
@@ -2,32 +2,31 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.shortcuts = exports.DirectivesFactory = exports.Directives = void 0;
4
4
  class Directives {
5
- directives;
6
- constructor(directives) {
7
- this.directives = directives;
5
+ sets;
6
+ constructor(sets) {
7
+ this.sets = sets;
8
8
  }
9
- async preflight(request, parameters) {
10
- for (const directive of this.directives) {
11
- const output = await directive.family.preflight(directive.directives, request, parameters);
9
+ async preflight(context, parameters) {
10
+ for (const set of this.sets) {
11
+ if (set.family.preflight === undefined)
12
+ continue;
13
+ const output = await set.family.preflight(set.directives, context, parameters);
12
14
  if (output !== null) {
13
- await this.settle(request, output);
15
+ await this.settle(context, output);
14
16
  return output;
15
17
  }
16
18
  }
17
19
  return null;
18
20
  }
19
- async settle(request, response) {
20
- for (const directive of this.directives)
21
- if (directive.family.settle !== undefined)
22
- await directive.family.settle(directive.directives, request, response);
23
- }
24
- merge(directives) {
25
- this.directives.push(...directives.directives);
21
+ async settle(context, response) {
22
+ for (const set of this.sets)
23
+ if (set.family.settle !== undefined)
24
+ await set.family.settle(set.directives, context, response);
26
25
  }
27
26
  }
28
27
  exports.Directives = Directives;
29
28
  class DirectivesFactory {
30
- remtoes;
29
+ remotes;
31
30
  families = {};
32
31
  mandatory = [];
33
32
  constructor(families, remotes) {
@@ -36,7 +35,7 @@ class DirectivesFactory {
36
35
  if (family.mandatory)
37
36
  this.mandatory.push(family.name);
38
37
  }
39
- this.remtoes = remotes;
38
+ this.remotes = remotes;
40
39
  }
41
40
  create(declarations) {
42
41
  const groups = {};
@@ -45,8 +44,8 @@ class DirectivesFactory {
45
44
  for (const declaration of declarations) {
46
45
  const family = this.families[declaration.family];
47
46
  if (family === undefined)
48
- throw new Error(`Directive family '${declaration.family}' not found.`);
49
- const directive = family.create(declaration.name, declaration.value, this.remtoes);
47
+ throw new Error(`Directive family '${declaration.family}' is not found.`);
48
+ const directive = family.create(declaration.name, declaration.value, this.remotes);
50
49
  groups[family.name] ??= [];
51
50
  groups[family.name].push(directive);
52
51
  mandatory.delete(family.name);
@@ -1 +1 @@
1
- {"version":3,"file":"Directive.js","sourceRoot":"","sources":["../source/Directive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Directive.js","sourceRoot":"","sources":["../source/Directive.ts"],"names":[],"mappings":"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"}