@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
package/source/Tenant.ts DELETED
@@ -1,73 +0,0 @@
1
- import { setTimeout } from 'node:timers/promises'
2
- import { Connector } from '@toa.io/core'
3
- import { BRANCH_TTL } from '@toa.io/definitions/extensions.exposition'
4
- import type { bindings } from '@toa.io/core/types'
5
- import type { Label } from './discovery.js'
6
- import type { Branch } from './Branch.js'
7
-
8
- export class Tenant extends Connector {
9
- private readonly broadcast: Broadcast
10
- private readonly branch: Omit<Branch, 'timestamp'>
11
- private started = 0
12
- private stopped = false
13
-
14
- public constructor(broadcast: Broadcast, branch: Omit<Branch, 'timestamp'>) {
15
- super()
16
-
17
- this.broadcast = broadcast
18
- this.branch = branch
19
-
20
- this.depends(broadcast)
21
- }
22
-
23
- public override async open(): Promise<void> {
24
- this.started = Date.now()
25
-
26
- await this.expose()
27
- await this.broadcast.receive('ping', this.expose.bind(this))
28
-
29
- void this.announce()
30
- }
31
-
32
- /**
33
- * Announcing is stopped where the teardown begins, not in `dispose`, which a connector
34
- * runs after every one of its dependencies has gone. A component on its way out that
35
- * announces itself once more has its routes held open by whoever is listening, and the
36
- * requests that follow reach nothing.
37
- */
38
- protected override async close(): Promise<void> {
39
- this.stopped = true
40
- }
41
-
42
- private async announce(): Promise<void> {
43
- while (!this.stopped) {
44
- const delay = exposeInterval(Date.now() - this.started)
45
-
46
- await setTimeout(delay, undefined, { ref: false })
47
-
48
- if (this.stopped) break
49
-
50
- await this.expose()
51
- }
52
- }
53
-
54
- private async expose(): Promise<void> {
55
- // the ping subscription outlives the announcing loop, and answering one on the way out
56
- // is the same announcement by another route
57
- if (this.stopped) return
58
-
59
- await this.broadcast.transmit('expose', { ...this.branch, timestamp: this.started })
60
- }
61
- }
62
-
63
- function exposeInterval(uptime: number): number {
64
- return Math.round(
65
- EXPOSE_MAX - (EXPOSE_MAX - EXPOSE_MIN) * Math.exp(-uptime / EXPOSE_TAU)
66
- )
67
- }
68
-
69
- const EXPOSE_MIN = 5_000
70
- const EXPOSE_MAX = Math.round(BRANCH_TTL / 2.1)
71
- const EXPOSE_TAU = 900_000
72
-
73
- type Broadcast = bindings.Broadcast<Label>
@@ -1,70 +0,0 @@
1
- import { describe, it } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import { Anonymous } from './Anonymous.js'
5
- import type { Context } from './types.js'
6
-
7
- const context = (
8
- headers: Record<string, string>,
9
- flags: { procedural?: boolean; exploratory?: boolean } = {}
10
- ): Context =>
11
- ({
12
- request: { headers },
13
- procedural: false,
14
- exploratory: false,
15
- ...flags
16
- }) as unknown as Context
17
-
18
- describe('anonymous', () => {
19
- it('should admit a request that presents nothing', () => {
20
- assert.equal(new Anonymous(true).authorize(null, context({})), true)
21
- })
22
-
23
- it('should refuse a request that presents a credential', () => {
24
- // it would make the reply uncacheable, which is the whole of the rule
25
- assert.equal(
26
- new Anonymous(true).authorize(null, context({ authorization: 'Token x' })),
27
- false
28
- )
29
- })
30
-
31
- it('should admit a procedure whatever the request presented', () => {
32
- // what a procedure answers is a value in an envelope, and the envelope is `no-store`
33
- const procedural = context({ authorization: 'Token x' }, { procedural: true })
34
-
35
- assert.equal(new Anonymous(true).authorize(null, procedural), true)
36
- })
37
-
38
- it('should admit a description whatever the request presented', () => {
39
- // a description is not the reply a cache would hold, and varies by who asked in any case
40
- const exploratory = context({ authorization: 'Token x' }, { exploratory: true })
41
-
42
- assert.equal(new Anonymous(true).authorize(null, exploratory), true)
43
- })
44
-
45
- it('should refuse where it admits nobody', () => {
46
- assert.equal(new Anonymous(false).authorize(null, context({})), false)
47
- assert.equal(
48
- new Anonymous(false).authorize(null, context({}, { procedural: true })),
49
- false
50
- )
51
- assert.equal(
52
- new Anonymous(false).authorize(null, context({}, { exploratory: true })),
53
- false
54
- )
55
- })
56
-
57
- it('should describe a method as it authorizes one', () => {
58
- const directive = new Anonymous(true)
59
-
60
- assert.equal(directive.admits(null, context({ authorization: 'Token x' })), false)
61
- assert.equal(
62
- directive.admits(null, context({ authorization: 'Token x' }, { procedural: true })),
63
- true
64
- )
65
- assert.equal(
66
- directive.admits(null, context({ authorization: 'Token x' }, { exploratory: true })),
67
- true
68
- )
69
- })
70
- })
@@ -1,36 +0,0 @@
1
- import { type Directive, type Context } from './types.js'
2
- import type { Introspection } from '../../Introspection.js'
3
-
4
- export class Anonymous implements Directive {
5
- private readonly allow: boolean
6
-
7
- public constructor(allow: boolean) {
8
- this.allow = allow
9
- }
10
-
11
- /**
12
- * A credential refuses, because it would make the reply uncacheable — which is the whole
13
- * of the rule, and none of it applies to a procedure, nor to a description. What a
14
- * procedure answers is a value in an envelope, and the envelope is the one thing that is
15
- * cached or not; what a description answers is what the resource is, which is not the
16
- * reply a cache would hold and varies by who asked in any case.
17
- */
18
- public authorize(_: any, context: Context): boolean {
19
- if (context.procedural || context.exploratory) return this.allow
20
-
21
- return 'authorization' in context.request.headers ? false : this.allow
22
- }
23
-
24
- public admits(_: any, context: Context): boolean {
25
- return this.authorize(_, context)
26
- }
27
-
28
- /**
29
- * That nothing guards it is something said rather than something left unsaid: it is also
30
- * what refuses a caller presenting a credential, and a client with one has to know which
31
- * methods not to present it to.
32
- */
33
- public describe(introspection: Introspection): Introspection {
34
- return this.allow ? { ...introspection, anonymous: true } : introspection
35
- }
36
- }
@@ -1,23 +0,0 @@
1
- import { type Directive, type Context } from './types.js'
2
- import type { Introspection } from '../../Introspection.js'
3
-
4
- export class Anyone implements Directive {
5
- private readonly allow: boolean
6
-
7
- public constructor(allow: boolean) {
8
- this.allow = allow
9
- }
10
-
11
- public authorize(_: any, context: Context): boolean {
12
- return context.identity !== null && this.allow
13
- }
14
-
15
- public admits(_: any, context: Context): boolean {
16
- return this.authorize(_, context)
17
- }
18
-
19
- /** Whoever asks, as long as they are somebody. */
20
- public describe(introspection: Introspection): Introspection {
21
- return this.allow ? { ...introspection, authenticated: true } : introspection
22
- }
23
- }
@@ -1,43 +0,0 @@
1
- import assert from 'node:assert'
2
- import { newid } from '@toa.io/generic'
3
- import * as http from '../../HTTP/index.js'
4
- import { Incept } from './Incept.js'
5
- import type { Context, Directive, Identity } from './types.js'
6
-
7
- export class Assert implements Directive {
8
- private readonly disabled: boolean
9
-
10
- public constructor(enabled: boolean) {
11
- assert.ok(
12
- typeof enabled === 'boolean',
13
- '`auth:assert` directive value must be a boolean'
14
- )
15
-
16
- this.disabled = !enabled
17
- }
18
-
19
- /** It admits nobody: it is there to require a credential, not to authorize one. */
20
- public admits(): boolean {
21
- return false
22
- }
23
-
24
- public async authorize(identity: Identity | null, context: Context): Promise<boolean> {
25
- if (!this.disabled) await this.incept(context, identity)
26
-
27
- return false
28
- }
29
-
30
- private async incept(context: Context, identity: Identity | null): Promise<void> {
31
- if (context.request.headers.authorization === undefined) throw new http.Unauthorized()
32
-
33
- if (identity === null) {
34
- if (!Incept.acceptable(context)) throw new http.Unauthorized()
35
-
36
- context.identity = await Incept.incept(context, newid())
37
-
38
- context.pipelines.response.push((response) => {
39
- response.status = 201
40
- })
41
- }
42
- }
43
- }
@@ -1,24 +0,0 @@
1
- import { it } from 'node:test'
2
- import assert from 'node:assert/strict'
3
-
4
- import { permits } from './Authorization.js'
5
-
6
- const permissions = { '/users/me/**': ['GET'], '/notes/': ['*'] }
7
-
8
- it('should permit a matching method and path', () => {
9
- assert.equal(permits(permissions, 'GET', '/users/me/posts/'), true)
10
- assert.equal(permits(permissions, 'DELETE', '/notes/'), true)
11
- })
12
-
13
- it('should refuse another method or path', () => {
14
- assert.equal(permits(permissions, 'POST', '/users/me/posts/'), false)
15
- assert.equal(permits(permissions, 'GET', '/admin/'), false)
16
- })
17
-
18
- it('should be matched on the routed path, not on the request URL', () => {
19
- const raw = '/users/me/%2e%2e/admin/'
20
- const routed = new URL(raw, 'https://example.com').pathname
21
-
22
- assert.equal(routed, '/users/admin/')
23
- assert.equal(permits(permissions, 'GET', routed), false)
24
- })
@@ -1,388 +0,0 @@
1
- import assert from 'node:assert'
2
- import { match } from 'matchacho'
3
- import { console } from 'openspan'
4
- import { Minimatch } from 'minimatch'
5
- import * as http from '../../HTTP/index.js'
6
- import { Anonymous } from './Anonymous.js'
7
- import { Id } from './Id.js'
8
- import { Role } from './Role.js'
9
- import { Rule } from './Rule.js'
10
- import { Incept } from './Incept.js'
11
- import { Assert } from './Assert.js'
12
- import { Echo } from './Echo.js'
13
- import { Scheme } from './Scheme.js'
14
- import { Delegate } from './Delegate.js'
15
- import { Federation } from './Federation.js'
16
- import { Anyone } from './Anyone.js'
17
- import { Input, type Declaration } from './Input.js'
18
- import { split } from './split.js'
19
- import { PRIMARY, UNRECOGNIZED, providers as providersOf } from './schemes.js'
20
- import { ATOM_GROUP } from '@toa.io/definitions/extensions.exposition'
21
- import { Quotas, Sync } from '../io/lib/throttle/index.js'
22
- import { Keys } from '../io/lib/throttle/Keys.js'
23
- import type { Output } from '../../io.js'
24
- import type { Introspection } from '../../Introspection.js'
25
- import type { Component } from '@toa.io/core'
26
- import type { Remotes } from '../../Remotes.js'
27
- import type { Parameter, DirectiveFamily } from '../../RTD/index.js'
28
- import type { Host } from '../../Factory.js'
29
- import type {
30
- AuthenticationResult,
31
- Ban,
32
- Directive,
33
- Discovery,
34
- Extension,
35
- Identity,
36
- Context,
37
- Remote,
38
- Components
39
- } from './types.js'
40
-
41
- export class Authorization implements DirectiveFamily<Directive, Extension> {
42
- public readonly depends: string[] = ['Vary']
43
- public readonly name: string = 'auth'
44
- public readonly mandatory: boolean = true
45
-
46
- private readonly components: Components = {}
47
- private readonly discovery = {} as unknown as Discovery
48
- private tokens: Component | null = null
49
- private bans: Component | null = null
50
-
51
- /** Failed authentications per address, reconciled with the other gateways. */
52
- private meter: Quotas | null = null
53
- private sync: Sync | null = null
54
-
55
- public mount(host: Host, options: http.Options): void {
56
- this.sync?.dispose()
57
- this.sync = null
58
- this.meter = null
59
-
60
- const bouncer = options.bouncer
61
-
62
- // keyed by address, which is the deployment's to name, so off until it is set
63
- if (bouncer === undefined) return
64
-
65
- this.meter = new Quotas({
66
- keys: Keys.create([{ method: 'ip', options: BOUNCER }]),
67
- requests: bouncer.attempts ?? ATTEMPTS,
68
- interval: (bouncer.interval ?? INTERVAL) * 1000,
69
- conditional: true, // charged on a rejection, not on a check
70
- name: METER
71
- })
72
-
73
- this.sync = new Sync(host.atom(ATOM_GROUP))
74
- this.sync.register(this.meter)
75
- }
76
-
77
- public dispose(): void {
78
- this.sync?.dispose()
79
- }
80
-
81
- public create(name: string, value: any, remotes: Remotes): Directive {
82
- assert.ok(name in constructors, `Directive 'auth:${name}' is not implemented`)
83
-
84
- const Class = constructors[name]
85
-
86
- for (const name of REMOTES)
87
- this.discovery[name] ??= remotes.discover('identity', name)
88
-
89
- return match(
90
- Class,
91
- Role,
92
- () => new Role(value as string | string[], this.discovery.roles),
93
- Rule,
94
- () => new Rule(value as Record<string, string>, this.create.bind(this)),
95
- Input,
96
- () => new Input(value as Declaration[], this.create.bind(this)),
97
- Incept,
98
- () => new Incept(value as string, this.discovery),
99
- Delegate,
100
- () => new Delegate(value as string, this.discovery.roles),
101
- () => new Class(value)
102
- )
103
- }
104
-
105
- public arrange(directives: Directive[]): void {
106
- directives.sort((a, b) => (a.priority ?? 1) - (b.priority ?? 1))
107
- }
108
-
109
- /**
110
- * Authentication: who the credential names, if one is presented. A credential belongs to
111
- * the request, so it is read once however many calls the request carries.
112
- */
113
- public async preflight(context: Context): Promise<void> {
114
- context.identity = await this.resolve(context)
115
- }
116
-
117
- /** Authorization: whether that identity may make this call, which every call asks anew. */
118
- public async precall(
119
- directives: Directive[],
120
- context: Context,
121
- parameters: Parameter[]
122
- ): Promise<Output> {
123
- for (const directive of directives) {
124
- const allow = await directive.authorize(context.identity, context, parameters)
125
-
126
- if (allow)
127
- if (this.permitted(context)) return directive.reply?.(context) ?? null
128
- else throw new http.Forbidden()
129
- }
130
-
131
- if (context.identity === null) throw new http.Unauthorized()
132
- else throw new http.Forbidden()
133
- }
134
-
135
- /**
136
- * The same disjunction as `precall`, over what can be told without a request. A method no
137
- * directive admits, and none is undecided about, is not this caller's to be told about —
138
- * `null` takes it out of the answer.
139
- *
140
- * A permission is matched against a path, and a description is not a request to one, so
141
- * `permits` has no say here. The call it describes is still checked, which is where a
142
- * token's permissions belong.
143
- *
144
- * A method that is described is then described by each of them, which is a separate pass:
145
- * admission is a disjunction and stops at the first that admits, while what the directives
146
- * fill is not any one of them's to state alone.
147
- */
148
- public async explain(
149
- directives: Directive[],
150
- context: Context,
151
- introspection: Introspection
152
- ): Promise<Introspection | null> {
153
- let untold = false
154
- let admitted = false
155
-
156
- for (const directive of directives) {
157
- const admits = await directive.admits?.(context.identity, context)
158
-
159
- if (admits === undefined) {
160
- untold = true
161
-
162
- continue
163
- }
164
-
165
- if (admits) {
166
- admitted = true
167
-
168
- break
169
- }
170
- }
171
-
172
- if (!admitted && !untold) return null
173
-
174
- // whichever of them admitted, a property any of them fills from the identity is filled
175
- // from the identity: what a caller sent there would be overwritten or forged
176
- for (const directive of directives)
177
- introspection = directive.describe?.(introspection) ?? introspection
178
-
179
- return introspection
180
- }
181
-
182
- public async settle(
183
- directives: Directive[],
184
- context: Context,
185
- response: http.OutgoingMessage
186
- ): Promise<void> {
187
- await Promise.all(
188
- directives.map(async (directive) => directive.settle?.(context, response))
189
- )
190
- }
191
-
192
- /**
193
- * Re-issuing a credential, and refusing a ban, are the request's business: the header
194
- * carries one token however many calls were made, and a ban refuses all of them.
195
- */
196
- public async depart(context: Context, response: http.OutgoingMessage): Promise<void> {
197
- const identity = context.identity
198
-
199
- if (identity === null) return
200
-
201
- if (identity.provider === PRIMARY && !identity.refresh) return
202
-
203
- // resolving already asked, for any provider but the primary
204
- if (context.vetted !== true && (await this.banned(identity)))
205
- throw new http.Unauthorized()
206
-
207
- // a token carries the roles it was issued with, and the refresh is where they are read again;
208
- // any other scheme has just read them, unless a Role directive already did
209
- if (identity.provider === PRIMARY)
210
- identity.roles = await Role.get(identity, this.discovery.roles)
211
- else identity.roles ??= await Role.get(identity, this.discovery.roles)
212
- this.tokens ??= await this.discovery.tokens
213
-
214
- const token = await this.tokens.invoke<string>('encrypt', {
215
- input: { authority: context.authority, identity }
216
- })
217
-
218
- const authorization = `Token ${token}`
219
-
220
- response.headers ??= new Headers()
221
- response.headers.set('authorization', authorization)
222
- response.headers.set('cache-control', 'no-store')
223
- }
224
-
225
- private async resolve(context: Context): Promise<Identity | null> {
226
- const { authority } = context
227
- const { authorization } = context.request.headers
228
-
229
- if (authorization === undefined) return null
230
-
231
- const retry = this.meter?.check(context, NONE) ?? 0
232
-
233
- if (retry > 0) throw new http.TooManyRequests(retry)
234
-
235
- const [scheme, credentials] = split(authorization)
236
- const candidates = providersOf(scheme)
237
-
238
- if (candidates === undefined)
239
- throw new http.Unauthorized(`Unknown authentication scheme '${scheme}'`)
240
-
241
- let provider: Remote | null = null
242
- let result: AuthenticationResult | null = null
243
-
244
- // the first provider that does not decline has claimed the credentials, and answers
245
- // for them: a rejection from one that never recognized them is not the rejection
246
- for (const candidate of candidates) {
247
- this.components[candidate] ??= await this.discovery[candidate]
248
-
249
- const answer = await this.components[candidate]!.invoke<AuthenticationResult>(
250
- 'authenticate',
251
- {
252
- input: {
253
- scheme,
254
- authority,
255
- credentials
256
- }
257
- }
258
- )
259
-
260
- if (declined(answer)) continue
261
-
262
- provider = candidate
263
- result = answer
264
-
265
- break
266
- }
267
-
268
- if (result === null || result instanceof Error) {
269
- const code = result === null ? UNRECOGNIZED : codeOf(result)
270
-
271
- if (code !== undefined) {
272
- console.info('Authentication failed', { code })
273
-
274
- context.rejection = code
275
- }
276
-
277
- this.meter?.use(context, null)
278
-
279
- return null
280
- }
281
-
282
- const identity = result.identity
283
-
284
- if (provider !== PRIMARY) {
285
- if (await this.banned(identity)) throw new http.Unauthorized()
286
-
287
- context.vetted = true
288
- }
289
-
290
- identity.scheme = scheme
291
- identity.provider = provider!
292
- identity.refresh = result.refresh
293
-
294
- return identity
295
- }
296
-
297
- private permitted(context: Context): boolean {
298
- const permissions = context.identity?.permissions
299
-
300
- if (permissions === undefined) return true
301
-
302
- // the route is matched on the normalized path, so the permission is too
303
- return permits(permissions, context.request.method, context.url.pathname)
304
- }
305
-
306
- private async banned(identity: Identity): Promise<boolean> {
307
- this.bans ??= await this.discovery.bans
308
-
309
- const ban = await this.bans.invoke<Ban>('observe', { query: { id: identity.id } })
310
-
311
- return ban.banned
312
- }
313
- }
314
-
315
- /** Whether a provider says the credentials are not of its kind, so the next is asked. */
316
- function declined(result: AuthenticationResult): boolean {
317
- return result instanceof Error && codeOf(result) === UNRECOGNIZED
318
- }
319
-
320
- function codeOf(result: Error): string | undefined {
321
- const code: string | unknown = (result as unknown as { code: string }).code
322
-
323
- return typeof code === 'string' ? code : undefined
324
- }
325
-
326
- /** Whether the permissions admit the method on the path the request is routed by. */
327
- export function permits(
328
- permissions: Record<string, string[]>,
329
- method: string,
330
- pathname: string
331
- ): boolean {
332
- return Object.entries(permissions).some(
333
- ([pattern, methods]) =>
334
- methods.some((allowed) => allowed === '*' || allowed === method) &&
335
- glob(pattern).match(pathname)
336
- )
337
- }
338
-
339
- /**
340
- * `minimatch(str, pattern)` compiles the pattern on every call, and a permission is
341
- * matched on every request the identity makes. Patterns arrive with an identity, hence
342
- * the bound.
343
- */
344
- function glob(pattern: string): Minimatch {
345
- let compiled = GLOBS.get(pattern)
346
-
347
- if (compiled === undefined) {
348
- if (GLOBS.size >= GLOBS_LIMIT) GLOBS.clear()
349
-
350
- compiled = new Minimatch(pattern)
351
-
352
- GLOBS.set(pattern, compiled)
353
- }
354
-
355
- return compiled
356
- }
357
-
358
- /** What an address may fail at once, and the seconds it takes to earn them back. */
359
- const ATTEMPTS = 20
360
- const INTERVAL = 60
361
-
362
- /** Who is speaking when a request cannot be keyed. */
363
- const BOUNCER = 'Authentication bouncer'
364
-
365
- /** The meter's name in the atom: `atom:exposition:meter:credentials:<address>`. */
366
- const METER = 'credentials'
367
-
368
- const NONE: Parameter[] = []
369
-
370
- const GLOBS = new Map<string, Minimatch>()
371
- const GLOBS_LIMIT = 1024
372
-
373
- const constructors: Record<string, new (value: any, argument?: any) => Directive> = {
374
- anonymous: Anonymous,
375
- anyone: Anyone,
376
- id: Id,
377
- role: Role,
378
- rule: Rule,
379
- incept: Incept,
380
- assert: Assert,
381
- scheme: Scheme,
382
- echo: Echo,
383
- delegate: Delegate,
384
- claims: Federation,
385
- input: Input
386
- }
387
-
388
- const REMOTES: Remote[] = ['basic', 'federation', 'tokens', 'roles', 'bans', 'otp']
@@ -1,36 +0,0 @@
1
- import assert from 'node:assert'
2
- import { describe, it } from 'node:test'
3
- import { Delegate } from './Delegate.js'
4
- import type { Introspection } from '../../Introspection.js'
5
-
6
- describe('auth:delegate', () => {
7
- function explanation(): Introspection {
8
- return {
9
- input: {
10
- type: 'object',
11
- properties: {
12
- identity: { type: 'object' },
13
- title: { type: 'string' }
14
- },
15
- required: ['identity', 'title']
16
- }
17
- } as unknown as Introspection
18
- }
19
-
20
- it('should take the property it embeds out of the input', () => {
21
- const delegate = new Delegate('identity', null as never)
22
- const described = delegate.describe(explanation())
23
- const input = described.input as { properties: object; required: string[] }
24
-
25
- assert.deepStrictEqual(Object.keys(input.properties), ['title'])
26
- assert.deepStrictEqual(input.required, ['title'])
27
- })
28
-
29
- it('should leave an input that does not declare it alone', () => {
30
- const delegate = new Delegate('originator', null as never)
31
- const described = delegate.describe(explanation())
32
- const input = described.input as { properties: object }
33
-
34
- assert.deepStrictEqual(Object.keys(input.properties), ['identity', 'title'])
35
- })
36
- })