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

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 (489) hide show
  1. package/components/context.toa.yaml +2 -2
  2. package/components/identity.bans/manifest.toa.yaml +14 -6
  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 +20 -10
  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 +8 -6
  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 +11 -9
  24. package/components/identity.basic/source/types.ts +8 -4
  25. package/components/identity.federation/manifest.toa.yaml +32 -15
  26. package/components/identity.federation/operations/authenticate.d.ts +2 -2
  27. package/components/identity.federation/operations/authenticate.js +4 -11
  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/assertions-as-values.js +4 -2
  33. package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -1
  34. package/components/identity.federation/operations/lib/jwt.d.ts +5 -5
  35. package/components/identity.federation/operations/lib/jwt.js +25 -12
  36. package/components/identity.federation/operations/lib/jwt.js.map +1 -1
  37. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
  38. package/components/identity.federation/operations/types/configuration.d.ts +14 -0
  39. package/components/identity.federation/operations/types/configuration.js +3 -0
  40. package/components/identity.federation/operations/types/configuration.js.map +1 -0
  41. package/components/identity.federation/operations/{types.d.ts → types/context.d.ts} +15 -7
  42. package/components/identity.federation/operations/types/context.js +3 -0
  43. package/components/identity.federation/operations/types/context.js.map +1 -0
  44. package/components/identity.federation/operations/types/entity.d.ts +6 -0
  45. package/components/identity.federation/operations/types/entity.js +3 -0
  46. package/components/identity.federation/operations/types/entity.js.map +1 -0
  47. package/components/identity.federation/operations/types/index.d.ts +3 -0
  48. package/components/identity.federation/operations/types/index.js +20 -0
  49. package/components/identity.federation/operations/types/index.js.map +1 -0
  50. package/components/identity.federation/source/authenticate.ts +6 -19
  51. package/components/identity.federation/source/{create.ts → incept.ts} +10 -9
  52. package/components/identity.federation/source/lib/assertions-as-values.ts +5 -2
  53. package/components/identity.federation/source/lib/jwt.test.ts +123 -4
  54. package/components/identity.federation/source/lib/jwt.ts +36 -16
  55. package/components/identity.federation/source/types/configuration.ts +15 -0
  56. package/components/identity.federation/source/{types.ts → types/context.ts} +17 -6
  57. package/components/identity.federation/source/types/entity.ts +6 -0
  58. package/components/identity.federation/source/types/index.ts +3 -0
  59. package/components/identity.federation/tsconfig.json +5 -4
  60. package/components/identity.roles/manifest.toa.yaml +16 -6
  61. package/components/identity.roles/operations/grant.d.ts +10 -0
  62. package/components/identity.roles/operations/grant.js +21 -0
  63. package/components/identity.roles/operations/grant.js.map +1 -0
  64. package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
  65. package/components/identity.roles/operations/lib/Entity.js +3 -0
  66. package/components/identity.roles/operations/lib/Entity.js.map +1 -0
  67. package/components/identity.roles/operations/list.d.ts +1 -4
  68. package/components/identity.roles/operations/list.js.map +1 -1
  69. package/components/identity.roles/operations/principal.d.ts +4 -6
  70. package/components/identity.roles/operations/principal.js +6 -1
  71. package/components/identity.roles/operations/principal.js.map +1 -1
  72. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
  73. package/components/identity.roles/source/grant.ts +32 -0
  74. package/components/identity.roles/source/lib/Entity.ts +5 -0
  75. package/components/identity.roles/source/list.ts +2 -4
  76. package/components/identity.roles/source/principal.ts +10 -8
  77. package/components/identity.tokens/manifest.toa.yaml +19 -4
  78. package/components/identity.tokens/operations/authenticate.d.ts +2 -2
  79. package/components/identity.tokens/operations/authenticate.js +12 -5
  80. package/components/identity.tokens/operations/authenticate.js.map +1 -1
  81. package/components/identity.tokens/operations/decrypt.js +1 -0
  82. package/components/identity.tokens/operations/decrypt.js.map +1 -1
  83. package/components/identity.tokens/operations/encrypt.js +5 -1
  84. package/components/identity.tokens/operations/encrypt.js.map +1 -1
  85. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
  86. package/components/identity.tokens/operations/types.d.ts +8 -2
  87. package/components/identity.tokens/receivers/identity.bans.created.js +3 -0
  88. package/components/identity.tokens/source/authenticate.test.ts +11 -4
  89. package/components/identity.tokens/source/authenticate.ts +14 -6
  90. package/components/identity.tokens/source/decrypt.test.ts +5 -3
  91. package/components/identity.tokens/source/decrypt.ts +9 -8
  92. package/components/identity.tokens/source/encrypt.test.ts +26 -2
  93. package/components/identity.tokens/source/encrypt.ts +5 -1
  94. package/components/identity.tokens/source/types.ts +9 -2
  95. package/components/octets.storage/manifest.toa.yaml +9 -11
  96. package/components/octets.storage/operations/get.js +3 -3
  97. package/components/octets.storage/operations/head.js +7 -0
  98. package/components/octets.storage/operations/put.js +121 -0
  99. package/documentation/access.md +75 -38
  100. package/documentation/authorities.md +49 -0
  101. package/documentation/cache.md +8 -1
  102. package/documentation/components.md +61 -22
  103. package/documentation/flow.md +44 -0
  104. package/documentation/identity.md +17 -22
  105. package/documentation/introspection.md +82 -0
  106. package/documentation/octets.md +95 -67
  107. package/documentation/protocol.md +13 -3
  108. package/documentation/query.md +29 -4
  109. package/documentation/require.md +15 -0
  110. package/documentation/tree.md +13 -0
  111. package/documentation/vary.md +14 -14
  112. package/features/access.feature +77 -46
  113. package/features/annotation.feature +1 -0
  114. package/features/auth.claim.feature +170 -0
  115. package/features/authorities.basic.feature +141 -0
  116. package/features/authorities.feature +32 -0
  117. package/features/authorities.federation.feature +100 -0
  118. package/features/authorities.tokens.feature +117 -0
  119. package/features/body.feature +2 -0
  120. package/features/cache.feature +109 -5
  121. package/features/cors.feature +6 -1
  122. package/features/debug.feature +34 -0
  123. package/features/directives.feature +3 -0
  124. package/features/dynamic.feature +48 -0
  125. package/features/errors.feature +32 -7
  126. package/features/etag.feature +108 -0
  127. package/features/flow.feature +96 -0
  128. package/features/identity.bans.feature +137 -0
  129. package/features/identity.basic.feature +97 -26
  130. package/features/identity.feature +18 -6
  131. package/features/identity.federation.feature +66 -11
  132. package/features/identity.roles.feature +250 -7
  133. package/features/identity.tokens.feature +54 -4
  134. package/features/introspection.feature +153 -0
  135. package/features/io.feature +38 -1
  136. package/features/methods.feature +47 -0
  137. package/features/{octets.meta.feature → octets.attributes.feature} +16 -12
  138. package/features/octets.cloudinary.feature +68 -0
  139. package/features/octets.download.feature +189 -0
  140. package/features/octets.entries.feature +13 -55
  141. package/features/octets.feature +83 -107
  142. package/features/octets.workflows.feature +242 -58
  143. package/features/probes.feature +14 -0
  144. package/features/{queries.feature → query.feature} +77 -2
  145. package/features/realtime.feature +34 -0
  146. package/features/require.feature +67 -0
  147. package/features/response.feature +38 -3
  148. package/features/routes.feature +93 -2
  149. package/features/server.feature +21 -0
  150. package/features/steps/.env.example +3 -0
  151. package/features/steps/Database.ts +16 -9
  152. package/features/steps/Gateway.ts +23 -6
  153. package/features/steps/IdP.ts +30 -25
  154. package/features/steps/Parameters.ts +44 -1
  155. package/features/steps/Realtime.ts +151 -0
  156. package/features/steps/components/echo/manifest.toa.yaml +14 -1
  157. package/features/steps/components/echo/operations/identity.js +7 -0
  158. package/features/steps/components/echo/operations/parameters.js +7 -0
  159. package/features/steps/components/echo.beacon/manifest.toa.yaml +2 -0
  160. package/features/steps/components/echo.beacon/operations/hello.js +5 -0
  161. package/features/steps/components/octets.tester/manifest.toa.yaml +22 -2
  162. package/features/steps/components/octets.tester/operations/authority.js +7 -0
  163. package/features/steps/components/octets.tester/operations/bar.js +0 -1
  164. package/features/steps/components/octets.tester/operations/baz.js +0 -2
  165. package/features/steps/components/octets.tester/operations/foo.js +1 -2
  166. package/features/steps/components/octets.tester/operations/redirect.js +12 -0
  167. package/features/steps/components/octets.tester/operations/yex.js +16 -0
  168. package/features/steps/components/octets.tester/operations/yield.js +13 -0
  169. package/features/steps/components/pots/manifest.toa.yaml +14 -3
  170. package/features/steps/components/users/manifest.toa.yaml +0 -1
  171. package/features/steps/components/users.properties/manifest.toa.yaml +1 -1
  172. package/features/streams.feature +5 -0
  173. package/features/timing.feature +4 -1
  174. package/features/vary.feature +71 -0
  175. package/package.json +23 -14
  176. package/readme.md +19 -14
  177. package/schemas/annotation.cos.yaml +1 -1
  178. package/schemas/method.cos.yaml +1 -1
  179. package/schemas/node.cos.yaml +2 -0
  180. package/schemas/octets/put.cos.yaml +25 -0
  181. package/schemas/query.cos.yaml +4 -10
  182. package/source/Annotation.ts +3 -3
  183. package/source/Branch.ts +1 -0
  184. package/source/Composition.ts +0 -6
  185. package/source/Context.ts +1 -0
  186. package/source/Directive.test.ts +1 -1
  187. package/source/Directive.ts +5 -6
  188. package/source/Endpoint.ts +59 -17
  189. package/source/Factory.ts +22 -13
  190. package/source/Gateway.ts +65 -18
  191. package/source/HTTP/Context.ts +26 -3
  192. package/source/HTTP/Server.ts +60 -46
  193. package/source/HTTP/exceptions.ts +13 -1
  194. package/source/HTTP/formats/index.ts +3 -3
  195. package/source/HTTP/messages.test.ts +45 -2
  196. package/source/HTTP/messages.ts +32 -8
  197. package/source/Introspection.ts +11 -0
  198. package/source/Mapping.ts +68 -21
  199. package/source/Query.test.ts +3 -3
  200. package/source/Query.ts +123 -33
  201. package/source/RTD/Context.ts +1 -1
  202. package/source/RTD/Endpoint.ts +3 -0
  203. package/source/RTD/Method.ts +16 -0
  204. package/source/RTD/Node.ts +29 -13
  205. package/source/RTD/Route.ts +5 -4
  206. package/source/RTD/Tree.ts +2 -2
  207. package/source/RTD/factory.ts +5 -2
  208. package/source/RTD/syntax/parse.test.ts +1 -1
  209. package/source/RTD/syntax/parse.ts +37 -24
  210. package/source/RTD/syntax/types.ts +6 -4
  211. package/source/Remotes.ts +7 -6
  212. package/source/Tenant.ts +6 -20
  213. package/source/deployment.ts +33 -23
  214. package/source/directives/auth/Authorization.ts +45 -22
  215. package/source/directives/auth/Delegate.ts +42 -0
  216. package/source/directives/auth/Echo.ts +19 -5
  217. package/source/directives/auth/Federation.ts +84 -0
  218. package/source/directives/auth/Incept.ts +4 -3
  219. package/source/directives/auth/Role.test.ts +53 -6
  220. package/source/directives/auth/Role.ts +22 -14
  221. package/source/directives/auth/Scheme.ts +1 -1
  222. package/source/directives/auth/split.ts +1 -1
  223. package/source/directives/auth/types.ts +2 -2
  224. package/source/directives/cache/Cache.ts +13 -6
  225. package/source/directives/cache/Control.ts +42 -16
  226. package/source/directives/cors/CORS.ts +1 -1
  227. package/source/directives/dev/Development.ts +1 -1
  228. package/source/directives/flow/Compose.ts +68 -0
  229. package/source/directives/flow/Fetch.ts +86 -0
  230. package/source/directives/flow/Flow.ts +42 -0
  231. package/source/directives/flow/index.ts +3 -0
  232. package/source/directives/flow/types.ts +7 -0
  233. package/source/directives/index.ts +3 -1
  234. package/source/directives/io/IO.ts +1 -1
  235. package/source/directives/io/Input.ts +4 -4
  236. package/source/directives/io/Output.ts +5 -4
  237. package/source/directives/octets/Context.ts +3 -2
  238. package/source/directives/octets/Delete.ts +11 -11
  239. package/source/directives/octets/Get.ts +84 -0
  240. package/source/directives/octets/Octets.ts +8 -12
  241. package/source/directives/octets/{Store.ts → Put.ts} +36 -21
  242. package/source/directives/octets/Workflow.ts +1 -1
  243. package/source/directives/octets/bytes.test.ts +30 -0
  244. package/source/directives/octets/bytes.ts +18 -0
  245. package/source/directives/octets/schemas.ts +4 -8
  246. package/source/directives/octets/workflows/Execution.ts +60 -8
  247. package/source/directives/octets/workflows/Workflow.ts +4 -4
  248. package/source/directives/require/Directive.ts +5 -0
  249. package/source/directives/require/Headers.ts +20 -0
  250. package/source/directives/require/Require.ts +28 -0
  251. package/source/directives/require/index.ts +3 -0
  252. package/source/directives/vary/Directive.ts +2 -1
  253. package/source/directives/vary/Embed.ts +14 -8
  254. package/source/directives/vary/Vary.ts +6 -4
  255. package/source/directives/vary/embeddings/Authority.ts +8 -0
  256. package/source/directives/vary/embeddings/Embedding.ts +2 -1
  257. package/source/directives/vary/embeddings/Language.ts +2 -2
  258. package/source/directives/vary/embeddings/Parameter.ts +14 -0
  259. package/source/directives/vary/embeddings/index.ts +6 -4
  260. package/source/exceptions.ts +17 -11
  261. package/source/manifest.ts +10 -11
  262. package/source/root.ts +5 -5
  263. package/source/schemas.ts +1 -1
  264. package/transpiled/Annotation.d.ts +3 -3
  265. package/transpiled/Branch.d.ts +1 -0
  266. package/transpiled/Composition.d.ts +0 -1
  267. package/transpiled/Composition.js +0 -4
  268. package/transpiled/Composition.js.map +1 -1
  269. package/transpiled/Context.d.ts +1 -0
  270. package/transpiled/Directive.js +5 -5
  271. package/transpiled/Directive.js.map +1 -1
  272. package/transpiled/Endpoint.d.ts +6 -4
  273. package/transpiled/Endpoint.js +39 -9
  274. package/transpiled/Endpoint.js.map +1 -1
  275. package/transpiled/Factory.d.ts +3 -2
  276. package/transpiled/Factory.js +18 -10
  277. package/transpiled/Factory.js.map +1 -1
  278. package/transpiled/Gateway.d.ts +3 -0
  279. package/transpiled/Gateway.js +49 -10
  280. package/transpiled/Gateway.js.map +1 -1
  281. package/transpiled/HTTP/Context.d.ts +9 -2
  282. package/transpiled/HTTP/Context.js +16 -2
  283. package/transpiled/HTTP/Context.js.map +1 -1
  284. package/transpiled/HTTP/Server.d.ts +13 -2
  285. package/transpiled/HTTP/Server.js +46 -39
  286. package/transpiled/HTTP/Server.js.map +1 -1
  287. package/transpiled/HTTP/exceptions.d.ts +7 -1
  288. package/transpiled/HTTP/exceptions.js +13 -1
  289. package/transpiled/HTTP/exceptions.js.map +1 -1
  290. package/transpiled/HTTP/formats/index.js +3 -3
  291. package/transpiled/HTTP/formats/index.js.map +1 -1
  292. package/transpiled/HTTP/messages.d.ts +2 -1
  293. package/transpiled/HTTP/messages.js +30 -7
  294. package/transpiled/HTTP/messages.js.map +1 -1
  295. package/transpiled/Introspection.d.ts +9 -0
  296. package/transpiled/Introspection.js +3 -0
  297. package/transpiled/Introspection.js.map +1 -0
  298. package/transpiled/Mapping.d.ts +11 -2
  299. package/transpiled/Mapping.js +50 -19
  300. package/transpiled/Mapping.js.map +1 -1
  301. package/transpiled/Query.d.ts +10 -1
  302. package/transpiled/Query.js +87 -30
  303. package/transpiled/Query.js.map +1 -1
  304. package/transpiled/RTD/Context.d.ts +1 -1
  305. package/transpiled/RTD/Endpoint.d.ts +1 -0
  306. package/transpiled/RTD/Method.d.ts +4 -0
  307. package/transpiled/RTD/Method.js +11 -0
  308. package/transpiled/RTD/Method.js.map +1 -1
  309. package/transpiled/RTD/Node.d.ts +4 -1
  310. package/transpiled/RTD/Node.js +23 -12
  311. package/transpiled/RTD/Node.js.map +1 -1
  312. package/transpiled/RTD/Route.d.ts +1 -1
  313. package/transpiled/RTD/Route.js +0 -1
  314. package/transpiled/RTD/Route.js.map +1 -1
  315. package/transpiled/RTD/Tree.d.ts +1 -1
  316. package/transpiled/RTD/Tree.js.map +1 -1
  317. package/transpiled/RTD/factory.js +5 -2
  318. package/transpiled/RTD/factory.js.map +1 -1
  319. package/transpiled/RTD/syntax/parse.js +34 -22
  320. package/transpiled/RTD/syntax/parse.js.map +1 -1
  321. package/transpiled/RTD/syntax/types.d.ts +5 -3
  322. package/transpiled/RTD/syntax/types.js +1 -1
  323. package/transpiled/RTD/syntax/types.js.map +1 -1
  324. package/transpiled/Remotes.d.ts +4 -4
  325. package/transpiled/Remotes.js +6 -5
  326. package/transpiled/Remotes.js.map +1 -1
  327. package/transpiled/Tenant.d.ts +5 -5
  328. package/transpiled/Tenant.js +2 -13
  329. package/transpiled/Tenant.js.map +1 -1
  330. package/transpiled/deployment.d.ts +1 -1
  331. package/transpiled/deployment.js +28 -20
  332. package/transpiled/deployment.js.map +1 -1
  333. package/transpiled/directives/auth/Authorization.d.ts +1 -1
  334. package/transpiled/directives/auth/Authorization.js +33 -19
  335. package/transpiled/directives/auth/Authorization.js.map +1 -1
  336. package/transpiled/directives/auth/Delegate.d.ts +10 -0
  337. package/transpiled/directives/auth/Delegate.js +34 -0
  338. package/transpiled/directives/auth/Delegate.js.map +1 -0
  339. package/transpiled/directives/auth/Echo.d.ts +4 -3
  340. package/transpiled/directives/auth/Echo.js +13 -3
  341. package/transpiled/directives/auth/Echo.js.map +1 -1
  342. package/transpiled/directives/auth/Federation.d.ts +16 -0
  343. package/transpiled/directives/auth/Federation.js +57 -0
  344. package/transpiled/directives/auth/Federation.js.map +1 -0
  345. package/transpiled/directives/auth/Incept.js +4 -3
  346. package/transpiled/directives/auth/Incept.js.map +1 -1
  347. package/transpiled/directives/auth/Role.d.ts +4 -1
  348. package/transpiled/directives/auth/Role.js +20 -14
  349. package/transpiled/directives/auth/Role.js.map +1 -1
  350. package/transpiled/directives/auth/Scheme.js +1 -1
  351. package/transpiled/directives/auth/Scheme.js.map +1 -1
  352. package/transpiled/directives/auth/split.js +1 -1
  353. package/transpiled/directives/auth/split.js.map +1 -1
  354. package/transpiled/directives/auth/types.d.ts +1 -1
  355. package/transpiled/directives/cache/Cache.d.ts +3 -3
  356. package/transpiled/directives/cache/Cache.js +10 -4
  357. package/transpiled/directives/cache/Cache.js.map +1 -1
  358. package/transpiled/directives/cache/Control.d.ts +2 -1
  359. package/transpiled/directives/cache/Control.js +29 -12
  360. package/transpiled/directives/cache/Control.js.map +1 -1
  361. package/transpiled/directives/cors/CORS.js +1 -1
  362. package/transpiled/directives/cors/CORS.js.map +1 -1
  363. package/transpiled/directives/dev/Development.js +1 -1
  364. package/transpiled/directives/dev/Development.js.map +1 -1
  365. package/transpiled/directives/flow/Compose.d.ts +8 -0
  366. package/transpiled/directives/flow/Compose.js +74 -0
  367. package/transpiled/directives/flow/Compose.js.map +1 -0
  368. package/transpiled/directives/flow/Fetch.d.ts +12 -0
  369. package/transpiled/directives/flow/Fetch.js +58 -0
  370. package/transpiled/directives/flow/Fetch.js.map +1 -0
  371. package/transpiled/directives/flow/Flow.d.ts +10 -0
  372. package/transpiled/directives/flow/Flow.js +33 -0
  373. package/transpiled/directives/flow/Flow.js.map +1 -0
  374. package/transpiled/directives/flow/index.d.ts +2 -0
  375. package/transpiled/directives/flow/index.js +6 -0
  376. package/transpiled/directives/flow/index.js.map +1 -0
  377. package/transpiled/directives/flow/types.d.ts +6 -0
  378. package/transpiled/directives/flow/types.js.map +1 -0
  379. package/transpiled/directives/index.js +3 -1
  380. package/transpiled/directives/index.js.map +1 -1
  381. package/transpiled/directives/io/IO.js +1 -1
  382. package/transpiled/directives/io/IO.js.map +1 -1
  383. package/transpiled/directives/io/Input.js +2 -2
  384. package/transpiled/directives/io/Input.js.map +1 -1
  385. package/transpiled/directives/io/Output.js +2 -2
  386. package/transpiled/directives/io/Output.js.map +1 -1
  387. package/transpiled/directives/octets/Context.js +4 -24
  388. package/transpiled/directives/octets/Context.js.map +1 -1
  389. package/transpiled/directives/octets/Delete.js +8 -8
  390. package/transpiled/directives/octets/Delete.js.map +1 -1
  391. package/transpiled/directives/octets/{Fetch.d.ts → Get.d.ts} +5 -6
  392. package/transpiled/directives/octets/{Fetch.js → Get.js} +24 -29
  393. package/transpiled/directives/octets/Get.js.map +1 -0
  394. package/transpiled/directives/octets/Octets.js +8 -12
  395. package/transpiled/directives/octets/Octets.js.map +1 -1
  396. package/transpiled/directives/octets/{Store.d.ts → Put.d.ts} +7 -2
  397. package/transpiled/directives/octets/{Store.js → Put.js} +26 -19
  398. package/transpiled/directives/octets/Put.js.map +1 -0
  399. package/transpiled/directives/octets/Workflow.js +1 -1
  400. package/transpiled/directives/octets/Workflow.js.map +1 -1
  401. package/transpiled/directives/octets/bytes.d.ts +1 -0
  402. package/transpiled/directives/octets/bytes.js +21 -0
  403. package/transpiled/directives/octets/bytes.js.map +1 -0
  404. package/transpiled/directives/octets/schemas.d.ts +4 -8
  405. package/transpiled/directives/octets/schemas.js +3 -6
  406. package/transpiled/directives/octets/schemas.js.map +1 -1
  407. package/transpiled/directives/octets/workflows/Execution.d.ts +5 -1
  408. package/transpiled/directives/octets/workflows/Execution.js +44 -9
  409. package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
  410. package/transpiled/directives/octets/workflows/Workflow.d.ts +1 -1
  411. package/transpiled/directives/octets/workflows/Workflow.js +2 -1
  412. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  413. package/transpiled/directives/require/Directive.d.ts +4 -0
  414. package/transpiled/directives/require/Directive.js +3 -0
  415. package/transpiled/directives/require/Directive.js.map +1 -0
  416. package/transpiled/directives/require/Headers.d.ts +7 -0
  417. package/transpiled/directives/require/Headers.js +19 -0
  418. package/transpiled/directives/require/Headers.js.map +1 -0
  419. package/transpiled/directives/require/Require.d.ts +9 -0
  420. package/transpiled/directives/require/Require.js +27 -0
  421. package/transpiled/directives/require/Require.js.map +1 -0
  422. package/transpiled/directives/require/index.d.ts +2 -0
  423. package/transpiled/directives/require/index.js +6 -0
  424. package/transpiled/directives/require/index.js.map +1 -0
  425. package/transpiled/directives/vary/Directive.d.ts +2 -1
  426. package/transpiled/directives/vary/Embed.d.ts +2 -1
  427. package/transpiled/directives/vary/Embed.js +8 -6
  428. package/transpiled/directives/vary/Embed.js.map +1 -1
  429. package/transpiled/directives/vary/Vary.d.ts +2 -2
  430. package/transpiled/directives/vary/Vary.js +3 -3
  431. package/transpiled/directives/vary/Vary.js.map +1 -1
  432. package/transpiled/directives/vary/embeddings/Authority.d.ts +5 -0
  433. package/transpiled/directives/vary/embeddings/Authority.js +10 -0
  434. package/transpiled/directives/vary/embeddings/Authority.js.map +1 -0
  435. package/transpiled/directives/vary/embeddings/Embedding.d.ts +2 -1
  436. package/transpiled/directives/vary/embeddings/Language.js +2 -2
  437. package/transpiled/directives/vary/embeddings/Language.js.map +1 -1
  438. package/transpiled/directives/vary/embeddings/Parameter.d.ts +7 -0
  439. package/transpiled/directives/vary/embeddings/Parameter.js +14 -0
  440. package/transpiled/directives/vary/embeddings/Parameter.js.map +1 -0
  441. package/transpiled/directives/vary/embeddings/index.d.ts +2 -2
  442. package/transpiled/directives/vary/embeddings/index.js +8 -4
  443. package/transpiled/directives/vary/embeddings/index.js.map +1 -1
  444. package/transpiled/exceptions.d.ts +3 -2
  445. package/transpiled/exceptions.js +10 -5
  446. package/transpiled/exceptions.js.map +1 -1
  447. package/transpiled/manifest.js +10 -11
  448. package/transpiled/manifest.js.map +1 -1
  449. package/transpiled/root.js +5 -5
  450. package/transpiled/root.js.map +1 -1
  451. package/transpiled/schemas.d.ts +1 -1
  452. package/transpiled/schemas.js +2 -2
  453. package/transpiled/schemas.js.map +1 -1
  454. package/transpiled/tsconfig.tsbuildinfo +1 -1
  455. package/tsconfig.json +8 -2
  456. package/components/identity.basic/operations/create.d.ts +0 -10
  457. package/components/identity.basic/operations/create.js +0 -10
  458. package/components/identity.basic/operations/create.js.map +0 -1
  459. package/components/identity.basic/source/create.ts +0 -18
  460. package/components/identity.federation/operations/create.d.ts +0 -10
  461. package/components/identity.federation/operations/create.js.map +0 -1
  462. package/components/identity.federation/operations/schemas.d.ts +0 -59
  463. package/components/identity.federation/operations/schemas.js +0 -9
  464. package/components/identity.federation/operations/schemas.js.map +0 -1
  465. package/components/identity.federation/operations/types.js.map +0 -1
  466. package/components/identity.federation/source/schemas.ts +0 -61
  467. package/components/octets.storage/operations/fetch.js +0 -46
  468. package/components/octets.storage/operations/list.js +0 -7
  469. package/components/octets.storage/operations/permute.js +0 -7
  470. package/components/octets.storage/operations/store.js +0 -11
  471. package/features/steps/components/octets.tester/operations/diversify.js +0 -14
  472. package/schemas/octets/context.cos.yaml +0 -1
  473. package/schemas/octets/fetch.cos.yaml +0 -3
  474. package/schemas/octets/permute.cos.yaml +0 -1
  475. package/schemas/octets/store.cos.yaml +0 -3
  476. package/source/HTTP/Server.test.ts +0 -126
  477. package/source/directives/octets/Fetch.ts +0 -100
  478. package/source/directives/octets/List.ts +0 -72
  479. package/source/directives/octets/Permute.ts +0 -44
  480. package/transpiled/directives/octets/Fetch.js.map +0 -1
  481. package/transpiled/directives/octets/List.d.ts +0 -16
  482. package/transpiled/directives/octets/List.js +0 -74
  483. package/transpiled/directives/octets/List.js.map +0 -1
  484. package/transpiled/directives/octets/Permute.d.ts +0 -11
  485. package/transpiled/directives/octets/Permute.js +0 -58
  486. package/transpiled/directives/octets/Permute.js.map +0 -1
  487. package/transpiled/directives/octets/Store.js.map +0 -1
  488. /package/schemas/octets/{list.cos.yaml → get.cos.yaml} +0 -0
  489. /package/{components/identity.federation/operations → transpiled/directives/flow}/types.js +0 -0
package/source/Query.ts CHANGED
@@ -1,43 +1,117 @@
1
+ import assert from 'node:assert'
1
2
  import * as http from './HTTP'
2
3
  import { type Parameter } from './RTD'
3
4
  import * as schemas from './schemas'
5
+ import { queryable } from './Mapping'
6
+ import type { Introspection, Schema } from './Introspection'
4
7
  import type * as syntax from './RTD/syntax'
5
8
  import type * as core from '@toa.io/core'
6
9
 
7
10
  export class Query {
8
11
  private readonly query: syntax.Query
9
12
  private readonly closed: boolean = false
13
+ private readonly prepend: ',' | ';' = ';'
14
+ private readonly queryable: boolean
10
15
 
11
16
  public constructor (query: syntax.Query) {
12
- if (query.criteria !== undefined) {
13
- const open = query.criteria[query.criteria.length - 1] === ';'
14
-
15
- if (open) query.criteria = query.criteria.slice(0, -1)
16
- else this.closed = true
17
+ this.queryable = queryable(query)
18
+
19
+ if (this.queryable) {
20
+ query.omit ??= { value: 0, range: [0, 1000] }
21
+ query.limit ??= { value: 10, range: [1, 100] }
22
+
23
+ if (query.criteria !== undefined) {
24
+ // eslint-disable-next-line max-depth
25
+ if (query.criteria.endsWith(';'))
26
+ query.criteria = query.criteria.slice(0, -1)
27
+ else
28
+ this.closed = true
29
+
30
+ // eslint-disable-next-line max-depth
31
+ if (query.criteria.startsWith(',') || query.criteria.startsWith(';')) {
32
+ this.prepend = query.criteria[0] as ',' | ';'
33
+
34
+ query.criteria = query.criteria.slice(1)
35
+ }
36
+ }
17
37
  }
18
38
 
19
39
  this.query = query
20
40
  }
21
41
 
22
- public fit (query: http.Query, parameters: Parameter[]): core.Query {
23
- const error = schemas.querystring.fit(query)
42
+ public fit (query: http.Query, parameters: Parameter[]): QueryString {
43
+ const qs = this.split(query)
44
+
45
+ if (qs.query !== null) {
46
+ const error = schemas.querystring.fit(qs.query)
24
47
 
25
- if (error !== null)
26
- throw new http.BadRequest('Query ' + error.message)
48
+ if (error !== null)
49
+ throw new http.BadRequest('Query ' + error.message)
27
50
 
28
- this.fitCriteria(query, parameters)
29
- this.fitRanges(query)
30
- this.fitSort(query)
51
+ this.fitCriteria(qs.query, parameters)
52
+ this.fitRanges(qs.query)
53
+ this.fitSort(qs.query)
54
+ }
31
55
 
32
- return query as core.Query
56
+ return {
57
+ query: qs.query as core.Query,
58
+ parameters: qs.parameters
59
+ }
33
60
  }
34
61
 
35
- private fitCriteria (query: http.Query, parameters: Parameter[]): void {
36
- const criteria: string[] = []
62
+ public explain (introspection: Introspection): Record<string, Schema> | null {
63
+ if (this.query?.parameters === undefined || introspection.input?.type !== 'object')
64
+ return null
37
65
 
38
- if (this.query.criteria !== undefined)
39
- criteria.push(this.query.criteria)
66
+ let query: Record<string, Schema> | null = null
67
+
68
+ for (const parameter of this.query.parameters) {
69
+ const schema = introspection.input.properties[parameter]
70
+
71
+ if (schema !== undefined) {
72
+ query ??= {}
73
+ query[parameter] = schema
74
+ }
75
+
76
+ delete introspection.input.properties[parameter]
77
+ }
78
+
79
+ return query
80
+ }
81
+
82
+ private split (query: http.Query): {
83
+ query: http.Query | null
84
+ parameters: Record<string, string> | null
85
+ } {
86
+ let parameters: Record<string, string> | null = null
87
+
88
+ if (this.query?.parameters !== undefined)
89
+ for (const key in query)
90
+ // eslint-disable-next-line max-depth
91
+ if (this.query.parameters.includes(key)) {
92
+ parameters ??= {}
93
+ parameters[key] = query[key] as string
94
+
95
+ delete query[key]
96
+ }
97
+
98
+ if (!this.queryable) {
99
+ const keys = Object.keys(query)
40
100
 
101
+ if (keys.length > 0)
102
+ throw new http.BadRequest(`Query parameter '${keys[0]}' is not allowed`)
103
+
104
+ query = null!
105
+ }
106
+
107
+ return {
108
+ query,
109
+ parameters
110
+ }
111
+ }
112
+
113
+ private fitCriteria (query: http.Query, parameters: Parameter[]): void {
114
+ const groups: CriteriaGroup[] = []
41
115
  const idx = parameters.findIndex((parameter) => parameter.name === 'id')
42
116
 
43
117
  if (idx !== -1) {
@@ -47,32 +121,36 @@ export class Query {
47
121
  }
48
122
 
49
123
  if (parameters.length > 0) {
50
- const chunks = parameters
124
+ const criteria = parameters
51
125
  .map(({ name, value }) => `${name}==${value}`)
52
126
  .join(';')
53
127
 
54
- criteria.push(chunks)
128
+ groups.push({ criteria, operator: this.prepend })
55
129
  }
56
130
 
131
+ if (this.query.criteria !== undefined)
132
+ groups.push({ criteria: this.query.criteria, operator: ';' })
133
+
57
134
  if (query.criteria !== undefined)
58
- if (this.closed) throw new http.BadRequest('Query criteria is closed.')
59
- else criteria.push(query.criteria)
60
-
61
- switch (criteria.length) {
62
- case 0:
63
- break
64
- case 1:
65
- query.criteria = criteria[0]
66
- break
67
- default:
68
- query.criteria = '(' + criteria.join(');(') + ')'
69
- break
70
- }
135
+ if (this.closed)
136
+ throw new http.BadRequest('Query criteria is closed')
137
+ else
138
+ groups.push({ criteria: query.criteria, operator: WHATEVER })
139
+
140
+ if (groups.length > 0)
141
+ query.criteria = groups.reduce((acc, { criteria, operator }, i) => {
142
+ return i === groups.length - 1
143
+ ? `${acc}(${criteria})`
144
+ : `${acc}(${criteria})${operator}`
145
+ }, '')
71
146
  }
72
147
 
73
148
  private fitRanges (qs: http.Query): void {
74
149
  const query = qs as core.Query
75
150
 
151
+ assert.ok(this.query.limit !== undefined, 'Query limit must be defined')
152
+ assert.ok(this.query.omit !== undefined, 'Query limit range must be defined')
153
+
76
154
  if (qs.limit !== undefined)
77
155
  query.limit = fit(qs.limit, this.query.limit.range, 'limit')
78
156
  else
@@ -99,7 +177,19 @@ function fit (string: string, range: [number, number], name: string): number {
99
177
 
100
178
  if (number < range[0] || number > range[1])
101
179
  throw new http.BadRequest(`Query ${name} must be between ` +
102
- `${range[0]} and ${range[1]} inclusive.`)
180
+ `${range[0]} and ${range[1]} inclusive`)
103
181
 
104
182
  return number
105
183
  }
184
+
185
+ const WHATEVER = ';'
186
+
187
+ interface CriteriaGroup {
188
+ criteria: string
189
+ operator: ',' | ';'
190
+ }
191
+
192
+ export interface QueryString {
193
+ query: core.Query | null
194
+ parameters: Record<string, string> | null
195
+ }
@@ -9,5 +9,5 @@ export interface Context<TExtension = any> {
9
9
  readonly factory: DirectiveFactory
10
10
  stack: Directive[]
11
11
  }
12
- readonly extension?: TExtension
12
+ readonly extension: TExtension
13
13
  }
@@ -5,6 +5,9 @@ import type * as RTD from './index'
5
5
 
6
6
  export interface Endpoint {
7
7
  call: (context: http.Context, parameters: RTD.Parameter[]) => Promise<http.OutgoingMessage>
8
+
9
+ explain: (parameters: RTD.Parameter[]) => Promise<unknown>
10
+
8
11
  close: () => Promise<void>
9
12
  }
10
13
 
@@ -1,15 +1,31 @@
1
+ import type { Parameter } from './Match'
1
2
  import type { Endpoint } from './Endpoint'
2
3
  import type { Directives } from './Directives'
3
4
 
4
5
  export class Method {
5
6
  public readonly endpoint: Endpoint | null
6
7
  public readonly directives: Directives
8
+ private introspection: unknown | null = null
9
+ private introspecting: Promise<unknown> | null = null
7
10
 
8
11
  public constructor (endpoint: Endpoint | null, directives: Directives) {
9
12
  this.endpoint = endpoint
10
13
  this.directives = directives
11
14
  }
12
15
 
16
+ public async explain (parameters: Parameter[]): Promise<unknown> {
17
+ if (this.introspection !== null)
18
+ return this.introspection
19
+
20
+ if (this.introspecting === null)
21
+ // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain
22
+ this.introspecting = this.endpoint?.explain(parameters)!
23
+
24
+ this.introspection = await this.introspecting
25
+
26
+ return this.introspection
27
+ }
28
+
13
29
  public async close (): Promise<void> {
14
30
  await this.endpoint?.close()
15
31
  }
@@ -4,6 +4,7 @@ import { type Match, type Parameter } from './Match'
4
4
 
5
5
  export class Node {
6
6
  public intermediate: boolean
7
+ public forward: string | null
7
8
  public methods: Methods
8
9
  private readonly protected: boolean
9
10
  private routes: Route[]
@@ -13,6 +14,7 @@ export class Node {
13
14
  this.routes = routes
14
15
  this.methods = methods
15
16
  this.protected = properties.protected
17
+ this.forward = properties.forward ?? null
16
18
  this.intermediate = this.routes.findIndex((route) => route.root) !== -1
17
19
 
18
20
  this.sort()
@@ -20,7 +22,8 @@ export class Node {
20
22
 
21
23
  public match (fragments: string[], parameters: Parameter[] = []): Match | null {
22
24
  for (const route of this.routes) {
23
- const match = route.match(fragments, parameters)
25
+ const params = parameters.slice()
26
+ const match = route.match(fragments, params)
24
27
 
25
28
  if (match !== null)
26
29
  return match
@@ -32,38 +35,46 @@ export class Node {
32
35
  public merge (node: Node): void {
33
36
  this.intermediate = node.intermediate
34
37
 
35
- if (!this.protected)
36
- this.replace(node)
37
- else
38
+ if (this.protected)
38
39
  this.append(node)
40
+ else
41
+ this.replace(node)
39
42
 
40
43
  this.sort()
41
44
  }
42
45
 
46
+ public async explain (parameters: Parameter[]): Promise<Record<string, unknown>> {
47
+ const methods: Record<string, unknown> = {}
48
+
49
+ const explained = Object.entries(this.methods)
50
+ .map(async ([verb, method]) =>
51
+ (methods[verb] = await method.explain(parameters)))
52
+
53
+ await Promise.all(explained)
54
+
55
+ return methods
56
+ }
57
+
43
58
  private replace (node: Node): void {
44
59
  const methods = Object.values(this.methods)
45
60
 
46
61
  this.routes = node.routes
47
62
  this.methods = node.methods
48
63
 
64
+ // race condition is really unlikely
49
65
  for (const method of methods)
50
66
  void method.close()
51
-
52
- // race condition is really unlikely
53
67
  }
54
68
 
55
69
  private append (node: Node): void {
56
70
  for (const route of node.routes)
57
- this.mergeRoute(route)
71
+ this.route(route)
58
72
 
59
73
  for (const [verb, method] of Object.entries(node.methods))
60
- if (verb in this.methods)
61
- console.warn(`Overriding of the protected method ${verb} is not permitted.`)
62
- else
63
- this.methods[verb] = method
74
+ this.methods[verb] = method
64
75
  }
65
76
 
66
- private mergeRoute (candidate: Route): void {
77
+ private route (candidate: Route): void {
67
78
  for (const route of this.routes)
68
79
  if (candidate.equals(route)) {
69
80
  route.merge(candidate)
@@ -75,10 +86,15 @@ export class Node {
75
86
  }
76
87
 
77
88
  private sort (): void {
78
- this.routes.sort((a, b) => a.variables - b.variables)
89
+ this.routes.sort((a, b) => {
90
+ return a.variables === b.variables
91
+ ? b.segments.length - a.segments.length // routes with more segments should be matched first
92
+ : a.variables - b.variables // routes with more variables should be matched last
93
+ })
79
94
  }
80
95
  }
81
96
 
82
97
  export interface Properties {
83
98
  protected: boolean
99
+ forward?: string
84
100
  }
@@ -5,7 +5,7 @@ import { type Match, type Parameter } from './Match'
5
5
  export class Route {
6
6
  public readonly root: boolean
7
7
  public readonly variables: number = 0
8
- private readonly segments: Segment[]
8
+ public readonly segments: Segment[]
9
9
  private readonly node: Node
10
10
 
11
11
  public constructor (segments: Segment[], node: Node) {
@@ -31,8 +31,10 @@ export class Route {
31
31
 
32
32
  const exact = this.segments.length === fragments.length
33
33
 
34
- if (exact && !this.node.intermediate) return { node: this.node, parameters }
35
- else return this.matchNested(fragments, parameters)
34
+ if (exact && !this.node.intermediate)
35
+ return { node: this.node, parameters }
36
+ else
37
+ return this.matchNested(fragments, parameters)
36
38
  }
37
39
 
38
40
  public equals (route: Route): boolean {
@@ -52,7 +54,6 @@ export class Route {
52
54
 
53
55
  private matchNested (fragments: string[], parameters: Parameter[]): Match | null {
54
56
  fragments = fragments.slice(this.segments.length)
55
- parameters = parameters.slice()
56
57
 
57
58
  return this.node.match(fragments, parameters)
58
59
  }
@@ -33,14 +33,14 @@ export class Tree {
33
33
  return this.trunk.match(fragments)
34
34
  }
35
35
 
36
- public merge (node: syntax.Node, extension: any): void {
36
+ public merge (node: syntax.Node, extension: unknown): void {
37
37
  const branch = this.createNode(node, !PROTECTED, extension)
38
38
 
39
39
  this.trunk.merge(branch)
40
40
  }
41
41
 
42
42
  private createNode
43
- (node: syntax.Node, protect: boolean, extension?: any): Node {
43
+ (node: syntax.Node, protect: boolean, extension?: unknown): Node {
44
44
  const context: Context = {
45
45
  protected: protect,
46
46
  endpoints: this.endpoints,
@@ -17,7 +17,10 @@ export function createNode (node: syntax.Node, context: Context): Node {
17
17
  for (const method of node.methods)
18
18
  methods[method.verb] = createMethod(method, context)
19
19
 
20
- const properties: Properties = { protected: node.protected ?? context.protected }
20
+ const properties: Properties = {
21
+ protected: node.protected ?? context.protected,
22
+ forward: node.forward
23
+ }
21
24
 
22
25
  return new Node(routes, methods, properties)
23
26
  }
@@ -33,7 +36,7 @@ function createRoute (route: syntax.Route, context: Context): Route {
33
36
  }
34
37
 
35
38
  function createMethod (method: syntax.Method, context: Context): Method {
36
- const stack = context.directives.stack.concat(method.directives.reverse())
39
+ const stack = method.directives.concat(context.directives.stack)
37
40
  const directives = context.directives.factory.create(stack)
38
41
 
39
42
  const endpoint = method.mapping?.endpoint === undefined
@@ -148,7 +148,7 @@ describe('validation', () => {
148
148
  it('should throw on unknown key', async () => {
149
149
  const declaration = { hello: 'world' }
150
150
 
151
- expect(() => parse(declaration)).toThrow('RTD parse error: unknown key \'hello\'.')
151
+ expect(() => parse(declaration)).toThrow('RTD parse error: unknown key \'hello\'')
152
152
  })
153
153
 
154
154
  it('should throw on invalid mapping', async () => {
@@ -17,42 +17,56 @@ export function parse (input: object, shortcuts?: Shortcuts): Node {
17
17
  return node
18
18
  }
19
19
 
20
- function parseNode (input: object, shortcuts?: Shortcuts): Node {
20
+ function parseNode (input: object | string, shortcuts?: Shortcuts): Node {
21
21
  const node = createNode()
22
22
 
23
- for (const [key, value] of Object.entries(input)) {
24
- if (PROPERTIES.includes(key as keyof Node)) {
25
- node[key as keyof Node] = value
23
+ if (typeof input === 'string') {
24
+ node.forward = input
26
25
 
27
- continue
28
- }
26
+ return node
27
+ }
29
28
 
30
- if (key[0] === '/') {
31
- const route = parseRoute(key, value as Node, shortcuts)
29
+ for (const [key, value] of Object.entries(input) as Array<[keyof Node, unknown]>)
30
+ switch (key) {
31
+ case 'protected':
32
+ case 'isolated':
33
+ node[key] = value as boolean
34
+ break
35
+ case 'forward':
36
+ node[key] = value as string
37
+ break
32
38
 
33
- node.routes.push(route)
39
+ default:
40
+ // eslint-disable-next-line max-depth
41
+ if (key[0] === '/') {
42
+ const route = parseRoute(key, value as Node, shortcuts)
34
43
 
35
- continue
36
- }
44
+ node.routes.push(route)
37
45
 
38
- if (verbs.has(key)) {
39
- const method = parseMethod(key, value as Mapping, shortcuts)
46
+ continue
47
+ }
40
48
 
41
- node.methods.push(method)
49
+ // eslint-disable-next-line max-depth
50
+ if (verbs.has(key)) {
51
+ const method = parseMethod(key, value as Mapping, shortcuts)
42
52
 
43
- continue
44
- }
53
+ node.methods.push(method)
45
54
 
46
- const directive = parseDirective(key, value, shortcuts)
55
+ continue
56
+ }
47
57
 
48
- if (directive !== null) {
49
- node.directives.push(directive)
58
+ // eslint-disable-next-line no-case-declarations
59
+ const directive = parseDirective(key, value, shortcuts)
50
60
 
51
- continue
52
- }
61
+ // eslint-disable-next-line max-depth
62
+ if (directive !== null) {
63
+ node.directives.push(directive)
53
64
 
54
- throw new Error(`RTD parse error: unknown key '${key}'.`)
55
- }
65
+ continue
66
+ }
67
+
68
+ throw new Error(`RTD parse error: unknown key '${key}'`)
69
+ }
56
70
 
57
71
  return node
58
72
  }
@@ -149,6 +163,5 @@ function expandRange (range: number): Range {
149
163
  }
150
164
 
151
165
  const DIRECTIVE_RX = /^(?<family>\w{1,32}):(?<name>\w{1,32})$/
152
- const PROPERTIES: Array<keyof Node> = ['protected', 'isolated']
153
166
 
154
167
  export type Shortcuts = Map<string, string>
@@ -1,6 +1,7 @@
1
1
  export interface Node {
2
2
  protected?: boolean
3
3
  isolated?: boolean
4
+ forward?: string
4
5
  routes: Route[]
5
6
  methods: Method[]
6
7
  directives: Directive[]
@@ -27,17 +28,18 @@ export interface Mapping {
27
28
  namespace?: string
28
29
  component?: string
29
30
  endpoint: string
30
- query?: Query
31
+ query?: Query | null
31
32
  }
32
33
 
33
34
  export interface Query {
34
35
  id?: string
35
36
  criteria?: string
36
37
  sort?: string
37
- omit: Range
38
- limit: Range
38
+ omit?: Range
39
+ limit?: Range
39
40
  selectors?: string[]
40
41
  projection?: string[]
42
+ parameters?: string[]
41
43
  }
42
44
 
43
45
  export interface Range {
@@ -45,4 +47,4 @@ export interface Range {
45
47
  range: [number, number]
46
48
  }
47
49
 
48
- export const verbs = new Set<string>(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'])
50
+ export const verbs = new Set<string>(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'LOCK', 'UNLOCK'])
package/source/Remotes.ts CHANGED
@@ -1,24 +1,25 @@
1
- import { Locator, Connector, type Component } from '@toa.io/core'
1
+ import { Locator, Connector, type Remote } from '@toa.io/core'
2
2
  import { type Bootloader } from './Factory'
3
3
 
4
4
  export class Remotes extends Connector {
5
5
  private readonly boot: Bootloader
6
- private readonly remotes: Record<string, Promise<Component>> = {}
6
+ private readonly cache: Record<string, Promise<Remote>> = {}
7
7
 
8
8
  public constructor (boot: Bootloader) {
9
9
  super()
10
10
  this.boot = boot
11
11
  }
12
12
 
13
- public async discover (namespace: string, name: string): Promise<Component> {
13
+ public async discover (namespace: string, name: string, version: string = 'local'): Promise<Remote> {
14
14
  const locator = new Locator(name, namespace)
15
+ const key = locator.id + ':' + version
15
16
 
16
- this.remotes[locator.id] ??= this.create(locator)
17
+ this.cache[key] ??= this.locate(locator)
17
18
 
18
- return await this.remotes[locator.id]
19
+ return this.cache[key]
19
20
  }
20
21
 
21
- private async create (locator: Locator): Promise<Component> {
22
+ private async locate (locator: Locator): Promise<Remote> {
22
23
  const remote = await this.boot.remote(locator)
23
24
 
24
25
  this.depends(remote)
package/source/Tenant.ts CHANGED
@@ -1,23 +1,17 @@
1
- import { Connector, type Locator, type bindings } from '@toa.io/core'
2
- import { type Label } from './discovery'
3
- import { type Branch } from './Branch'
4
- import type * as RTD from './RTD/syntax'
1
+ import { Connector } from '@toa.io/core'
2
+ import type { bindings } from '@toa.io/core'
3
+ import type { Label } from './discovery'
4
+ import type { Branch } from './Branch'
5
5
 
6
6
  export class Tenant extends Connector {
7
7
  private readonly broadcast: Broadcast
8
8
  private readonly branch: Branch
9
9
 
10
- public constructor (broadcast: Broadcast, locator: Locator, node: RTD.Node) {
10
+ public constructor (broadcast: Broadcast, branch: Branch) {
11
11
  super()
12
12
 
13
13
  this.broadcast = broadcast
14
-
15
- this.branch = {
16
- namespace: locator.namespace,
17
- component: locator.name,
18
- isolated: locator.namespace === 'identity',
19
- node
20
- }
14
+ this.branch = branch
21
15
 
22
16
  this.depends(broadcast)
23
17
  }
@@ -25,14 +19,6 @@ export class Tenant extends Connector {
25
19
  public override async open (): Promise<void> {
26
20
  await this.expose()
27
21
  await this.broadcast.receive('ping', this.expose.bind(this))
28
-
29
- console.info('Exposition Tenant for ' +
30
- `'${this.branch.namespace}.${this.branch.component}' has started.`)
31
- }
32
-
33
- public override async dispose (): Promise<void> {
34
- console.info('Exposition Tenant for ' +
35
- `'${this.branch.namespace}.${this.branch.component}' has been stopped.`)
36
22
  }
37
23
 
38
24
  private async expose (): Promise<void> {