@toa.io/extensions.exposition 1.0.0-alpha.314 → 1.0.0-alpha.316

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 (52) hide show
  1. package/components/exposition.octets/package.json +2 -2
  2. package/components/exposition.octets/types/toa.d.ts +5 -5
  3. package/components/identity.bans/types/toa.d.ts +8 -8
  4. package/components/identity.basic/types/toa.d.ts +15 -15
  5. package/components/identity.clients/types/toa.d.ts +10 -10
  6. package/components/identity.credentials/types/toa.d.ts +1 -2
  7. package/components/identity.federation/types/toa.d.ts +14 -14
  8. package/components/identity.grants/types/toa.d.ts +12 -12
  9. package/components/identity.keys/types/toa.d.ts +10 -10
  10. package/components/identity.otp/types/toa.d.ts +9 -9
  11. package/components/identity.passkeys/types/toa.d.ts +13 -13
  12. package/components/identity.roles/types/toa.d.ts +10 -10
  13. package/components/identity.tokens/types/toa.d.ts +12 -12
  14. package/package.json +5 -5
  15. package/readme.md +1 -1
  16. package/transpiled/Branch.d.ts +2 -1
  17. package/transpiled/Branch.js +11 -2
  18. package/transpiled/Branch.js.map +1 -1
  19. package/transpiled/Discovery/Site.d.ts +4 -1
  20. package/transpiled/Discovery/Site.js +7 -1
  21. package/transpiled/Discovery/Site.js.map +1 -1
  22. package/transpiled/Gateway.js +6 -0
  23. package/transpiled/Gateway.js.map +1 -1
  24. package/transpiled/HTTP/Server.d.ts +1 -1
  25. package/transpiled/HTTP/Server.js +13 -1
  26. package/transpiled/HTTP/Server.js.map +1 -1
  27. package/transpiled/MCP/Server.d.ts +4 -0
  28. package/transpiled/MCP/Server.js +7 -0
  29. package/transpiled/MCP/Server.js.map +1 -1
  30. package/transpiled/directives/oauth/Discovery.d.ts +2 -0
  31. package/transpiled/directives/oauth/Discovery.js +19 -5
  32. package/transpiled/directives/oauth/Discovery.js.map +1 -1
  33. package/transpiled/directives/oauth/documents.d.ts +7 -0
  34. package/transpiled/directives/oauth/documents.js +24 -5
  35. package/transpiled/directives/oauth/documents.js.map +1 -1
  36. package/ui/dist/_app/immutable/chunks/{DnwsDdVR.js → 88hnU14r.js} +2 -2
  37. package/ui/dist/_app/immutable/chunks/{CubNYXGc.js → BBJZQEv9.js} +4 -2
  38. package/ui/dist/_app/immutable/chunks/{gT7UvzUs.js → OnTEdh-X.js} +1 -1
  39. package/ui/dist/_app/immutable/chunks/lNO1Siuz.js +1 -0
  40. package/ui/dist/_app/immutable/entry/{app.BuIzcMse.js → app.CNwB_Va3.js} +2 -2
  41. package/ui/dist/_app/immutable/entry/start.DXdlzrp8.js +1 -0
  42. package/ui/dist/_app/immutable/nodes/{0.CwHL4JQh.js → 0.DiwgiwZL.js} +1 -1
  43. package/ui/dist/_app/immutable/nodes/{1.DgOr0IJQ.js → 1.CqOttI_M.js} +1 -1
  44. package/ui/dist/_app/immutable/nodes/{2.1ODUSz5b.js → 2.CxWR-fCF.js} +1 -1
  45. package/ui/dist/_app/immutable/nodes/{3._pT85mpt.js → 3.C-sZLb6G.js} +1 -1
  46. package/ui/dist/_app/immutable/nodes/{4.DiXgB9MQ.js → 4.CF4sP9Jk.js} +1 -1
  47. package/ui/dist/_app/immutable/nodes/{5.D7U8VR0l.js → 5.o-tpvDQ9.js} +1 -1
  48. package/ui/dist/_app/immutable/nodes/{6.CiZdC04N.js → 6.DFXdtfh8.js} +1 -1
  49. package/ui/dist/_app/version.json +1 -1
  50. package/ui/dist/index.html +10 -10
  51. package/ui/dist/_app/immutable/chunks/3z-MngL5.js +0 -1
  52. package/ui/dist/_app/immutable/entry/start.Djj5Mm5B.js +0 -1
@@ -3,8 +3,8 @@
3
3
  "private": true,
4
4
  "type": "module",
5
5
  "dependencies": {
6
- "@aws-sdk/client-s3": "3.1133.0",
7
- "@aws-sdk/lib-storage": "3.1133.0",
6
+ "@aws-sdk/client-s3": "3.1135.0",
7
+ "@aws-sdk/lib-storage": "3.1135.0",
8
8
  "cloudinary": "2.11.0"
9
9
  }
10
10
  }
@@ -1,7 +1,7 @@
1
1
  // Written by `toa types`. Every run rewrites it.
2
2
  // What a manifest does not state belongs in a file of your own.
3
3
 
4
- import type { Options, RemoteError } from '@toa.io/core/types'
4
+ import type { RemoteError } from '@toa.io/core/types'
5
5
 
6
6
  export type PutInput = {
7
7
  location?: string
@@ -34,8 +34,8 @@ export type DeleteInput = {
34
34
  }
35
35
 
36
36
  export interface Component {
37
- put: (request: { input: PutInput, task?: boolean }, options?: Options) => Promise<unknown | RemoteError<"LOCATION_UNTRUSTED" | "LOCATION_LENGTH" | "LOCATION_UNAVAILABLE" | "INVALID_ID" | "NOT_FOUND" | "LIMIT_EXCEEDED" | "NOT_ACCEPTABLE" | "TYPE_MISMATCH">>
38
- get: (request: { input: GetInput, task?: boolean }, options?: Options) => Promise<unknown | RemoteError<"NOT_FOUND" | "LIMIT_EXCEEDED" | "NOT_ACCEPTABLE" | "TYPE_MISMATCH">>
39
- head: (request: { input: HeadInput, task?: boolean }, options?: Options) => Promise<unknown | RemoteError<"NOT_FOUND" | "LIMIT_EXCEEDED" | "NOT_ACCEPTABLE" | "TYPE_MISMATCH">>
40
- delete: (request: { input: DeleteInput, task?: boolean }, options?: Options) => Promise<unknown | RemoteError<"NOT_FOUND" | "LIMIT_EXCEEDED" | "NOT_ACCEPTABLE" | "TYPE_MISMATCH">>
37
+ put: (request: { input: PutInput, task?: boolean }) => Promise<unknown | RemoteError<"LOCATION_UNTRUSTED" | "LOCATION_LENGTH" | "LOCATION_UNAVAILABLE" | "INVALID_ID" | "NOT_FOUND" | "LIMIT_EXCEEDED" | "NOT_ACCEPTABLE" | "TYPE_MISMATCH">>
38
+ get: (request: { input: GetInput, task?: boolean }) => Promise<unknown | RemoteError<"NOT_FOUND" | "LIMIT_EXCEEDED" | "NOT_ACCEPTABLE" | "TYPE_MISMATCH">>
39
+ head: (request: { input: HeadInput, task?: boolean }) => Promise<unknown | RemoteError<"NOT_FOUND" | "LIMIT_EXCEEDED" | "NOT_ACCEPTABLE" | "TYPE_MISMATCH">>
40
+ delete: (request: { input: DeleteInput, task?: boolean }) => Promise<unknown | RemoteError<"NOT_FOUND" | "LIMIT_EXCEEDED" | "NOT_ACCEPTABLE" | "TYPE_MISMATCH">>
41
41
  }
@@ -1,7 +1,7 @@
1
1
  // Written by `toa types`. Every run rewrites it.
2
2
  // What a manifest does not state belongs in a file of your own.
3
3
 
4
- import type { Options, Query } from '@toa.io/core/types'
4
+ import type { Query } from '@toa.io/core/types'
5
5
  import type { Readable } from 'node:stream'
6
6
 
7
7
  export interface Entity {
@@ -25,11 +25,11 @@ export type TransitInput = {
25
25
  }
26
26
 
27
27
  export interface Component {
28
- transit: (request: { input: TransitInput, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
29
- assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
30
- ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
31
- enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity[]>
32
- observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity | null>
33
- stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Readable>
34
- terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
28
+ transit: (request: { input: TransitInput, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
29
+ assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
30
+ ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
31
+ enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity[]>
32
+ observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity | null>
33
+ stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Readable>
34
+ terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
35
35
  }
@@ -1,7 +1,7 @@
1
1
  // Written by `toa types`. Every run rewrites it.
2
2
  // What a manifest does not state belongs in a file of your own.
3
3
 
4
- import type { Options, Query, RemoteError } from '@toa.io/core/types'
4
+ import type { Query, RemoteError } from '@toa.io/core/types'
5
5
  import type { Secret } from '@toa.io/extensions.configuration'
6
6
  import type { FetchInit } from '@toa.io/extensions.fetch'
7
7
  import type { Logs, Metrics, Span } from '@toa.io/extensions.telemetry'
@@ -92,20 +92,20 @@ export type DeleteInput = {
92
92
  }
93
93
 
94
94
  export interface Component {
95
- transit: (request: { input: TransitInput, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<TransitOutput | RemoteError<"PRINCIPAL_LOCKED" | "INVALID_USERNAME" | "INVALID_PASSWORD" | "EXISTS">>
96
- create: (request: { input: CreateInput, task?: boolean }, options?: Options) => Promise<CreateOutput | RemoteError<"PRINCIPAL_LOCKED" | "INVALID_USERNAME" | "INVALID_PASSWORD" | "EXISTS">>
97
- add: (request: { input: AddInput, task?: boolean }, options?: Options) => Promise<unknown | RemoteError<"PRINCIPAL_LOCKED" | "INVALID_USERNAME" | "INVALID_PASSWORD" | "EXISTS">>
98
- incept: (request: { input: InceptInput, task?: boolean }, options?: Options) => Promise<InceptOutput | RemoteError<"INVALID_CREDENTIALS">>
99
- authenticate: (request: { input: AuthenticateInput, task?: boolean }, options?: Options) => Promise<AuthenticateOutput | RemoteError<"NOT_FOUND" | "PASSWORD_MISMATCH">>
100
- check: (request: { input: CheckInput, task?: boolean }, options?: Options) => Promise<CheckOutput>
101
- info: (request: { input: InfoInput, task?: boolean }, options?: Options) => Promise<InfoOutput>
102
- delete: (request: { input: DeleteInput, task?: boolean }, options?: Options) => Promise<unknown>
103
- assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
104
- ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
105
- enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity[]>
106
- observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity | null>
107
- stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Readable>
108
- terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
95
+ transit: (request: { input: TransitInput, query?: Query<Entity>, task?: boolean }) => Promise<TransitOutput | RemoteError<"PRINCIPAL_LOCKED" | "INVALID_USERNAME" | "INVALID_PASSWORD" | "EXISTS">>
96
+ create: (request: { input: CreateInput, task?: boolean }) => Promise<CreateOutput | RemoteError<"PRINCIPAL_LOCKED" | "INVALID_USERNAME" | "INVALID_PASSWORD" | "EXISTS">>
97
+ add: (request: { input: AddInput, task?: boolean }) => Promise<unknown | RemoteError<"PRINCIPAL_LOCKED" | "INVALID_USERNAME" | "INVALID_PASSWORD" | "EXISTS">>
98
+ incept: (request: { input: InceptInput, task?: boolean }) => Promise<InceptOutput | RemoteError<"INVALID_CREDENTIALS">>
99
+ authenticate: (request: { input: AuthenticateInput, task?: boolean }) => Promise<AuthenticateOutput | RemoteError<"NOT_FOUND" | "PASSWORD_MISMATCH">>
100
+ check: (request: { input: CheckInput, task?: boolean }) => Promise<CheckOutput>
101
+ info: (request: { input: InfoInput, task?: boolean }) => Promise<InfoOutput>
102
+ delete: (request: { input: DeleteInput, task?: boolean }) => Promise<unknown>
103
+ assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
104
+ ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
105
+ enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity[]>
106
+ observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity | null>
107
+ stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Readable>
108
+ terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
109
109
  }
110
110
 
111
111
  export interface Configuration {
@@ -1,7 +1,7 @@
1
1
  // Written by `toa types`. Every run rewrites it.
2
2
  // What a manifest does not state belongs in a file of your own.
3
3
 
4
- import type { Options, Query, RemoteError } from '@toa.io/core/types'
4
+ import type { Query, RemoteError } from '@toa.io/core/types'
5
5
  import type { FetchInit } from '@toa.io/extensions.fetch'
6
6
  import type { Stash } from '@toa.io/extensions.stash'
7
7
  import type { Logs, Metrics, Span } from '@toa.io/extensions.telemetry'
@@ -85,15 +85,15 @@ export type DescribeOutput = {
85
85
  }
86
86
 
87
87
  export interface Component {
88
- transit: (request: { input: TransitInput, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
89
- register: (request: { input: RegisterInput, task?: boolean }, options?: Options) => Promise<RegisterOutput>
90
- describe: (request: { input: DescribeInput, task?: boolean }, options?: Options) => Promise<DescribeOutput | RemoteError<"UNKNOWN_CLIENT">>
91
- assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
92
- ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
93
- enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity[]>
94
- observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity | null>
95
- stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Readable>
96
- terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
88
+ transit: (request: { input: TransitInput, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
89
+ register: (request: { input: RegisterInput, task?: boolean }) => Promise<RegisterOutput>
90
+ describe: (request: { input: DescribeInput, task?: boolean }) => Promise<DescribeOutput | RemoteError<"UNKNOWN_CLIENT">>
91
+ assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
92
+ ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
93
+ enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity[]>
94
+ observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity | null>
95
+ stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Readable>
96
+ terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
97
97
  }
98
98
 
99
99
  export interface Configuration {
@@ -1,7 +1,6 @@
1
1
  // Written by `toa types`. Every run rewrites it.
2
2
  // What a manifest does not state belongs in a file of your own.
3
3
 
4
- import type { Options } from '@toa.io/core/types'
5
4
 
6
5
  export type ListInput = {
7
6
  authority: string
@@ -27,5 +26,5 @@ export type ListOutput = {
27
26
  }
28
27
 
29
28
  export interface Component {
30
- list: (request: { input: ListInput, task?: boolean }, options?: Options) => Promise<ListOutput>
29
+ list: (request: { input: ListInput, task?: boolean }) => Promise<ListOutput>
31
30
  }
@@ -1,7 +1,7 @@
1
1
  // Written by `toa types`. Every run rewrites it.
2
2
  // What a manifest does not state belongs in a file of your own.
3
3
 
4
- import type { Options, Query, RemoteError } from '@toa.io/core/types'
4
+ import type { Query, RemoteError } from '@toa.io/core/types'
5
5
  import type { Secret } from '@toa.io/extensions.configuration'
6
6
  import type { FetchInit } from '@toa.io/extensions.fetch'
7
7
  import type { Logs, Metrics, Span } from '@toa.io/extensions.telemetry'
@@ -88,19 +88,19 @@ export type DeleteInput = {
88
88
  }
89
89
 
90
90
  export interface Component {
91
- transit: (request: { input: TransitInput, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
92
- create: (request: { input: CreateInput, task?: boolean }, options?: Options) => Promise<unknown | RemoteError<"EXISTS" | "TOKEN" | "TRUST" | "RESPONSE" | "CONFIG" | "NO_TOKEN" | "ISS" | "SUB" | "EXP" | "REPLAY" | "CODE_NOT_ENABLED" | "CODE_SCHEMA">>
93
- incept: (request: { input: InceptInput, task?: boolean }, options?: Options) => Promise<InceptOutput | RemoteError<"EXISTS" | "TOKEN" | "TRUST" | "RESPONSE" | "CONFIG" | "NO_TOKEN" | "ISS" | "SUB" | "EXP" | "REPLAY" | "CODE_NOT_ENABLED" | "CODE_SCHEMA">>
94
- authenticate: (request: { input: AuthenticateInput, task?: boolean }, options?: Options) => Promise<AuthenticateOutput | RemoteError<"NOT_FOUND" | "TOKEN" | "TRUST" | "RESPONSE" | "CONFIG" | "NO_TOKEN" | "ISS" | "SUB" | "EXP" | "REPLAY" | "CODE_NOT_ENABLED" | "CODE_SCHEMA">>
95
- decode: (request: { input: DecodeInput, task?: boolean }, options?: Options) => Promise<DecodeOutput>
96
- list: (request: { input: ListInput, task?: boolean }, options?: Options) => Promise<unknown>
97
- delete: (request: { input: DeleteInput, task?: boolean }, options?: Options) => Promise<unknown>
98
- assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
99
- ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
100
- enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity[]>
101
- observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity | null>
102
- stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Readable>
103
- terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
91
+ transit: (request: { input: TransitInput, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
92
+ create: (request: { input: CreateInput, task?: boolean }) => Promise<unknown | RemoteError<"EXISTS" | "TOKEN" | "TRUST" | "RESPONSE" | "CONFIG" | "NO_TOKEN" | "ISS" | "SUB" | "EXP" | "REPLAY" | "CODE_NOT_ENABLED" | "CODE_SCHEMA">>
93
+ incept: (request: { input: InceptInput, task?: boolean }) => Promise<InceptOutput | RemoteError<"EXISTS" | "TOKEN" | "TRUST" | "RESPONSE" | "CONFIG" | "NO_TOKEN" | "ISS" | "SUB" | "EXP" | "REPLAY" | "CODE_NOT_ENABLED" | "CODE_SCHEMA">>
94
+ authenticate: (request: { input: AuthenticateInput, task?: boolean }) => Promise<AuthenticateOutput | RemoteError<"NOT_FOUND" | "TOKEN" | "TRUST" | "RESPONSE" | "CONFIG" | "NO_TOKEN" | "ISS" | "SUB" | "EXP" | "REPLAY" | "CODE_NOT_ENABLED" | "CODE_SCHEMA">>
95
+ decode: (request: { input: DecodeInput, task?: boolean }) => Promise<DecodeOutput>
96
+ list: (request: { input: ListInput, task?: boolean }) => Promise<unknown>
97
+ delete: (request: { input: DeleteInput, task?: boolean }) => Promise<unknown>
98
+ assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
99
+ ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
100
+ enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity[]>
101
+ observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity | null>
102
+ stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Readable>
103
+ terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
104
104
  }
105
105
 
106
106
  export interface Configuration {
@@ -1,7 +1,7 @@
1
1
  // Written by `toa types`. Every run rewrites it.
2
2
  // What a manifest does not state belongs in a file of your own.
3
3
 
4
- import type { Options, Query, RemoteError } from '@toa.io/core/types'
4
+ import type { Query, RemoteError } from '@toa.io/core/types'
5
5
  import type { FetchInit } from '@toa.io/extensions.fetch'
6
6
  import type { Stash } from '@toa.io/extensions.stash'
7
7
  import type { Logs, Metrics, Span } from '@toa.io/extensions.telemetry'
@@ -88,17 +88,17 @@ export type RevokeInput = {
88
88
  export type RevokeOutput = null
89
89
 
90
90
  export interface Component {
91
- transit: (request: { input: TransitInput, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
92
- authorize: (request: { input: AuthorizeInput, task?: boolean }, options?: Options) => Promise<AuthorizeOutput>
93
- exchange: (request: { input: ExchangeInput, task?: boolean }, options?: Options) => Promise<ExchangeOutput>
94
- list: (request: { input: ListInput, task?: boolean }, options?: Options) => Promise<unknown>
95
- revoke: (request: { input: RevokeInput, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<RevokeOutput | RemoteError<"NOT_FOUND">>
96
- assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
97
- ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
98
- enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity[]>
99
- observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity | null>
100
- stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Readable>
101
- terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
91
+ transit: (request: { input: TransitInput, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
92
+ authorize: (request: { input: AuthorizeInput, task?: boolean }) => Promise<AuthorizeOutput>
93
+ exchange: (request: { input: ExchangeInput, task?: boolean }) => Promise<ExchangeOutput>
94
+ list: (request: { input: ListInput, task?: boolean }) => Promise<unknown>
95
+ revoke: (request: { input: RevokeInput, query?: Query<Entity>, task?: boolean }) => Promise<RevokeOutput | RemoteError<"NOT_FOUND">>
96
+ assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
97
+ ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
98
+ enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity[]>
99
+ observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity | null>
100
+ stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Readable>
101
+ terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
102
102
  }
103
103
 
104
104
  export interface Configuration {
@@ -1,7 +1,7 @@
1
1
  // Written by `toa types`. Every run rewrites it.
2
2
  // What a manifest does not state belongs in a file of your own.
3
3
 
4
- import type { Options, Query } from '@toa.io/core/types'
4
+ import type { Query } from '@toa.io/core/types'
5
5
  import type { Readable } from 'node:stream'
6
6
 
7
7
  export interface Entity {
@@ -36,13 +36,13 @@ export type RevokeInput = {
36
36
  export type RevokeOutput = null
37
37
 
38
38
  export interface Component {
39
- create: (request: { input: CreateInput, task?: boolean }, options?: Options) => Promise<CreateOutput>
40
- revoke: (request: { input: RevokeInput, task?: boolean }, options?: Options) => Promise<RevokeOutput>
41
- disable: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<unknown>
42
- assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
43
- ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
44
- enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity[]>
45
- observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity | null>
46
- stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Readable>
47
- terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
39
+ create: (request: { input: CreateInput, task?: boolean }) => Promise<CreateOutput>
40
+ revoke: (request: { input: RevokeInput, task?: boolean }) => Promise<RevokeOutput>
41
+ disable: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<unknown>
42
+ assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
43
+ ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
44
+ enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity[]>
45
+ observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity | null>
46
+ stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Readable>
47
+ terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
48
48
  }
@@ -1,7 +1,7 @@
1
1
  // Written by `toa types`. Every run rewrites it.
2
2
  // What a manifest does not state belongs in a file of your own.
3
3
 
4
- import type { Options, Query, RemoteError } from '@toa.io/core/types'
4
+ import type { Query, RemoteError } from '@toa.io/core/types'
5
5
  import type { FetchInit } from '@toa.io/extensions.fetch'
6
6
  import type { Stash } from '@toa.io/extensions.stash'
7
7
  import type { Logs, Metrics, Span } from '@toa.io/extensions.telemetry'
@@ -39,14 +39,14 @@ export type AuthenticateOutput = {
39
39
  }
40
40
 
41
41
  export interface Component {
42
- issue: (request: { input: IssueInput, task?: boolean }, options?: Options) => Promise<unknown>
43
- authenticate: (request: { input: AuthenticateInput, task?: boolean }, options?: Options) => Promise<AuthenticateOutput | RemoteError<"INVALID_CREDENTIALS" | "EXPIRED" | "TOO_MANY_ATTEMPTS" | "NOT_FOUND">>
44
- assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
45
- ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
46
- enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity[]>
47
- observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity | null>
48
- stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Readable>
49
- terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
42
+ issue: (request: { input: IssueInput, task?: boolean }) => Promise<unknown>
43
+ authenticate: (request: { input: AuthenticateInput, task?: boolean }) => Promise<AuthenticateOutput | RemoteError<"INVALID_CREDENTIALS" | "EXPIRED" | "TOO_MANY_ATTEMPTS" | "NOT_FOUND">>
44
+ assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
45
+ ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
46
+ enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity[]>
47
+ observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity | null>
48
+ stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Readable>
49
+ terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
50
50
  }
51
51
 
52
52
  export interface Configuration {
@@ -1,7 +1,7 @@
1
1
  // Written by `toa types`. Every run rewrites it.
2
2
  // What a manifest does not state belongs in a file of your own.
3
3
 
4
- import type { Options, Query, RemoteError } from '@toa.io/core/types'
4
+ import type { Query, RemoteError } from '@toa.io/core/types'
5
5
  import type { FetchInit } from '@toa.io/extensions.fetch'
6
6
  import type { Stash } from '@toa.io/extensions.stash'
7
7
  import type { Logs, Metrics, Span } from '@toa.io/extensions.telemetry'
@@ -97,18 +97,18 @@ export type DeleteInput = {
97
97
  }
98
98
 
99
99
  export interface Component {
100
- challenge: (request: { input: ChallengeInput, task?: boolean }, options?: Options) => Promise<unknown>
101
- create: (request: { input: CreateInput, task?: boolean }, options?: Options) => Promise<unknown | RemoteError<"FAILED" | "INVALID">>
102
- use: (request: { input: UseInput, query: Query<Entity>, task?: boolean }, options?: Options) => Promise<unknown | RemoteError<"FAILED" | "INVALID">>
103
- authenticate: (request: { input: AuthenticateInput, task?: boolean }, options?: Options) => Promise<unknown | RemoteError<"MISS" | "FAILED" | "INVALID">>
104
- list: (request: { input: ListInput, task?: boolean }, options?: Options) => Promise<unknown>
105
- delete: (request: { input: DeleteInput, task?: boolean }, options?: Options) => Promise<unknown>
106
- assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
107
- ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
108
- enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity[]>
109
- observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity | null>
110
- stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Readable>
111
- terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
100
+ challenge: (request: { input: ChallengeInput, task?: boolean }) => Promise<unknown>
101
+ create: (request: { input: CreateInput, task?: boolean }) => Promise<unknown | RemoteError<"FAILED" | "INVALID">>
102
+ use: (request: { input: UseInput, query: Query<Entity>, task?: boolean }) => Promise<unknown | RemoteError<"FAILED" | "INVALID">>
103
+ authenticate: (request: { input: AuthenticateInput, task?: boolean }) => Promise<unknown | RemoteError<"MISS" | "FAILED" | "INVALID">>
104
+ list: (request: { input: ListInput, task?: boolean }) => Promise<unknown>
105
+ delete: (request: { input: DeleteInput, task?: boolean }) => Promise<unknown>
106
+ assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
107
+ ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
108
+ enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity[]>
109
+ observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity | null>
110
+ stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Readable>
111
+ terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
112
112
  }
113
113
 
114
114
  export interface Configuration {
@@ -1,7 +1,7 @@
1
1
  // Written by `toa types`. Every run rewrites it.
2
2
  // What a manifest does not state belongs in a file of your own.
3
3
 
4
- import type { Options, Query, RemoteError } from '@toa.io/core/types'
4
+ import type { Query, RemoteError } from '@toa.io/core/types'
5
5
  import type { Readable } from 'node:stream'
6
6
 
7
7
  export interface Entity {
@@ -32,13 +32,13 @@ export type PrincipalInput = {
32
32
  }
33
33
 
34
34
  export interface Component {
35
- grant: (request: { input: GrantInput, task?: boolean }, options?: Options) => Promise<unknown | RemoteError<"INACCESSIBLE_SCOPE">>
36
- list: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<ListOutput>
37
- principal: (request: { input: PrincipalInput, task?: boolean }, options?: Options) => Promise<unknown>
38
- assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
39
- ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
40
- enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity[]>
41
- observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity | null>
42
- stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Readable>
43
- terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
35
+ grant: (request: { input: GrantInput, task?: boolean }) => Promise<unknown | RemoteError<"INACCESSIBLE_SCOPE">>
36
+ list: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<ListOutput>
37
+ principal: (request: { input: PrincipalInput, task?: boolean }) => Promise<unknown>
38
+ assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
39
+ ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
40
+ enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity[]>
41
+ observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity | null>
42
+ stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Readable>
43
+ terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
44
44
  }
@@ -1,7 +1,7 @@
1
1
  // Written by `toa types`. Every run rewrites it.
2
2
  // What a manifest does not state belongs in a file of your own.
3
3
 
4
- import type { Options, Query, RemoteError } from '@toa.io/core/types'
4
+ import type { Query, RemoteError } from '@toa.io/core/types'
5
5
  import type { Secret } from '@toa.io/extensions.configuration'
6
6
  import type { FetchInit } from '@toa.io/extensions.fetch'
7
7
  import type { Logs, Metrics, Span } from '@toa.io/extensions.telemetry'
@@ -89,17 +89,17 @@ export type IssueOutput = {
89
89
  export type RevokeOutput = null
90
90
 
91
91
  export interface Component {
92
- encrypt: (request: { input: EncryptInput, task?: boolean }, options?: Options) => Promise<EncryptOutput | RemoteError<"INACCESSIBLE_SCOPE">>
93
- decrypt: (request: { input: DecryptInput, task?: boolean }, options?: Options) => Promise<DecryptOutput | RemoteError<"INVALID_TOKEN" | "INVALID_KEY" | "FORGED_KEY" | "REVOKED_KEY">>
94
- authenticate: (request: { input: AuthenticateInput, task?: boolean }, options?: Options) => Promise<AuthenticateOutput | RemoteError<"UNRECOGNIZED" | "AUTHORITY_MISMATCH" | "TOKEN_REVOKED" | "INVALID_TOKEN" | "INVALID_KEY" | "FORGED_KEY" | "REVOKED_KEY">>
95
- issue: (request: { input: IssueInput, task?: boolean }, options?: Options) => Promise<IssueOutput | RemoteError<"INACCESSIBLE_SCOPE">>
96
- revoke: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<RevokeOutput>
97
- assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
98
- ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
99
- enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity[]>
100
- observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity | null>
101
- stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Readable>
102
- terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }, options?: Options) => Promise<Entity>
92
+ encrypt: (request: { input: EncryptInput, task?: boolean }) => Promise<EncryptOutput | RemoteError<"INACCESSIBLE_SCOPE">>
93
+ decrypt: (request: { input: DecryptInput, task?: boolean }) => Promise<DecryptOutput | RemoteError<"INVALID_TOKEN" | "INVALID_KEY" | "FORGED_KEY" | "REVOKED_KEY">>
94
+ authenticate: (request: { input: AuthenticateInput, task?: boolean }) => Promise<AuthenticateOutput | RemoteError<"UNRECOGNIZED" | "AUTHORITY_MISMATCH" | "TOKEN_REVOKED" | "INVALID_TOKEN" | "INVALID_KEY" | "FORGED_KEY" | "REVOKED_KEY">>
95
+ issue: (request: { input: IssueInput, task?: boolean }) => Promise<IssueOutput | RemoteError<"INACCESSIBLE_SCOPE">>
96
+ revoke: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<RevokeOutput>
97
+ assign: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
98
+ ensure: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
99
+ enumerate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity[]>
100
+ observe: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity | null>
101
+ stream: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Readable>
102
+ terminate: (request: { input?: null, query?: Query<Entity>, task?: boolean }) => Promise<Entity>
103
103
  }
104
104
 
105
105
  export interface Configuration {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toa.io/extensions.exposition",
3
- "version": "1.0.0-alpha.314",
3
+ "version": "1.0.0-alpha.316",
4
4
  "type": "module",
5
5
  "description": "Toa Exposition",
6
6
  "author": "temich <tema.gurtovoy@gmail.com>",
@@ -28,12 +28,12 @@
28
28
  "!**/.env*"
29
29
  ],
30
30
  "dependencies": {
31
- "@toa.io/core": "1.0.0-alpha.314",
32
- "@toa.io/definitions": "1.0.0-alpha.314",
31
+ "@toa.io/core": "1.0.0-alpha.315",
32
+ "@toa.io/definitions": "1.0.0-alpha.316",
33
33
  "@toa.io/generic": "1.0.0-alpha.311",
34
34
  "@toa.io/pointer": "1.0.0-alpha.311",
35
35
  "@toa.io/schemas": "1.0.0-alpha.311",
36
- "content-type": "3.1.0",
36
+ "content-type": "3.1.1",
37
37
  "ioredis": "6.0.0",
38
38
  "matchacho": "0.6.1",
39
39
  "minimatch": "10.2.6",
@@ -74,5 +74,5 @@
74
74
  "lru-cache": "11.5.2",
75
75
  "paseto": "4.0.1"
76
76
  },
77
- "gitHead": "4b7c0f4468e6fa89f95a69f43fed85c648fb033d"
77
+ "gitHead": "1a873a2f74dc27cc82cc523aa4557a38f23593c6"
78
78
  }
package/readme.md CHANGED
@@ -142,7 +142,7 @@ exposition:
142
142
  | `oauth` | Authorization server exposed to OAuth clients. See [OAuth](documentation/oauth.md). |
143
143
  | `protocol` | `h1` or `h2c`. See [Protocol](documentation/protocol.md). |
144
144
  | `rpc` | JSON-RPC at `/.rpc`; none is served without it. See [JSON-RPC](documentation/rpc.md). |
145
- | `mcp` | MCP at `/.mcp`; none is served without it. See [MCP](documentation/mcp.md). |
145
+ | `mcp` | MCP at `/.mcp`, and on a host of its own where one is named; none is served without it. See [MCP](documentation/mcp.md). |
146
146
 
147
147
  ### Observability
148
148
 
@@ -41,7 +41,8 @@ export interface Exposed {
41
41
  *
42
42
  * - `refresh`: the same component and the same routes, so its expiration is extended and its
43
43
  * endpoints left alone
44
- * - `superseded`: it came from a tenant that started before the one exposed now
44
+ * - `superseded`: it came from a tenant that started before the one exposed now, while the
45
+ * exposed branch is still served
45
46
  * - `merge`: everything else
46
47
  */
47
48
  export declare function decide(exposed: Exposed, branch: Branch): Decision;
@@ -3,14 +3,23 @@
3
3
  *
4
4
  * - `refresh`: the same component and the same routes, so its expiration is extended and its
5
5
  * endpoints left alone
6
- * - `superseded`: it came from a tenant that started before the one exposed now
6
+ * - `superseded`: it came from a tenant that started before the one exposed now, while the
7
+ * exposed branch is still served
7
8
  * - `merge`: everything else
8
9
  */
9
10
  export function decide(exposed, branch) {
10
11
  if (exposed.version === branch.version && exposed.routes === branch.routes)
11
12
  return 'refresh';
12
- if (branch.timestamp < exposed.timestamp)
13
+ if (branch.timestamp < exposed.timestamp && !expired(exposed))
13
14
  return 'superseded';
14
15
  return 'merge';
15
16
  }
17
+ /**
18
+ * A tenant that has gone without saying so stops refreshing its branch, and once the branch
19
+ * expires, nothing it held off is served. What started before it is all there is left to expose.
20
+ */
21
+ function expired(exposed) {
22
+ const now = Date.now();
23
+ return exposed.nodes.length > 0 && exposed.nodes.every((node) => now >= node.expiration);
24
+ }
16
25
  //# sourceMappingURL=Branch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Branch.js","sourceRoot":"","sources":["../source/Branch.ts"],"names":[],"mappings":"AAgDA;;;;;;;GAOG;AACH,MAAM,UAAU,MAAM,CAAC,OAAgB,EAAE,MAAc;IACrD,IAAI,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IAE5F,IAAI,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS;QAAE,OAAO,YAAY,CAAA;IAE7D,OAAO,OAAO,CAAA;AAChB,CAAC"}
1
+ {"version":3,"file":"Branch.js","sourceRoot":"","sources":["../source/Branch.ts"],"names":[],"mappings":"AAgDA;;;;;;;;GAQG;AACH,MAAM,UAAU,MAAM,CAAC,OAAgB,EAAE,MAAc;IACrD,IAAI,OAAO,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IAE5F,IAAI,MAAM,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO,YAAY,CAAA;IAElF,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,OAAO,CAAC,OAAgB;IAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAEtB,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAA;AAC1F,CAAC"}
@@ -1,3 +1,4 @@
1
+ import * as http from '../HTTP/index.ts';
1
2
  import type { Input, Output } from '../io.ts';
2
3
  import type { Interceptor } from '../Interception.ts';
3
4
  /**
@@ -21,13 +22,15 @@ export declare class Site implements Interceptor {
21
22
  /** What a test points at a fixture; the build otherwise. */
22
23
  private readonly override;
23
24
  private root;
25
+ /** Hosts MCP is served at the root of, where this page is not served. */
26
+ private roots;
24
27
  constructor(root?: string);
25
28
  /**
26
29
  * Resolved here rather than at construction because this is a module singleton, built
27
30
  * when the module loads and before anything has said where the page is. Said once, too,
28
31
  * because a page that is not built is otherwise a `503` per request and nothing else.
29
32
  */
30
- mount(): void;
33
+ mount(options: http.Options): void;
31
34
  intercept(input: Input): Output;
32
35
  /**
33
36
  * The file a request lands on, or `null` when nothing does. A path that exists is served
@@ -25,6 +25,8 @@ export class Site {
25
25
  /** What a test points at a fixture; the build otherwise. */
26
26
  override;
27
27
  root;
28
+ /** Hosts MCP is served at the root of, where this page is not served. */
29
+ roots = new Set();
28
30
  constructor(root) {
29
31
  this.override = root;
30
32
  this.root = root ?? site();
@@ -34,8 +36,9 @@ export class Site {
34
36
  * when the module loads and before anything has said where the page is. Said once, too,
35
37
  * because a page that is not built is otherwise a `503` per request and nothing else.
36
38
  */
37
- mount() {
39
+ mount(options) {
38
40
  this.root = this.override ?? site();
41
+ this.roots = new Set(Object.values(options.mcp?.hosts ?? {}).map((host) => host.toLowerCase()));
39
42
  if (!isFile(path.join(this.root, 'index.html')))
40
43
  console.warn('Discovery UI is not built', { root: this.root });
41
44
  }
@@ -43,6 +46,9 @@ export class Site {
43
46
  const { pathname } = input.url;
44
47
  if (pathname !== DISCOVERY && !pathname.startsWith(DISCOVERY + '/'))
45
48
  return null;
49
+ // the gateway answers for such a host, and what it answers there is `404`
50
+ if (this.roots.has(input.url.host))
51
+ return null;
46
52
  // the prefix itself, as opposed to something under it
47
53
  const bare = pathname === DISCOVERY || pathname === DISCOVERY + '/';
48
54
  const method = input.request.method;
@@ -1 +1 @@
1
- {"version":3,"file":"Site.js","sourceRoot":"","sources":["../../source/Discovery/Site.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Site.js","sourceRoot":"","sources":["../../source/Discovery/Site.ts"],"names":[],"mappings":"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"}