@toa.io/extensions.exposition 1.0.0-alpha.292 → 1.0.0-alpha.293

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/identity.basic/package.json +8 -0
  2. package/components/identity.federation/package.json +8 -0
  3. package/components/identity.passkeys/package.json +8 -0
  4. package/components/identity.tokens/package.json +10 -0
  5. package/package.json +24 -13
  6. package/transpiled/Endpoint.js +3 -0
  7. package/transpiled/Endpoint.js.map +1 -1
  8. package/transpiled/Introspection.d.ts +6 -0
  9. package/transpiled/Introspection.js +1 -0
  10. package/transpiled/Introspection.js.map +1 -1
  11. package/transpiled/MCP/schema.js +2 -2
  12. package/transpiled/Query.d.ts +2 -12
  13. package/transpiled/Query.js +2 -12
  14. package/transpiled/Query.js.map +1 -1
  15. package/transpiled/RTD/Endpoint.d.ts +2 -3
  16. package/ui/dist/_app/immutable/assets/0.Cu0AnR_8.css +2 -0
  17. package/ui/dist/_app/immutable/assets/2.BghF56l_.css +1 -0
  18. package/ui/dist/_app/immutable/assets/ui.C8aD6zzF.css +1 -0
  19. package/ui/dist/_app/immutable/chunks/B8GvXrmq.js +1 -0
  20. package/ui/dist/_app/immutable/chunks/BVDJTrf4.js +3 -0
  21. package/ui/dist/_app/immutable/chunks/D6q28_Ok.js +86 -0
  22. package/ui/dist/_app/immutable/chunks/{aLpTDmOc.js → DVlaUfVU.js} +1 -1
  23. package/ui/dist/_app/immutable/chunks/DpB73ZB6.js +6 -0
  24. package/ui/dist/_app/immutable/entry/app.CTava8yn.js +2 -0
  25. package/ui/dist/_app/immutable/entry/start.yWN0gSLA.js +1 -0
  26. package/ui/dist/_app/immutable/nodes/0.HKRDBYrC.js +1 -0
  27. package/ui/dist/_app/immutable/nodes/1.CLa0ydOi.js +1 -0
  28. package/ui/dist/_app/immutable/nodes/2.C9Kaym8C.js +8 -0
  29. package/ui/dist/_app/immutable/nodes/3.C1X4_rXZ.js +1 -0
  30. package/ui/dist/_app/immutable/nodes/4.DdzDIi9E.js +1 -0
  31. package/ui/dist/_app/immutable/nodes/5.DpbmCMdw.js +1 -0
  32. package/ui/dist/_app/version.json +1 -1
  33. package/ui/dist/index.html +12 -12
  34. package/CHANGELOG.md +0 -42
  35. package/components/identity.bans/tsconfig.tsbuildinfo +0 -1
  36. package/components/identity.basic/source/lib/credentials.test.ts +0 -18
  37. package/components/identity.basic/tsconfig.tsbuildinfo +0 -1
  38. package/components/identity.clients/source/lib/canonical.test.ts +0 -43
  39. package/components/identity.clients/source/lib/cimd.test.ts +0 -122
  40. package/components/identity.clients/source/lib/redirect.test.ts +0 -47
  41. package/components/identity.clients/tsconfig.tsbuildinfo +0 -1
  42. package/components/identity.credentials/source/list.test.ts +0 -70
  43. package/components/identity.credentials/tsconfig.tsbuildinfo +0 -1
  44. package/components/identity.federation/source/lib/discovery.test.ts +0 -60
  45. package/components/identity.federation/source/list.test.ts +0 -41
  46. package/components/identity.federation/tsconfig.tsbuildinfo +0 -1
  47. package/components/identity.grants/tsconfig.tsbuildinfo +0 -1
  48. package/components/identity.keys/tsconfig.tsbuildinfo +0 -1
  49. package/components/identity.otp/tsconfig.tsbuildinfo +0 -1
  50. package/components/identity.passkeys/source/errors.test.ts +0 -34
  51. package/components/identity.passkeys/source/webauthn.test.ts +0 -26
  52. package/components/identity.passkeys/tsconfig.tsbuildinfo +0 -1
  53. package/components/identity.roles/tsconfig.tsbuildinfo +0 -1
  54. package/components/identity.tokens/source/authenticate.test.ts +0 -112
  55. package/components/identity.tokens/source/decrypt.test.ts +0 -216
  56. package/components/identity.tokens/source/encrypt.test.ts +0 -150
  57. package/components/identity.tokens/source/issue.test.ts +0 -73
  58. package/components/identity.tokens/source/lib/form.test.ts +0 -25
  59. package/components/identity.tokens/source/lib/paseto.test.ts +0 -62
  60. package/components/identity.tokens/tsconfig.tsbuildinfo +0 -1
  61. package/context.toa.yaml +0 -31
  62. package/cucumber.mjs +0 -7
  63. package/documentation/.assets/ia3-dark.jpg +0 -0
  64. package/documentation/.assets/ia3-light.jpg +0 -0
  65. package/documentation/.assets/overview-dark.jpg +0 -0
  66. package/documentation/.assets/overview-light.jpg +0 -0
  67. package/documentation/.assets/role-scopes-dark.jpg +0 -0
  68. package/documentation/.assets/role-scopes-light.jpg +0 -0
  69. package/documentation/.assets/rtd-dark.jpg +0 -0
  70. package/documentation/.assets/rtd-light.jpg +0 -0
  71. package/documentation/access.md +0 -350
  72. package/documentation/authorities.md +0 -51
  73. package/documentation/cache.md +0 -72
  74. package/documentation/components.md +0 -472
  75. package/documentation/consent.md +0 -101
  76. package/documentation/credentials.md +0 -88
  77. package/documentation/dev.md +0 -30
  78. package/documentation/discovery.md +0 -81
  79. package/documentation/flow.md +0 -44
  80. package/documentation/help.md +0 -122
  81. package/documentation/identity.md +0 -304
  82. package/documentation/introspection.md +0 -123
  83. package/documentation/io.md +0 -167
  84. package/documentation/ip.md +0 -24
  85. package/documentation/map.md +0 -123
  86. package/documentation/mcp.md +0 -183
  87. package/documentation/notes/desync.jpg +0 -0
  88. package/documentation/notes/peers.md +0 -59
  89. package/documentation/notes/sse.md +0 -71
  90. package/documentation/notes/throttling.md +0 -122
  91. package/documentation/oauth.md +0 -180
  92. package/documentation/octets.md +0 -334
  93. package/documentation/passkeys.md +0 -11
  94. package/documentation/protocol.md +0 -120
  95. package/documentation/query.md +0 -324
  96. package/documentation/require.md +0 -15
  97. package/documentation/rpc.md +0 -154
  98. package/documentation/tracing.md +0 -70
  99. package/documentation/tree.md +0 -199
  100. package/features/access.feature +0 -596
  101. package/features/annotation.feature +0 -32
  102. package/features/auth.assert.feature +0 -55
  103. package/features/auth.bearer.feature +0 -120
  104. package/features/auth.claims.feature +0 -171
  105. package/features/auth.incept.feature +0 -166
  106. package/features/auth.input.feature +0 -59
  107. package/features/authorities.basic.feature +0 -141
  108. package/features/authorities.feature +0 -71
  109. package/features/authorities.federation.feature +0 -100
  110. package/features/authorities.tokens.feature +0 -117
  111. package/features/body.feature +0 -76
  112. package/features/cache.feature +0 -368
  113. package/features/configuration.feature +0 -206
  114. package/features/cors.feature +0 -127
  115. package/features/credentials.feature +0 -106
  116. package/features/debug.feature +0 -34
  117. package/features/dev.feature +0 -90
  118. package/features/directives.feature +0 -61
  119. package/features/discovery.feature +0 -213
  120. package/features/discovery.ui.feature +0 -213
  121. package/features/dynamic.feature +0 -192
  122. package/features/errors.feature +0 -258
  123. package/features/etag.feature +0 -239
  124. package/features/flow.feature +0 -148
  125. package/features/help.feature +0 -512
  126. package/features/identity.bans.feature +0 -200
  127. package/features/identity.basic.feature +0 -666
  128. package/features/identity.feature +0 -240
  129. package/features/identity.federation.feature +0 -396
  130. package/features/identity.otp.feature +0 -142
  131. package/features/identity.roles.feature +0 -568
  132. package/features/identity.tokens.custom.feature +0 -430
  133. package/features/identity.tokens.feature +0 -131
  134. package/features/interruptions.feature +0 -20
  135. package/features/introspection.feature +0 -565
  136. package/features/introspection.map.feature +0 -108
  137. package/features/io.feature +0 -204
  138. package/features/io.throttle.feature +0 -166
  139. package/features/map.feature +0 -360
  140. package/features/mcp.feature +0 -753
  141. package/features/methods.feature +0 -48
  142. package/features/oauth.clients.feature +0 -195
  143. package/features/oauth.discovery.feature +0 -164
  144. package/features/oauth.grants.feature +0 -301
  145. package/features/octets.cloudinary.feature +0 -233
  146. package/features/octets.download.feature +0 -194
  147. package/features/octets.entries.feature +0 -83
  148. package/features/octets.feature +0 -306
  149. package/features/octets.head.feature +0 -40
  150. package/features/octets.location.feature +0 -83
  151. package/features/octets.meta.feature +0 -117
  152. package/features/octets.workflows.feature +0 -565
  153. package/features/passkeys.feature +0 -66
  154. package/features/probes.feature +0 -18
  155. package/features/query.feature +0 -389
  156. package/features/realtime.feature +0 -34
  157. package/features/require.feature +0 -66
  158. package/features/response.feature +0 -103
  159. package/features/routes.feature +0 -224
  160. package/features/rpc.feature +0 -429
  161. package/features/server.feature +0 -21
  162. package/features/site/_app/immutable/asset.js +0 -1
  163. package/features/site/favicon.ico +0 -0
  164. package/features/site/index.html +0 -10
  165. package/features/steps/.env.example +0 -5
  166. package/features/steps/Captures.ts +0 -20
  167. package/features/steps/Cloudinary.ts +0 -12
  168. package/features/steps/Common.ts +0 -38
  169. package/features/steps/Components.ts +0 -115
  170. package/features/steps/Database.ts +0 -106
  171. package/features/steps/Gateway.ts +0 -239
  172. package/features/steps/HTTP.ts +0 -96
  173. package/features/steps/IDP.ts +0 -361
  174. package/features/steps/Identity.ts +0 -54
  175. package/features/steps/OTP.ts +0 -42
  176. package/features/steps/Parameters.ts +0 -162
  177. package/features/steps/Probe.ts +0 -38
  178. package/features/steps/Realtime.ts +0 -175
  179. package/features/steps/Workspace.ts +0 -48
  180. package/features/steps/components/audit/manifest.toa.yaml +0 -20
  181. package/features/steps/components/audit/operations/record.js +0 -5
  182. package/features/steps/components/echo/manifest.toa.yaml +0 -59
  183. package/features/steps/components/echo/operations/affect.js +0 -3
  184. package/features/steps/components/echo/operations/compute.js +0 -3
  185. package/features/steps/components/echo/operations/echo.js +0 -3
  186. package/features/steps/components/echo/operations/error.js +0 -7
  187. package/features/steps/components/echo/operations/identity.js +0 -3
  188. package/features/steps/components/echo/operations/parameters.js +0 -3
  189. package/features/steps/components/echo/operations/ping.js +0 -3
  190. package/features/steps/components/echo/operations/unwrap.js +0 -3
  191. package/features/steps/components/echo.beacon/manifest.toa.yaml +0 -2
  192. package/features/steps/components/echo.beacon/operations/hello.js +0 -3
  193. package/features/steps/components/greeter/manifest.toa.yaml +0 -5
  194. package/features/steps/components/greeter/operations/greet.js +0 -3
  195. package/features/steps/components/notify/manifest.toa.yaml +0 -20
  196. package/features/steps/components/notify/operations/send.js +0 -5
  197. package/features/steps/components/octets.tester/manifest.toa.yaml +0 -73
  198. package/features/steps/components/octets.tester/operations/authority.js +0 -3
  199. package/features/steps/components/octets.tester/operations/bar.js +0 -9
  200. package/features/steps/components/octets.tester/operations/baz.js +0 -9
  201. package/features/steps/components/octets.tester/operations/concat.js +0 -5
  202. package/features/steps/components/octets.tester/operations/echo.js +0 -5
  203. package/features/steps/components/octets.tester/operations/err.js +0 -14
  204. package/features/steps/components/octets.tester/operations/foo.js +0 -5
  205. package/features/steps/components/octets.tester/operations/id.js +0 -5
  206. package/features/steps/components/octets.tester/operations/identity.js +0 -5
  207. package/features/steps/components/octets.tester/operations/lenna.png +0 -0
  208. package/features/steps/components/octets.tester/operations/redirect.js +0 -17
  209. package/features/steps/components/octets.tester/operations/yex.js +0 -14
  210. package/features/steps/components/octets.tester/operations/yield.js +0 -11
  211. package/features/steps/components/orders/manifest.toa.yaml +0 -30
  212. package/features/steps/components/orders/operations/create.js +0 -7
  213. package/features/steps/components/pots/manifest.toa.yaml +0 -91
  214. package/features/steps/components/pots/migrations/0002-indexes.yaml +0 -4
  215. package/features/steps/components/pricing/manifest.toa.yaml +0 -13
  216. package/features/steps/components/pricing/operations/quote.js +0 -3
  217. package/features/steps/components/sequences/manifest.toa.yaml +0 -11
  218. package/features/steps/components/sequences/operations/numbers.js +0 -5
  219. package/features/steps/components/sequences/operations/tokens.js +0 -14
  220. package/features/steps/components/users/manifest.toa.yaml +0 -30
  221. package/features/steps/components/users/operations/create.js +0 -11
  222. package/features/steps/components/users.properties/manifest.toa.yaml +0 -22
  223. package/features/steps/map.ts +0 -30
  224. package/features/steps/tsconfig.json +0 -9
  225. package/features/streams.feature +0 -35
  226. package/features/timestamps.feature +0 -41
  227. package/features/timing.feature +0 -49
  228. package/features/tracing.feature +0 -123
  229. package/source/Branch.test.ts +0 -40
  230. package/source/Branch.ts +0 -44
  231. package/source/Composition.ts +0 -51
  232. package/source/Context.ts +0 -11
  233. package/source/Directive.test.ts +0 -199
  234. package/source/Directive.ts +0 -248
  235. package/source/Discovery/Explorer.ts +0 -34
  236. package/source/Discovery/Site.test.ts +0 -147
  237. package/source/Discovery/Site.ts +0 -202
  238. package/source/Discovery/index.ts +0 -3
  239. package/source/Discovery/tree.test.ts +0 -175
  240. package/source/Discovery/tree.ts +0 -77
  241. package/source/Discovery/trunk.ts +0 -33
  242. package/source/Endpoint.test.ts +0 -67
  243. package/source/Endpoint.ts +0 -157
  244. package/source/Factory.ts +0 -42
  245. package/source/Gateway.ts +0 -390
  246. package/source/HTTP/Context.ts +0 -143
  247. package/source/HTTP/Probe.ts +0 -99
  248. package/source/HTTP/Server.ts +0 -435
  249. package/source/HTTP/Timing.ts +0 -14
  250. package/source/HTTP/address.test.ts +0 -28
  251. package/source/HTTP/address.ts +0 -16
  252. package/source/HTTP/exceptions.ts +0 -99
  253. package/source/HTTP/formats/form.ts +0 -21
  254. package/source/HTTP/formats/index.ts +0 -36
  255. package/source/HTTP/formats/json.ts +0 -14
  256. package/source/HTTP/formats/msgpack.ts +0 -14
  257. package/source/HTTP/formats/text.ts +0 -10
  258. package/source/HTTP/formats/yaml.test.ts +0 -22
  259. package/source/HTTP/formats/yaml.ts +0 -40
  260. package/source/HTTP/index.ts +0 -6
  261. package/source/HTTP/messages.test.ts +0 -196
  262. package/source/HTTP/messages.ts +0 -186
  263. package/source/HTTP/types.ts +0 -39
  264. package/source/Interception.ts +0 -37
  265. package/source/Introspection.ts +0 -179
  266. package/source/MCP/Server.ts +0 -335
  267. package/source/MCP/discover.ts +0 -51
  268. package/source/MCP/errors.ts +0 -80
  269. package/source/MCP/index.ts +0 -1
  270. package/source/MCP/schema.test.ts +0 -91
  271. package/source/MCP/schema.ts +0 -94
  272. package/source/MCP/tools.ts +0 -144
  273. package/source/MCP/types.ts +0 -84
  274. package/source/Mapping.ts +0 -101
  275. package/source/Query.test.ts +0 -54
  276. package/source/Query.ts +0 -277
  277. package/source/RPC/Context.ts +0 -75
  278. package/source/RPC/Dispatcher.ts +0 -150
  279. package/source/RPC/errors.test.ts +0 -77
  280. package/source/RPC/errors.ts +0 -82
  281. package/source/RPC/index.ts +0 -1
  282. package/source/RPC/names.test.ts +0 -141
  283. package/source/RPC/names.ts +0 -176
  284. package/source/RPC/types.ts +0 -34
  285. package/source/RTD/Context.ts +0 -16
  286. package/source/RTD/Directives.ts +0 -126
  287. package/source/RTD/Endpoint.ts +0 -27
  288. package/source/RTD/Match.ts +0 -11
  289. package/source/RTD/Method.ts +0 -39
  290. package/source/RTD/Node.ts +0 -169
  291. package/source/RTD/Route.ts +0 -93
  292. package/source/RTD/Tree.ts +0 -137
  293. package/source/RTD/expiration.test.ts +0 -81
  294. package/source/RTD/factory.ts +0 -105
  295. package/source/RTD/index.ts +0 -8
  296. package/source/RTD/segment.test.ts +0 -35
  297. package/source/RTD/segment.ts +0 -51
  298. package/source/RTD/syntax/index.ts +0 -1
  299. package/source/RTD/walk.test.ts +0 -147
  300. package/source/Remotes.test.ts +0 -79
  301. package/source/Remotes.ts +0 -39
  302. package/source/Tenant.ts +0 -73
  303. package/source/directives/auth/Anonymous.test.ts +0 -70
  304. package/source/directives/auth/Anonymous.ts +0 -36
  305. package/source/directives/auth/Anyone.ts +0 -23
  306. package/source/directives/auth/Assert.ts +0 -43
  307. package/source/directives/auth/Authorization.test.ts +0 -24
  308. package/source/directives/auth/Authorization.ts +0 -388
  309. package/source/directives/auth/Delegate.test.ts +0 -36
  310. package/source/directives/auth/Delegate.ts +0 -54
  311. package/source/directives/auth/Echo.ts +0 -24
  312. package/source/directives/auth/Federation.ts +0 -104
  313. package/source/directives/auth/Id.ts +0 -37
  314. package/source/directives/auth/Incept.ts +0 -117
  315. package/source/directives/auth/Input.ts +0 -92
  316. package/source/directives/auth/Role.test.ts +0 -147
  317. package/source/directives/auth/Role.ts +0 -99
  318. package/source/directives/auth/Rule.ts +0 -59
  319. package/source/directives/auth/Scheme.ts +0 -31
  320. package/source/directives/auth/create.ts +0 -11
  321. package/source/directives/auth/index.ts +0 -3
  322. package/source/directives/auth/schemes.test.ts +0 -18
  323. package/source/directives/auth/schemes.ts +0 -39
  324. package/source/directives/auth/split.ts +0 -14
  325. package/source/directives/auth/types.ts +0 -75
  326. package/source/directives/cache/Cache.ts +0 -92
  327. package/source/directives/cache/Control.ts +0 -81
  328. package/source/directives/cache/Exact.ts +0 -7
  329. package/source/directives/cache/etag.ts +0 -38
  330. package/source/directives/cache/index.ts +0 -3
  331. package/source/directives/cache/types.ts +0 -9
  332. package/source/directives/cors/CORS.test.ts +0 -75
  333. package/source/directives/cors/CORS.ts +0 -88
  334. package/source/directives/cors/index.ts +0 -3
  335. package/source/directives/dev/Development.ts +0 -41
  336. package/source/directives/dev/Faulty.ts +0 -31
  337. package/source/directives/dev/Sleep.ts +0 -53
  338. package/source/directives/dev/Stub.ts +0 -14
  339. package/source/directives/dev/Throw.ts +0 -14
  340. package/source/directives/dev/index.ts +0 -3
  341. package/source/directives/dev/types.ts +0 -5
  342. package/source/directives/flow/Compose.ts +0 -98
  343. package/source/directives/flow/Fetch.ts +0 -86
  344. package/source/directives/flow/Flow.ts +0 -43
  345. package/source/directives/flow/index.ts +0 -3
  346. package/source/directives/flow/types.ts +0 -7
  347. package/source/directives/help/Family.ts +0 -122
  348. package/source/directives/help/Help.test.ts +0 -227
  349. package/source/directives/help/Help.ts +0 -47
  350. package/source/directives/help/Parameters.ts +0 -47
  351. package/source/directives/help/described.ts +0 -57
  352. package/source/directives/help/index.ts +0 -45
  353. package/source/directives/index.ts +0 -33
  354. package/source/directives/io/Directive.ts +0 -17
  355. package/source/directives/io/IO.ts +0 -118
  356. package/source/directives/io/Input.ts +0 -55
  357. package/source/directives/io/Message.ts +0 -1
  358. package/source/directives/io/Output.ts +0 -81
  359. package/source/directives/io/Status.test.ts +0 -88
  360. package/source/directives/io/Status.ts +0 -47
  361. package/source/directives/io/Throttle.ts +0 -30
  362. package/source/directives/io/index.ts +0 -3
  363. package/source/directives/io/lib/throttle/Configuration.test.ts +0 -72
  364. package/source/directives/io/lib/throttle/Configuration.ts +0 -68
  365. package/source/directives/io/lib/throttle/Keys.ts +0 -53
  366. package/source/directives/io/lib/throttle/Quotas.test.ts +0 -411
  367. package/source/directives/io/lib/throttle/Quotas.ts +0 -190
  368. package/source/directives/io/lib/throttle/Sync.test.ts +0 -163
  369. package/source/directives/io/lib/throttle/Sync.ts +0 -93
  370. package/source/directives/io/lib/throttle/Warning.test.ts +0 -32
  371. package/source/directives/io/lib/throttle/Warning.ts +0 -29
  372. package/source/directives/io/lib/throttle/components/Component.ts +0 -7
  373. package/source/directives/io/lib/throttle/components/IP.ts +0 -30
  374. package/source/directives/io/lib/throttle/components/Identity.ts +0 -19
  375. package/source/directives/io/lib/throttle/components/Path.ts +0 -8
  376. package/source/directives/io/lib/throttle/components/Route.ts +0 -19
  377. package/source/directives/io/lib/throttle/components/Segment.ts +0 -19
  378. package/source/directives/io/lib/throttle/components/index.ts +0 -19
  379. package/source/directives/io/lib/throttle/conditions/Condition.ts +0 -5
  380. package/source/directives/io/lib/throttle/conditions/Status.ts +0 -17
  381. package/source/directives/io/lib/throttle/conditions/index.ts +0 -11
  382. package/source/directives/io/lib/throttle/index.ts +0 -4
  383. package/source/directives/io/schemas.test.ts +0 -40
  384. package/source/directives/io/schemas.ts +0 -16
  385. package/source/directives/map/Authority.ts +0 -15
  386. package/source/directives/map/Buffer.ts +0 -15
  387. package/source/directives/map/Claims.ts +0 -63
  388. package/source/directives/map/Directive.ts +0 -4
  389. package/source/directives/map/Headers.ts +0 -60
  390. package/source/directives/map/Language.ts +0 -45
  391. package/source/directives/map/Languages.ts +0 -17
  392. package/source/directives/map/Map.ts +0 -85
  393. package/source/directives/map/Mapping.ts +0 -45
  394. package/source/directives/map/Properties.ts +0 -15
  395. package/source/directives/map/Segments.ts +0 -52
  396. package/source/directives/map/index.ts +0 -3
  397. package/source/directives/mcp/MCP.ts +0 -33
  398. package/source/directives/mcp/Tool.test.ts +0 -56
  399. package/source/directives/mcp/Tool.ts +0 -32
  400. package/source/directives/mcp/index.ts +0 -6
  401. package/source/directives/oauth/Discovery.ts +0 -66
  402. package/source/directives/oauth/documents.ts +0 -110
  403. package/source/directives/oauth/index.ts +0 -3
  404. package/source/directives/octets/Context.ts +0 -23
  405. package/source/directives/octets/Delete.ts +0 -96
  406. package/source/directives/octets/Directive.ts +0 -21
  407. package/source/directives/octets/Get.ts +0 -88
  408. package/source/directives/octets/Octets.ts +0 -82
  409. package/source/directives/octets/Put.ts +0 -186
  410. package/source/directives/octets/Workflow.ts +0 -60
  411. package/source/directives/octets/bytes.test.ts +0 -33
  412. package/source/directives/octets/bytes.ts +0 -18
  413. package/source/directives/octets/index.ts +0 -3
  414. package/source/directives/octets/schemas.test.ts +0 -20
  415. package/source/directives/octets/schemas.ts +0 -15
  416. package/source/directives/octets/types.ts +0 -9
  417. package/source/directives/octets/workflows/Execution.ts +0 -130
  418. package/source/directives/octets/workflows/Workflow.ts +0 -51
  419. package/source/directives/octets/workflows/index.ts +0 -1
  420. package/source/directives/require/Directive.ts +0 -5
  421. package/source/directives/require/Headers.ts +0 -19
  422. package/source/directives/require/Require.ts +0 -27
  423. package/source/directives/require/index.ts +0 -3
  424. package/source/discovery.ts +0 -1
  425. package/source/exceptions.ts +0 -47
  426. package/source/index.ts +0 -10
  427. package/source/io.ts +0 -4
  428. package/source/octets.d.ts +0 -17
  429. package/source/root.ts +0 -59
  430. package/source/service.ts +0 -95
  431. package/source/userland.ts +0 -47
  432. package/tsconfig.json +0 -13
  433. package/tsconfig.tsbuildinfo +0 -1
  434. package/ui/dist/_app/immutable/assets/0.Bl7vLmIK.css +0 -2
  435. package/ui/dist/_app/immutable/assets/2.BC0-Jhqu.css +0 -1
  436. package/ui/dist/_app/immutable/chunks/BaWe3aOV.js +0 -1
  437. package/ui/dist/_app/immutable/chunks/DjIYL2zC.js +0 -3
  438. package/ui/dist/_app/immutable/chunks/GZTfV0ks.js +0 -6
  439. package/ui/dist/_app/immutable/entry/app.D5v4JoUx.js +0 -2
  440. package/ui/dist/_app/immutable/entry/start.CWxFoIyZ.js +0 -1
  441. package/ui/dist/_app/immutable/nodes/0.DIh5T_5-.js +0 -1
  442. package/ui/dist/_app/immutable/nodes/1.CY-bFzHC.js +0 -1
  443. package/ui/dist/_app/immutable/nodes/2.6Ubd1ItY.js +0 -14
@@ -1,361 +0,0 @@
1
- import { once } from 'node:events'
2
- import * as crypto from 'node:crypto'
3
- import * as http from 'node:http'
4
- import * as assert from 'node:assert'
5
- import * as util from 'node:util'
6
- import { buffer } from 'node:stream/consumers'
7
- import tsflow from 'cucumber-tsflow'
8
-
9
- import { Captures } from './Captures.js'
10
-
11
- import type { AddressInfo } from 'node:net'
12
-
13
- const { binding, given, afterAll } = tsflow
14
-
15
- @binding([Captures])
16
- export class IDP {
17
- private static server?: http.Server
18
- private static privateKey?: crypto.KeyObject
19
- private static issuer?: string
20
- private static authCodes = new Map<string, AuthCode>()
21
- private readonly captures: Captures
22
-
23
- public constructor(captures: Captures) {
24
- this.captures = captures
25
- }
26
-
27
- @afterAll()
28
- public static async stop(): Promise<void> {
29
- if (this.server instanceof http.Server) {
30
- this.server.close()
31
- await once(this.server, 'close')
32
- }
33
- }
34
-
35
- @given(/local IDP is running/i)
36
- public async start(): Promise<void> {
37
- if (IDP.server instanceof http.Server) return
38
-
39
- // creating the key
40
- const { publicKey, privateKey } = await util.promisify(crypto.generateKeyPair)(
41
- 'rsa',
42
- {
43
- modulusLength: 2048
44
- }
45
- )
46
-
47
- IDP.privateKey = privateKey
48
-
49
- const jwk = JSON.stringify({
50
- keys: [
51
- {
52
- use: 'sig',
53
- alg: 'RS256',
54
- ...publicKey.export({ format: 'jwk' })
55
- }
56
- ]
57
- })
58
-
59
- const JWK_ENDPOINT = '/.well-known/jwks'
60
- const TOKEN_ENDPOINT = '/token'
61
- const AUTH_ENDPOINT = '/authorize'
62
-
63
- const server = http.createServer(async (request, response) => {
64
- switch (request.url) {
65
- case JWK_ENDPOINT:
66
- response.writeHead(200, {
67
- 'Content-Type': 'application/json',
68
- 'Content-Length': jwk.length,
69
- 'Cache-Control': 'no-cache, no-store, must-revalidate',
70
- Pragma: 'no-cache',
71
- Expires: '0'
72
- })
73
- response.end(jwk)
74
- break
75
-
76
- case '/.well-known/openid-configuration':
77
- {
78
- const openIdConfiguration = JSON.stringify({
79
- issuer: IDP.issuer,
80
- jwks_uri: IDP.issuer + JWK_ENDPOINT,
81
- authorization_endpoint: IDP.issuer + AUTH_ENDPOINT,
82
- token_endpoint: IDP.issuer + TOKEN_ENDPOINT,
83
- response_types_supported: ['id_token', 'code'],
84
- grant_types_supported: ['authorization_code'],
85
- subject_types_supported: ['public'],
86
- id_token_signing_alg_values_supported: ['RS256'],
87
- scopes_supported: ['openid', 'email', 'profile']
88
- })
89
-
90
- response.writeHead(200, {
91
- 'Content-Type': 'application/json',
92
- 'Cache-Control': 'public, max-age=3600',
93
- 'Content-Length': openIdConfiguration.length
94
- })
95
-
96
- response.end(openIdConfiguration)
97
- }
98
-
99
- break
100
-
101
- case TOKEN_ENDPOINT:
102
- {
103
- if (request.method !== 'POST') {
104
- response.writeHead(405, { 'Content-Type': 'text/plain' })
105
- response.end('Method not allowed')
106
-
107
- return
108
- }
109
-
110
- const buf = await buffer(request)
111
- const body = buf.toString('utf8')
112
-
113
- const params = new URLSearchParams(body)
114
- const grantType = params.get('grant_type')!
115
- const code = params.get('code')!
116
- const redirectUri = params.get('redirect_uri')!
117
- const clientId = params.get('client_id')!
118
-
119
- if (grantType !== 'authorization_code' || !code || !clientId) {
120
- response.writeHead(400, { 'Content-Type': 'application/json' })
121
- response.end(JSON.stringify({ error: 'invalid_request' }))
122
- }
123
-
124
- const codeData = IDP.authCodes.get(code)
125
-
126
- if (
127
- !codeData ||
128
- codeData.expiresAt < Date.now() ||
129
- codeData.clientId !== clientId ||
130
- (redirectUri && codeData.redirectUri !== redirectUri)
131
- ) {
132
- response.writeHead(400, { 'Content-Type': 'application/json' })
133
- response.end(JSON.stringify({ error: 'invalid_grant' }))
134
-
135
- return
136
- }
137
-
138
- const accessToken = crypto.randomBytes(32).toString('hex')
139
- const idToken = this.generateIdToken(codeData.sub, codeData.email, clientId)
140
-
141
- IDP.authCodes.delete(code)
142
-
143
- response.writeHead(200, { 'Content-Type': 'application/json' }).end(
144
- JSON.stringify({
145
- access_token: accessToken,
146
- token_type: 'Bearer',
147
- id_token: idToken,
148
- expires_in: 3600
149
- })
150
- )
151
- }
152
-
153
- break
154
-
155
- default:
156
- response.writeHead(404, 'Not found')
157
- response.end()
158
- }
159
- })
160
-
161
- // in Toa's own block, and out of the ephemeral range an arbitrary port would sit in
162
- server.listen(31005, 'localhost')
163
- await once(server, 'listening')
164
-
165
- const address = server.address() as AddressInfo
166
-
167
- console.log('IdP is listening on %s:%s', address.address, address.port)
168
- IDP.server = server
169
- IDP.issuer = `http://localhost:${address.port}`
170
- }
171
-
172
- @given('the IDP token for {word} is issued')
173
- public async issueToken(user: string): Promise<void> {
174
- assert.ok(IDP.privateKey, 'IdP private key is not available')
175
-
176
- const jwt = [
177
- {
178
- typ: 'JWT',
179
- alg: 'RS256'
180
- },
181
- {
182
- iss: IDP.issuer,
183
- sub: user,
184
- aud: 'test',
185
- email: user + '@test.local',
186
- iat: Math.floor(Date.now() / 1000),
187
- exp: Math.floor((Date.now() + 1000 * 60 * 5) / 1000)
188
- }
189
- ]
190
- .map((v) => Buffer.from(JSON.stringify(v)).toString('base64url'))
191
- .join('.')
192
-
193
- const signature = crypto
194
- .createSign('RSA-SHA256')
195
- .end(jwt)
196
- .sign(IDP.privateKey, 'base64url')
197
-
198
- const idToken = `${jwt}.${signature}`
199
-
200
- this.captures.set(`${user}.id_token`, idToken)
201
- }
202
-
203
- @given('the IDP random token is issued')
204
- public async issueNewToken(): Promise<void> {
205
- assert.ok(IDP.privateKey, 'IdP private key is not available')
206
-
207
- const sub = Math.random().toString(36).substring(7)
208
-
209
- const jwt = [
210
- {
211
- typ: 'JWT',
212
- alg: 'RS256'
213
- },
214
- {
215
- iss: IDP.issuer,
216
- sub,
217
- aud: 'test',
218
- email: sub + '@test.local',
219
- iat: Math.floor(Date.now() / 1000),
220
- exp: Math.floor((Date.now() + 1000 * 60 * 5) / 1000)
221
- }
222
- ]
223
- .map((v) => Buffer.from(JSON.stringify(v)).toString('base64url'))
224
- .join('.')
225
-
226
- const signature = crypto
227
- .createSign('RSA-SHA256')
228
- .end(jwt)
229
- .sign(IDP.privateKey, 'base64url')
230
-
231
- const idToken = `${jwt}.${signature}`
232
-
233
- this.captures.set('random.sub', sub)
234
- this.captures.set('random.email', sub + '@test.local')
235
- this.captures.set('random.id_token', idToken)
236
- }
237
-
238
- @given('the IDP {word} token for {word} is issued with following secret:')
239
- public async issueSymmetricToken(
240
- alg: string,
241
- user: string,
242
- secret: string
243
- ): Promise<void> {
244
- const jwt = [
245
- {
246
- typ: 'JWT',
247
- alg
248
- },
249
- {
250
- iss: IDP.issuer,
251
- sub: user,
252
- aud: 'test',
253
- iat: Math.floor(Date.now() / 1000),
254
- exp: Math.floor((Date.now() + 1000 * 60 * 5) / 1000)
255
- }
256
- ]
257
- .map((v) => Buffer.from(JSON.stringify(v)).toString('base64url'))
258
- .join('.')
259
-
260
- const signature = crypto
261
- .createHmac(alg.replace(/^HS(\d{3})$/, 'sha$1'), secret)
262
- .update(jwt)
263
- .digest('base64url')
264
-
265
- const idToken = `${jwt}.${signature}`
266
-
267
- this.captures.set(`${user}.id_token`, idToken)
268
- }
269
-
270
- @given('ID token with jti is issued for {word}')
271
- public async issueTokenWithJti(user: string): Promise<void> {
272
- assert.ok(IDP.privateKey, 'IdP private key is not available')
273
-
274
- const jwt = [
275
- {
276
- typ: 'JWT',
277
- alg: 'RS256'
278
- },
279
- {
280
- iss: IDP.issuer,
281
- sub: user,
282
- aud: 'test',
283
- email: user + '@test.local',
284
- iat: Math.floor(Date.now() / 1000),
285
- exp: Math.floor((Date.now() + 1000 * 60 * 5) / 1000),
286
- jti: crypto.randomUUID()
287
- }
288
- ]
289
- .map((v) => Buffer.from(JSON.stringify(v)).toString('base64url'))
290
- .join('.')
291
-
292
- const signature = crypto
293
- .createSign('RSA-SHA256')
294
- .end(jwt)
295
- .sign(IDP.privateKey, 'base64url')
296
-
297
- const idToken = `${jwt}.${signature}`
298
-
299
- this.captures.set(`${user}.id_token`, idToken)
300
- }
301
-
302
- @given('auth code for {word} is issued for {word}')
303
- public async issueAuthCode(user: string, redirectUri: string): Promise<void> {
304
- const code = crypto.randomBytes(16).toString('hex')
305
- const email = user + '@test.local'
306
- const clientId = 'nex'
307
-
308
- IDP.authCodes.set(code, {
309
- code,
310
- sub: user,
311
- email,
312
- clientId,
313
- redirectUri,
314
- expiresAt: Date.now() + 60 * 1000
315
- })
316
-
317
- const json = JSON.stringify({ code, iss: IDP.issuer, for: redirectUri })
318
- const base64 = Buffer.from(json).toString('base64')
319
-
320
- this.captures.set(`${user}.auth_code`, code)
321
- this.captures.set(`${user}.code_credentials`, base64)
322
- }
323
-
324
- private generateIdToken(sub: string, email: string, clientId: string): string {
325
- assert.ok(IDP.privateKey, 'IdP private key is not available')
326
- assert.ok(IDP.issuer, 'IdP issuer is not available')
327
-
328
- const jwt = [
329
- {
330
- typ: 'JWT',
331
- alg: 'RS256'
332
- },
333
- {
334
- iss: IDP.issuer,
335
- sub,
336
- aud: clientId,
337
- email,
338
- iat: Math.floor(Date.now() / 1000),
339
- exp: Math.floor((Date.now() + 1000 * 60 * 5) / 1000)
340
- }
341
- ]
342
- .map((v) => Buffer.from(JSON.stringify(v)).toString('base64url'))
343
- .join('.')
344
-
345
- const signature = crypto
346
- .createSign('RSA-SHA256')
347
- .end(jwt)
348
- .sign(IDP.privateKey, 'base64url')
349
-
350
- return `${jwt}.${signature}`
351
- }
352
- }
353
-
354
- interface AuthCode {
355
- code: string
356
- sub: string
357
- email: string
358
- clientId: string
359
- redirectUri: string
360
- expiresAt: number
361
- }
@@ -1,54 +0,0 @@
1
- import tsflow from 'cucumber-tsflow'
2
-
3
- import * as http from '@toa.io/agent'
4
- import { Parameters } from './Parameters.js'
5
- import { Captures } from './Captures.js'
6
- import { Gateway } from './Gateway.js'
7
-
8
- const { binding, given } = tsflow
9
-
10
- @binding([Gateway, Parameters, Captures])
11
- export class Identity {
12
- private readonly gateway: Gateway
13
- private readonly http: http.Agent
14
- private readonly variables: Captures
15
-
16
- public constructor(gateway: Gateway, parameters: Parameters, captures: Captures) {
17
- this.gateway = gateway
18
- this.http = new http.Agent(parameters.origin, captures)
19
- this.variables = captures
20
- }
21
-
22
- @given('transient identity {word}')
23
- public async transient(as: string): Promise<Principal> {
24
- await this.gateway.start()
25
-
26
- await this.http.request(`
27
- GET /identity/ HTTP/1.1
28
- host: nex.toa.io
29
- accept: application/yaml
30
- `)
31
-
32
- this.http.responseIncludes(`
33
- 201 Created
34
- authorization: Token \${{ ${as}.token }}
35
-
36
- id: \${{ ${as}.id }}
37
- `)
38
-
39
- const id = this.variables.get(as + '.id')!
40
- const token = this.variables.get(as + '.token')!
41
-
42
- return { id, token }
43
- }
44
-
45
- @given('transient identity')
46
- public async anonymous(): Promise<Principal> {
47
- return await this.transient('identity')
48
- }
49
- }
50
-
51
- export interface Principal {
52
- id: string
53
- token: string
54
- }
@@ -1,42 +0,0 @@
1
- import * as assert from 'node:assert'
2
- import tsflow from 'cucumber-tsflow'
3
-
4
- import * as boot from '@toa.io/boot'
5
- import { Locator, type Remote } from '@toa.io/core'
6
- import { Captures } from './Captures.js'
7
-
8
- const { binding, given } = tsflow
9
-
10
- @binding([Captures])
11
- export class OTP {
12
- private captures: Captures
13
- private otp: Remote | null = null
14
-
15
- public constructor(captures: Captures) {
16
- this.captures = captures
17
- }
18
-
19
- @given('OTP for `{word}` in `{word}` authority is issued')
20
- public async issue(username: string, authority: string): Promise<void> {
21
- this.otp ??= await this.connect()
22
-
23
- const reply = await this.otp.invoke('issue', {
24
- input: {
25
- username,
26
- authority
27
- }
28
- })
29
-
30
- assert.ok(typeof reply.code === 'string')
31
-
32
- const credentials = btoa(`${username}:${reply.code}`)
33
-
34
- this.captures.set(`${username}.otp`, credentials)
35
- }
36
-
37
- private async connect(): Promise<Remote> {
38
- const locator = new Locator('otp', 'identity')
39
-
40
- return await boot.remote(locator)
41
- }
42
- }
@@ -1,162 +0,0 @@
1
- import { join } from 'node:path'
2
- import * as dotenv from 'dotenv'
3
- import { setDefaultTimeout } from '@cucumber/cucumber'
4
- import { environment as variables } from '@toa.io/generic'
5
-
6
- dotenv.config({ path: join(import.meta.dirname, '.env') })
7
-
8
- /**
9
- * Not `PORT` and `PROBE`, which a deployment serves the gateway on: an application built on
10
- * Toa is served on this machine too, and its own gateway holds those. See CONTRIBUTING.md.
11
- */
12
- export const PORT = 31000
13
- export const PROBE = 31004
14
-
15
- export class Parameters {
16
- public readonly origin: string
17
-
18
- public constructor() {
19
- this.origin = `http://127.0.0.1:${PORT}`
20
- }
21
- }
22
-
23
- setDefaultTimeout(60 * 1000)
24
-
25
- variables.set('TOA_DEV', '1')
26
-
27
- // a reply is checked against what the operation declares, so the suite runs Toa under the
28
- // contract it asks applications to keep
29
- if (!variables.has('TOA_ENV')) variables.set('TOA_ENV', 'local')
30
-
31
- // the gateway answers for itself, as it does in a deployment: telemetry's probe tracks the
32
- // nested composition, which connects before route discovery settles
33
- if (!variables.has('TOA_TELEMETRY_READY'))
34
- variables.set('TOA_TELEMETRY_READY', JSON.stringify(false))
35
-
36
- // export traces to the local Tempo (`docker compose up tempo grafana`),
37
- // unavailability of the endpoint is harmless
38
- if (!variables.has('TOA_TELEMETRY_TRACES'))
39
- variables.set(
40
- 'TOA_TELEMETRY_TRACES',
41
- JSON.stringify({
42
- exporters: {
43
- console: null,
44
- otlp: { endpoint: 'http://localhost:31061' }
45
- }
46
- })
47
- )
48
-
49
- /*
50
- * The page the gateway serves at `/.discovery/`, pointed at a fixture: the scenarios are
51
- * about the server, not the page, and none of them should need a UI build. Set here rather
52
- * than in a step because the gateway is not rebuilt between scenarios that share its
53
- * signature, so one flipping this would silently read whatever the last one left.
54
- */
55
- process.env.__TESTING_EXPOSITION_DISCOVERY_ROOT = join(
56
- import.meta.dirname,
57
- '..',
58
- 'site'
59
- )
60
-
61
- const environment = process.env.CLOUDINARY_ENVIRONMENT
62
-
63
- /**
64
- * A storage is built when a component's context is — for every scenario, not only for the ones
65
- * that reach for it — and a Cloudinary storage asks for the keys of a real account. A checkout
66
- * carries none, so these two are declared only where `features/steps/.env` names an environment.
67
- */
68
- const CLOUDINARY = {
69
- cloudinary: {
70
- provider: 'cloudinary',
71
- environment,
72
- type: 'image',
73
- prefix: 'toa-dev',
74
- transformations: [
75
- {
76
- extension: 'icon',
77
- transformation: [
78
- {
79
- width: 48,
80
- height: 48,
81
- crop: 'fill'
82
- },
83
- {
84
- border: '10px_solid_white'
85
- }
86
- ],
87
- optional: true
88
- },
89
- {
90
- extension: '(?<width>\\d*)x(?<height>\\d*)(z(?<zoom>\\d*))?',
91
- transformation: {
92
- width: '<width>',
93
- height: '<height>',
94
- zoom: '<zoom>',
95
- crop: 'thumb',
96
- gravity: 'face'
97
- },
98
- optional: true
99
- },
100
- {
101
- extension: '\\[(?<width>\\d*)x(?<height>\\d*)\\](z(?<zoom>\\d+))?',
102
- transformation: {
103
- width: '<width>',
104
- height: '<height>',
105
- zoom: '<zoom>',
106
- crop: 'fit'
107
- },
108
- optional: true
109
- },
110
- {
111
- extension: '(?<format>jpeg|webp)',
112
- transformation: {
113
- fetch_format: '<format>'
114
- },
115
- optional: true
116
- }
117
- ]
118
- },
119
- cloudinary_video: {
120
- provider: 'cloudinary',
121
- environment,
122
- type: 'video',
123
- prefix: 'toa-dev',
124
- eager: [
125
- {
126
- width: 200,
127
- height: 200,
128
- crop: 'fill'
129
- }
130
- ],
131
- transformations: [
132
- {
133
- extension: '200x200',
134
- transformation: {
135
- width: 200,
136
- height: 200,
137
- crop: 'fill'
138
- },
139
- optional: true
140
- },
141
- {
142
- extension: '(?<format>mp4|gif)',
143
- transformation: {
144
- quality: 'auto',
145
- fetch_format: '<format>'
146
- },
147
- optional: true
148
- }
149
- ]
150
- }
151
- }
152
-
153
- variables.set(
154
- 'TOA_STORAGES',
155
- JSON.stringify({
156
- octets: {
157
- provider: 'tmp',
158
- directory: Math.random().toString(36).substring(2)
159
- },
160
- ...(environment === undefined ? {} : CLOUDINARY)
161
- })
162
- )
@@ -1,38 +0,0 @@
1
- import assert from 'node:assert'
2
- import { Agent, request } from 'undici'
3
- import tsflow from 'cucumber-tsflow'
4
- import { PATH } from '../../source/HTTP/index.js'
5
- import { PROBE } from './Parameters.js'
6
-
7
- const { after, binding, then, when } = tsflow
8
-
9
- @binding()
10
- export class Probe {
11
- private readonly agent = new Agent()
12
- private status: number | null = null
13
- private headers: Record<string, string> = {}
14
-
15
- @when('the ready probe is requested')
16
- public async request(): Promise<void> {
17
- const response = await request(`http://127.0.0.1:${PROBE}${PATH}`, {
18
- dispatcher: this.agent
19
- })
20
-
21
- this.status = response.statusCode
22
- this.headers = response.headers as Record<string, string>
23
-
24
- await response.body.dump()
25
- }
26
-
27
- @then('the ready probe answers {int}')
28
- public answers(status: number): void {
29
- assert.equal(this.status, status)
30
-
31
- if (status === 200) assert.equal(this.headers['cache-control'], 'no-store')
32
- }
33
-
34
- @after()
35
- public async close(): Promise<void> {
36
- await this.agent.close()
37
- }
38
- }