1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
[]
= "sofie-http"
= "The HTTP server, areas, routes and the handler model."
= true
= true
= true
= true
= true
[]
= ["engine"]
# A debug build's 500 carries its internal error in `x-sofie-test-error`, which sofie-testing
# shows; a release build never does.
= []
# Screens, htmx notices and the engine's assets; a JSON-only API leaves it out.
= ["dep:sofie-engine", "dep:sofie-values"]
# Screens from template text, parsed at boot (`screens_from_sources`,
# `Screens::add_source`); a built app loads its screens compiled by its
# build script.
= ["engine", "sofie-engine/parse"]
# `Screen::render`: a handler choosing its screen as it runs.
= ["engine"]
# Screens and notices in the language each request negotiates, from the
# app's translations; see `Screens::translate`.
= ["engine", "gates", "sofie-engine/i18n"]
# Each further feature is a route modifier or app hook that not every app
# needs; an app enables the ones it uses.
# `.idempotent()` actions, answered once per `Idempotency-Key`.
= ["sofie-db/idempotency"]
# `.signed()` routes and the `SignedUrls` that sign links to them.
= []
# `App::trusted_proxies`: the client address a proxy forwards; without
# it the client is the connection's peer.
= []
# `App::step` and `App::step_all`: an app's own checks on requests and
# headers on answers, per area or app-wide.
= []
# `App::cors`: cross-origin calls per area, preflights answered by the
# framework, origins also from `SOFIE_CORS_ORIGINS`.
= []
# `Routes::webhook`: verified deliveries, answered once per delivery id.
= ["idempotency"]
# Feature flags: `.feature(…)` routes, `Features` and `Gates::features`.
= ["gates", "dep:sofie-flags"]
# `Permitted` areas: a permission per route, held through grants.
= ["gates"]
# `Gates::entitlements`: `.entitled(…)` routes and menu entries and
# `entitled(…)` in screens, held as a principal's plan grants them.
= ["gates"]
# `App::gates`, which flags, permissions and entitlements decide through;
# turned on by any of them, not on its own. Screens ask them with `can(…)` and `enabled(…)`.
= ["sofie-engine?/gates"]
# `Listing` and `Listed`: a list screen's page, order and filters, from its
# query, which a `Table` links through.
= ["engine", "gates", "sofie-db/listing", "sofie-engine/listing", "sofie-values/filter"]
# `Routes::resource`: an aggregate's screens with no template file.
= ["gates", "listing", "parse", "sofie-db/resources"]
# With `resources`, a show screen lists the record's history.
= ["sofie-db/history"]
# `Routes::group`: routes under a parent's path; a child bound outside its
# parent is not found.
= ["gates", "sofie-db/children"]
# `App::menu`: each area's navigation from its modules' menu entries.
= ["engine", "gates"]
# `Area::TOKENS`: an area accepts `Authorization: Bearer` beside its session
# cookie, its scopes narrowing a `Permitted` area's grants.
= ["permissions"]
# `AreaMembers::session_record`: every cookie's session is asked of a store,
# so one can be listed and ended from elsewhere; answers are cached per
# instance until the store's sessions change, here or on another instance.
= ["client-headers", "sofie-db/live"]
# `Session::user_agent` and `Session::origin`: what the client says of itself.
= []
# `Session::begin_flow` and `flow`: a short-lived cookie tying a flow through
# another site, such as an OAuth sign-in, to the browser that began it.
= []
# Attacks told apart by behaviour: slowed down, blocked and reported per
# caller, sign-in locked per account (`Serving::shield`, `SignIns`).
= ["sofie-db/shield"]
# Request and handler durations, the database's metrics and `/metrics`,
# read with the app's metrics token.
= ["sofie-telemetry/metrics", "sofie-db/metrics"]
# The engine's client sends Web Vitals, errors, navigations and long tasks
# to `/_sofie/telemetry`.
= ["engine"]
# `Routes::island` and `<Island …/>`: Svelte components mounted with their
# loader's data, each area's bundle served and loaded on its pages.
= ["engine", "sofie-engine/islands"]
# Client areas: screens compiled into Svelte or React components, served as a
# page shell with the first screen's envelope and answering later navigations
# with `application/vnd.sofie.screen+json`.
= ["engine", "gates", "sofie-engine/clients"]
# `sofie dev`: debug builds reload a page when the server restarts or a
# template changes, and load rebuilt islands again (`/_sofie/dev/…`); release
# builds leave it out.
= ["engine", "parse", "sofie-engine/development"]
# Debug builds show each page's span tree under it, with forms to act as
# another principal, override flags and move the clock for one browser;
# release builds leave it out.
= ["engine", "sofie-telemetry/development", "sofie-flags?/toolbar", "sofie-core/development"]
# Text answers of 1 KiB or more compressed with Brotli or gzip as the client
# accepts, and the engine's assets sent as compressed at build time.
= ["dep:brotli", "dep:flate2", "sofie-engine?/compression"]
# `PageRoute::live`: an open screen refetches its fragments when a record its
# loader read changes, told by a server-sent event stream per area.
= ["engine", "sofie-db/live"]
# `PageRoute::cached`: a screen's loaded reply kept per path, query and reach
# until a record it read changes on any instance, or its time runs out.
= ["engine", "sofie-db/live"]
# `Routes::queue`: a route queueing a `#[job]` action with the request's input.
= ["sofie-db/jobs"]
# `ETag`s from the rows a loader read and `304` to a held one without
# rendering; such answers are `private, no-cache` instead of `no-store`.
# Off with `development`, whose templates change on disk without a read.
= ["sofie-db/etag"]
# A split app serving its contracts, lookups and event feed to the apps it
# left (`Served::serve`), and every handler acting for its principal in the
# contract calls it makes.
= ["dep:serde", "sofie-db/remote-contracts"]
# `Serving::storage`: a `Storage` handlers take, its signed `/_sofie/files/`
# links answered (streamed) before routing.
= ["dep:sofie-storage", "tokio/sync"]
# `multipart/form-data` forms, each file streamed into the storage as an
# `Upload` input field, within `.body_limit(…)` and `.file_limit(…)`.
= ["engine", "storage", "dep:serde", "serde/derive"]
# Product events a request raises name its principal, for reports kept in the database.
= ["sofie-telemetry/product-events"]
# `.document(Media::Csv)` answering a list of records as CSV, and `CsvRows` reading one into inputs.
= []
# `Serving::tls`: HTTPS on the app's own address, HTTP/2 negotiated by ALPN.
= ["dep:rustls", "dep:tokio-rustls"]
[]
= { = true, = true }
= true
= { = true, = true }
= true
= true
= true
= { = true, = true }
= { = true, = true }
= { = true, = true }
= true
= { = true, = true }
= true
= true
= true
= true
= true
= { = true, = true }
= { = true, = true }
= true
= { = true, = ["net", "sync", "time"] }
= { = true, = true }
= true
[]
# So `tests/clients.rs`, `etag.rs`, `cors.rs`, `live.rs`, `middleware.rs`, `session_cache.rs`,
# `tls.rs` and `uploads.rs` run in every test run; the tests parse their screens.
= { = ".", = false, = ["clients", "cors", "csv", "etag", "live", "parse", "session-list", "steps", "tls", "uploads"] }
= true
= { = "../sofie-storage", = ["local"] }
= { = "../sofie-telemetry", = ["capture", "product-events"] }
= { = "../sofie-testing" }
= { = true, = ["io-util", "macros", "sync", "test-util"] }
= true
[]
= true