framework/gate
面の入口の門(0.11.1)。面 package の src/gate.gleam に pub const gate: Gate を 1 つ置くと、
生成器が src/gen/gate.mjs を書き、生成 shell の lifecycle hook(before_route / after_response)から呼ぶ。
Page の数だけ書かない ── 門は Match で Page 群を指す。Prefix("/me") は /me と /me/* の全 Page、
Every は面の全 Page、except で除く Page を持つ。Page を足しても宣言は書き換えない。
path は Page の route の綴り(フォルダの木、arg_x は :x、_ はそのまま)で書く。URL の段の - は
フォルダの _ に対応する(生成器の規則。/for-stores/api/v1 は pages/for_stores/api/v1)。
src/gate.gleam が無い面は、入口 Http の admit: Authenticated と subject: Subjects([..]) から
既定の門(session が読めない・主体が違えば 403 / 404)を生成器が出す。宣言を置いた面では宣言が既定に代わる。
値の運び(route の値・session・Page の query を読みへ渡すこと)はここに置かない。門が持つのは 「通すか・どこへ返すか」と、応答に足す header / script だけ。
Types
pub type Fail {
ToSignIn(status: Int, back: Bool)
Deny(status: Int, body: String)
RedirectTo(location: String)
}
Constructors
-
ToSignIn(status: Int, back: Bool)sign-in へ
status(302 / 303)。backならredirect_uriに要求の URL を付ける。 -
Deny(status: Int, body: String)statusと本文(text/plain)で止める。 -
RedirectTo(location: String)302 で面の中の path へ返す。
pub type Gate {
Gate(
sign_in: SignIn,
rules: List(Rule),
redirects: List(Redirect),
frame_src: List(Match),
pageview: Pageview,
)
}
Constructors
-
Gate( sign_in: SignIn, rules: List(Rule), redirects: List(Redirect), frame_src: List(Match), pageview: Pageview, )Arguments
- sign_in
-
sign-in へ返す先。origin は env
PUBLIC_IDP_ORIGIN、空ならfallback_origin。 - rules
-
宣言順に評価する。最初に落ちた検査の応答を返す。
- redirects
-
門を通った後の条件つきの redirect。宣言順で最初に当たったものを返す。
- frame_src
-
入口
Httpのframe_srcをContent-Security-Policy: frame-srcとして付ける Page(HTML の応答だけ)。
pub type Match {
Exact(path: String)
Prefix(path: String)
Every
}
Constructors
-
Exact(path: String)Page の route そのもの(
/claim/:code)。 -
Prefix(path: String)その path の Page と、その下の全 Page(
/me→/me,/me/chats/:id, ..)。 -
Every面の全 Page。
pub type Pageview {
NoPageview
Pageview(
pages: List(Match),
endpoint: String,
source_param: String,
storage_key: String,
)
}
Constructors
-
NoPageview -
Pageview( pages: List(Match), endpoint: String, source_param: String, storage_key: String, )pagesの Page が 200 の HTML を返し、session が成人なら、</body>の前に pageview の script を差す。 script はendpointへ POST し、querysource_paramの値([a-z0-9_]{1,16})をsource_keyに載せる。
pub type SignIn {
SignIn(path: String, fallback_origin: String)
}
Constructors
-
SignIn(path: String, fallback_origin: String)
pub type To {
SafeParam(param: String, fallback: String)
Fixed(location: String)
}
Constructors
-
SafeParam(param: String, fallback: String)302 → query
paramの値。面の中の path でなければfallback。 -
Fixed(location: String)302 → 決まった path。