@toa.io/extensions.exposition 1.0.0-alpha.8 → 1.0.0-alpha.81

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 (443) 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 +20 -11
  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 +32 -16
  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 +17 -8
  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 -5
  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 +6 -7
  96. package/components/octets.storage/operations/get.js +2 -2
  97. package/components/octets.storage/operations/store.js +113 -3
  98. package/documentation/access.md +75 -38
  99. package/documentation/authorities.md +49 -0
  100. package/documentation/cache.md +8 -1
  101. package/documentation/components.md +47 -22
  102. package/documentation/flow.md +31 -0
  103. package/documentation/identity.md +17 -22
  104. package/documentation/introspection.md +82 -0
  105. package/documentation/octets.md +81 -23
  106. package/documentation/protocol.md +13 -3
  107. package/documentation/query.md +29 -4
  108. package/documentation/require.md +15 -0
  109. package/documentation/tree.md +13 -0
  110. package/documentation/vary.md +14 -14
  111. package/features/access.feature +78 -46
  112. package/features/annotation.feature +1 -0
  113. package/features/auth.claim.feature +170 -0
  114. package/features/authorities.basic.feature +141 -0
  115. package/features/authorities.feature +32 -0
  116. package/features/authorities.federation.feature +100 -0
  117. package/features/authorities.tokens.feature +117 -0
  118. package/features/body.feature +2 -0
  119. package/features/cache.feature +109 -5
  120. package/features/cors.feature +6 -1
  121. package/features/debug.feature +34 -0
  122. package/features/directives.feature +3 -0
  123. package/features/dynamic.feature +48 -0
  124. package/features/errors.feature +32 -7
  125. package/features/etag.feature +31 -0
  126. package/features/flow.feature +45 -0
  127. package/features/identity.bans.feature +137 -0
  128. package/features/identity.basic.feature +113 -23
  129. package/features/identity.feature +7 -2
  130. package/features/identity.federation.feature +66 -11
  131. package/features/identity.roles.feature +250 -7
  132. package/features/identity.tokens.feature +54 -4
  133. package/features/introspection.feature +153 -0
  134. package/features/io.feature +38 -1
  135. package/features/methods.feature +47 -0
  136. package/features/octets.download.feature +189 -0
  137. package/features/octets.entries.feature +8 -1
  138. package/features/octets.feature +82 -54
  139. package/features/octets.meta.feature +3 -0
  140. package/features/octets.workflows.feature +239 -19
  141. package/features/probes.feature +14 -0
  142. package/features/{queries.feature → query.feature} +65 -2
  143. package/features/realtime.feature +34 -0
  144. package/features/require.feature +67 -0
  145. package/features/response.feature +38 -3
  146. package/features/routes.feature +93 -2
  147. package/features/steps/Database.ts +16 -9
  148. package/features/steps/Gateway.ts +23 -6
  149. package/features/steps/IdP.ts +30 -25
  150. package/features/steps/Parameters.ts +4 -1
  151. package/features/steps/Realtime.ts +151 -0
  152. package/features/steps/components/echo/manifest.toa.yaml +14 -1
  153. package/features/steps/components/echo/operations/identity.js +7 -0
  154. package/features/steps/components/echo/operations/parameters.js +7 -0
  155. package/features/steps/components/echo.beacon/manifest.toa.yaml +2 -0
  156. package/features/steps/components/echo.beacon/operations/hello.js +5 -0
  157. package/features/steps/components/octets.tester/manifest.toa.yaml +22 -1
  158. package/features/steps/components/octets.tester/operations/authority.js +7 -0
  159. package/features/steps/components/octets.tester/operations/baz.js +1 -2
  160. package/features/steps/components/octets.tester/operations/diversify.js +3 -1
  161. package/features/steps/components/octets.tester/operations/foo.js +2 -2
  162. package/features/steps/components/octets.tester/operations/redirect.js +12 -0
  163. package/features/steps/components/octets.tester/operations/yex.js +16 -0
  164. package/features/steps/components/octets.tester/operations/yield.js +13 -0
  165. package/features/steps/components/pots/manifest.toa.yaml +14 -3
  166. package/features/steps/components/users/manifest.toa.yaml +0 -1
  167. package/features/steps/components/users.properties/manifest.toa.yaml +1 -1
  168. package/features/streams.feature +5 -0
  169. package/features/timing.feature +4 -1
  170. package/features/vary.feature +71 -0
  171. package/package.json +23 -14
  172. package/readme.md +19 -14
  173. package/schemas/annotation.cos.yaml +1 -1
  174. package/schemas/method.cos.yaml +1 -1
  175. package/schemas/node.cos.yaml +2 -0
  176. package/schemas/octets/store.cos.yaml +25 -3
  177. package/schemas/query.cos.yaml +4 -10
  178. package/source/Annotation.ts +3 -3
  179. package/source/Branch.ts +1 -0
  180. package/source/Composition.ts +0 -6
  181. package/source/Context.ts +1 -0
  182. package/source/Directive.ts +4 -5
  183. package/source/Endpoint.ts +55 -15
  184. package/source/Factory.ts +22 -13
  185. package/source/Gateway.ts +67 -19
  186. package/source/HTTP/Context.ts +25 -2
  187. package/source/HTTP/Server.ts +54 -44
  188. package/source/HTTP/exceptions.ts +13 -1
  189. package/source/HTTP/formats/index.ts +3 -3
  190. package/source/HTTP/messages.test.ts +45 -2
  191. package/source/HTTP/messages.ts +23 -5
  192. package/source/Introspection.ts +11 -0
  193. package/source/Mapping.ts +63 -21
  194. package/source/Query.test.ts +3 -3
  195. package/source/Query.ts +117 -33
  196. package/source/RTD/Context.ts +1 -1
  197. package/source/RTD/Endpoint.ts +3 -0
  198. package/source/RTD/Method.ts +16 -0
  199. package/source/RTD/Node.ts +29 -13
  200. package/source/RTD/Route.ts +5 -4
  201. package/source/RTD/Tree.ts +2 -2
  202. package/source/RTD/factory.ts +5 -2
  203. package/source/RTD/syntax/parse.ts +37 -24
  204. package/source/RTD/syntax/types.ts +6 -4
  205. package/source/Remotes.ts +7 -6
  206. package/source/Tenant.ts +6 -20
  207. package/source/deployment.ts +33 -23
  208. package/source/directives/auth/Authorization.ts +37 -14
  209. package/source/directives/auth/Delegate.ts +42 -0
  210. package/source/directives/auth/Federation.ts +84 -0
  211. package/source/directives/auth/Incept.ts +4 -3
  212. package/source/directives/auth/Role.test.ts +53 -6
  213. package/source/directives/auth/Role.ts +22 -14
  214. package/source/directives/auth/split.ts +1 -1
  215. package/source/directives/auth/types.ts +1 -1
  216. package/source/directives/cache/Cache.ts +13 -6
  217. package/source/directives/cache/Control.ts +42 -16
  218. package/source/directives/cors/CORS.ts +1 -1
  219. package/source/directives/dev/Development.ts +1 -1
  220. package/source/directives/flow/Fetch.ts +88 -0
  221. package/source/directives/flow/Flow.ts +34 -0
  222. package/source/directives/flow/index.ts +3 -0
  223. package/source/directives/flow/types.ts +6 -0
  224. package/source/directives/index.ts +3 -1
  225. package/source/directives/io/Input.ts +4 -4
  226. package/source/directives/io/Output.ts +4 -3
  227. package/source/directives/octets/Context.ts +3 -2
  228. package/source/directives/octets/Fetch.ts +11 -10
  229. package/source/directives/octets/List.ts +5 -5
  230. package/source/directives/octets/Octets.ts +1 -3
  231. package/source/directives/octets/Store.ts +30 -10
  232. package/source/directives/octets/bytes.test.ts +30 -0
  233. package/source/directives/octets/bytes.ts +18 -0
  234. package/source/directives/octets/schemas.ts +4 -6
  235. package/source/directives/octets/workflows/Execution.ts +60 -8
  236. package/source/directives/octets/workflows/Workflow.ts +2 -1
  237. package/source/directives/require/Directive.ts +5 -0
  238. package/source/directives/require/Headers.ts +20 -0
  239. package/source/directives/require/Require.ts +28 -0
  240. package/source/directives/require/index.ts +3 -0
  241. package/source/directives/vary/Directive.ts +2 -1
  242. package/source/directives/vary/Embed.ts +14 -8
  243. package/source/directives/vary/Vary.ts +6 -4
  244. package/source/directives/vary/embeddings/Authority.ts +8 -0
  245. package/source/directives/vary/embeddings/Embedding.ts +2 -1
  246. package/source/directives/vary/embeddings/Parameter.ts +14 -0
  247. package/source/directives/vary/embeddings/index.ts +6 -4
  248. package/source/exceptions.ts +17 -11
  249. package/source/manifest.ts +10 -11
  250. package/source/schemas.ts +1 -1
  251. package/transpiled/Annotation.d.ts +3 -3
  252. package/transpiled/Branch.d.ts +1 -0
  253. package/transpiled/Composition.d.ts +0 -1
  254. package/transpiled/Composition.js +0 -4
  255. package/transpiled/Composition.js.map +1 -1
  256. package/transpiled/Context.d.ts +1 -0
  257. package/transpiled/Directive.js +4 -4
  258. package/transpiled/Directive.js.map +1 -1
  259. package/transpiled/Endpoint.d.ts +6 -4
  260. package/transpiled/Endpoint.js +35 -7
  261. package/transpiled/Endpoint.js.map +1 -1
  262. package/transpiled/Factory.d.ts +3 -2
  263. package/transpiled/Factory.js +18 -10
  264. package/transpiled/Factory.js.map +1 -1
  265. package/transpiled/Gateway.d.ts +3 -0
  266. package/transpiled/Gateway.js +51 -12
  267. package/transpiled/Gateway.js.map +1 -1
  268. package/transpiled/HTTP/Context.d.ts +8 -1
  269. package/transpiled/HTTP/Context.js +16 -2
  270. package/transpiled/HTTP/Context.js.map +1 -1
  271. package/transpiled/HTTP/Server.d.ts +13 -2
  272. package/transpiled/HTTP/Server.js +41 -36
  273. package/transpiled/HTTP/Server.js.map +1 -1
  274. package/transpiled/HTTP/exceptions.d.ts +7 -1
  275. package/transpiled/HTTP/exceptions.js +13 -1
  276. package/transpiled/HTTP/exceptions.js.map +1 -1
  277. package/transpiled/HTTP/formats/index.js +3 -3
  278. package/transpiled/HTTP/formats/index.js.map +1 -1
  279. package/transpiled/HTTP/messages.d.ts +1 -0
  280. package/transpiled/HTTP/messages.js +24 -5
  281. package/transpiled/HTTP/messages.js.map +1 -1
  282. package/transpiled/Introspection.d.ts +9 -0
  283. package/transpiled/Introspection.js +3 -0
  284. package/transpiled/Introspection.js.map +1 -0
  285. package/transpiled/Mapping.d.ts +10 -2
  286. package/transpiled/Mapping.js +48 -19
  287. package/transpiled/Mapping.js.map +1 -1
  288. package/transpiled/Query.d.ts +10 -1
  289. package/transpiled/Query.js +83 -30
  290. package/transpiled/Query.js.map +1 -1
  291. package/transpiled/RTD/Context.d.ts +1 -1
  292. package/transpiled/RTD/Endpoint.d.ts +1 -0
  293. package/transpiled/RTD/Method.d.ts +4 -0
  294. package/transpiled/RTD/Method.js +11 -0
  295. package/transpiled/RTD/Method.js.map +1 -1
  296. package/transpiled/RTD/Node.d.ts +4 -1
  297. package/transpiled/RTD/Node.js +23 -12
  298. package/transpiled/RTD/Node.js.map +1 -1
  299. package/transpiled/RTD/Route.d.ts +1 -1
  300. package/transpiled/RTD/Route.js +0 -1
  301. package/transpiled/RTD/Route.js.map +1 -1
  302. package/transpiled/RTD/Tree.d.ts +1 -1
  303. package/transpiled/RTD/Tree.js.map +1 -1
  304. package/transpiled/RTD/factory.js +5 -2
  305. package/transpiled/RTD/factory.js.map +1 -1
  306. package/transpiled/RTD/syntax/parse.js +34 -22
  307. package/transpiled/RTD/syntax/parse.js.map +1 -1
  308. package/transpiled/RTD/syntax/types.d.ts +5 -3
  309. package/transpiled/RTD/syntax/types.js +1 -1
  310. package/transpiled/RTD/syntax/types.js.map +1 -1
  311. package/transpiled/Remotes.d.ts +4 -4
  312. package/transpiled/Remotes.js +6 -5
  313. package/transpiled/Remotes.js.map +1 -1
  314. package/transpiled/Tenant.d.ts +5 -5
  315. package/transpiled/Tenant.js +2 -13
  316. package/transpiled/Tenant.js.map +1 -1
  317. package/transpiled/deployment.d.ts +1 -1
  318. package/transpiled/deployment.js +28 -20
  319. package/transpiled/deployment.js.map +1 -1
  320. package/transpiled/directives/auth/Authorization.js +26 -10
  321. package/transpiled/directives/auth/Authorization.js.map +1 -1
  322. package/transpiled/directives/auth/Delegate.d.ts +10 -0
  323. package/transpiled/directives/auth/Delegate.js +34 -0
  324. package/transpiled/directives/auth/Delegate.js.map +1 -0
  325. package/transpiled/directives/auth/Federation.d.ts +16 -0
  326. package/transpiled/directives/auth/Federation.js +57 -0
  327. package/transpiled/directives/auth/Federation.js.map +1 -0
  328. package/transpiled/directives/auth/Incept.js +4 -3
  329. package/transpiled/directives/auth/Incept.js.map +1 -1
  330. package/transpiled/directives/auth/Role.d.ts +4 -1
  331. package/transpiled/directives/auth/Role.js +20 -14
  332. package/transpiled/directives/auth/Role.js.map +1 -1
  333. package/transpiled/directives/auth/split.js +1 -1
  334. package/transpiled/directives/auth/split.js.map +1 -1
  335. package/transpiled/directives/cache/Cache.d.ts +3 -3
  336. package/transpiled/directives/cache/Cache.js +10 -4
  337. package/transpiled/directives/cache/Cache.js.map +1 -1
  338. package/transpiled/directives/cache/Control.d.ts +2 -1
  339. package/transpiled/directives/cache/Control.js +29 -12
  340. package/transpiled/directives/cache/Control.js.map +1 -1
  341. package/transpiled/directives/cors/CORS.js +1 -1
  342. package/transpiled/directives/cors/CORS.js.map +1 -1
  343. package/transpiled/directives/dev/Development.js +1 -1
  344. package/transpiled/directives/dev/Development.js.map +1 -1
  345. package/transpiled/directives/flow/Fetch.d.ts +13 -0
  346. package/transpiled/directives/flow/Fetch.js +59 -0
  347. package/transpiled/directives/flow/Fetch.js.map +1 -0
  348. package/transpiled/directives/flow/Flow.d.ts +10 -0
  349. package/transpiled/directives/flow/Flow.js +27 -0
  350. package/transpiled/directives/flow/Flow.js.map +1 -0
  351. package/transpiled/directives/flow/index.d.ts +2 -0
  352. package/transpiled/directives/flow/index.js +6 -0
  353. package/transpiled/directives/flow/index.js.map +1 -0
  354. package/transpiled/directives/flow/types.d.ts +5 -0
  355. package/transpiled/directives/flow/types.js.map +1 -0
  356. package/transpiled/directives/index.js +3 -1
  357. package/transpiled/directives/index.js.map +1 -1
  358. package/transpiled/directives/io/Input.js +2 -2
  359. package/transpiled/directives/io/Input.js.map +1 -1
  360. package/transpiled/directives/io/Output.js +2 -2
  361. package/transpiled/directives/io/Output.js.map +1 -1
  362. package/transpiled/directives/octets/Context.js +4 -24
  363. package/transpiled/directives/octets/Context.js.map +1 -1
  364. package/transpiled/directives/octets/Fetch.d.ts +3 -3
  365. package/transpiled/directives/octets/Fetch.js +8 -8
  366. package/transpiled/directives/octets/Fetch.js.map +1 -1
  367. package/transpiled/directives/octets/List.d.ts +3 -3
  368. package/transpiled/directives/octets/List.js +3 -3
  369. package/transpiled/directives/octets/List.js.map +1 -1
  370. package/transpiled/directives/octets/Octets.js +1 -3
  371. package/transpiled/directives/octets/Octets.js.map +1 -1
  372. package/transpiled/directives/octets/Store.d.ts +6 -1
  373. package/transpiled/directives/octets/Store.js +17 -7
  374. package/transpiled/directives/octets/Store.js.map +1 -1
  375. package/transpiled/directives/octets/bytes.d.ts +1 -0
  376. package/transpiled/directives/octets/bytes.js +21 -0
  377. package/transpiled/directives/octets/bytes.js.map +1 -0
  378. package/transpiled/directives/octets/schemas.d.ts +4 -6
  379. package/transpiled/directives/octets/schemas.js +1 -3
  380. package/transpiled/directives/octets/schemas.js.map +1 -1
  381. package/transpiled/directives/octets/workflows/Execution.d.ts +5 -1
  382. package/transpiled/directives/octets/workflows/Execution.js +44 -9
  383. package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
  384. package/transpiled/directives/octets/workflows/Workflow.js +2 -1
  385. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  386. package/transpiled/directives/require/Directive.d.ts +4 -0
  387. package/transpiled/directives/require/Directive.js +3 -0
  388. package/transpiled/directives/require/Directive.js.map +1 -0
  389. package/transpiled/directives/require/Headers.d.ts +7 -0
  390. package/transpiled/directives/require/Headers.js +19 -0
  391. package/transpiled/directives/require/Headers.js.map +1 -0
  392. package/transpiled/directives/require/Require.d.ts +9 -0
  393. package/transpiled/directives/require/Require.js +27 -0
  394. package/transpiled/directives/require/Require.js.map +1 -0
  395. package/transpiled/directives/require/index.d.ts +2 -0
  396. package/transpiled/directives/require/index.js +6 -0
  397. package/transpiled/directives/require/index.js.map +1 -0
  398. package/transpiled/directives/vary/Directive.d.ts +2 -1
  399. package/transpiled/directives/vary/Embed.d.ts +2 -1
  400. package/transpiled/directives/vary/Embed.js +8 -6
  401. package/transpiled/directives/vary/Embed.js.map +1 -1
  402. package/transpiled/directives/vary/Vary.d.ts +2 -2
  403. package/transpiled/directives/vary/Vary.js +3 -3
  404. package/transpiled/directives/vary/Vary.js.map +1 -1
  405. package/transpiled/directives/vary/embeddings/Authority.d.ts +5 -0
  406. package/transpiled/directives/vary/embeddings/Authority.js +10 -0
  407. package/transpiled/directives/vary/embeddings/Authority.js.map +1 -0
  408. package/transpiled/directives/vary/embeddings/Embedding.d.ts +2 -1
  409. package/transpiled/directives/vary/embeddings/Parameter.d.ts +7 -0
  410. package/transpiled/directives/vary/embeddings/Parameter.js +14 -0
  411. package/transpiled/directives/vary/embeddings/Parameter.js.map +1 -0
  412. package/transpiled/directives/vary/embeddings/index.d.ts +2 -2
  413. package/transpiled/directives/vary/embeddings/index.js +8 -4
  414. package/transpiled/directives/vary/embeddings/index.js.map +1 -1
  415. package/transpiled/exceptions.d.ts +3 -2
  416. package/transpiled/exceptions.js +10 -5
  417. package/transpiled/exceptions.js.map +1 -1
  418. package/transpiled/manifest.js +10 -11
  419. package/transpiled/manifest.js.map +1 -1
  420. package/transpiled/schemas.d.ts +1 -1
  421. package/transpiled/schemas.js +2 -2
  422. package/transpiled/schemas.js.map +1 -1
  423. package/transpiled/tsconfig.tsbuildinfo +1 -1
  424. package/tsconfig.json +9 -7
  425. package/components/identity.basic/operations/create.d.ts +0 -10
  426. package/components/identity.basic/operations/create.js +0 -10
  427. package/components/identity.basic/operations/create.js.map +0 -1
  428. package/components/identity.basic/source/create.ts +0 -18
  429. package/components/identity.federation/operations/create.d.ts +0 -10
  430. package/components/identity.federation/operations/create.js.map +0 -1
  431. package/components/identity.federation/operations/schemas.d.ts +0 -59
  432. package/components/identity.federation/operations/schemas.js +0 -9
  433. package/components/identity.federation/operations/schemas.js.map +0 -1
  434. package/components/identity.federation/operations/types.js.map +0 -1
  435. package/components/identity.federation/source/schemas.ts +0 -61
  436. package/components/octets.storage/operations/permute.js +0 -7
  437. package/schemas/octets/context.cos.yaml +0 -1
  438. package/source/HTTP/Server.test.ts +0 -126
  439. package/source/directives/octets/Permute.ts +0 -44
  440. package/transpiled/directives/octets/Permute.d.ts +0 -11
  441. package/transpiled/directives/octets/Permute.js +0 -58
  442. package/transpiled/directives/octets/Permute.js.map +0 -1
  443. /package/{components/identity.federation/operations → transpiled/directives/flow}/types.js +0 -0
@@ -7,11 +7,13 @@ Feature: Response
7
7
  io:output: true
8
8
  GET:
9
9
  anonymous: true
10
- dev:stub: hello
10
+ dev:stub:
11
+ hello: world
11
12
  """
12
13
  When the following request is received:
13
14
  """
14
15
  GET / HTTP/1.1
16
+ host: nex.toa.io
15
17
  accept: application/json
16
18
  """
17
19
  Then the following reply is sent:
@@ -19,6 +21,37 @@ Feature: Response
19
21
  200 OK
20
22
  content-type: application/json
21
23
  vary: accept
24
+
25
+ {"hello":"world"}
26
+ """
27
+ When the following request is received:
28
+ """
29
+ GET / HTTP/1.1
30
+ host: nex.toa.io
31
+ accept: application/yaml
32
+ """
33
+ Then the following reply is sent:
34
+ """
35
+ 200 OK
36
+ content-type: application/yaml
37
+ vary: accept
38
+
39
+ hello: world
40
+ """
41
+
42
+ # default is JSON
43
+ When the following request is received:
44
+ """
45
+ GET / HTTP/1.1
46
+ host: nex.toa.io
47
+ """
48
+ Then the following reply is sent:
49
+ """
50
+ 200 OK
51
+ content-type: application/json
52
+ vary: accept
53
+
54
+ {"hello":"world"}
22
55
  """
23
56
 
24
57
  Scenario: Error as YAML
@@ -32,11 +65,12 @@ Feature: Response
32
65
  When the following request is received:
33
66
  """
34
67
  GET /echo/ HTTP/1.1
68
+ host: nex.toa.io
35
69
  accept: application/yaml
36
70
  """
37
71
  Then the following reply is sent:
38
72
  """
39
- 409 Conflict
73
+ 422 Unprocessable Entity
40
74
  content-type: application/yaml
41
75
 
42
76
  code: CODE
@@ -54,11 +88,12 @@ Feature: Response
54
88
  When the following request is received:
55
89
  """
56
90
  GET /echo/ HTTP/1.1
91
+ host: nex.toa.io
57
92
  accept: application/msgpack
58
93
  """
59
94
  Then the following reply is sent:
60
95
  """
61
- 409 Conflict
96
+ 422 Unprocessable Entity
62
97
  content-type: application/msgpack
63
98
  """
64
99
  And response body contains MessagePack-encoded value:
@@ -18,6 +18,7 @@ Feature: Routes
18
18
  When the following request is received:
19
19
  """
20
20
  GET /basic/greeter<route> HTTP/1.1
21
+ host: nex.toa.io
21
22
  accept: text/plain
22
23
  """
23
24
  Then the following reply is sent:
@@ -42,6 +43,7 @@ Feature: Routes
42
43
  When the following request is received:
43
44
  """
44
45
  GET /greeter/ HTTP/1.1
46
+ host: nex.toa.io
45
47
  accept: text/plain
46
48
  """
47
49
  Then the following reply is sent:
@@ -65,6 +67,7 @@ Feature: Routes
65
67
  When the following request is received:
66
68
  """
67
69
  GET /greeter/baz/ HTTP/1.1
70
+ host: nex.toa.io
68
71
  accept: text/plain
69
72
  """
70
73
  Then the following reply is sent:
@@ -76,6 +79,7 @@ Feature: Routes
76
79
  When the following request is received:
77
80
  """
78
81
  GET /greeter/baz/qux/ HTTP/1.1
82
+ host: nex.toa.io
79
83
  """
80
84
  Then the following reply is sent:
81
85
  """
@@ -84,6 +88,7 @@ Feature: Routes
84
88
  When the following request is received:
85
89
  """
86
90
  GET /greeter/foo/baz/bar/ HTTP/1.1
91
+ host: nex.toa.io
87
92
  accept: text/plain
88
93
  """
89
94
  Then the following reply is sent:
@@ -94,8 +99,7 @@ Feature: Routes
94
99
  """
95
100
 
96
101
  Scenario: Routes with naming conflicts
97
- Given the Gateway is running
98
- And the `users` is running with the following manifest:
102
+ Given the `users` is running with the following manifest:
99
103
  """yaml
100
104
  exposition:
101
105
  /:
@@ -112,6 +116,7 @@ Feature: Routes
112
116
  When the following request is received:
113
117
  """
114
118
  GET /users/properties/b5534021e30042259badffbd1831e472/ HTTP/1.1
119
+ host: nex.toa.io
115
120
  accept: application/yaml
116
121
  """
117
122
  Then the following reply is sent:
@@ -123,6 +128,7 @@ Feature: Routes
123
128
  When the following request is received:
124
129
  """
125
130
  POST /users/ HTTP/1.1
131
+ host: nex.toa.io
126
132
  content-type: application/yaml
127
133
 
128
134
  name: Alice
@@ -131,3 +137,88 @@ Feature: Routes
131
137
  """
132
138
  201 Created
133
139
  """
140
+
141
+ Scenario: Routes with default namespace conflicts
142
+ Given the `echo` is running with the following manifest:
143
+ """yaml
144
+ exposition:
145
+ /:foo:
146
+ io:output: true
147
+ PUT: compute
148
+ """
149
+ And the `echo.beacon` is running with the following manifest:
150
+ """yaml
151
+ exposition:
152
+ /:
153
+ io:output: true
154
+ GET: hello
155
+ """
156
+ When the following request is received:
157
+ """
158
+ GET /echo/beacon/ HTTP/1.1
159
+ host: nex.toa.io
160
+ accept: application/yaml
161
+ """
162
+ Then the following reply is sent:
163
+ """
164
+ 200 OK
165
+ """
166
+
167
+ Scenario: Routes with parameters
168
+ Given the `echo` is running with the following manifest:
169
+ """yaml
170
+ exposition:
171
+ /:a/:b:
172
+ io:output: true
173
+ GET: parameters
174
+ """
175
+ When the following request is received:
176
+ """
177
+ GET /echo/foo/bar/ HTTP/1.1
178
+ host: nex.toa.io
179
+ accept: application/yaml
180
+ """
181
+ Then the following reply is sent:
182
+ """
183
+ 200 OK
184
+
185
+ a: foo
186
+ b: bar
187
+ """
188
+
189
+ Scenario: Route forwarding
190
+ Given the `echo` is running with the following manifest:
191
+ """yaml
192
+ exposition:
193
+ /show/:a/:b:
194
+ io:output: true
195
+ GET: parameters
196
+ /hello: /echo/show/foo/bar
197
+ /mirror/:a/:b: /echo/show/:a/:b
198
+ """
199
+ When the following request is received:
200
+ """
201
+ GET /echo/hello/ HTTP/1.1
202
+ host: nex.toa.io
203
+ accept: application/yaml
204
+ """
205
+ Then the following reply is sent:
206
+ """
207
+ 200 OK
208
+
209
+ a: foo
210
+ b: bar
211
+ """
212
+ When the following request is received:
213
+ """
214
+ GET /echo/mirror/bar/baz/ HTTP/1.1
215
+ host: nex.toa.io
216
+ accept: application/yaml
217
+ """
218
+ Then the following reply is sent:
219
+ """
220
+ 200 OK
221
+
222
+ a: bar
223
+ b: baz
224
+ """
@@ -1,5 +1,6 @@
1
1
  import { afterAll, beforeAll, binding, given } from 'cucumber-tsflow'
2
2
  import { MongoClient } from 'mongodb'
3
+ import type { Collection } from 'mongodb'
3
4
  import type { DataTable } from '@cucumber/cucumber'
4
5
 
5
6
  @binding()
@@ -8,9 +9,7 @@ export class Database {
8
9
 
9
10
  @given('the `{word}` database contains:')
10
11
  public async upsert (id: string, table: DataTable): Promise<void> {
11
- const [name, namespace = 'default'] = id.split('.').reverse()
12
- const collection = Database.client.db(namespace).collection(name)
13
-
12
+ const collection = this.collection(id)
14
13
  const columns = table.raw()[0]
15
14
  const rows = table.rows()
16
15
  const documents: Document[] = []
@@ -22,7 +21,11 @@ export class Database {
22
21
  const str = rows[r][c]
23
22
  const int = parseInt(str)
24
23
 
25
- document[columns[c]] = int.toString() === str ? int : str
24
+ document[columns[c]] = int.toString() === str
25
+ ? int
26
+ : str === 'null'
27
+ ? null
28
+ : str
26
29
  }
27
30
 
28
31
  documents.push(document)
@@ -36,10 +39,7 @@ export class Database {
36
39
 
37
40
  @given('the `{word}` database is empty')
38
41
  public async truncate (id: string): Promise<void> {
39
- const [name, namespace = 'default'] = id.split('.').reverse()
40
- const collection = Database.client.db(namespace).collection(name)
41
-
42
- await collection.deleteMany({})
42
+ await this.collection(id).deleteMany({})
43
43
  }
44
44
 
45
45
  @beforeAll()
@@ -53,6 +53,13 @@ export class Database {
53
53
  public static async disconnect (): Promise<void> {
54
54
  await this.client.close()
55
55
  }
56
+
57
+ private collection (id: string): Collection {
58
+ const [name, namespace = 'default'] = id.split('.').reverse()
59
+ const collection = `${namespace}_${name}`.toLowerCase()
60
+
61
+ return Database.client.db('toa-dev').collection(collection)
62
+ }
56
63
  }
57
64
 
58
- type Document = Record<string, string | number>
65
+ type Document = Record<string, string | number | null>
@@ -6,6 +6,7 @@ import { encode, timeout } from '@toa.io/generic'
6
6
  import { Factory } from '../../source'
7
7
  import * as syntax from '../../source/RTD/syntax'
8
8
  import { shortcuts } from '../../source/Directive'
9
+ import type * as http from '../../source/HTTP'
9
10
 
10
11
  let instance: Connector | null = null
11
12
 
@@ -23,11 +24,19 @@ export class Gateway {
23
24
  process.env.TOA_EXPOSITION = encode(tree)
24
25
  }
25
26
 
26
- if (annotation.debug === true)
27
- process.env.TOA_EXPOSITION_DEBUG = '1'
27
+ const { debug, trace, authorities } = annotation
28
+ const properties = Object.assign({}, DEFAULT_PROPERTIES)
28
29
 
29
- if (annotation.trace === true)
30
- process.env.TOA_EXPOSITION_TRACE = '1'
30
+ if (debug !== undefined)
31
+ properties.debug = debug
32
+
33
+ if (trace !== undefined)
34
+ properties.trace = trace
35
+
36
+ if (authorities !== undefined)
37
+ properties.authorities = authorities
38
+
39
+ process.env.TOA_EXPOSITION_PROPERTIES = encode(properties)
31
40
 
32
41
  await Gateway.stop()
33
42
 
@@ -54,7 +63,8 @@ export class Gateway {
54
63
  if (instance !== null)
55
64
  return
56
65
 
57
- process.env.TOA_EXPOSITION ??= DEFAULT_ANNOTATION
66
+ process.env.TOA_EXPOSITION ??= DEFAULT_TREE
67
+ process.env.TOA_EXPOSITION_PROPERTIES ??= encode(DEFAULT_PROPERTIES)
58
68
 
59
69
  this.writeConfiguration()
60
70
 
@@ -76,6 +86,7 @@ export class Gateway {
76
86
  return
77
87
 
78
88
  delete process.env.TOA_EXPOSITION
89
+ delete process.env.TOA_EXPOSITION_PROPERTIES
79
90
 
80
91
  await Gateway.stop()
81
92
  }
@@ -96,7 +107,7 @@ export class Gateway {
96
107
  }
97
108
  }
98
109
 
99
- const DEFAULT_ANNOTATION = encode({
110
+ const DEFAULT_TREE = encode({
100
111
  routes: [],
101
112
  methods: [],
102
113
  directives: [
@@ -108,6 +119,12 @@ const DEFAULT_ANNOTATION = encode({
108
119
  ]
109
120
  } satisfies syntax.Node)
110
121
 
122
+ const DEFAULT_PROPERTIES: Partial<http.Options> = {
123
+ authorities: {
124
+ nex: 'nex.toa.io'
125
+ }
126
+ }
127
+
111
128
  const DEFAULT_CONFIGURATION: Record<string, object> = {
112
129
  'identity.tokens': {
113
130
  key0: 'k3.local.pIZT8-9Fa6U_QtfQHOSStfGtmyzPINyKQq2Xk-hd7vA'
@@ -14,7 +14,8 @@ export class IdP {
14
14
  private static privateKey?: crypto.KeyObject
15
15
  private static issuer?: string
16
16
 
17
- public constructor (private readonly captures: Captures) {}
17
+ public constructor (private readonly captures: Captures) {
18
+ }
18
19
 
19
20
  @afterAll()
20
21
  public static async stop (): Promise<void> {
@@ -29,14 +30,21 @@ export class IdP {
29
30
  if (IdP.server instanceof http.Server) return
30
31
 
31
32
  // creating the key
32
- const { publicKey, privateKey } = await util.promisify(crypto.generateKeyPair)('rsa', {
33
+ const {
34
+ publicKey,
35
+ privateKey
36
+ } = await util.promisify(crypto.generateKeyPair)('rsa', {
33
37
  modulusLength: 2048
34
38
  })
35
39
 
36
40
  IdP.privateKey = privateKey
37
41
 
38
42
  const jwk = JSON.stringify({
39
- keys: [{ use: 'sig', alg: 'RS256', ...publicKey.export({ format: 'jwk' }) }]
43
+ keys: [{
44
+ use: 'sig',
45
+ alg: 'RS256',
46
+ ...publicKey.export({ format: 'jwk' })
47
+ }]
40
48
  })
41
49
 
42
50
  const JWK_URL = '/.well-known/jwks'
@@ -54,24 +62,23 @@ export class IdP {
54
62
  response.end(jwk)
55
63
  break
56
64
 
57
- case '/.well-known/openid-configuration':
58
- {
59
- const openIdConfiguration = JSON.stringify({
60
- issuer: IdP.issuer,
61
- jwks_uri: IdP.issuer + JWK_URL,
62
- response_types_supported: ['id_token'],
63
- subject_types_supported: ['public'],
64
- id_token_signing_alg_values_supported: ['RS256'],
65
- scopes_supported: ['openid']
66
- })
67
-
68
- response.writeHead(200, {
69
- 'Content-Type': 'application/json',
70
- 'Cache-Control': 'public, max-age=3600',
71
- 'Content-Length': openIdConfiguration.length
72
- })
73
- response.end(openIdConfiguration)
74
- }
65
+ case '/.well-known/openid-configuration': {
66
+ const openIdConfiguration = JSON.stringify({
67
+ issuer: IdP.issuer,
68
+ jwks_uri: IdP.issuer + JWK_URL,
69
+ response_types_supported: ['id_token'],
70
+ subject_types_supported: ['public'],
71
+ id_token_signing_alg_values_supported: ['RS256'],
72
+ scopes_supported: ['openid']
73
+ })
74
+
75
+ response.writeHead(200, {
76
+ 'Content-Type': 'application/json',
77
+ 'Cache-Control': 'public, max-age=3600',
78
+ 'Content-Length': openIdConfiguration.length
79
+ })
80
+ response.end(openIdConfiguration)
81
+ }
75
82
 
76
83
  break
77
84
 
@@ -102,7 +109,7 @@ export class IdP {
102
109
  },
103
110
  {
104
111
  iss: IdP.issuer,
105
- sub: `${user}-mock-id`,
112
+ sub: user,
106
113
  aud: 'test',
107
114
  iat: Math.floor(Date.now() / 1000),
108
115
  exp: Math.floor((Date.now() + 1000 * 60 * 5) / 1000)
@@ -120,8 +127,6 @@ export class IdP {
120
127
 
121
128
  @given('the IDP {word} token for {word} is issued with following secret:')
122
129
  public async issueSymmetricToken (alg: string, user: string, secret: string): Promise<void> {
123
- console.log('Sym token for %s with secret "%s"', user, secret)
124
-
125
130
  const jwt = [
126
131
  {
127
132
  typ: 'JWT',
@@ -129,7 +134,7 @@ export class IdP {
129
134
  },
130
135
  {
131
136
  iss: IdP.issuer,
132
- sub: `${user}-mock-id`,
137
+ sub: user,
133
138
  aud: 'test',
134
139
  iat: Math.floor(Date.now() / 1000),
135
140
  exp: Math.floor((Date.now() + 1000 * 60 * 5) / 1000)
@@ -1,5 +1,6 @@
1
1
  import { setDefaultTimeout } from '@cucumber/cucumber'
2
2
  import { encode } from '@toa.io/generic'
3
+ import { console } from 'openspan'
3
4
 
4
5
  export class Parameters {
5
6
  public readonly origin: string
@@ -11,11 +12,13 @@ export class Parameters {
11
12
 
12
13
  setDefaultTimeout(30 * 1000)
13
14
 
15
+ console.configure({ format: 'terminal' })
16
+
14
17
  process.env.TOA_DEV = '1'
15
18
 
16
19
  process.env.TOA_STORAGES = encode({
17
20
  octets: {
18
21
  provider: 'tmp',
19
- directory: 'exposition'
22
+ directory: Math.random().toString(36).substring(2)
20
23
  }
21
24
  })
@@ -0,0 +1,151 @@
1
+ import { EventEmitter, once } from 'node:events'
2
+ import * as assert from 'node:assert'
3
+ import { after, binding, given, afterAll, then } from 'cucumber-tsflow'
4
+ import { Factory } from '@toa.io/extensions.realtime'
5
+ import * as boot from '@toa.io/boot'
6
+ import { encode, match } from '@toa.io/generic'
7
+ import { parse } from '@toa.io/yaml'
8
+ import { Agent } from '@toa.io/agent'
9
+ import { Parameters } from './Parameters'
10
+ import { Gateway } from './Gateway'
11
+ import { Captures } from './Captures'
12
+ import type { Connector } from '@toa.io/core'
13
+
14
+ @binding([Gateway, Parameters, Captures])
15
+ export class Realtime {
16
+ private static instance: Connector | null = null
17
+ private readonly gateway: Gateway
18
+ private readonly agent: Agent
19
+ private readonly events = new EventEmitter()
20
+ private log: Record<string, unknown[]> = {}
21
+ private aborted = false
22
+
23
+ public constructor (gateway: Gateway, parameters: Parameters, captures: Captures) {
24
+ this.gateway = gateway
25
+ this.agent = new Agent(parameters.origin, captures)
26
+ }
27
+
28
+ @given('the Realtime is running with the following annotation:')
29
+ public async start (yaml: string): Promise<void> {
30
+ await Realtime.stop()
31
+
32
+ const annotation = parse(yaml)
33
+ const routes = []
34
+
35
+ for (const [event, property] of Object.entries(annotation))
36
+ routes.push({ event, properties: [property] })
37
+
38
+ process.env.TOA_REALTIME = encode(routes)
39
+
40
+ const factory = new Factory(boot)
41
+
42
+ Realtime.instance = factory.service()
43
+
44
+ void Realtime.instance.connect()
45
+ }
46
+
47
+ @given('the identity {word} is consuming realtime events')
48
+ public async connect (name: string): Promise<void> {
49
+ await this.gateway.start()
50
+
51
+ const id = await this.createIdentity(name)
52
+
53
+ const parts = await this.agent.parts(`
54
+ GET /realtime/streams/\${{ ${name}.id }}/ HTTP/1.1
55
+ authorization: Token \${{ ${name}.token }}
56
+ accept: application/json
57
+ `) as AsyncIterable<Uint8Array>
58
+
59
+ void this.consume(id, parts).catch((e) => {
60
+ if (!this.aborted)
61
+ console.debug('Consumption interrupted', e)
62
+ })
63
+ }
64
+
65
+ @then('the following event `{word}` is received by {word}:')
66
+ public async received (label: string, name: string, yaml: string): Promise<void> {
67
+ const id = this.agent.captures.get(`${name}.id`)
68
+ const tag = `${id}:${label}`
69
+ const expected = parse(yaml)
70
+
71
+ if (this.log[tag] !== undefined)
72
+ for (const data of this.log[tag])
73
+ // eslint-disable-next-line max-depth
74
+ if (match(data, expected))
75
+ return
76
+
77
+ const [event] = await once(this.events, tag)
78
+
79
+ assert.ok(match(event, expected), 'Event does not match')
80
+ }
81
+
82
+ @after()
83
+ public abort (): void {
84
+ this.aborted = true
85
+ this.agent.abort()
86
+ this.log = {}
87
+ this.events.removeAllListeners()
88
+ }
89
+
90
+ @afterAll()
91
+ public static async stop (): Promise<void> {
92
+ if (this.instance === null)
93
+ return
94
+
95
+ await this.instance.disconnect()
96
+
97
+ this.instance = null
98
+ process.env.TOA_REALTIME = undefined
99
+ }
100
+
101
+ private async createIdentity (name: string): Promise<string> {
102
+ const password = Math.random().toString(36).slice(2)
103
+ const username = name + Math.random().toString(36).slice(2)
104
+
105
+ await this.agent.request(`
106
+ POST /identity/basic/ HTTP/1.1
107
+ accept: application/yaml
108
+ content-type: application/yaml
109
+
110
+ username: ${username}
111
+ password: ${password}
112
+ `)
113
+
114
+ this.agent.responseIncludes(`
115
+ 201 Created
116
+ `)
117
+
118
+ const credentials = Buffer.from(`${username}:${password}`).toString('base64')
119
+
120
+ await this.agent.request(`
121
+ GET /identity/ HTTP/1.1
122
+ authorization: Basic ${credentials}
123
+ accept: application/yaml
124
+ `)
125
+
126
+ this.agent.responseIncludes(`
127
+ 200 OK
128
+ authorization: Token \${{ ${name}.token }}
129
+
130
+ id: \${{ ${name}.id }}
131
+ `)
132
+
133
+ return this.agent.captures.get(`${name}.id`)
134
+ }
135
+
136
+ private async consume (id: string, parts: any): Promise<void> {
137
+ for await (const part of parts) {
138
+ const text = Buffer.from(part.body).toString('utf8')
139
+ const event = JSON.parse(text)
140
+
141
+ if (typeof event === 'string')
142
+ continue
143
+
144
+ const tag = `${id}:${event.event}`
145
+
146
+ this.events.emit(tag, event.data)
147
+ this.log[tag] ??= []
148
+ this.log[tag].push(event.data)
149
+ }
150
+ }
151
+ }
@@ -1,5 +1,4 @@
1
1
  name: echo
2
- version: 0.0.0
3
2
 
4
3
  operations:
5
4
  compute:
@@ -8,3 +7,17 @@ operations:
8
7
  affect:
9
8
  input:
10
9
  name*: string
10
+ identity:
11
+ input:
12
+ identity:
13
+ id: string
14
+ roles: [string]
15
+ parameters:
16
+ input: &parameters
17
+ type: object
18
+ properties:
19
+ a:
20
+ type: string
21
+ b:
22
+ type: string
23
+ output: *parameters
@@ -0,0 +1,7 @@
1
+ 'use strict'
2
+
3
+ function computation (input) {
4
+ return input
5
+ }
6
+
7
+ exports.computation = computation
@@ -0,0 +1,7 @@
1
+ 'use strict'
2
+
3
+ function computation (input) {
4
+ return input
5
+ }
6
+
7
+ exports.computation = computation
@@ -0,0 +1,2 @@
1
+ namespace: echo
2
+ name: beacon
@@ -0,0 +1,5 @@
1
+ 'use strict'
2
+
3
+ exports.computation = () => {
4
+ return 'Hello!'
5
+ }