@toa.io/extensions.exposition 0.24.0-alpha.9 → 1.0.0-alpha.2
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.
- package/components/context.toa.yaml +12 -0
- package/components/identity.bans/manifest.toa.yaml +1 -1
- package/components/identity.basic/manifest.toa.yaml +1 -1
- package/components/identity.basic/operations/authenticate.js +1 -2
- package/components/identity.basic/operations/authenticate.js.map +1 -1
- package/components/identity.basic/operations/transit.js.map +1 -1
- package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.basic/source/authenticate.ts +0 -1
- package/components/identity.federation/events/principal.js +22 -0
- package/components/identity.federation/manifest.toa.yaml +88 -0
- package/components/identity.federation/operations/assertions-as-values.cjs +45 -0
- package/components/identity.federation/operations/assertions-as-values.cjs.map +1 -0
- package/components/identity.federation/operations/assertions-as-values.d.cts +4 -0
- package/components/identity.federation/operations/authenticate.d.ts +3 -0
- package/components/identity.federation/operations/authenticate.js +20 -0
- package/components/identity.federation/operations/authenticate.js.map +1 -0
- package/components/identity.federation/operations/create.d.ts +10 -0
- package/components/identity.federation/operations/create.js +15 -0
- package/components/identity.federation/operations/create.js.map +1 -0
- package/components/identity.federation/operations/jwt.cjs +112 -0
- package/components/identity.federation/operations/jwt.cjs.map +1 -0
- package/components/identity.federation/operations/jwt.d.cts +19 -0
- package/components/identity.federation/operations/schemas.d.ts +43 -0
- package/components/identity.federation/operations/schemas.js +9 -0
- package/components/identity.federation/operations/schemas.js.map +1 -0
- package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -0
- package/components/identity.federation/operations/types.d.ts +51 -0
- package/components/identity.federation/operations/types.js +3 -0
- package/components/identity.federation/operations/types.js.map +1 -0
- package/components/identity.federation/source/assertions-as-values.cts +20 -0
- package/components/identity.federation/source/authenticate.ts +28 -0
- package/components/identity.federation/source/create.ts +26 -0
- package/components/identity.federation/source/jwt.cts +143 -0
- package/components/identity.federation/source/schemas.ts +45 -0
- package/components/identity.federation/source/types.ts +56 -0
- package/components/identity.federation/tsconfig.json +9 -0
- package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
- package/components/identity.tokens/manifest.toa.yaml +1 -1
- package/components/identity.tokens/operations/authenticate.js.map +1 -1
- package/components/identity.tokens/operations/decrypt.js.map +1 -1
- package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
- package/components/octets.storage/manifest.toa.yaml +1 -0
- package/components/octets.storage/operations/store.js +2 -2
- package/cucumber.js +0 -1
- package/documentation/components.md +24 -1
- package/documentation/identity.md +7 -7
- package/documentation/octets.md +90 -37
- package/documentation/protocol.md +21 -1
- package/documentation/query.md +1 -1
- package/documentation/vary.md +69 -0
- package/features/cors.feature +72 -0
- package/features/identity.feature +19 -3
- package/features/identity.federation.feature +125 -0
- package/features/octets.entries.feature +121 -0
- package/features/octets.feature +2 -28
- package/features/octets.meta.feature +65 -0
- package/features/octets.workflows.feature +138 -4
- package/features/response.feature +65 -0
- package/features/routes.feature +37 -0
- package/features/steps/Captures.ts +6 -0
- package/features/steps/Components.ts +18 -6
- package/features/steps/Gateway.ts +1 -2
- package/features/steps/HTTP.ts +34 -6
- package/features/steps/IdP.ts +120 -0
- package/features/steps/Parameters.ts +8 -2
- package/features/steps/Workspace.ts +5 -7
- package/features/steps/components/echo/operations/error.js +11 -0
- package/features/steps/components/octets.tester/manifest.toa.yaml +3 -0
- package/features/steps/components/octets.tester/operations/concat.js +7 -0
- package/features/steps/components/octets.tester/operations/echo.js +7 -0
- package/features/steps/components/users/manifest.toa.yaml +3 -0
- package/features/steps/components/users.properties/manifest.toa.yaml +13 -0
- package/features/steps/tsconfig.json +1 -1
- package/features/vary.feature +150 -0
- package/package.json +17 -18
- package/schemas/octets/delete.cos.yaml +2 -1
- package/schemas/octets/list.cos.yaml +2 -1
- package/source/Directive.test.ts +8 -2
- package/source/Directive.ts +19 -16
- package/source/Factory.ts +8 -7
- package/source/Gateway.ts +22 -8
- package/source/HTTP/Server.fixtures.ts +0 -1
- package/source/HTTP/Server.test.ts +61 -134
- package/source/HTTP/Server.ts +68 -37
- package/source/HTTP/formats/msgpack.ts +9 -6
- package/source/HTTP/formats/text.ts +1 -1
- package/source/HTTP/formats/yaml.ts +1 -1
- package/source/HTTP/messages.ts +15 -3
- package/source/Interception.ts +24 -0
- package/source/RTD/Directives.ts +2 -2
- package/source/RTD/Tree.ts +3 -0
- package/source/RTD/syntax/parse.ts +6 -6
- package/source/RTD/syntax/types.ts +1 -1
- package/source/deployment.ts +1 -2
- package/source/directives/auth/{Family.ts → Authorization.ts} +29 -33
- package/source/directives/auth/Incept.ts +1 -1
- package/source/directives/auth/Rule.ts +2 -2
- package/source/directives/auth/index.ts +2 -2
- package/source/directives/auth/schemes.ts +2 -1
- package/source/directives/auth/types.ts +9 -6
- package/source/directives/cache/{Family.ts → Cache.ts} +4 -5
- package/source/directives/cache/index.ts +2 -2
- package/source/directives/cache/types.ts +1 -1
- package/source/directives/cors/CORS.ts +54 -0
- package/source/directives/cors/index.ts +3 -0
- package/source/directives/dev/{Family.ts → Development.ts} +3 -4
- package/source/directives/dev/Stub.ts +4 -4
- package/source/directives/dev/Throw.ts +4 -4
- package/source/directives/dev/index.ts +2 -2
- package/source/directives/dev/types.ts +1 -1
- package/source/directives/index.ts +10 -6
- package/source/directives/octets/Context.ts +1 -1
- package/source/directives/octets/Delete.ts +50 -9
- package/source/directives/octets/Fetch.ts +18 -19
- package/source/directives/octets/List.ts +37 -7
- package/source/directives/octets/{Family.ts → Octets.ts} +7 -6
- package/source/directives/octets/Permute.ts +3 -3
- package/source/directives/octets/Store.ts +43 -99
- package/source/directives/octets/index.ts +2 -2
- package/source/directives/octets/schemas.ts +11 -6
- package/source/directives/octets/types.ts +4 -3
- package/source/directives/octets/workflow/Execution.ts +78 -0
- package/source/directives/octets/workflow/Workflow.ts +37 -0
- package/source/directives/octets/workflow/index.ts +1 -0
- package/source/directives/vary/Directive.ts +6 -0
- package/source/directives/vary/Embed.ts +62 -0
- package/source/directives/vary/Properties.ts +17 -0
- package/source/directives/vary/Vary.ts +48 -0
- package/source/directives/vary/embeddings/Embedding.ts +6 -0
- package/source/directives/vary/embeddings/Header.ts +30 -0
- package/source/directives/vary/embeddings/Language.ts +31 -0
- package/source/directives/vary/embeddings/index.ts +11 -0
- package/source/directives/vary/index.ts +3 -0
- package/source/io.ts +4 -0
- package/source/manifest.test.ts +6 -14
- package/source/manifest.ts +9 -6
- package/source/schemas.ts +7 -3
- package/transpiled/Composition.js.map +1 -1
- package/transpiled/Directive.d.ts +6 -7
- package/transpiled/Directive.js +12 -10
- package/transpiled/Directive.js.map +1 -1
- package/transpiled/Factory.d.ts +0 -1
- package/transpiled/Factory.js +7 -6
- package/transpiled/Factory.js.map +1 -1
- package/transpiled/Gateway.d.ts +8 -5
- package/transpiled/Gateway.js +12 -2
- package/transpiled/Gateway.js.map +1 -1
- package/transpiled/HTTP/Server.d.ts +5 -3
- package/transpiled/HTTP/Server.fixtures.d.ts +0 -1
- package/transpiled/HTTP/Server.fixtures.js +1 -2
- package/transpiled/HTTP/Server.fixtures.js.map +1 -1
- package/transpiled/HTTP/Server.js +50 -32
- package/transpiled/HTTP/Server.js.map +1 -1
- package/transpiled/HTTP/formats/msgpack.d.ts +2 -2
- package/transpiled/HTTP/formats/msgpack.js +8 -29
- package/transpiled/HTTP/formats/msgpack.js.map +1 -1
- package/transpiled/HTTP/formats/text.d.ts +3 -1
- package/transpiled/HTTP/formats/text.js.map +1 -1
- package/transpiled/HTTP/formats/yaml.js +1 -1
- package/transpiled/HTTP/formats/yaml.js.map +1 -1
- package/transpiled/HTTP/messages.d.ts +5 -0
- package/transpiled/HTTP/messages.js +8 -3
- package/transpiled/HTTP/messages.js.map +1 -1
- package/transpiled/Interception.d.ts +9 -0
- package/transpiled/Interception.js +19 -0
- package/transpiled/Interception.js.map +1 -0
- package/transpiled/Query.js.map +1 -1
- package/transpiled/RTD/Directives.d.ts +2 -2
- package/transpiled/RTD/Node.js.map +1 -1
- package/transpiled/RTD/Route.js.map +1 -1
- package/transpiled/RTD/Tree.js +2 -0
- package/transpiled/RTD/Tree.js.map +1 -1
- package/transpiled/RTD/syntax/parse.js +1 -1
- package/transpiled/RTD/syntax/parse.js.map +1 -1
- package/transpiled/RTD/syntax/types.js +1 -1
- package/transpiled/RTD/syntax/types.js.map +1 -1
- package/transpiled/deployment.js +1 -2
- package/transpiled/deployment.js.map +1 -1
- package/transpiled/directives/auth/{Family.d.ts → Authorization.d.ts} +4 -4
- package/transpiled/directives/auth/{Family.js → Authorization.js} +15 -8
- package/transpiled/directives/auth/Authorization.js.map +1 -0
- package/transpiled/directives/auth/Incept.js.map +1 -1
- package/transpiled/directives/auth/Role.js.map +1 -1
- package/transpiled/directives/auth/Rule.d.ts +2 -2
- package/transpiled/directives/auth/Rule.js.map +1 -1
- package/transpiled/directives/auth/index.d.ts +2 -2
- package/transpiled/directives/auth/index.js +4 -5
- package/transpiled/directives/auth/index.js.map +1 -1
- package/transpiled/directives/auth/schemes.js +2 -1
- package/transpiled/directives/auth/schemes.js.map +1 -1
- package/transpiled/directives/auth/types.d.ts +4 -4
- package/transpiled/directives/cache/{Family.d.ts → Cache.d.ts} +4 -5
- package/transpiled/directives/cache/{Family.js → Cache.js} +4 -2
- package/transpiled/directives/cache/{Family.js.map → Cache.js.map} +1 -1
- package/transpiled/directives/cache/index.d.ts +2 -2
- package/transpiled/directives/cache/index.js +4 -5
- package/transpiled/directives/cache/index.js.map +1 -1
- package/transpiled/directives/cache/types.d.ts +1 -1
- package/transpiled/directives/cors/CORS.d.ts +11 -0
- package/transpiled/directives/cors/CORS.js +44 -0
- package/transpiled/directives/cors/CORS.js.map +1 -0
- package/transpiled/directives/cors/index.d.ts +2 -0
- package/transpiled/directives/cors/index.js +6 -0
- package/transpiled/directives/cors/index.js.map +1 -0
- package/transpiled/directives/dev/{Family.d.ts → Development.d.ts} +3 -4
- package/transpiled/directives/dev/{Family.js → Development.js} +4 -2
- package/transpiled/directives/dev/Development.js.map +1 -0
- package/transpiled/directives/dev/Stub.d.ts +3 -3
- package/transpiled/directives/dev/Stub.js.map +1 -1
- package/transpiled/directives/dev/Throw.d.ts +3 -3
- package/transpiled/directives/dev/Throw.js.map +1 -1
- package/transpiled/directives/dev/index.d.ts +2 -2
- package/transpiled/directives/dev/index.js +4 -5
- package/transpiled/directives/dev/index.js.map +1 -1
- package/transpiled/directives/dev/types.d.ts +1 -1
- package/transpiled/directives/index.d.ts +3 -1
- package/transpiled/directives/index.js +9 -9
- package/transpiled/directives/index.js.map +1 -1
- package/transpiled/directives/octets/Context.d.ts +1 -1
- package/transpiled/directives/octets/Delete.d.ts +12 -3
- package/transpiled/directives/octets/Delete.js +32 -7
- package/transpiled/directives/octets/Delete.js.map +1 -1
- package/transpiled/directives/octets/Fetch.d.ts +5 -6
- package/transpiled/directives/octets/Fetch.js +11 -12
- package/transpiled/directives/octets/Fetch.js.map +1 -1
- package/transpiled/directives/octets/List.d.ts +7 -2
- package/transpiled/directives/octets/List.js +22 -4
- package/transpiled/directives/octets/List.js.map +1 -1
- package/transpiled/directives/octets/Octets.d.ts +12 -0
- package/transpiled/directives/octets/{Family.js → Octets.js} +6 -4
- package/transpiled/directives/octets/Octets.js.map +1 -0
- package/transpiled/directives/octets/Permute.d.ts +1 -1
- package/transpiled/directives/octets/Permute.js +2 -2
- package/transpiled/directives/octets/Permute.js.map +1 -1
- package/transpiled/directives/octets/Store.d.ts +10 -21
- package/transpiled/directives/octets/Store.js +25 -69
- package/transpiled/directives/octets/Store.js.map +1 -1
- package/transpiled/directives/octets/index.d.ts +2 -2
- package/transpiled/directives/octets/index.js +4 -5
- package/transpiled/directives/octets/index.js.map +1 -1
- package/transpiled/directives/octets/schemas.d.ts +11 -6
- package/transpiled/directives/octets/schemas.js.map +1 -1
- package/transpiled/directives/octets/types.d.ts +4 -3
- package/transpiled/directives/octets/workflow/Execution.d.ts +25 -0
- package/transpiled/directives/octets/workflow/Execution.js +55 -0
- package/transpiled/directives/octets/workflow/Execution.js.map +1 -0
- package/transpiled/directives/octets/workflow/Workflow.d.ts +12 -0
- package/transpiled/directives/octets/workflow/Workflow.js +25 -0
- package/transpiled/directives/octets/workflow/Workflow.js.map +1 -0
- package/transpiled/directives/octets/workflow/index.d.ts +1 -0
- package/transpiled/directives/octets/workflow/index.js +6 -0
- package/transpiled/directives/octets/workflow/index.js.map +1 -0
- package/transpiled/directives/vary/Directive.d.ts +5 -0
- package/transpiled/directives/vary/Directive.js +3 -0
- package/transpiled/directives/vary/Directive.js.map +1 -0
- package/transpiled/directives/vary/Embed.d.ts +10 -0
- package/transpiled/directives/vary/Embed.js +49 -0
- package/transpiled/directives/vary/Embed.js.map +1 -0
- package/transpiled/directives/vary/Properties.d.ts +9 -0
- package/transpiled/directives/vary/Properties.js +16 -0
- package/transpiled/directives/vary/Properties.js.map +1 -0
- package/transpiled/directives/vary/Vary.d.ts +10 -0
- package/transpiled/directives/vary/Vary.js +36 -0
- package/transpiled/directives/vary/Vary.js.map +1 -0
- package/transpiled/directives/vary/embeddings/Embedding.d.ts +5 -0
- package/transpiled/directives/vary/embeddings/Embedding.js +3 -0
- package/transpiled/directives/vary/embeddings/Embedding.js.map +1 -0
- package/transpiled/directives/vary/embeddings/Header.d.ts +7 -0
- package/transpiled/directives/vary/embeddings/Header.js +26 -0
- package/transpiled/directives/vary/embeddings/Header.js.map +1 -0
- package/transpiled/directives/vary/embeddings/Language.d.ts +7 -0
- package/transpiled/directives/vary/embeddings/Language.js +28 -0
- package/transpiled/directives/vary/embeddings/Language.js.map +1 -0
- package/transpiled/directives/vary/embeddings/index.d.ts +5 -0
- package/transpiled/directives/vary/embeddings/index.js +10 -0
- package/transpiled/directives/vary/embeddings/index.js.map +1 -0
- package/transpiled/directives/vary/index.d.ts +2 -0
- package/transpiled/directives/vary/index.js +6 -0
- package/transpiled/directives/vary/index.js.map +1 -0
- package/transpiled/io.d.ts +3 -0
- package/transpiled/io.js +3 -0
- package/transpiled/io.js.map +1 -0
- package/transpiled/manifest.js +10 -5
- package/transpiled/manifest.js.map +1 -1
- package/transpiled/schemas.d.ts +7 -3
- package/transpiled/schemas.js.map +1 -1
- package/transpiled/tsconfig.tsbuildinfo +1 -1
- package/transpiled/directives/auth/Family.js.map +0 -1
- package/transpiled/directives/dev/Family.js.map +0 -1
- package/transpiled/directives/octets/Family.d.ts +0 -12
- package/transpiled/directives/octets/Family.js.map +0 -1
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
Feature: The Vary directive family
|
|
2
|
+
|
|
3
|
+
Scenario Outline: Embedding a `<result>` language code
|
|
4
|
+
Given the `echo` is running with the following manifest:
|
|
5
|
+
"""yaml
|
|
6
|
+
exposition:
|
|
7
|
+
/:
|
|
8
|
+
vary:languages: [en, fr]
|
|
9
|
+
GET:
|
|
10
|
+
vary:embed:
|
|
11
|
+
name: language # embed resolved language code as a `name` property of the operation input
|
|
12
|
+
endpoint: compute
|
|
13
|
+
"""
|
|
14
|
+
When the following request is received:
|
|
15
|
+
"""
|
|
16
|
+
GET /echo/ HTTP/1.1
|
|
17
|
+
accept: application/yaml
|
|
18
|
+
accept-language: <accept>
|
|
19
|
+
"""
|
|
20
|
+
Then the following reply is sent:
|
|
21
|
+
"""
|
|
22
|
+
200 OK
|
|
23
|
+
content-type: application/yaml
|
|
24
|
+
content-language: <result>
|
|
25
|
+
vary: accept-language, accept
|
|
26
|
+
|
|
27
|
+
Hello <result>
|
|
28
|
+
"""
|
|
29
|
+
Examples:
|
|
30
|
+
| accept | result |
|
|
31
|
+
| en | en |
|
|
32
|
+
| en_US | en |
|
|
33
|
+
| fr | fr |
|
|
34
|
+
| sw | en |
|
|
35
|
+
|
|
36
|
+
Scenario: Listing languages on the root
|
|
37
|
+
Given the annotation:
|
|
38
|
+
"""
|
|
39
|
+
/:
|
|
40
|
+
vary:languages: [en, fr]
|
|
41
|
+
"""
|
|
42
|
+
And the `echo` is running with the following manifest:
|
|
43
|
+
"""yaml
|
|
44
|
+
exposition:
|
|
45
|
+
/:
|
|
46
|
+
GET:
|
|
47
|
+
anonymous: true
|
|
48
|
+
vary:embed:
|
|
49
|
+
name: language
|
|
50
|
+
endpoint: compute
|
|
51
|
+
"""
|
|
52
|
+
When the following request is received:
|
|
53
|
+
"""
|
|
54
|
+
GET /echo/ HTTP/1.1
|
|
55
|
+
accept: application/yaml
|
|
56
|
+
accept-language: fr
|
|
57
|
+
"""
|
|
58
|
+
Then the following reply is sent:
|
|
59
|
+
"""
|
|
60
|
+
200 OK
|
|
61
|
+
content-type: application/yaml
|
|
62
|
+
content-language: fr
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
Scenario: Embedding a value of an arbitrary header
|
|
67
|
+
Given the `echo` is running with the following manifest:
|
|
68
|
+
"""yaml
|
|
69
|
+
exposition:
|
|
70
|
+
/:
|
|
71
|
+
GET:
|
|
72
|
+
vary:embed:
|
|
73
|
+
name: :foo
|
|
74
|
+
endpoint: compute
|
|
75
|
+
"""
|
|
76
|
+
When the following request is received:
|
|
77
|
+
"""
|
|
78
|
+
GET /echo/ HTTP/1.1
|
|
79
|
+
accept: application/yaml
|
|
80
|
+
foo: bar
|
|
81
|
+
"""
|
|
82
|
+
Then the following reply is sent:
|
|
83
|
+
"""
|
|
84
|
+
200 OK
|
|
85
|
+
content-type: application/yaml
|
|
86
|
+
vary: foo, accept
|
|
87
|
+
|
|
88
|
+
Hello bar
|
|
89
|
+
"""
|
|
90
|
+
|
|
91
|
+
Scenario Outline: Embedding a value from the list of options
|
|
92
|
+
Given the `echo` is running with the following manifest:
|
|
93
|
+
"""yaml
|
|
94
|
+
exposition:
|
|
95
|
+
/:
|
|
96
|
+
vary:languages: [en, fr]
|
|
97
|
+
GET:
|
|
98
|
+
vary:embed:
|
|
99
|
+
name:
|
|
100
|
+
- :foo
|
|
101
|
+
- :bar
|
|
102
|
+
- language
|
|
103
|
+
endpoint: compute
|
|
104
|
+
"""
|
|
105
|
+
When the following request is received:
|
|
106
|
+
"""
|
|
107
|
+
GET /echo/ HTTP/1.1
|
|
108
|
+
accept: application/yaml
|
|
109
|
+
<header>: <value>
|
|
110
|
+
"""
|
|
111
|
+
Then the following reply is sent:
|
|
112
|
+
"""
|
|
113
|
+
200 OK
|
|
114
|
+
content-type: application/yaml
|
|
115
|
+
vary: <header>, accept
|
|
116
|
+
|
|
117
|
+
Hello <value>
|
|
118
|
+
"""
|
|
119
|
+
Examples:
|
|
120
|
+
| header | value |
|
|
121
|
+
| foo | bar |
|
|
122
|
+
| bar | baz |
|
|
123
|
+
| accept-language | en |
|
|
124
|
+
|
|
125
|
+
Scenario: Adding headers used by defined embeddings to CORS permissions
|
|
126
|
+
Given the `echo` is running with the following manifest:
|
|
127
|
+
"""yaml
|
|
128
|
+
exposition:
|
|
129
|
+
/:
|
|
130
|
+
vary:languages: [en, fr]
|
|
131
|
+
GET:
|
|
132
|
+
vary:embed:
|
|
133
|
+
name:
|
|
134
|
+
- language
|
|
135
|
+
- :foo
|
|
136
|
+
- :FOO
|
|
137
|
+
- :bar
|
|
138
|
+
endpoint: compute
|
|
139
|
+
"""
|
|
140
|
+
When the following request is received:
|
|
141
|
+
"""
|
|
142
|
+
OPTIONS / HTTP/1.1
|
|
143
|
+
origin: http://example.com
|
|
144
|
+
access-control-request-headers: whatever
|
|
145
|
+
"""
|
|
146
|
+
Then the following reply is sent:
|
|
147
|
+
"""
|
|
148
|
+
204 No Content
|
|
149
|
+
access-control-allow-headers: accept, authorization, content-type, accept-language, foo, bar
|
|
150
|
+
"""
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@toa.io/extensions.exposition",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.0-alpha.2",
|
|
4
4
|
"description": "Toa Exposition",
|
|
5
5
|
"author": "temich <tema.gurtovoy@gmail.com>",
|
|
6
6
|
"homepage": "https://github.com/toa-io/toa#readme",
|
|
@@ -17,17 +17,16 @@
|
|
|
17
17
|
"access": "public"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@toa.io/core": "0.
|
|
21
|
-
"@toa.io/generic": "0.
|
|
22
|
-
"@toa.io/schemas": "0.
|
|
23
|
-
"@toa.io/streams": "0.
|
|
20
|
+
"@toa.io/core": "1.0.0-alpha.2",
|
|
21
|
+
"@toa.io/generic": "1.0.0-alpha.2",
|
|
22
|
+
"@toa.io/schemas": "1.0.0-alpha.2",
|
|
23
|
+
"@toa.io/streams": "1.0.0-alpha.2",
|
|
24
24
|
"bcryptjs": "2.4.3",
|
|
25
|
-
"cors": "2.8.5",
|
|
26
25
|
"error-value": "0.3.0",
|
|
27
26
|
"express": "4.18.2",
|
|
28
27
|
"js-yaml": "4.1.0",
|
|
29
28
|
"matchacho": "0.3.5",
|
|
30
|
-
"msgpackr": "1.
|
|
29
|
+
"msgpackr": "1.10.1",
|
|
31
30
|
"negotiator": "0.6.3",
|
|
32
31
|
"paseto": "3.1.4"
|
|
33
32
|
},
|
|
@@ -37,21 +36,21 @@
|
|
|
37
36
|
},
|
|
38
37
|
"scripts": {
|
|
39
38
|
"test": "jest",
|
|
40
|
-
"transpile": "
|
|
41
|
-
"transpile:basic": "
|
|
42
|
-
"
|
|
43
|
-
"transpile:
|
|
44
|
-
"
|
|
39
|
+
"transpile": "tsc && npm run transpile:basic && npm run transpile:tokens && npm run transpile:roles && npm run transpile:federation",
|
|
40
|
+
"transpile:basic": "tsc -p ./components/identity.basic",
|
|
41
|
+
"pretranspile:federation": "js-yaml components/identity.federation/manifest.toa.yaml | jq -M '{ type: \"object\", properties: {configuration: .configuration.schema, entity: .entity.schema }, additionalProperties: false}' > schemas.json && json2ts -i schemas.json -o components/identity.federation/source/schemas.ts && rm schemas.json",
|
|
42
|
+
"transpile:federation": "tsc -p ./components/identity.federation",
|
|
43
|
+
"transpile:tokens": "tsc -p ./components/identity.tokens",
|
|
44
|
+
"transpile:roles": "tsc -p ./components/identity.roles",
|
|
45
|
+
"features": "cucumber-js"
|
|
45
46
|
},
|
|
46
47
|
"devDependencies": {
|
|
47
|
-
"@toa.io/
|
|
48
|
-
"@toa.io/
|
|
48
|
+
"@toa.io/agent": "1.0.0-alpha.2",
|
|
49
|
+
"@toa.io/extensions.storages": "1.0.0-alpha.2",
|
|
49
50
|
"@types/bcryptjs": "2.4.3",
|
|
50
51
|
"@types/cors": "2.8.13",
|
|
51
52
|
"@types/express": "4.17.17",
|
|
52
|
-
"@types/
|
|
53
|
-
"@types/negotiator": "0.6.1",
|
|
54
|
-
"fs-extra": "11.1.1"
|
|
53
|
+
"@types/negotiator": "0.6.1"
|
|
55
54
|
},
|
|
56
|
-
"gitHead": "
|
|
55
|
+
"gitHead": "7688e6e980a65c82ac2e459be4e355eebf406cd0"
|
|
57
56
|
}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
workflow+: <string>
|
|
2
|
+
_: true
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
meta: boolean
|
|
2
|
+
_: true
|
package/source/Directive.test.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import assert from 'node:assert'
|
|
1
2
|
import { generate } from 'randomstring'
|
|
2
3
|
import { DirectivesFactory, type Family } from './Directive'
|
|
3
4
|
import { type syntax } from './RTD'
|
|
4
5
|
import { type IncomingMessage } from './HTTP'
|
|
5
6
|
import { type Remotes } from './Remotes'
|
|
6
7
|
|
|
7
|
-
const families: Array<jest.
|
|
8
|
+
const families: Array<jest.MockedObjectDeep<Family>> = [
|
|
8
9
|
{
|
|
9
10
|
name: 'foo',
|
|
10
11
|
mandatory: true,
|
|
@@ -26,6 +27,9 @@ let factory: DirectivesFactory
|
|
|
26
27
|
beforeEach(() => {
|
|
27
28
|
jest.clearAllMocks()
|
|
28
29
|
|
|
30
|
+
assert.ok(families[0].preflight !== undefined)
|
|
31
|
+
assert.ok(families[1].preflight !== undefined)
|
|
32
|
+
|
|
29
33
|
families[0].preflight.mockImplementation(() => null)
|
|
30
34
|
families[1].preflight.mockImplementation(() => null)
|
|
31
35
|
factory = new DirectivesFactory(families, {} as unknown as Remotes)
|
|
@@ -61,7 +65,7 @@ it('should throw error if directive family is not found', async () => {
|
|
|
61
65
|
}
|
|
62
66
|
|
|
63
67
|
expect(() => factory.create([declaration]))
|
|
64
|
-
.toThrowError(`Directive family '${declaration.family}' not found.`)
|
|
68
|
+
.toThrowError(`Directive family '${declaration.family}' is not found.`)
|
|
65
69
|
})
|
|
66
70
|
|
|
67
71
|
it('should apply directive', async () => {
|
|
@@ -77,6 +81,8 @@ it('should apply directive', async () => {
|
|
|
77
81
|
|
|
78
82
|
await directives.preflight(request, [])
|
|
79
83
|
|
|
84
|
+
assert.ok(families[0].preflight !== undefined)
|
|
85
|
+
|
|
80
86
|
expect(families[0].preflight.mock.calls[0][0]).toStrictEqual([directive])
|
|
81
87
|
expect(families[0].preflight.mock.calls[0][1]).toEqual(request)
|
|
82
88
|
})
|
package/source/Directive.ts
CHANGED
|
@@ -1,17 +1,21 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import type { IncomingMessage, OutgoingMessage } from './HTTP'
|
|
2
|
+
import type { Remotes } from './Remotes'
|
|
3
|
+
import type { Output } from './io'
|
|
3
4
|
import type * as RTD from './RTD'
|
|
4
5
|
|
|
5
6
|
export class Directives implements RTD.Directives<Directives> {
|
|
6
|
-
private readonly
|
|
7
|
+
private readonly sets: DirectiveSet[]
|
|
7
8
|
|
|
8
|
-
public constructor (
|
|
9
|
-
this.
|
|
9
|
+
public constructor (sets: DirectiveSet[]) {
|
|
10
|
+
this.sets = sets
|
|
10
11
|
}
|
|
11
12
|
|
|
12
13
|
public async preflight (request: IncomingMessage, parameters: RTD.Parameter[]): Promise<Output> {
|
|
13
|
-
for (const
|
|
14
|
-
|
|
14
|
+
for (const set of this.sets) {
|
|
15
|
+
if (set.family.preflight === undefined)
|
|
16
|
+
continue
|
|
17
|
+
|
|
18
|
+
const output = await set.family.preflight(set.directives, request, parameters)
|
|
15
19
|
|
|
16
20
|
if (output !== null) {
|
|
17
21
|
await this.settle(request, output)
|
|
@@ -24,13 +28,13 @@ export class Directives implements RTD.Directives<Directives> {
|
|
|
24
28
|
}
|
|
25
29
|
|
|
26
30
|
public async settle (request: IncomingMessage, response: OutgoingMessage): Promise<void> {
|
|
27
|
-
for (const
|
|
28
|
-
if (
|
|
29
|
-
await
|
|
31
|
+
for (const set of this.sets)
|
|
32
|
+
if (set.family.settle !== undefined)
|
|
33
|
+
await set.family.settle(set.directives, request, response)
|
|
30
34
|
}
|
|
31
35
|
|
|
32
36
|
public merge (directives: Directives): void {
|
|
33
|
-
this.
|
|
37
|
+
this.sets.push(...directives.sets)
|
|
34
38
|
}
|
|
35
39
|
}
|
|
36
40
|
|
|
@@ -61,7 +65,7 @@ export class DirectivesFactory implements RTD.DirectivesFactory<Directives> {
|
|
|
61
65
|
const family = this.families[declaration.family]
|
|
62
66
|
|
|
63
67
|
if (family === undefined)
|
|
64
|
-
throw new Error(`Directive family '${declaration.family}' not found.`)
|
|
68
|
+
throw new Error(`Directive family '${declaration.family}' is not found.`)
|
|
65
69
|
|
|
66
70
|
const directive = family.create(declaration.name, declaration.value, this.remtoes)
|
|
67
71
|
|
|
@@ -100,9 +104,11 @@ export interface Family<TDirective = any, TExtension = any> {
|
|
|
100
104
|
readonly name: string
|
|
101
105
|
readonly mandatory: boolean
|
|
102
106
|
|
|
107
|
+
// produce: (declarations: RTD.syntax.Directive[], remotes: Remotes) => TDirective[]
|
|
108
|
+
|
|
103
109
|
create: (name: string, value: any, remotes: Remotes) => TDirective
|
|
104
110
|
|
|
105
|
-
preflight
|
|
111
|
+
preflight?: (directives: TDirective[],
|
|
106
112
|
request: IncomingMessage & TExtension,
|
|
107
113
|
parameters: RTD.Parameter[]) => Output | Promise<Output>
|
|
108
114
|
|
|
@@ -115,6 +121,3 @@ interface DirectiveSet {
|
|
|
115
121
|
family: Family
|
|
116
122
|
directives: any[]
|
|
117
123
|
}
|
|
118
|
-
|
|
119
|
-
export type Input = IncomingMessage
|
|
120
|
-
export type Output = OutgoingMessage | null
|
package/source/Factory.ts
CHANGED
|
@@ -4,19 +4,18 @@ import { Remotes } from './Remotes'
|
|
|
4
4
|
import { Tree, syntax } from './RTD'
|
|
5
5
|
import { Server } from './HTTP'
|
|
6
6
|
import { type Endpoint, EndpointsFactory } from './Endpoint'
|
|
7
|
-
import
|
|
8
|
-
import { type Directives, DirectivesFactory
|
|
7
|
+
import { families, interceptors } from './directives'
|
|
8
|
+
import { type Directives, DirectivesFactory } from './Directive'
|
|
9
9
|
import { Composition } from './Composition'
|
|
10
10
|
import * as root from './root'
|
|
11
|
+
import { Interception } from './Interception'
|
|
11
12
|
import type { Connector, Locator, extensions } from '@toa.io/core'
|
|
12
13
|
|
|
13
14
|
export class Factory implements extensions.Factory {
|
|
14
15
|
private readonly boot: Bootloader
|
|
15
|
-
private readonly families: Family[]
|
|
16
16
|
|
|
17
17
|
public constructor (boot: Bootloader) {
|
|
18
18
|
this.boot = boot
|
|
19
|
-
this.families = directives.families
|
|
20
19
|
}
|
|
21
20
|
|
|
22
21
|
public tenant (locator: Locator, node: syntax.Node): Connector {
|
|
@@ -32,16 +31,18 @@ export class Factory implements extensions.Factory {
|
|
|
32
31
|
const remotes = new Remotes(this.boot)
|
|
33
32
|
const node = root.resolve()
|
|
34
33
|
const methods = new EndpointsFactory(remotes)
|
|
35
|
-
const directives = new DirectivesFactory(
|
|
34
|
+
const directives = new DirectivesFactory(families, remotes)
|
|
35
|
+
const interception = new Interception(interceptors)
|
|
36
36
|
const tree = new Tree<Endpoint, Directives>(node, methods, directives)
|
|
37
37
|
|
|
38
38
|
const composition = new Composition(this.boot)
|
|
39
|
-
const gateway = new Gateway(broadcast, server, tree)
|
|
39
|
+
const gateway = new Gateway(broadcast, server, tree, interception)
|
|
40
40
|
|
|
41
41
|
gateway.depends(remotes)
|
|
42
42
|
gateway.depends(composition)
|
|
43
|
+
server.depends(gateway)
|
|
43
44
|
|
|
44
|
-
return
|
|
45
|
+
return server
|
|
45
46
|
}
|
|
46
47
|
}
|
|
47
48
|
|
package/source/Gateway.ts
CHANGED
|
@@ -1,25 +1,31 @@
|
|
|
1
1
|
import { type bindings, Connector } from '@toa.io/core'
|
|
2
|
-
import { type Maybe } from '@toa.io/types'
|
|
3
2
|
import * as http from './HTTP'
|
|
4
3
|
import { rethrow } from './exceptions'
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
4
|
+
import type { Interceptor } from './Interception'
|
|
5
|
+
import type { Maybe } from '@toa.io/types'
|
|
6
|
+
import type { Method, Parameter, Tree } from './RTD'
|
|
7
|
+
import type { Label } from './discovery'
|
|
8
|
+
import type { Branch } from './Branch'
|
|
9
|
+
import type { Endpoint } from './Endpoint'
|
|
10
|
+
import type { Directives } from './Directive'
|
|
10
11
|
|
|
11
12
|
export class Gateway extends Connector {
|
|
12
13
|
private readonly broadcast: Broadcast
|
|
13
14
|
private readonly tree: Tree<Endpoint, Directives>
|
|
15
|
+
private readonly interceptor: Interceptor
|
|
16
|
+
private readonly server: Connector
|
|
14
17
|
|
|
15
|
-
|
|
18
|
+
// eslint-disable-next-line max-params, max-len
|
|
19
|
+
public constructor (broadcast: Broadcast, server: http.Server, tree: Tree<Endpoint, Directives>, interception: Interceptor) {
|
|
16
20
|
super()
|
|
17
21
|
|
|
18
22
|
this.broadcast = broadcast
|
|
19
23
|
this.tree = tree
|
|
24
|
+
this.interceptor = interception
|
|
25
|
+
this.server = server
|
|
20
26
|
|
|
21
27
|
this.depends(broadcast)
|
|
22
|
-
this.depends(server)
|
|
28
|
+
// this.depends(server)
|
|
23
29
|
|
|
24
30
|
server.attach(this.process.bind(this))
|
|
25
31
|
}
|
|
@@ -35,6 +41,11 @@ export class Gateway extends Connector {
|
|
|
35
41
|
}
|
|
36
42
|
|
|
37
43
|
private async process (request: http.IncomingMessage): Promise<http.OutgoingMessage> {
|
|
44
|
+
const interception = await this.interceptor.intercept(request)
|
|
45
|
+
|
|
46
|
+
if (interception !== null)
|
|
47
|
+
return interception
|
|
48
|
+
|
|
38
49
|
const match = this.tree.match(request.path)
|
|
39
50
|
|
|
40
51
|
if (match === null)
|
|
@@ -68,6 +79,9 @@ export class Gateway extends Connector {
|
|
|
68
79
|
|
|
69
80
|
const body = await request.parse()
|
|
70
81
|
|
|
82
|
+
if ('embed' in request && typeof body === 'object' && body !== null)
|
|
83
|
+
Object.assign(body, request.embed)
|
|
84
|
+
|
|
71
85
|
const reply = await method.endpoint
|
|
72
86
|
.call(body, request.query, parameters)
|
|
73
87
|
.catch(rethrow) as Maybe<unknown>
|