@toa.io/extensions.exposition 1.0.0-alpha.2 → 1.0.0-alpha.21

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 (383) hide show
  1. package/components/identity.bans/manifest.toa.yaml +15 -6
  2. package/components/identity.bans/operations/transit.d.ts +14 -0
  3. package/components/identity.bans/operations/transit.js +11 -0
  4. package/components/identity.bans/operations/transit.js.map +1 -0
  5. package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -0
  6. package/components/identity.bans/source/transit.ts +21 -0
  7. package/components/identity.bans/tsconfig.json +9 -0
  8. package/components/identity.basic/manifest.toa.yaml +5 -1
  9. package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
  10. package/components/identity.federation/manifest.toa.yaml +13 -7
  11. package/components/identity.federation/operations/authenticate.js +4 -4
  12. package/components/identity.federation/operations/authenticate.js.map +1 -1
  13. package/components/identity.federation/operations/create.js +4 -4
  14. package/components/identity.federation/operations/create.js.map +1 -1
  15. package/components/identity.federation/operations/{assertions-as-values.cjs → lib/assertions-as-values.js} +1 -1
  16. package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -0
  17. package/components/identity.federation/operations/{jwt.d.cts → lib/jwt.d.ts} +5 -4
  18. package/components/identity.federation/operations/{jwt.cjs → lib/jwt.js} +35 -11
  19. package/components/identity.federation/operations/lib/jwt.js.map +1 -0
  20. package/components/identity.federation/operations/schemas.d.ts +16 -0
  21. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
  22. package/components/identity.federation/operations/types.d.ts +1 -1
  23. package/components/identity.federation/source/authenticate.ts +2 -2
  24. package/components/identity.federation/source/create.ts +2 -2
  25. package/components/identity.federation/source/{assertions-as-values.cts → lib/assertions-as-values.ts} +1 -2
  26. package/components/identity.federation/source/lib/jwt.test.ts +56 -0
  27. package/components/identity.federation/source/{jwt.cts → lib/jwt.ts} +57 -29
  28. package/components/identity.federation/source/schemas.ts +16 -0
  29. package/components/identity.federation/source/types.ts +1 -1
  30. package/components/identity.federation/tsconfig.json +2 -2
  31. package/components/identity.roles/manifest.toa.yaml +18 -5
  32. package/components/identity.roles/operations/grant.d.ts +10 -0
  33. package/components/identity.roles/operations/grant.js +21 -0
  34. package/components/identity.roles/operations/grant.js.map +1 -0
  35. package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
  36. package/components/identity.roles/operations/lib/Entity.js +3 -0
  37. package/components/identity.roles/operations/lib/Entity.js.map +1 -0
  38. package/components/identity.roles/operations/list.d.ts +1 -4
  39. package/components/identity.roles/operations/list.js.map +1 -1
  40. package/components/identity.roles/operations/principal.d.ts +4 -6
  41. package/components/identity.roles/operations/principal.js +6 -1
  42. package/components/identity.roles/operations/principal.js.map +1 -1
  43. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
  44. package/components/identity.roles/source/grant.ts +32 -0
  45. package/components/identity.roles/source/lib/Entity.ts +5 -0
  46. package/components/identity.roles/source/list.ts +2 -4
  47. package/components/identity.roles/source/principal.ts +10 -8
  48. package/components/identity.tokens/manifest.toa.yaml +12 -3
  49. package/components/identity.tokens/operations/authenticate.js +5 -2
  50. package/components/identity.tokens/operations/authenticate.js.map +1 -1
  51. package/components/identity.tokens/operations/encrypt.js +4 -1
  52. package/components/identity.tokens/operations/encrypt.js.map +1 -1
  53. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
  54. package/components/identity.tokens/operations/types.d.ts +1 -2
  55. package/components/identity.tokens/receivers/identity.bans.created.js +3 -0
  56. package/components/identity.tokens/source/authenticate.ts +5 -2
  57. package/components/identity.tokens/source/encrypt.test.ts +22 -1
  58. package/components/identity.tokens/source/encrypt.ts +4 -1
  59. package/components/identity.tokens/source/types.ts +1 -2
  60. package/components/octets.storage/operations/store.js +1 -1
  61. package/documentation/access.md +27 -16
  62. package/documentation/cache.md +8 -1
  63. package/documentation/components.md +55 -23
  64. package/documentation/identity.md +7 -0
  65. package/documentation/io.md +56 -0
  66. package/documentation/octets.md +12 -0
  67. package/documentation/protocol.md +3 -0
  68. package/documentation/query.md +50 -5
  69. package/documentation/require.md +15 -0
  70. package/documentation/tree.md +22 -4
  71. package/documentation/vary.md +9 -3
  72. package/features/access.feature +28 -49
  73. package/features/annotation.feature +1 -0
  74. package/features/body.feature +3 -1
  75. package/features/cache.feature +39 -0
  76. package/features/cors.feature +2 -2
  77. package/features/directives.feature +2 -0
  78. package/features/dynamic.feature +14 -7
  79. package/features/errors.feature +7 -4
  80. package/features/etag.feature +97 -0
  81. package/features/identity.bans.feature +128 -0
  82. package/features/identity.basic.feature +68 -3
  83. package/features/identity.federation.feature +78 -5
  84. package/features/identity.roles.feature +205 -1
  85. package/features/identity.tokens.feature +98 -0
  86. package/features/io.feature +196 -0
  87. package/features/octets.entries.feature +3 -1
  88. package/features/octets.feature +32 -10
  89. package/features/octets.meta.feature +4 -3
  90. package/features/octets.workflows.feature +39 -0
  91. package/features/queries.feature +9 -1
  92. package/features/require.feature +64 -0
  93. package/features/response.feature +7 -1
  94. package/features/routes.feature +17 -10
  95. package/features/steps/Database.ts +17 -10
  96. package/features/steps/Gateway.ts +3 -0
  97. package/features/steps/IdP.ts +55 -21
  98. package/features/steps/components/echo/manifest.toa.yaml +5 -0
  99. package/features/steps/components/echo/operations/identity.js +7 -0
  100. package/features/steps/components/greeter/manifest.toa.yaml +1 -0
  101. package/features/steps/components/octets.tester/manifest.toa.yaml +1 -0
  102. package/features/steps/components/pots/manifest.toa.yaml +12 -3
  103. package/features/steps/components/sequences/manifest.toa.yaml +1 -0
  104. package/features/steps/components/users.properties/manifest.toa.yaml +2 -1
  105. package/features/timing.feature +66 -0
  106. package/features/vary.feature +56 -3
  107. package/package.json +13 -14
  108. package/readme.md +7 -6
  109. package/schemas/annotation.cos.yaml +1 -0
  110. package/schemas/io/input.cos.yaml +3 -0
  111. package/schemas/io/message.cos.yaml +5 -0
  112. package/schemas/io/output.cos.yaml +5 -0
  113. package/schemas/octets/workflow.cos.yaml +12 -0
  114. package/schemas/querystring.cos.yaml +1 -0
  115. package/source/Annotation.ts +1 -0
  116. package/source/Context.ts +6 -4
  117. package/source/Directive.test.ts +7 -7
  118. package/source/Directive.ts +19 -46
  119. package/source/Endpoint.ts +53 -6
  120. package/source/Factory.ts +17 -7
  121. package/source/Gateway.ts +40 -51
  122. package/source/HTTP/Context.ts +67 -0
  123. package/source/HTTP/Server.test.ts +1 -1
  124. package/source/HTTP/Server.ts +61 -96
  125. package/source/HTTP/Timing.ts +40 -0
  126. package/source/HTTP/exceptions.ts +1 -1
  127. package/source/HTTP/index.ts +1 -0
  128. package/source/HTTP/messages.test.ts +27 -8
  129. package/source/HTTP/messages.ts +32 -48
  130. package/source/Mapping.ts +7 -8
  131. package/source/RTD/Context.ts +7 -10
  132. package/source/RTD/Directives.ts +28 -4
  133. package/source/RTD/Endpoint.ts +6 -4
  134. package/source/RTD/Match.ts +2 -7
  135. package/source/RTD/Method.ts +7 -13
  136. package/source/RTD/Node.ts +13 -14
  137. package/source/RTD/Tree.ts +17 -16
  138. package/source/RTD/factory.ts +3 -6
  139. package/source/Tenant.ts +0 -8
  140. package/source/deployment.ts +6 -0
  141. package/source/directives/auth/Anonymous.ts +3 -2
  142. package/source/directives/auth/Authorization.ts +17 -14
  143. package/source/directives/auth/Delegate.ts +35 -0
  144. package/source/directives/auth/Incept.ts +11 -6
  145. package/source/directives/auth/Role.test.ts +53 -6
  146. package/source/directives/auth/Role.ts +27 -17
  147. package/source/directives/auth/Scheme.ts +2 -2
  148. package/source/directives/auth/types.ts +1 -1
  149. package/source/directives/cache/Cache.ts +5 -5
  150. package/source/directives/cache/Control.ts +48 -22
  151. package/source/directives/cache/types.ts +1 -1
  152. package/source/directives/cors/CORS.ts +18 -10
  153. package/source/directives/dev/Development.ts +4 -4
  154. package/source/directives/index.ts +6 -4
  155. package/source/directives/io/Directive.ts +11 -0
  156. package/source/directives/io/IO.ts +43 -0
  157. package/source/directives/io/Input.ts +50 -0
  158. package/source/directives/io/Message.ts +1 -0
  159. package/source/directives/io/Output.ts +69 -0
  160. package/source/directives/io/index.ts +3 -0
  161. package/source/directives/io/schemas.ts +12 -0
  162. package/source/directives/octets/Context.ts +5 -4
  163. package/source/directives/octets/Delete.ts +25 -13
  164. package/source/directives/octets/Directive.ts +10 -0
  165. package/source/directives/octets/Fetch.ts +33 -17
  166. package/source/directives/octets/List.ts +18 -8
  167. package/source/directives/octets/Octets.ts +12 -8
  168. package/source/directives/octets/Permute.ts +16 -9
  169. package/source/directives/octets/Store.ts +43 -19
  170. package/source/directives/octets/Workflow.ts +48 -0
  171. package/source/directives/octets/schemas.test.ts +21 -0
  172. package/source/directives/octets/schemas.ts +2 -0
  173. package/source/directives/octets/types.ts +0 -7
  174. package/source/directives/octets/{workflow → workflows}/Execution.ts +0 -2
  175. package/source/directives/octets/{workflow → workflows}/Workflow.ts +2 -2
  176. package/source/directives/require/Directive.ts +5 -0
  177. package/source/directives/require/Headers.ts +20 -0
  178. package/source/directives/require/Require.ts +28 -0
  179. package/source/directives/require/index.ts +3 -0
  180. package/source/directives/vary/Directive.ts +2 -1
  181. package/source/directives/vary/Embed.ts +14 -8
  182. package/source/directives/vary/Vary.ts +8 -6
  183. package/source/directives/vary/embeddings/Embedding.ts +2 -1
  184. package/source/directives/vary/embeddings/Header.ts +9 -7
  185. package/source/directives/vary/embeddings/Language.ts +2 -2
  186. package/source/directives/vary/embeddings/Parameter.ts +14 -0
  187. package/source/directives/vary/embeddings/index.ts +3 -3
  188. package/source/exceptions.ts +22 -11
  189. package/source/io.ts +2 -2
  190. package/source/root.ts +5 -0
  191. package/transpiled/Annotation.d.ts +1 -0
  192. package/transpiled/Context.d.ts +6 -4
  193. package/transpiled/Directive.d.ts +8 -21
  194. package/transpiled/Directive.js +11 -14
  195. package/transpiled/Directive.js.map +1 -1
  196. package/transpiled/Endpoint.d.ts +7 -5
  197. package/transpiled/Endpoint.js +58 -2
  198. package/transpiled/Endpoint.js.map +1 -1
  199. package/transpiled/Factory.js +8 -2
  200. package/transpiled/Factory.js.map +1 -1
  201. package/transpiled/Gateway.d.ts +4 -8
  202. package/transpiled/Gateway.js +23 -33
  203. package/transpiled/Gateway.js.map +1 -1
  204. package/transpiled/HTTP/Context.d.ts +24 -0
  205. package/transpiled/HTTP/Context.js +47 -0
  206. package/transpiled/HTTP/Context.js.map +1 -0
  207. package/transpiled/HTTP/Server.d.ts +8 -7
  208. package/transpiled/HTTP/Server.js +69 -77
  209. package/transpiled/HTTP/Server.js.map +1 -1
  210. package/transpiled/HTTP/Timing.d.ts +10 -0
  211. package/transpiled/HTTP/Timing.js +29 -0
  212. package/transpiled/HTTP/Timing.js.map +1 -0
  213. package/transpiled/HTTP/exceptions.d.ts +1 -1
  214. package/transpiled/HTTP/exceptions.js.map +1 -1
  215. package/transpiled/HTTP/index.d.ts +1 -0
  216. package/transpiled/HTTP/index.js +1 -0
  217. package/transpiled/HTTP/index.js.map +1 -1
  218. package/transpiled/HTTP/messages.d.ts +7 -21
  219. package/transpiled/HTTP/messages.js +24 -26
  220. package/transpiled/HTTP/messages.js.map +1 -1
  221. package/transpiled/Mapping.js +7 -7
  222. package/transpiled/Mapping.js.map +1 -1
  223. package/transpiled/RTD/Context.d.ts +7 -6
  224. package/transpiled/RTD/Directives.d.ts +19 -4
  225. package/transpiled/RTD/Endpoint.d.ts +6 -4
  226. package/transpiled/RTD/Match.d.ts +2 -4
  227. package/transpiled/RTD/Method.d.ts +7 -7
  228. package/transpiled/RTD/Method.js.map +1 -1
  229. package/transpiled/RTD/Node.d.ts +4 -6
  230. package/transpiled/RTD/Node.js +2 -1
  231. package/transpiled/RTD/Node.js.map +1 -1
  232. package/transpiled/RTD/Tree.d.ts +6 -6
  233. package/transpiled/RTD/Tree.js +4 -1
  234. package/transpiled/RTD/Tree.js.map +1 -1
  235. package/transpiled/RTD/factory.d.ts +2 -4
  236. package/transpiled/RTD/factory.js +1 -1
  237. package/transpiled/RTD/factory.js.map +1 -1
  238. package/transpiled/Tenant.d.ts +0 -1
  239. package/transpiled/Tenant.js +0 -6
  240. package/transpiled/Tenant.js.map +1 -1
  241. package/transpiled/deployment.js +5 -0
  242. package/transpiled/deployment.js.map +1 -1
  243. package/transpiled/directives/auth/Anonymous.js +3 -4
  244. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  245. package/transpiled/directives/auth/Authorization.d.ts +2 -3
  246. package/transpiled/directives/auth/Authorization.js +10 -8
  247. package/transpiled/directives/auth/Authorization.js.map +1 -1
  248. package/transpiled/directives/auth/Delegate.d.ts +8 -0
  249. package/transpiled/directives/auth/Delegate.js +29 -0
  250. package/transpiled/directives/auth/Delegate.js.map +1 -0
  251. package/transpiled/directives/auth/Incept.d.ts +1 -1
  252. package/transpiled/directives/auth/Incept.js +11 -6
  253. package/transpiled/directives/auth/Incept.js.map +1 -1
  254. package/transpiled/directives/auth/Role.d.ts +4 -1
  255. package/transpiled/directives/auth/Role.js +25 -17
  256. package/transpiled/directives/auth/Role.js.map +1 -1
  257. package/transpiled/directives/auth/Scheme.js +2 -2
  258. package/transpiled/directives/auth/Scheme.js.map +1 -1
  259. package/transpiled/directives/cache/Cache.d.ts +3 -3
  260. package/transpiled/directives/cache/Cache.js +3 -3
  261. package/transpiled/directives/cache/Cache.js.map +1 -1
  262. package/transpiled/directives/cache/Control.d.ts +5 -4
  263. package/transpiled/directives/cache/Control.js +32 -15
  264. package/transpiled/directives/cache/Control.js.map +1 -1
  265. package/transpiled/directives/cache/types.d.ts +1 -1
  266. package/transpiled/directives/cors/CORS.d.ts +2 -3
  267. package/transpiled/directives/cors/CORS.js +17 -10
  268. package/transpiled/directives/cors/CORS.js.map +1 -1
  269. package/transpiled/directives/dev/Development.d.ts +3 -3
  270. package/transpiled/directives/dev/Development.js +1 -1
  271. package/transpiled/directives/dev/Development.js.map +1 -1
  272. package/transpiled/directives/index.d.ts +2 -2
  273. package/transpiled/directives/index.js +5 -3
  274. package/transpiled/directives/index.js.map +1 -1
  275. package/transpiled/directives/io/Directive.d.ts +8 -0
  276. package/transpiled/directives/io/Directive.js +3 -0
  277. package/transpiled/directives/io/Directive.js.map +1 -0
  278. package/transpiled/directives/io/IO.d.ts +9 -0
  279. package/transpiled/directives/io/IO.js +33 -0
  280. package/transpiled/directives/io/IO.js.map +1 -0
  281. package/transpiled/directives/io/Input.d.ts +11 -0
  282. package/transpiled/directives/io/Input.js +63 -0
  283. package/transpiled/directives/io/Input.js.map +1 -0
  284. package/transpiled/directives/io/Message.d.ts +1 -0
  285. package/transpiled/directives/io/Message.js +3 -0
  286. package/transpiled/directives/io/Message.js.map +1 -0
  287. package/transpiled/directives/io/Output.d.ts +13 -0
  288. package/transpiled/directives/io/Output.js +76 -0
  289. package/transpiled/directives/io/Output.js.map +1 -0
  290. package/transpiled/directives/io/index.d.ts +2 -0
  291. package/transpiled/directives/io/index.js +6 -0
  292. package/transpiled/directives/io/index.js.map +1 -0
  293. package/transpiled/directives/io/schemas.d.ts +7 -0
  294. package/transpiled/directives/io/schemas.js +14 -0
  295. package/transpiled/directives/io/schemas.js.map +1 -0
  296. package/transpiled/directives/octets/Context.d.ts +4 -4
  297. package/transpiled/directives/octets/Context.js +4 -2
  298. package/transpiled/directives/octets/Context.js.map +1 -1
  299. package/transpiled/directives/octets/Delete.d.ts +5 -4
  300. package/transpiled/directives/octets/Delete.js +24 -12
  301. package/transpiled/directives/octets/Delete.js.map +1 -1
  302. package/transpiled/directives/octets/Directive.d.ts +8 -0
  303. package/transpiled/directives/octets/Directive.js +8 -0
  304. package/transpiled/directives/octets/Directive.js.map +1 -0
  305. package/transpiled/directives/octets/Fetch.d.ts +4 -3
  306. package/transpiled/directives/octets/Fetch.js +31 -15
  307. package/transpiled/directives/octets/Fetch.js.map +1 -1
  308. package/transpiled/directives/octets/List.d.ts +4 -3
  309. package/transpiled/directives/octets/List.js +16 -7
  310. package/transpiled/directives/octets/List.js.map +1 -1
  311. package/transpiled/directives/octets/Octets.d.ts +4 -4
  312. package/transpiled/directives/octets/Octets.js +8 -4
  313. package/transpiled/directives/octets/Octets.js.map +1 -1
  314. package/transpiled/directives/octets/Permute.d.ts +4 -3
  315. package/transpiled/directives/octets/Permute.js +14 -7
  316. package/transpiled/directives/octets/Permute.js.map +1 -1
  317. package/transpiled/directives/octets/Store.d.ts +6 -4
  318. package/transpiled/directives/octets/Store.js +28 -13
  319. package/transpiled/directives/octets/Store.js.map +1 -1
  320. package/transpiled/directives/octets/Workflow.d.ts +15 -0
  321. package/transpiled/directives/octets/Workflow.js +59 -0
  322. package/transpiled/directives/octets/Workflow.js.map +1 -0
  323. package/transpiled/directives/octets/schemas.d.ts +2 -0
  324. package/transpiled/directives/octets/schemas.js +2 -1
  325. package/transpiled/directives/octets/schemas.js.map +1 -1
  326. package/transpiled/directives/octets/types.d.ts +0 -5
  327. package/transpiled/directives/octets/{workflow → workflows}/Execution.js +0 -1
  328. package/transpiled/directives/octets/workflows/Execution.js.map +1 -0
  329. package/transpiled/directives/octets/{workflow → workflows}/Workflow.d.ts +1 -1
  330. package/transpiled/directives/octets/{workflow → workflows}/Workflow.js +2 -2
  331. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -0
  332. package/transpiled/directives/octets/workflows/index.js.map +1 -0
  333. package/transpiled/directives/require/Directive.d.ts +4 -0
  334. package/transpiled/directives/require/Directive.js +3 -0
  335. package/transpiled/directives/require/Directive.js.map +1 -0
  336. package/transpiled/directives/require/Headers.d.ts +7 -0
  337. package/transpiled/directives/require/Headers.js +19 -0
  338. package/transpiled/directives/require/Headers.js.map +1 -0
  339. package/transpiled/directives/require/Require.d.ts +9 -0
  340. package/transpiled/directives/require/Require.js +27 -0
  341. package/transpiled/directives/require/Require.js.map +1 -0
  342. package/transpiled/directives/require/index.d.ts +2 -0
  343. package/transpiled/directives/require/index.js +6 -0
  344. package/transpiled/directives/require/index.js.map +1 -0
  345. package/transpiled/directives/vary/Directive.d.ts +2 -1
  346. package/transpiled/directives/vary/Embed.d.ts +2 -1
  347. package/transpiled/directives/vary/Embed.js +8 -6
  348. package/transpiled/directives/vary/Embed.js.map +1 -1
  349. package/transpiled/directives/vary/Vary.d.ts +3 -3
  350. package/transpiled/directives/vary/Vary.js +4 -4
  351. package/transpiled/directives/vary/Vary.js.map +1 -1
  352. package/transpiled/directives/vary/embeddings/Embedding.d.ts +2 -1
  353. package/transpiled/directives/vary/embeddings/Header.js +9 -7
  354. package/transpiled/directives/vary/embeddings/Header.js.map +1 -1
  355. package/transpiled/directives/vary/embeddings/Language.js +2 -2
  356. package/transpiled/directives/vary/embeddings/Language.js.map +1 -1
  357. package/transpiled/directives/vary/embeddings/Parameter.d.ts +7 -0
  358. package/transpiled/directives/vary/embeddings/Parameter.js +14 -0
  359. package/transpiled/directives/vary/embeddings/Parameter.js.map +1 -0
  360. package/transpiled/directives/vary/embeddings/index.d.ts +2 -2
  361. package/transpiled/directives/vary/embeddings/index.js +5 -3
  362. package/transpiled/directives/vary/embeddings/index.js.map +1 -1
  363. package/transpiled/exceptions.d.ts +3 -2
  364. package/transpiled/exceptions.js +13 -7
  365. package/transpiled/exceptions.js.map +1 -1
  366. package/transpiled/io.d.ts +2 -2
  367. package/transpiled/root.js +5 -0
  368. package/transpiled/root.js.map +1 -1
  369. package/transpiled/tsconfig.tsbuildinfo +1 -1
  370. package/components/identity.federation/operations/assertions-as-values.cjs.map +0 -1
  371. package/components/identity.federation/operations/jwt.cjs.map +0 -1
  372. package/source/HTTP/Server.fixtures.ts +0 -40
  373. package/transpiled/HTTP/Server.fixtures.d.ts +0 -10
  374. package/transpiled/HTTP/Server.fixtures.js +0 -31
  375. package/transpiled/HTTP/Server.fixtures.js.map +0 -1
  376. package/transpiled/directives/octets/workflow/Execution.js.map +0 -1
  377. package/transpiled/directives/octets/workflow/Workflow.js.map +0 -1
  378. package/transpiled/directives/octets/workflow/index.js.map +0 -1
  379. /package/components/identity.federation/operations/{assertions-as-values.d.cts → lib/assertions-as-values.d.ts} +0 -0
  380. /package/source/directives/octets/{workflow → workflows}/index.ts +0 -0
  381. /package/transpiled/directives/octets/{workflow → workflows}/Execution.d.ts +0 -0
  382. /package/transpiled/directives/octets/{workflow → workflows}/index.d.ts +0 -0
  383. /package/transpiled/directives/octets/{workflow → workflows}/index.js +0 -0
@@ -5,6 +5,7 @@ Feature: The Vary directive family
5
5
  """yaml
6
6
  exposition:
7
7
  /:
8
+ io:output: true
8
9
  vary:languages: [en, fr]
9
10
  GET:
10
11
  vary:embed:
@@ -43,6 +44,7 @@ Feature: The Vary directive family
43
44
  """yaml
44
45
  exposition:
45
46
  /:
47
+ io:output: true
46
48
  GET:
47
49
  anonymous: true
48
50
  vary:embed:
@@ -62,12 +64,12 @@ Feature: The Vary directive family
62
64
  content-language: fr
63
65
  """
64
66
 
65
-
66
67
  Scenario: Embedding a value of an arbitrary header
67
68
  Given the `echo` is running with the following manifest:
68
69
  """yaml
69
70
  exposition:
70
71
  /:
72
+ io:output: true
71
73
  GET:
72
74
  vary:embed:
73
75
  name: :foo
@@ -88,11 +90,38 @@ Feature: The Vary directive family
88
90
  Hello bar
89
91
  """
90
92
 
93
+ Scenario: Embedding a `host` header value
94
+ Given the `echo` is running with the following manifest:
95
+ """yaml
96
+ exposition:
97
+ /:
98
+ io:output: true
99
+ GET:
100
+ vary:embed:
101
+ name: :Host
102
+ endpoint: compute
103
+ """
104
+ When the following request is received:
105
+ """
106
+ GET /echo/ HTTP/1.1
107
+ accept: application/yaml
108
+ foo: bar
109
+ """
110
+ Then the following reply is sent:
111
+ """
112
+ 200 OK
113
+ content-type: application/yaml
114
+ vary: accept
115
+
116
+ Hello 127.0.0.1:8000
117
+ """
118
+
91
119
  Scenario Outline: Embedding a value from the list of options
92
120
  Given the `echo` is running with the following manifest:
93
121
  """yaml
94
122
  exposition:
95
123
  /:
124
+ io:output: true
96
125
  vary:languages: [en, fr]
97
126
  GET:
98
127
  vary:embed:
@@ -122,11 +151,35 @@ Feature: The Vary directive family
122
151
  | bar | baz |
123
152
  | accept-language | en |
124
153
 
154
+ Scenario: Embedding route parameter
155
+ Given the `echo` is running with the following manifest:
156
+ """yaml
157
+ exposition:
158
+ /:friend:
159
+ io:output: true
160
+ GET:
161
+ vary:embed:
162
+ name: /:friend
163
+ endpoint: compute
164
+ """
165
+ When the following request is received:
166
+ """
167
+ GET /echo/Ken/ HTTP/1.1
168
+ accept: text/plain
169
+ """
170
+ Then the following reply is sent:
171
+ """
172
+ 200 OK
173
+
174
+ Hello Ken
175
+ """
176
+
125
177
  Scenario: Adding headers used by defined embeddings to CORS permissions
126
178
  Given the `echo` is running with the following manifest:
127
179
  """yaml
128
180
  exposition:
129
181
  /:
182
+ io:output: true
130
183
  vary:languages: [en, fr]
131
184
  GET:
132
185
  vary:embed:
@@ -140,11 +193,11 @@ Feature: The Vary directive family
140
193
  When the following request is received:
141
194
  """
142
195
  OPTIONS / HTTP/1.1
143
- origin: http://example.com
196
+ origin: https://example.com
144
197
  access-control-request-headers: whatever
145
198
  """
146
199
  Then the following reply is sent:
147
200
  """
148
201
  204 No Content
149
- access-control-allow-headers: accept, authorization, content-type, accept-language, foo, bar
202
+ access-control-allow-headers: accept, authorization, content-type, etag, if-match, if-none-match, accept-language, foo, bar
150
203
  """
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toa.io/extensions.exposition",
3
- "version": "1.0.0-alpha.2",
3
+ "version": "1.0.0-alpha.21",
4
4
  "description": "Toa Exposition",
5
5
  "author": "temich <tema.gurtovoy@gmail.com>",
6
6
  "homepage": "https://github.com/toa-io/toa#readme",
@@ -17,13 +17,11 @@
17
17
  "access": "public"
18
18
  },
19
19
  "dependencies": {
20
- "@toa.io/core": "1.0.0-alpha.2",
21
- "@toa.io/generic": "1.0.0-alpha.2",
22
- "@toa.io/schemas": "1.0.0-alpha.2",
23
- "@toa.io/streams": "1.0.0-alpha.2",
20
+ "@toa.io/core": "1.0.0-alpha.21",
21
+ "@toa.io/generic": "1.0.0-alpha.21",
22
+ "@toa.io/schemas": "1.0.0-alpha.21",
24
23
  "bcryptjs": "2.4.3",
25
24
  "error-value": "0.3.0",
26
- "express": "4.18.2",
27
25
  "js-yaml": "4.1.0",
28
26
  "matchacho": "0.3.5",
29
27
  "msgpackr": "1.10.1",
@@ -36,21 +34,22 @@
36
34
  },
37
35
  "scripts": {
38
36
  "test": "jest",
39
- "transpile": "tsc && npm run transpile:basic && npm run transpile:tokens && npm run transpile:roles && npm run transpile:federation",
37
+ "transpile": "tsc && npm run transpile:bans && npm run transpile:basic && npm run transpile:tokens && npm run transpile:roles && npm run transpile:federation",
38
+ "transpile:bans": "tsc -p ./components/identity.bans",
40
39
  "transpile:basic": "tsc -p ./components/identity.basic",
41
- "pretranspile:federation": "js-yaml components/identity.federation/manifest.toa.yaml | jq -M '{ type: \"object\", properties: {configuration: .configuration.schema, entity: .entity.schema }, additionalProperties: false}' > schemas.json && json2ts -i schemas.json -o components/identity.federation/source/schemas.ts && rm schemas.json",
42
- "transpile:federation": "tsc -p ./components/identity.federation",
43
40
  "transpile:tokens": "tsc -p ./components/identity.tokens",
44
41
  "transpile:roles": "tsc -p ./components/identity.roles",
45
- "features": "cucumber-js"
42
+ "pretranspile:federation": "js-yaml components/identity.federation/manifest.toa.yaml | jq -M '{ type: \"object\", properties: {configuration: .configuration.schema, entity: .entity.schema }, additionalProperties: false}' > schemas.json && json2ts -i schemas.json -o components/identity.federation/source/schemas.ts && rm schemas.json",
43
+ "transpile:federation": "tsc -p ./components/identity.federation",
44
+ "features": "cucumber-js",
45
+ "features:security": "cucumber-js --tags @security"
46
46
  },
47
47
  "devDependencies": {
48
- "@toa.io/agent": "1.0.0-alpha.2",
49
- "@toa.io/extensions.storages": "1.0.0-alpha.2",
48
+ "@toa.io/agent": "1.0.0-alpha.21",
49
+ "@toa.io/extensions.storages": "1.0.0-alpha.21",
50
50
  "@types/bcryptjs": "2.4.3",
51
51
  "@types/cors": "2.8.13",
52
- "@types/express": "4.17.17",
53
52
  "@types/negotiator": "0.6.1"
54
53
  },
55
- "gitHead": "7688e6e980a65c82ac2e459be4e355eebf406cd0"
54
+ "gitHead": "da9f4c278f6ab02a28f65c6e25c713c013cbfce9"
56
55
  }
package/readme.md CHANGED
@@ -127,12 +127,13 @@ exposition:
127
127
  host: the.example.com
128
128
  ```
129
129
 
130
- | Option | Type | Description |
131
- |---------------|-----------|------------------------------------------------------------------|
132
- | `host` | `string` | Domain name to be used for the corresponding Kubernetes Ingress. |
133
- | `class` | `string` | Ingress class |
134
- | `annotations` | `object` | Ingress annotations |
135
- | `debug` | `boolean` | Output server errors. Default `false`. |
130
+ | Option | Type | Description |
131
+ |---------------|-----------|-------------------------------------------------------------------------------------------------------------------|
132
+ | `host` | `string` | Domain name to be used for the corresponding Kubernetes Ingress. |
133
+ | `class` | `string` | Ingress class |
134
+ | `annotations` | `object` | Ingress annotations |
135
+ | `debug` | `boolean` | Output server errors. Default `false`. |
136
+ | `trace` | `boolean` | Output [server timing](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Server-Timing). Default `false`. |
136
137
 
137
138
  ### Context resources
138
139
 
@@ -2,4 +2,5 @@ host: string
2
2
  class: string
3
3
  annotations: <string>
4
4
  debug: boolean
5
+ trace: boolean
5
6
  /: ~
@@ -0,0 +1,3 @@
1
+ type: array
2
+ items:
3
+ type: string
@@ -0,0 +1,5 @@
1
+ oneOf:
2
+ - type: object
3
+ - type: array
4
+ items:
5
+ type: object
@@ -0,0 +1,5 @@
1
+ oneOf:
2
+ - type: boolean
3
+ - type: array
4
+ items:
5
+ type: string
@@ -0,0 +1,12 @@
1
+ definitions:
2
+ unit:
3
+ type: object
4
+ patternProperties:
5
+ ^[a-zA-Z0-9_]+$:
6
+ type: string
7
+
8
+ oneOf:
9
+ - $ref: '#/definitions/unit'
10
+ - type: array
11
+ items:
12
+ $ref: '#/definitions/unit'
@@ -3,3 +3,4 @@ criteria: string
3
3
  sort: string
4
4
  omit: number
5
5
  limit: number
6
+ version: number
@@ -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 // parsed and validated by RTD.syntax.parse
7
8
  }
package/source/Context.ts CHANGED
@@ -1,6 +1,8 @@
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
2
 
6
- export type Context = RTD.Context<Endpoint, Directives, Branch>
3
+ export type Context = RTD.Context<Extension>
4
+
5
+ interface Extension {
6
+ namespace: string
7
+ component: string
8
+ }
@@ -1,11 +1,11 @@
1
1
  import assert from 'node:assert'
2
2
  import { generate } from 'randomstring'
3
- import { DirectivesFactory, type Family } from './Directive'
4
- import { type syntax } from './RTD'
5
- import { type IncomingMessage } from './HTTP'
6
- import { type Remotes } from './Remotes'
3
+ import { DirectivesFactory } from './Directive'
4
+ import type { syntax, DirectiveFamily } from './RTD'
5
+ import type { Remotes } from './Remotes'
6
+ import type { Context } from './HTTP'
7
7
 
8
- const families: Array<jest.MockedObjectDeep<Family>> = [
8
+ const families: Array<jest.MockedObjectDeep<DirectiveFamily>> = [
9
9
  {
10
10
  name: 'foo',
11
11
  mandatory: true,
@@ -76,7 +76,7 @@ it('should apply directive', async () => {
76
76
  }
77
77
 
78
78
  const directives = factory.create([declaration])
79
- const request = generate() as unknown as IncomingMessage
79
+ const request = generate() as unknown as Context
80
80
  const directive = families[0].create.mock.results[0].value
81
81
 
82
82
  await directives.preflight(request, [])
@@ -89,7 +89,7 @@ it('should apply directive', async () => {
89
89
 
90
90
  it('should apply mandatory families', async () => {
91
91
  const directives = factory.create([])
92
- const request = generate() as unknown as IncomingMessage
92
+ const request = generate() as unknown as Context
93
93
 
94
94
  await directives.preflight(request, [])
95
95
 
@@ -1,49 +1,42 @@
1
- import type { IncomingMessage, OutgoingMessage } from './HTTP'
1
+ import type { Context, OutgoingMessage } from './HTTP'
2
2
  import type { Remotes } from './Remotes'
3
3
  import type { Output } from './io'
4
4
  import type * as RTD from './RTD'
5
5
 
6
- export class Directives implements RTD.Directives<Directives> {
7
- private readonly sets: DirectiveSet[]
6
+ export class Directives implements RTD.Directives {
7
+ private readonly sets: RTD.DirectiveSet[]
8
8
 
9
- public constructor (sets: DirectiveSet[]) {
9
+ public constructor (sets: RTD.DirectiveSet[]) {
10
10
  this.sets = sets
11
11
  }
12
12
 
13
- public async preflight (request: IncomingMessage, parameters: RTD.Parameter[]): Promise<Output> {
13
+ public async preflight (context: Context, parameters: RTD.Parameter[]): Promise<Output> {
14
14
  for (const set of this.sets) {
15
15
  if (set.family.preflight === undefined)
16
16
  continue
17
17
 
18
- const output = await set.family.preflight(set.directives, request, parameters)
19
-
20
- if (output !== null) {
21
- await this.settle(request, output)
18
+ const output = await set.family.preflight(set.directives, context, parameters)
22
19
 
20
+ if (output !== null)
23
21
  return output
24
- }
25
22
  }
26
23
 
27
24
  return null
28
25
  }
29
26
 
30
- public async settle (request: IncomingMessage, response: OutgoingMessage): Promise<void> {
27
+ public async settle (context: Context, response: OutgoingMessage): Promise<void> {
31
28
  for (const set of this.sets)
32
29
  if (set.family.settle !== undefined)
33
- await set.family.settle(set.directives, request, response)
34
- }
35
-
36
- public merge (directives: Directives): void {
37
- this.sets.push(...directives.sets)
30
+ await set.family.settle(set.directives, context, response)
38
31
  }
39
32
  }
40
33
 
41
- export class DirectivesFactory implements RTD.DirectivesFactory<Directives> {
42
- private readonly remtoes: Remotes
43
- private readonly families: Record<string, Family> = {}
34
+ export class DirectivesFactory implements RTD.DirectiveFactory {
35
+ private readonly remotes: Remotes
36
+ private readonly families: Record<string, RTD.DirectiveFamily> = {}
44
37
  private readonly mandatory: string[] = []
45
38
 
46
- public constructor (families: Family[], remotes: Remotes) {
39
+ public constructor (families: RTD.DirectiveFamily[], remotes: Remotes) {
47
40
  for (const family of families) {
48
41
  this.families[family.name] = family
49
42
 
@@ -51,7 +44,7 @@ export class DirectivesFactory implements RTD.DirectivesFactory<Directives> {
51
44
  this.mandatory.push(family.name)
52
45
  }
53
46
 
54
- this.remtoes = remotes
47
+ this.remotes = remotes
55
48
  }
56
49
 
57
50
  public create (declarations: RTD.syntax.Directive[]): Directives {
@@ -67,14 +60,14 @@ export class DirectivesFactory implements RTD.DirectivesFactory<Directives> {
67
60
  if (family === undefined)
68
61
  throw new Error(`Directive family '${declaration.family}' is not found.`)
69
62
 
70
- const directive = family.create(declaration.name, declaration.value, this.remtoes)
63
+ const directive = family.create(declaration.name, declaration.value, this.remotes)
71
64
 
72
65
  groups[family.name] ??= []
73
66
  groups[family.name].push(directive)
74
67
  mandatory.delete(family.name)
75
68
  }
76
69
 
77
- const sets: DirectiveSet[] = []
70
+ const sets: RTD.DirectiveSet[] = []
78
71
 
79
72
  for (const family of mandatory)
80
73
  sets.push({
@@ -97,27 +90,7 @@ export const shortcuts: RTD.syntax.Shortcuts = new Map([
97
90
  ['id', 'auth:id'],
98
91
  ['role', 'auth:role'],
99
92
  ['rule', 'auth:rule'],
100
- ['incept', 'auth:incept']
93
+ ['incept', 'auth:incept'],
94
+ ['input', 'io:input'],
95
+ ['output', 'io:output']
101
96
  ])
102
-
103
- export interface Family<TDirective = any, TExtension = any> {
104
- readonly name: string
105
- readonly mandatory: boolean
106
-
107
- // produce: (declarations: RTD.syntax.Directive[], remotes: Remotes) => TDirective[]
108
-
109
- create: (name: string, value: any, remotes: Remotes) => TDirective
110
-
111
- preflight?: (directives: TDirective[],
112
- request: IncomingMessage & TExtension,
113
- parameters: RTD.Parameter[]) => Output | Promise<Output>
114
-
115
- settle?: (directives: TDirective[],
116
- request: IncomingMessage & TExtension,
117
- response: OutgoingMessage) => void | Promise<void>
118
- }
119
-
120
- interface DirectiveSet {
121
- family: Family
122
- directives: any[]
123
- }
@@ -1,11 +1,11 @@
1
- import { type Component, type Reply } from '@toa.io/core'
1
+ import { type Component } from '@toa.io/core'
2
2
  import { type Remotes } from './Remotes'
3
3
  import { Mapping } from './Mapping'
4
4
  import { type Context } from './Context'
5
+ import * as http from './HTTP'
5
6
  import type * as RTD from './RTD'
6
- import type * as http from './HTTP'
7
7
 
8
- export class Endpoint implements RTD.Endpoint<Endpoint> {
8
+ export class Endpoint implements RTD.Endpoint {
9
9
  private readonly endpoint: string
10
10
  private readonly mapping: Mapping
11
11
  private readonly discovery: Promise<Component>
@@ -17,12 +17,38 @@ export class Endpoint implements RTD.Endpoint<Endpoint> {
17
17
  this.discovery = discovery
18
18
  }
19
19
 
20
- public async call (body: any, query: http.Query, parameters: RTD.Parameter[]): Promise<Reply> {
20
+ public async call
21
+ (context: http.Context, parameters: RTD.Parameter[]): Promise<http.OutgoingMessage> {
22
+ const body = await context.body()
23
+ const query = this.query(context)
21
24
  const request = this.mapping.fit(body, query, parameters)
22
25
 
23
26
  this.remote ??= await this.discovery
24
27
 
25
- return await this.remote.invoke(this.endpoint, request)
28
+ const reply = await this.remote.invoke(this.endpoint, request)
29
+
30
+ if (reply instanceof Error)
31
+ throw new http.Conflict(reply)
32
+
33
+ const message: http.OutgoingMessage = {}
34
+
35
+ if (typeof reply === 'object' && reply !== null && '_version' in reply) {
36
+ const etag = context.request.headers['if-none-match']
37
+
38
+ message.headers ??= new Headers()
39
+
40
+ if (etag !== undefined && reply._version === this.version(etag)) {
41
+ message.status = 304
42
+ message.headers.set('etag', etag)
43
+
44
+ return message
45
+ } else
46
+ message.headers.set('etag', `"${reply._version.toString()}"`)
47
+ }
48
+
49
+ message.body = reply
50
+
51
+ return message
26
52
  }
27
53
 
28
54
  public async close (): Promise<void> {
@@ -30,9 +56,28 @@ export class Endpoint implements RTD.Endpoint<Endpoint> {
30
56
 
31
57
  await this.remote.disconnect(INTERRUPT)
32
58
  }
59
+
60
+ private query (context: http.Context): http.Query {
61
+ const query: http.Query = Object.fromEntries(context.url.searchParams)
62
+ const etag = context.request.headers['if-match']
63
+
64
+ if (etag !== undefined)
65
+ query.version = this.version(etag)
66
+
67
+ return query
68
+ }
69
+
70
+ private version (etag: string): number {
71
+ const match = etag.match(ETAG)
72
+
73
+ if (match === null)
74
+ throw new http.BadRequest('Invalid ETag.')
75
+
76
+ return Number.parseInt(match.groups!.version)
77
+ }
33
78
  }
34
79
 
35
- export class EndpointsFactory implements RTD.EndpointsFactory<Endpoint> {
80
+ export class EndpointsFactory implements RTD.EndpointsFactory {
36
81
  private readonly remotes: Remotes
37
82
 
38
83
  public constructor (remotes: Remotes) {
@@ -56,4 +101,6 @@ export class EndpointsFactory implements RTD.EndpointsFactory<Endpoint> {
56
101
  }
57
102
  }
58
103
 
104
+ const ETAG = /^"(?<version>\d{1,32})"$/
105
+
59
106
  const INTERRUPT = true
package/source/Factory.ts CHANGED
@@ -3,12 +3,13 @@ import { Gateway } from './Gateway'
3
3
  import { Remotes } from './Remotes'
4
4
  import { Tree, syntax } from './RTD'
5
5
  import { Server } from './HTTP'
6
- import { type Endpoint, EndpointsFactory } from './Endpoint'
6
+ import { EndpointsFactory } from './Endpoint'
7
7
  import { families, interceptors } from './directives'
8
- import { type Directives, DirectivesFactory } from './Directive'
8
+ import { DirectivesFactory } from './Directive'
9
9
  import { Composition } from './Composition'
10
10
  import * as root from './root'
11
11
  import { Interception } from './Interception'
12
+ import type { Broadcast } from './Gateway'
12
13
  import type { Connector, Locator, extensions } from '@toa.io/core'
13
14
 
14
15
  export class Factory implements extensions.Factory {
@@ -19,27 +20,36 @@ export class Factory implements extensions.Factory {
19
20
  }
20
21
 
21
22
  public tenant (locator: Locator, node: syntax.Node): Connector {
22
- const broadcast = this.boot.bindings.broadcast(CHANNEL, locator.id)
23
+ const broadcast: Broadcast = this.boot.bindings.broadcast(CHANNEL, locator.id)
23
24
 
24
25
  return new Tenant(broadcast, locator, node)
25
26
  }
26
27
 
27
28
  public service (): Connector | null {
28
29
  const debug = process.env.TOA_EXPOSITION_DEBUG === '1'
29
- const broadcast = this.boot.bindings.broadcast(CHANNEL)
30
- const server = Server.create({ methods: syntax.verbs, debug })
30
+ const trace = process.env.TOA_EXPOSITION_TRACE === '1'
31
+ const broadcast: Broadcast = this.boot.bindings.broadcast(CHANNEL)
32
+
33
+ const server = Server.create({
34
+ methods: syntax.verbs,
35
+ debug,
36
+ trace
37
+ })
38
+
31
39
  const remotes = new Remotes(this.boot)
32
40
  const node = root.resolve()
33
41
  const methods = new EndpointsFactory(remotes)
34
42
  const directives = new DirectivesFactory(families, remotes)
35
43
  const interception = new Interception(interceptors)
36
- const tree = new Tree<Endpoint, Directives>(node, methods, directives)
44
+ const tree = new Tree(node, methods, directives)
37
45
 
38
46
  const composition = new Composition(this.boot)
39
- const gateway = new Gateway(broadcast, server, tree, interception)
47
+ const gateway = new Gateway(broadcast, tree, interception)
40
48
 
41
49
  gateway.depends(remotes)
42
50
  gateway.depends(composition)
51
+
52
+ server.attach(gateway.process.bind(gateway))
43
53
  server.depends(gateway)
44
54
 
45
55
  return server