@toa.io/extensions.exposition 1.0.0-alpha.4 → 1.0.0-alpha.40

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 (396) hide show
  1. package/components/context.toa.yaml +2 -2
  2. package/components/identity.bans/manifest.toa.yaml +15 -7
  3. package/components/identity.bans/operations/transit.d.ts +14 -0
  4. package/components/identity.bans/operations/transit.js +11 -0
  5. package/components/identity.bans/operations/transit.js.map +1 -0
  6. package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -0
  7. package/components/identity.bans/source/transit.ts +21 -0
  8. package/components/identity.bans/tsconfig.json +9 -0
  9. package/components/identity.basic/manifest.toa.yaml +22 -9
  10. package/components/identity.basic/operations/authenticate.d.ts +5 -1
  11. package/components/identity.basic/operations/authenticate.js +5 -2
  12. package/components/identity.basic/operations/authenticate.js.map +1 -1
  13. package/components/identity.basic/operations/incept.d.ts +12 -0
  14. package/components/identity.basic/operations/incept.js +26 -0
  15. package/components/identity.basic/operations/incept.js.map +1 -0
  16. package/components/identity.basic/operations/transit.d.ts +4 -4
  17. package/components/identity.basic/operations/transit.js +5 -3
  18. package/components/identity.basic/operations/transit.js.map +1 -1
  19. package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
  20. package/components/identity.basic/operations/types.d.ts +8 -4
  21. package/components/identity.basic/source/authenticate.ts +16 -5
  22. package/components/identity.basic/source/incept.ts +38 -0
  23. package/components/identity.basic/source/transit.ts +8 -6
  24. package/components/identity.basic/source/types.ts +8 -4
  25. package/components/identity.federation/manifest.toa.yaml +28 -22
  26. package/components/identity.federation/operations/authenticate.d.ts +2 -2
  27. package/components/identity.federation/operations/authenticate.js +3 -10
  28. package/components/identity.federation/operations/authenticate.js.map +1 -1
  29. package/components/identity.federation/operations/incept.d.ts +11 -0
  30. package/components/identity.federation/operations/{create.js → incept.js} +6 -7
  31. package/components/identity.federation/operations/incept.js.map +1 -0
  32. package/components/identity.federation/operations/lib/jwt.d.ts +4 -5
  33. package/components/identity.federation/operations/lib/jwt.js +3 -3
  34. package/components/identity.federation/operations/lib/jwt.js.map +1 -1
  35. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
  36. package/components/identity.federation/operations/types/configuration.d.ts +14 -0
  37. package/components/identity.federation/operations/types/configuration.js +3 -0
  38. package/components/identity.federation/operations/types/configuration.js.map +1 -0
  39. package/components/identity.federation/operations/{types.d.ts → types/context.d.ts} +13 -6
  40. package/components/identity.federation/operations/types/context.js +3 -0
  41. package/components/identity.federation/operations/types/context.js.map +1 -0
  42. package/components/identity.federation/operations/types/entity.d.ts +6 -0
  43. package/components/identity.federation/operations/{types.js → types/entity.js} +1 -1
  44. package/components/identity.federation/operations/types/entity.js.map +1 -0
  45. package/components/identity.federation/operations/types/index.d.ts +3 -0
  46. package/components/identity.federation/operations/types/index.js +20 -0
  47. package/components/identity.federation/operations/types/index.js.map +1 -0
  48. package/components/identity.federation/source/authenticate.ts +5 -18
  49. package/components/identity.federation/source/{create.ts → incept.ts} +10 -9
  50. package/components/identity.federation/source/lib/jwt.test.ts +2 -2
  51. package/components/identity.federation/source/lib/jwt.ts +7 -8
  52. package/components/identity.federation/source/types/configuration.ts +15 -0
  53. package/components/identity.federation/source/{types.ts → types/context.ts} +15 -5
  54. package/components/identity.federation/source/types/entity.ts +6 -0
  55. package/components/identity.federation/source/types/index.ts +3 -0
  56. package/components/identity.federation/tsconfig.json +2 -2
  57. package/components/identity.roles/manifest.toa.yaml +18 -6
  58. package/components/identity.roles/operations/grant.d.ts +10 -0
  59. package/components/identity.roles/operations/grant.js +21 -0
  60. package/components/identity.roles/operations/grant.js.map +1 -0
  61. package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
  62. package/components/identity.roles/operations/lib/Entity.js +3 -0
  63. package/components/identity.roles/operations/lib/Entity.js.map +1 -0
  64. package/components/identity.roles/operations/list.d.ts +1 -4
  65. package/components/identity.roles/operations/list.js.map +1 -1
  66. package/components/identity.roles/operations/principal.d.ts +4 -6
  67. package/components/identity.roles/operations/principal.js +6 -1
  68. package/components/identity.roles/operations/principal.js.map +1 -1
  69. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
  70. package/components/identity.roles/source/grant.ts +32 -0
  71. package/components/identity.roles/source/lib/Entity.ts +5 -0
  72. package/components/identity.roles/source/list.ts +2 -4
  73. package/components/identity.roles/source/principal.ts +10 -8
  74. package/components/identity.tokens/manifest.toa.yaml +19 -5
  75. package/components/identity.tokens/operations/authenticate.d.ts +2 -2
  76. package/components/identity.tokens/operations/authenticate.js +10 -4
  77. package/components/identity.tokens/operations/authenticate.js.map +1 -1
  78. package/components/identity.tokens/operations/decrypt.js +1 -0
  79. package/components/identity.tokens/operations/decrypt.js.map +1 -1
  80. package/components/identity.tokens/operations/encrypt.js +5 -1
  81. package/components/identity.tokens/operations/encrypt.js.map +1 -1
  82. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
  83. package/components/identity.tokens/operations/types.d.ts +8 -2
  84. package/components/identity.tokens/receivers/identity.bans.created.js +3 -0
  85. package/components/identity.tokens/source/authenticate.test.ts +11 -4
  86. package/components/identity.tokens/source/authenticate.ts +12 -5
  87. package/components/identity.tokens/source/decrypt.test.ts +5 -3
  88. package/components/identity.tokens/source/decrypt.ts +9 -8
  89. package/components/identity.tokens/source/encrypt.test.ts +26 -2
  90. package/components/identity.tokens/source/encrypt.ts +5 -1
  91. package/components/identity.tokens/source/types.ts +9 -2
  92. package/components/octets.storage/manifest.toa.yaml +0 -7
  93. package/documentation/access.md +27 -16
  94. package/documentation/authorities.md +53 -0
  95. package/documentation/cache.md +8 -1
  96. package/documentation/components.md +47 -22
  97. package/documentation/identity.md +17 -22
  98. package/documentation/io.md +56 -0
  99. package/documentation/protocol.md +3 -0
  100. package/documentation/query.md +17 -11
  101. package/documentation/require.md +15 -0
  102. package/documentation/tree.md +22 -4
  103. package/documentation/vary.md +14 -14
  104. package/features/access.feature +89 -47
  105. package/features/annotation.feature +2 -0
  106. package/features/authorities.basic.feature +141 -0
  107. package/features/authorities.feature +32 -0
  108. package/features/authorities.federation.feature +99 -0
  109. package/features/authorities.tokens.feature +118 -0
  110. package/features/body.feature +4 -0
  111. package/features/cache.feature +112 -5
  112. package/features/cors.feature +7 -2
  113. package/features/debug.feature +34 -0
  114. package/features/directives.feature +5 -0
  115. package/features/dynamic.feature +18 -7
  116. package/features/errors.feature +18 -4
  117. package/features/etag.feature +18 -1
  118. package/features/identity.bans.feature +137 -0
  119. package/features/identity.basic.feature +142 -19
  120. package/features/identity.feature +7 -2
  121. package/features/identity.federation.feature +67 -14
  122. package/features/identity.roles.feature +220 -4
  123. package/features/identity.tokens.feature +57 -4
  124. package/features/io.feature +205 -0
  125. package/features/octets.entries.feature +10 -0
  126. package/features/octets.feature +60 -64
  127. package/features/octets.meta.feature +7 -3
  128. package/features/octets.workflows.feature +14 -0
  129. package/features/probes.feature +14 -0
  130. package/features/{queries.feature → query.feature} +50 -3
  131. package/features/require.feature +67 -0
  132. package/features/response.feature +12 -3
  133. package/features/routes.feature +25 -12
  134. package/features/steps/Database.ts +17 -10
  135. package/features/steps/Gateway.ts +23 -6
  136. package/features/steps/IdP.ts +28 -23
  137. package/features/steps/components/echo/manifest.toa.yaml +5 -1
  138. package/features/steps/components/echo/operations/identity.js +7 -0
  139. package/features/steps/components/pots/manifest.toa.yaml +2 -0
  140. package/features/steps/components/users.properties/manifest.toa.yaml +2 -1
  141. package/features/streams.feature +1 -0
  142. package/features/timing.feature +27 -1
  143. package/features/vary.feature +105 -3
  144. package/package.json +12 -11
  145. package/readme.md +19 -14
  146. package/schemas/annotation.cos.yaml +1 -1
  147. package/schemas/io/input.cos.yaml +3 -0
  148. package/schemas/io/message.cos.yaml +5 -0
  149. package/schemas/io/output.cos.yaml +5 -0
  150. package/source/Annotation.ts +3 -3
  151. package/source/Context.ts +6 -4
  152. package/source/Directive.test.ts +4 -4
  153. package/source/Directive.ts +11 -38
  154. package/source/Endpoint.ts +43 -8
  155. package/source/Factory.ts +11 -7
  156. package/source/Gateway.ts +16 -44
  157. package/source/HTTP/Context.ts +24 -2
  158. package/source/HTTP/Server.ts +56 -43
  159. package/source/HTTP/exceptions.ts +7 -1
  160. package/source/HTTP/messages.ts +1 -1
  161. package/source/Mapping.ts +6 -1
  162. package/source/Query.test.ts +1 -1
  163. package/source/Query.ts +35 -24
  164. package/source/RTD/Context.ts +7 -10
  165. package/source/RTD/Directives.ts +28 -4
  166. package/source/RTD/Endpoint.ts +6 -4
  167. package/source/RTD/Match.ts +2 -7
  168. package/source/RTD/Method.ts +7 -13
  169. package/source/RTD/Node.ts +13 -14
  170. package/source/RTD/Tree.ts +17 -16
  171. package/source/RTD/factory.ts +3 -6
  172. package/source/Tenant.ts +0 -8
  173. package/source/deployment.ts +32 -22
  174. package/source/directives/auth/Authorization.ts +38 -19
  175. package/source/directives/auth/Delegate.ts +42 -0
  176. package/source/directives/auth/Incept.ts +3 -2
  177. package/source/directives/auth/Role.test.ts +53 -6
  178. package/source/directives/auth/Role.ts +22 -14
  179. package/source/directives/auth/types.ts +1 -1
  180. package/source/directives/cache/Cache.ts +15 -8
  181. package/source/directives/cache/Control.ts +42 -16
  182. package/source/directives/cors/CORS.ts +13 -7
  183. package/source/directives/dev/Development.ts +4 -4
  184. package/source/directives/index.ts +6 -4
  185. package/source/directives/io/Directive.ts +11 -0
  186. package/source/directives/io/IO.ts +43 -0
  187. package/source/directives/io/Input.ts +50 -0
  188. package/source/directives/io/Message.ts +1 -0
  189. package/source/directives/io/Output.ts +69 -0
  190. package/source/directives/io/index.ts +3 -0
  191. package/source/directives/io/schemas.ts +12 -0
  192. package/source/directives/octets/Context.ts +4 -3
  193. package/source/directives/octets/Delete.ts +4 -2
  194. package/source/directives/octets/Directive.ts +10 -0
  195. package/source/directives/octets/Fetch.ts +4 -3
  196. package/source/directives/octets/List.ts +4 -2
  197. package/source/directives/octets/Octets.ts +6 -8
  198. package/source/directives/octets/Store.ts +12 -4
  199. package/source/directives/octets/Workflow.ts +10 -3
  200. package/source/directives/octets/types.ts +0 -7
  201. package/source/directives/require/Directive.ts +5 -0
  202. package/source/directives/require/Headers.ts +20 -0
  203. package/source/directives/require/Require.ts +28 -0
  204. package/source/directives/require/index.ts +3 -0
  205. package/source/directives/vary/Directive.ts +2 -1
  206. package/source/directives/vary/Embed.ts +14 -8
  207. package/source/directives/vary/Vary.ts +7 -5
  208. package/source/directives/vary/embeddings/Authority.ts +8 -0
  209. package/source/directives/vary/embeddings/Embedding.ts +2 -1
  210. package/source/directives/vary/embeddings/Header.ts +8 -6
  211. package/source/directives/vary/embeddings/Language.ts +1 -1
  212. package/source/directives/vary/embeddings/Parameter.ts +14 -0
  213. package/source/directives/vary/embeddings/index.ts +6 -4
  214. package/source/exceptions.ts +22 -11
  215. package/source/root.ts +5 -0
  216. package/source/schemas.ts +1 -1
  217. package/transpiled/Annotation.d.ts +3 -3
  218. package/transpiled/Context.d.ts +6 -4
  219. package/transpiled/Directive.d.ts +4 -17
  220. package/transpiled/Directive.js +4 -7
  221. package/transpiled/Directive.js.map +1 -1
  222. package/transpiled/Endpoint.d.ts +5 -3
  223. package/transpiled/Endpoint.js +30 -5
  224. package/transpiled/Endpoint.js.map +1 -1
  225. package/transpiled/Factory.js +9 -4
  226. package/transpiled/Factory.js.map +1 -1
  227. package/transpiled/Gateway.d.ts +1 -4
  228. package/transpiled/Gateway.js +10 -26
  229. package/transpiled/Gateway.js.map +1 -1
  230. package/transpiled/HTTP/Context.d.ts +8 -1
  231. package/transpiled/HTTP/Context.js +15 -2
  232. package/transpiled/HTTP/Context.js.map +1 -1
  233. package/transpiled/HTTP/Server.d.ts +13 -2
  234. package/transpiled/HTTP/Server.js +41 -35
  235. package/transpiled/HTTP/Server.js.map +1 -1
  236. package/transpiled/HTTP/exceptions.d.ts +4 -1
  237. package/transpiled/HTTP/exceptions.js +7 -1
  238. package/transpiled/HTTP/exceptions.js.map +1 -1
  239. package/transpiled/HTTP/messages.js +1 -1
  240. package/transpiled/HTTP/messages.js.map +1 -1
  241. package/transpiled/Mapping.js +4 -1
  242. package/transpiled/Mapping.js.map +1 -1
  243. package/transpiled/Query.d.ts +1 -0
  244. package/transpiled/Query.js +21 -20
  245. package/transpiled/Query.js.map +1 -1
  246. package/transpiled/RTD/Context.d.ts +7 -6
  247. package/transpiled/RTD/Directives.d.ts +19 -4
  248. package/transpiled/RTD/Endpoint.d.ts +6 -4
  249. package/transpiled/RTD/Match.d.ts +2 -4
  250. package/transpiled/RTD/Method.d.ts +7 -7
  251. package/transpiled/RTD/Method.js.map +1 -1
  252. package/transpiled/RTD/Node.d.ts +4 -6
  253. package/transpiled/RTD/Node.js +2 -1
  254. package/transpiled/RTD/Node.js.map +1 -1
  255. package/transpiled/RTD/Tree.d.ts +6 -6
  256. package/transpiled/RTD/Tree.js +4 -1
  257. package/transpiled/RTD/Tree.js.map +1 -1
  258. package/transpiled/RTD/factory.d.ts +2 -4
  259. package/transpiled/RTD/factory.js +1 -1
  260. package/transpiled/RTD/factory.js.map +1 -1
  261. package/transpiled/Tenant.d.ts +0 -1
  262. package/transpiled/Tenant.js +0 -6
  263. package/transpiled/Tenant.js.map +1 -1
  264. package/transpiled/deployment.d.ts +1 -1
  265. package/transpiled/deployment.js +28 -20
  266. package/transpiled/deployment.js.map +1 -1
  267. package/transpiled/directives/auth/Authorization.d.ts +2 -3
  268. package/transpiled/directives/auth/Authorization.js +26 -12
  269. package/transpiled/directives/auth/Authorization.js.map +1 -1
  270. package/transpiled/directives/auth/Delegate.d.ts +10 -0
  271. package/transpiled/directives/auth/Delegate.js +34 -0
  272. package/transpiled/directives/auth/Delegate.js.map +1 -0
  273. package/transpiled/directives/auth/Incept.js +3 -2
  274. package/transpiled/directives/auth/Incept.js.map +1 -1
  275. package/transpiled/directives/auth/Role.d.ts +4 -1
  276. package/transpiled/directives/auth/Role.js +20 -14
  277. package/transpiled/directives/auth/Role.js.map +1 -1
  278. package/transpiled/directives/cache/Cache.d.ts +5 -5
  279. package/transpiled/directives/cache/Cache.js +10 -4
  280. package/transpiled/directives/cache/Cache.js.map +1 -1
  281. package/transpiled/directives/cache/Control.d.ts +2 -1
  282. package/transpiled/directives/cache/Control.js +29 -12
  283. package/transpiled/directives/cache/Control.js.map +1 -1
  284. package/transpiled/directives/cors/CORS.d.ts +2 -3
  285. package/transpiled/directives/cors/CORS.js +13 -7
  286. package/transpiled/directives/cors/CORS.js.map +1 -1
  287. package/transpiled/directives/dev/Development.d.ts +3 -3
  288. package/transpiled/directives/dev/Development.js +1 -1
  289. package/transpiled/directives/dev/Development.js.map +1 -1
  290. package/transpiled/directives/index.d.ts +2 -2
  291. package/transpiled/directives/index.js +5 -3
  292. package/transpiled/directives/index.js.map +1 -1
  293. package/transpiled/directives/io/Directive.d.ts +8 -0
  294. package/transpiled/directives/io/Directive.js +3 -0
  295. package/transpiled/directives/io/Directive.js.map +1 -0
  296. package/transpiled/directives/io/IO.d.ts +9 -0
  297. package/transpiled/directives/io/IO.js +33 -0
  298. package/transpiled/directives/io/IO.js.map +1 -0
  299. package/transpiled/directives/io/Input.d.ts +11 -0
  300. package/transpiled/directives/{octets/Permute.js → io/Input.js} +33 -26
  301. package/transpiled/directives/io/Input.js.map +1 -0
  302. package/transpiled/directives/io/Message.d.ts +1 -0
  303. package/transpiled/directives/io/Message.js +3 -0
  304. package/transpiled/directives/io/Message.js.map +1 -0
  305. package/transpiled/directives/io/Output.d.ts +13 -0
  306. package/transpiled/directives/io/Output.js +76 -0
  307. package/transpiled/directives/io/Output.js.map +1 -0
  308. package/transpiled/directives/io/index.d.ts +2 -0
  309. package/transpiled/directives/io/index.js +6 -0
  310. package/transpiled/directives/io/index.js.map +1 -0
  311. package/transpiled/directives/io/schemas.d.ts +7 -0
  312. package/transpiled/directives/io/schemas.js +14 -0
  313. package/transpiled/directives/io/schemas.js.map +1 -0
  314. package/transpiled/directives/octets/Context.d.ts +3 -3
  315. package/transpiled/directives/octets/Context.js +4 -2
  316. package/transpiled/directives/octets/Context.js.map +1 -1
  317. package/transpiled/directives/octets/Delete.d.ts +3 -2
  318. package/transpiled/directives/octets/Delete.js +3 -1
  319. package/transpiled/directives/octets/Delete.js.map +1 -1
  320. package/transpiled/directives/octets/Directive.d.ts +8 -0
  321. package/transpiled/directives/octets/Directive.js +8 -0
  322. package/transpiled/directives/octets/Directive.js.map +1 -0
  323. package/transpiled/directives/octets/Fetch.d.ts +3 -2
  324. package/transpiled/directives/octets/Fetch.js +3 -1
  325. package/transpiled/directives/octets/Fetch.js.map +1 -1
  326. package/transpiled/directives/octets/List.d.ts +3 -2
  327. package/transpiled/directives/octets/List.js +3 -1
  328. package/transpiled/directives/octets/List.js.map +1 -1
  329. package/transpiled/directives/octets/Octets.d.ts +4 -4
  330. package/transpiled/directives/octets/Octets.js +2 -4
  331. package/transpiled/directives/octets/Octets.js.map +1 -1
  332. package/transpiled/directives/octets/Store.d.ts +3 -2
  333. package/transpiled/directives/octets/Store.js +10 -3
  334. package/transpiled/directives/octets/Store.js.map +1 -1
  335. package/transpiled/directives/octets/Workflow.d.ts +3 -2
  336. package/transpiled/directives/octets/Workflow.js +9 -2
  337. package/transpiled/directives/octets/Workflow.js.map +1 -1
  338. package/transpiled/directives/octets/types.d.ts +0 -5
  339. package/transpiled/directives/require/Directive.d.ts +4 -0
  340. package/transpiled/directives/require/Directive.js +3 -0
  341. package/transpiled/directives/require/Directive.js.map +1 -0
  342. package/transpiled/directives/require/Headers.d.ts +7 -0
  343. package/transpiled/directives/require/Headers.js +19 -0
  344. package/transpiled/directives/require/Headers.js.map +1 -0
  345. package/transpiled/directives/require/Require.d.ts +9 -0
  346. package/transpiled/directives/require/Require.js +27 -0
  347. package/transpiled/directives/require/Require.js.map +1 -0
  348. package/transpiled/directives/require/index.d.ts +2 -0
  349. package/transpiled/directives/require/index.js +6 -0
  350. package/transpiled/directives/require/index.js.map +1 -0
  351. package/transpiled/directives/vary/Directive.d.ts +2 -1
  352. package/transpiled/directives/vary/Embed.d.ts +2 -1
  353. package/transpiled/directives/vary/Embed.js +8 -6
  354. package/transpiled/directives/vary/Embed.js.map +1 -1
  355. package/transpiled/directives/vary/Vary.d.ts +3 -3
  356. package/transpiled/directives/vary/Vary.js +3 -3
  357. package/transpiled/directives/vary/Vary.js.map +1 -1
  358. package/transpiled/directives/vary/embeddings/Authority.d.ts +5 -0
  359. package/transpiled/directives/vary/embeddings/Authority.js +10 -0
  360. package/transpiled/directives/vary/embeddings/Authority.js.map +1 -0
  361. package/transpiled/directives/vary/embeddings/Embedding.d.ts +2 -1
  362. package/transpiled/directives/vary/embeddings/Header.js +8 -6
  363. package/transpiled/directives/vary/embeddings/Header.js.map +1 -1
  364. package/transpiled/directives/vary/embeddings/Language.js +1 -1
  365. package/transpiled/directives/vary/embeddings/Language.js.map +1 -1
  366. package/transpiled/directives/vary/embeddings/Parameter.d.ts +7 -0
  367. package/transpiled/directives/vary/embeddings/Parameter.js +14 -0
  368. package/transpiled/directives/vary/embeddings/Parameter.js.map +1 -0
  369. package/transpiled/directives/vary/embeddings/index.d.ts +2 -2
  370. package/transpiled/directives/vary/embeddings/index.js +8 -4
  371. package/transpiled/directives/vary/embeddings/index.js.map +1 -1
  372. package/transpiled/exceptions.d.ts +3 -2
  373. package/transpiled/exceptions.js +13 -7
  374. package/transpiled/exceptions.js.map +1 -1
  375. package/transpiled/root.js +5 -0
  376. package/transpiled/root.js.map +1 -1
  377. package/transpiled/schemas.d.ts +1 -1
  378. package/transpiled/schemas.js +2 -2
  379. package/transpiled/schemas.js.map +1 -1
  380. package/transpiled/tsconfig.tsbuildinfo +1 -1
  381. package/components/identity.basic/operations/create.d.ts +0 -10
  382. package/components/identity.basic/operations/create.js +0 -10
  383. package/components/identity.basic/operations/create.js.map +0 -1
  384. package/components/identity.basic/source/create.ts +0 -18
  385. package/components/identity.federation/operations/create.d.ts +0 -10
  386. package/components/identity.federation/operations/create.js.map +0 -1
  387. package/components/identity.federation/operations/schemas.d.ts +0 -59
  388. package/components/identity.federation/operations/schemas.js +0 -9
  389. package/components/identity.federation/operations/schemas.js.map +0 -1
  390. package/components/identity.federation/operations/types.js.map +0 -1
  391. package/components/identity.federation/source/schemas.ts +0 -61
  392. package/components/octets.storage/operations/permute.js +0 -7
  393. package/source/HTTP/Server.test.ts +0 -126
  394. package/source/directives/octets/Permute.ts +0 -43
  395. package/transpiled/directives/octets/Permute.d.ts +0 -10
  396. package/transpiled/directives/octets/Permute.js.map +0 -1
@@ -4,56 +4,82 @@ import type { AuthenticatedContext, Directive } from './types'
4
4
  export class Control implements Directive {
5
5
  protected readonly value: string
6
6
  private cache: string | null = null
7
+ private vary: boolean = false
7
8
 
8
9
  public constructor (value: string) {
9
10
  this.value = value
10
11
  }
11
12
 
13
+ public static disabled (headers: Headers): boolean {
14
+ const value = headers.get('cache-control')
15
+
16
+ if (value === null)
17
+ return false
18
+
19
+ const directives = mask(value)
20
+
21
+ return (directives & NO_STORE) === NO_STORE
22
+ }
23
+
12
24
  public set (context: AuthenticatedContext, headers: Headers): void {
13
25
  if (!['GET', 'HEAD', 'OPTIONS'].includes(context.request.method))
14
26
  return
15
27
 
16
28
  this.cache ??= this.resolve(context)
17
29
 
30
+ if (Control.disabled(headers))
31
+ return
32
+
18
33
  headers.set('cache-control', this.cache)
34
+
35
+ if (this.vary !== null)
36
+ headers.append('vary', 'authorization')
19
37
  }
20
38
 
21
39
  protected resolve (request: AuthenticatedContext): string {
22
40
  if (request.identity === null)
23
41
  return this.value
24
42
 
25
- const directives = this.mask()
43
+ const directives = mask(this.value)
44
+
45
+ if ((directives & PRIVATE) === PRIVATE)
46
+ this.vary = true
26
47
 
27
48
  if ((directives & (PUBLIC | NO_CACHE)) === PUBLIC)
28
49
  return 'no-cache, ' + this.value
29
50
 
30
- if ((directives & (PUBLIC | PRIVATE)) === 0)
51
+ if ((directives & (PUBLIC | PRIVATE)) === 0) {
52
+ this.vary = true
53
+
31
54
  return 'private, ' + this.value
55
+ }
32
56
 
33
57
  return this.value
34
58
  }
59
+ }
35
60
 
36
- private mask (): number {
37
- const directives = this.value.match(DIRECTIVES_RX)
61
+ function mask (value: string): number {
62
+ const directives = value.match(DIRECTIVES_RX)
38
63
 
39
- if (directives === null)
40
- return 0
64
+ if (directives === null)
65
+ return 0
41
66
 
42
- let mask = 0
67
+ let mask = 0
43
68
 
44
- for (const directive of directives)
45
- mask |= match<number>(directive,
46
- 'private', PRIVATE,
47
- 'public', PUBLIC,
48
- 'no-cache', NO_CACHE,
49
- 0)
69
+ for (const directive of directives)
70
+ mask |= match<number>(directive,
71
+ 'private', PRIVATE,
72
+ 'public', PUBLIC,
73
+ 'no-cache', NO_CACHE,
74
+ 'no-store', NO_STORE,
75
+ 0)
50
76
 
51
- return mask
52
- }
77
+ return mask
53
78
  }
54
79
 
55
- const DIRECTIVES_RX = /\b(private|public|no-cache)\b/ig
80
+ const DIRECTIVES_RX = /\b(private|public|no-cache|no-store)\b/ig
56
81
 
57
82
  const PUBLIC = 1
58
83
  const PRIVATE = 2
59
84
  const NO_CACHE = 4
85
+ const NO_STORE = 8
@@ -3,16 +3,22 @@ import type { Interceptor } from '../../Interception'
3
3
 
4
4
  export class CORS implements Interceptor {
5
5
  public readonly name = 'cors'
6
- public readonly mandatory = true
7
6
 
8
- private readonly allowedHeaders = new Set<string>(['accept', 'authorization', 'content-type'])
7
+ private readonly requestHeaders = new Set<string>([
8
+ 'accept',
9
+ 'authorization',
10
+ 'content-type',
11
+ 'etag',
12
+ 'if-match',
13
+ 'if-none-match'
14
+ ])
9
15
 
10
16
  private readonly headers = new Headers({
11
17
  'access-control-allow-methods': 'GET, POST, PUT, PATCH, DELETE',
12
18
  'access-control-allow-credentials': 'true',
13
- 'access-control-allow-headers': Array.from(this.allowedHeaders).join(', '),
19
+ 'access-control-allow-headers': Array.from(this.requestHeaders).join(', '),
14
20
  'access-control-max-age': '3600',
15
- 'cache-control': 'public, max-age=3600',
21
+ 'cache-control': 'max-age=3600',
16
22
  vary: 'origin'
17
23
  })
18
24
 
@@ -40,9 +46,9 @@ export class CORS implements Interceptor {
40
46
  return null
41
47
  }
42
48
 
43
- public allowHeader (header: string): void {
44
- this.allowedHeaders.add(header.toLowerCase())
45
- this.headers.set('access-control-allow-headers', Array.from(this.allowedHeaders).join(', '))
49
+ public allow (header: string): void {
50
+ this.requestHeaders.add(header.toLowerCase())
51
+ this.headers.set('access-control-allow-headers', Array.from(this.requestHeaders).join(', '))
46
52
  }
47
53
 
48
54
  private preflightResponse (origin: string): Output {
@@ -2,17 +2,17 @@ import { Stub } from './Stub'
2
2
  import { Throw } from './Throw'
3
3
  import { type Directive } from './types'
4
4
  import type { Input, Output } from '../../io'
5
- import type { Family } from '../../Directive'
5
+ import type { DirectiveFamily } from '../../RTD'
6
6
 
7
- export class Development implements Family<Directive> {
7
+ export class Development implements DirectiveFamily<Directive> {
8
8
  public readonly name: string = 'dev'
9
9
  public readonly mandatory: boolean = false
10
10
 
11
- public create (name: string, value: any): Directive {
11
+ public create (name: string, value: unknown): Directive {
12
12
  const Class = constructors[name]
13
13
 
14
14
  if (Class === undefined)
15
- throw new Error(`Directive '${name}' is not provided by the '${this.name}' family.`)
15
+ throw new Error(`Directive 'dev:${name}' is not implemented.`)
16
16
 
17
17
  return new Class(value)
18
18
  }
@@ -1,11 +1,13 @@
1
- import { dev } from './dev'
2
1
  import { authorization } from './auth'
3
2
  import { cache } from './cache'
4
- import { octets } from './octets'
5
3
  import { cors } from './cors'
4
+ import { dev } from './dev'
5
+ import { octets } from './octets'
6
+ import { io } from './io'
6
7
  import { vary } from './vary'
7
- import type { Family } from '../Directive'
8
+ import { req } from './require'
9
+ import type { DirectiveFamily } from '../RTD'
8
10
  import type { Interceptor } from '../Interception'
9
11
 
10
- export const families: Family[] = [authorization, cache, octets, vary, dev]
12
+ export const families: DirectiveFamily[] = [authorization, io, cache, vary, req, octets, dev]
11
13
  export const interceptors: Interceptor[] = [cors]
@@ -0,0 +1,11 @@
1
+ import type { Input } from '../../io'
2
+
3
+ export interface Directive {
4
+ attach: (context: Input) => void
5
+ }
6
+
7
+ export interface Constructor {
8
+ validate: (value: unknown) => void
9
+
10
+ new (value: any): Directive
11
+ }
@@ -0,0 +1,43 @@
1
+ import { Output } from './Output'
2
+ import { Input } from './Input'
3
+ import type { Constructor, Directive } from './Directive'
4
+ import type { Input as Context } from '../../io'
5
+ import type { DirectiveFamily } from '../../RTD'
6
+
7
+ export class IO implements DirectiveFamily<Directive> {
8
+ public readonly name = 'io'
9
+ public readonly mandatory = true
10
+
11
+ public create (name: string, value: unknown): Directive {
12
+ if (!(name in constructors))
13
+ throw new Error(`Directive 'io:${name}' is not implemented.`)
14
+
15
+ const Directive = constructors[name]
16
+
17
+ Directive.validate(value)
18
+
19
+ return new Directive(value)
20
+ }
21
+
22
+ public preflight (directives: Directive[], context: Context): null {
23
+ let restricted = false
24
+
25
+ for (const directive of directives) {
26
+ restricted ||= directive instanceof Output
27
+
28
+ directive.attach(context)
29
+ }
30
+
31
+ if (!restricted)
32
+ DENIAL.attach(context)
33
+
34
+ return null
35
+ }
36
+ }
37
+
38
+ const constructors: Record<string, Constructor> = {
39
+ output: Output,
40
+ input: Input
41
+ }
42
+
43
+ const DENIAL: Output = new Output([])
@@ -0,0 +1,50 @@
1
+ import { BadRequest } from '../../HTTP'
2
+ import * as schemas from './schemas'
3
+ import type { Message } from './Message'
4
+ import type { Directive } from './Directive'
5
+ import type { Input as Context } from '../../io'
6
+
7
+ export class Input implements Directive {
8
+ private readonly permissions: Permissions
9
+
10
+ public constructor (permissions: Permissions) {
11
+ this.permissions = permissions
12
+ }
13
+
14
+ public static validate (permissions: unknown): asserts permissions is Permissions {
15
+ schemas.input.validate(permissions, 'Incorrect \'io:input\' format')
16
+ }
17
+
18
+ public attach (context: Context): void {
19
+ context.pipelines.body.push((body) => this.check(body))
20
+ }
21
+
22
+ private check (body: unknown): unknown {
23
+ try {
24
+ schemas.message.validate(body)
25
+ } catch {
26
+ throw new BadRequest('Invalid request body.')
27
+ }
28
+
29
+ const property = this.violation(body)
30
+
31
+ if (property !== undefined)
32
+ throw new BadRequest(`Unexpected input: ${property}.`)
33
+
34
+ return body
35
+ }
36
+
37
+ private violation (value: Message | Message[]): string | undefined {
38
+ if (!Array.isArray(value))
39
+ return Object.keys(value).find((key) => !this.permissions.includes(key))
40
+
41
+ for (const item of value) {
42
+ const property = this.violation(item)
43
+
44
+ if (property !== undefined)
45
+ return property
46
+ }
47
+ }
48
+ }
49
+
50
+ export type Permissions = string[]
@@ -0,0 +1 @@
1
+ export type Message = Record<string, unknown>
@@ -0,0 +1,69 @@
1
+ import { Stream } from 'node:stream'
2
+ import * as schemas from './schemas'
3
+ import type { Message } from './Message'
4
+ import type { Directive } from './Directive'
5
+ import type { Input as Context } from '../../io'
6
+ import type { OutgoingMessage } from '../../HTTP'
7
+
8
+ export class Output implements Directive {
9
+ private readonly disabled: boolean = false
10
+ private readonly omitted: boolean = true
11
+ private readonly permissions: string[] = []
12
+
13
+ public constructor (permissions: Permissions) {
14
+ if (typeof permissions === 'boolean')
15
+ if (permissions)
16
+ this.disabled = true
17
+ else
18
+ this.omitted = false
19
+
20
+ else
21
+ this.permissions = permissions
22
+ }
23
+
24
+ public static validate (permissions: unknown): asserts permissions is Permissions {
25
+ schemas.output.validate(permissions, 'Incorrect \'io:output\' format')
26
+ }
27
+
28
+ public attach (context: Context): void {
29
+ context.pipelines.response.push(this.restriction(context))
30
+ }
31
+
32
+ private restriction (context: Context) {
33
+ return (message: OutgoingMessage): void => {
34
+ const error = message.status !== undefined && message.status >= 300
35
+ const stream = message.body instanceof Stream
36
+ const none = message.body === undefined || message.body === null
37
+
38
+ if (this.disabled || error || stream || none)
39
+ return
40
+
41
+ if (typeof message.body !== 'object' || this.permissions.length === 0) {
42
+ if (this.omitted)
43
+ console.warn('Permissions for \'io:output\' are not specified properly ' +
44
+ `(${context.request.url}). Response omitted.`)
45
+
46
+ delete message.body
47
+
48
+ return
49
+ }
50
+
51
+ schemas.message.validate(message.body,
52
+ '\'io:output\' expects response to be an object or array of objects')
53
+
54
+ if (Array.isArray(message.body))
55
+ message.body = message.body.map((entity) => this.fit(entity))
56
+ else
57
+ message.body = this.fit(message.body)
58
+ }
59
+ }
60
+
61
+ private fit (message: Message): Message | undefined {
62
+ const entries = Object.entries(message)
63
+ .filter(([key]) => this.permissions.includes(key))
64
+
65
+ return Object.fromEntries(entries)
66
+ }
67
+ }
68
+
69
+ export type Permissions = string[] | boolean
@@ -0,0 +1,3 @@
1
+ import { IO } from './IO'
2
+
3
+ export const io = new IO()
@@ -0,0 +1,12 @@
1
+ import { resolve } from 'node:path'
2
+ import schemas, { type Schema } from '@toa.io/schemas'
3
+ import type { Permissions as InputPermissions } from './Input'
4
+ import type { Permissions as OutputPermissions } from './Output'
5
+ import type { Message } from './Message'
6
+
7
+ const path = resolve(__dirname, '../../../schemas/io')
8
+ const namespace = schemas.namespace(path)
9
+
10
+ export const message: Schema<Message | Message[]> = namespace.schema('message')
11
+ export const input: Schema<InputPermissions> = namespace.schema('input')
12
+ export const output: Schema<OutputPermissions> = namespace.schema('output')
@@ -1,18 +1,19 @@
1
1
  import * as schemas from './schemas'
2
+ import { Directive } from './Directive'
2
3
  import type { Output } from '../../io'
3
- import type { Directive } from './types'
4
4
 
5
- export class Context implements Directive {
5
+ export class Context extends Directive {
6
6
  public readonly targeted = false
7
7
  public readonly storage: string
8
8
 
9
9
  public constructor (value: unknown) {
10
+ super()
10
11
  schemas.context.validate(value)
11
12
 
12
13
  this.storage = value
13
14
  }
14
15
 
15
- public apply (): Output {
16
+ public async apply (): Promise<Output> {
16
17
  return null
17
18
  }
18
19
  }
@@ -2,16 +2,17 @@ import { Readable } from 'stream'
2
2
  import { NotFound } from '../../HTTP'
3
3
  import * as schemas from './schemas'
4
4
  import { Workflow } from './workflows'
5
+ import { Directive } from './Directive'
5
6
  import type { Parameter } from '../../RTD'
6
7
  import type { Unit } from './workflows'
7
8
  import type { Maybe } from '@toa.io/types'
8
9
  import type { Component } from '@toa.io/core'
9
10
  import type { Output } from '../../io'
10
- import type { Directive, Input } from './types'
11
+ import type { Input } from './types'
11
12
  import type { Remotes } from '../../Remotes'
12
13
  import type { Entry } from '@toa.io/extensions.storages'
13
14
 
14
- export class Delete implements Directive {
15
+ export class Delete extends Directive {
15
16
  public readonly targeted = true
16
17
 
17
18
  private readonly workflow?: Workflow
@@ -19,6 +20,7 @@ export class Delete implements Directive {
19
20
  private storage: Component | null = null
20
21
 
21
22
  public constructor (options: Options | null, discovery: Promise<Component>, remotes: Remotes) {
23
+ super()
22
24
  schemas.remove.validate(options)
23
25
 
24
26
  if (options?.workflow !== undefined)
@@ -0,0 +1,10 @@
1
+ import type { Input } from './types'
2
+ import type { Parameter } from '../../RTD'
3
+ import type * as io from '../../io'
4
+
5
+ export abstract class Directive {
6
+ public readonly name = 'octets.' + this.constructor.name.toLowerCase()
7
+ public abstract readonly targeted: boolean
8
+
9
+ public abstract apply (storage: string, input: Input, parameters: Parameter[]): Promise<io.Output>
10
+ }
@@ -1,15 +1,15 @@
1
1
  import { posix } from 'node:path'
2
2
  import { Forbidden, NotFound } from '../../HTTP'
3
3
  import * as schemas from './schemas'
4
+ import { Directive } from './Directive'
4
5
  import type { Maybe } from '@toa.io/types'
5
6
  import type { Entry } from '@toa.io/extensions.storages'
6
7
  import type { Readable } from 'node:stream'
7
8
  import type { Component } from '@toa.io/core'
8
9
  import type { Output } from '../../io'
10
+ import type { Input } from './types'
9
11
 
10
- import type { Directive, Input } from './types'
11
-
12
- export class Fetch implements Directive {
12
+ export class Fetch extends Directive {
13
13
  public readonly targeted = true
14
14
 
15
15
  private readonly permissions: Required<Permissions> = {
@@ -21,6 +21,7 @@ export class Fetch implements Directive {
21
21
  private storage: Component = null as unknown as Component
22
22
 
23
23
  public constructor (permissions: Permissions | null, discovery: Promise<Component>) {
24
+ super()
24
25
  schemas.fetch.validate(permissions)
25
26
 
26
27
  Object.assign(this.permissions, permissions)
@@ -1,14 +1,15 @@
1
1
  import { posix } from 'node:path'
2
2
  import { Forbidden, NotFound } from '../../HTTP'
3
3
  import * as schemas from './schemas'
4
+ import { Directive } from './Directive'
4
5
  import type { Entry } from '@toa.io/extensions.storages'
5
6
  import type { Maybe } from '@toa.io/types'
6
7
  import type { Component } from '@toa.io/core'
7
8
  import type { Output } from '../../io'
8
9
 
9
- import type { Directive, Input } from './types'
10
+ import type { Input } from './types'
10
11
 
11
- export class List implements Directive {
12
+ export class List extends Directive {
12
13
  public readonly targeted = false
13
14
 
14
15
  private readonly permissions: Required<Permissions> = { meta: false }
@@ -16,6 +17,7 @@ export class List implements Directive {
16
17
  private storage: Component | null = null
17
18
 
18
19
  public constructor (permissions: Permissions | null, discovery: Promise<Component>) {
20
+ super()
19
21
  schemas.list.validate(permissions)
20
22
 
21
23
  Object.assign(this.permissions, permissions)
@@ -4,16 +4,15 @@ import { Store } from './Store'
4
4
  import { Fetch } from './Fetch'
5
5
  import { List } from './List'
6
6
  import { Delete } from './Delete'
7
- import { Permute } from './Permute'
8
7
  import { WorkflowDirective } from './Workflow'
8
+ import type { Directive } from './Directive'
9
9
  import type { Output } from '../../io'
10
10
  import type { Component } from '@toa.io/core'
11
11
  import type { Remotes } from '../../Remotes'
12
- import type { Family } from '../../Directive'
13
- import type { Directive, Input } from './types'
14
- import type { Parameter } from '../../RTD'
12
+ import type { Parameter, DirectiveFamily } from '../../RTD'
13
+ import type { Input } from './types'
15
14
 
16
- export class Octets implements Family<Directive> {
15
+ export class Octets implements DirectiveFamily<Directive> {
17
16
  public readonly name: string = 'octets'
18
17
  public readonly mandatory: boolean = false
19
18
 
@@ -23,7 +22,7 @@ export class Octets implements Family<Directive> {
23
22
  const Class = DIRECTIVES[name]
24
23
 
25
24
  if (Class === undefined)
26
- throw new Error(`Directive '${name}' is not provided by the '${this.name}' family.`)
25
+ throw new Error(`Directive 'octets:${name}' is not implemented.`)
27
26
 
28
27
  this.discovery ??= remotes.discover('octets', 'storage')
29
28
 
@@ -56,7 +55,7 @@ export class Octets implements Family<Directive> {
56
55
  throw new NotFound(`Trailing slash is ${action.targeted ? 'redundant' : 'required'}.`)
57
56
 
58
57
  // noinspection JSObjectNullOrUndefined
59
- return action.apply(context.storage, input, parameters)
58
+ return await input.timing.capture(action.name, action.apply(context.storage, input, parameters))
60
59
  }
61
60
  }
62
61
 
@@ -66,7 +65,6 @@ const DIRECTIVES: Record<string, Constructor> = {
66
65
  fetch: Fetch,
67
66
  list: List,
68
67
  delete: Delete,
69
- permute: Permute,
70
68
  workflow: WorkflowDirective
71
69
  }
72
70
 
@@ -4,6 +4,7 @@ import { BadRequest, UnsupportedMediaType } from '../../HTTP'
4
4
  import { cors } from '../cors'
5
5
  import * as schemas from './schemas'
6
6
  import { Workflow } from './workflows'
7
+ import { Directive } from './Directive'
7
8
  import type { Readable } from 'stream'
8
9
  import type { Parameter } from '../../RTD'
9
10
  import type { Unit } from './workflows'
@@ -12,9 +13,9 @@ import type { Remotes } from '../../Remotes'
12
13
  import type { ErrorType } from 'error-value'
13
14
  import type { Component } from '@toa.io/core'
14
15
  import type { Output } from '../../io'
15
- import type { Directive, Input } from './types'
16
+ import type { Input } from './types'
16
17
 
17
- export class Store implements Directive {
18
+ export class Store extends Directive {
18
19
  public readonly targeted = false
19
20
 
20
21
  private readonly accept?: string
@@ -24,6 +25,7 @@ export class Store implements Directive {
24
25
 
25
26
  public constructor
26
27
  (options: Options | null, discovery: Promise<Component>, remotes: Remotes) {
28
+ super()
27
29
  schemas.store.validate(options)
28
30
 
29
31
  this.accept = match(options?.accept,
@@ -36,13 +38,19 @@ export class Store implements Directive {
36
38
 
37
39
  this.discovery.storage = discovery
38
40
 
39
- cors.allowHeader('content-meta')
41
+ cors.allow('content-meta')
40
42
  }
41
43
 
42
44
  public async apply (storage: string, input: Input, parameters: Parameter[]): Promise<Output> {
43
45
  this.storage ??= await this.discovery.storage
44
46
 
45
- const request: StoreRequest = { input: { storage, request: input.request } }
47
+ const request: StoreRequest = {
48
+ input: {
49
+ storage,
50
+ request: input.request
51
+ }
52
+ }
53
+
46
54
  const meta = input.request.headers['content-meta']
47
55
 
48
56
  if (this.accept !== undefined)
@@ -1,8 +1,9 @@
1
1
  import { NotFound } from '../../HTTP'
2
2
  import * as schemas from './schemas'
3
3
  import { Workflow } from './workflows'
4
+ import { Directive } from './Directive'
4
5
  import type { Unit } from './workflows'
5
- import type { Directive, Input } from './types'
6
+ import type { Input } from './types'
6
7
  import type { Component } from '@toa.io/core'
7
8
  import type { Output } from '../../io'
8
9
  import type { Remotes } from '../../Remotes'
@@ -10,7 +11,7 @@ import type { Maybe } from '@toa.io/types'
10
11
  import type { Entry } from '@toa.io/extensions.storages'
11
12
  import type { Parameter } from '../../RTD'
12
13
 
13
- export class WorkflowDirective implements Directive {
14
+ export class WorkflowDirective extends Directive {
14
15
  public readonly targeted = true
15
16
 
16
17
  private readonly workflow: Workflow
@@ -18,6 +19,7 @@ export class WorkflowDirective implements Directive {
18
19
  private storage: Component | null = null
19
20
 
20
21
  public constructor (units: Unit[] | Unit, discovery: Promise<Component>, remotes: Remotes) {
22
+ super()
21
23
  schemas.workflow.validate(units)
22
24
 
23
25
  this.workflow = new Workflow(units, remotes)
@@ -28,7 +30,12 @@ export class WorkflowDirective implements Directive {
28
30
  this.storage ??= await this.discovery
29
31
 
30
32
  const entry = await this.storage.invoke<Maybe<Entry>>('get',
31
- { input: { storage, path: input.request.url } })
33
+ {
34
+ input: {
35
+ storage,
36
+ path: input.request.url
37
+ }
38
+ })
32
39
 
33
40
  if (entry instanceof Error)
34
41
  throw new NotFound()
@@ -1,12 +1,5 @@
1
- import type { Parameter } from '../../RTD'
2
1
  import type * as io from '../../io'
3
2
 
4
- export interface Directive {
5
- readonly targeted: boolean
6
-
7
- apply: (storage: string, input: Input, parameters: Parameter[]) => io.Output | Promise<io.Output>
8
- }
9
-
10
3
  export interface Extension {
11
4
  octets?: string
12
5
  }
@@ -0,0 +1,5 @@
1
+ import type { Input } from '../../io'
2
+
3
+ export interface Directive {
4
+ preflight: (context: Input) => void
5
+ }