36 lines · 1.6 KB · TypeScript
RawDownload
// ---------------------------------------------------------------------------// Login state — the OAuth `state` parameter for the WorkOS login round trip.//// `state` exists for CSRF (the callback checks it against the wos-login-state// cookie), and OAuth round-trips it verbatim — which makes it the natural// carrier for `returnTo` too: base64url(JSON { nonce, returnTo }). One value,// one cookie, and the destination is covered by the same timing-safe// comparison that authenticates the nonce.//// Decoding is total: anything that isn't our encoding reads as null, because// the callback can also be reached by WorkOS-initiated redirects whose state// (if any) we never minted.// --------------------------------------------------------------------------- import { Encoding, Option, Result, Schema } from "effect"; const LoginStateSchema = Schema.Struct({  nonce: Schema.String,  returnTo: Schema.optional(Schema.String),}); export type LoginState = typeof LoginStateSchema.Type; const LoginStateFromJson = Schema.fromJsonString(LoginStateSchema);const decodeLoginStateJson = Schema.decodeUnknownOption(LoginStateFromJson);const encodeLoginStateJson = Schema.encodeSync(LoginStateFromJson); export const encodeLoginState = (state: LoginState): string =>  Encoding.encodeBase64Url(encodeLoginStateJson(state)); /** Decode a state value back; null for anything we didn't mint. */export const decodeLoginState = (value: string | null | undefined): LoginState | null => {  if (!value) return null;  const json = Result.getOrNull(Encoding.decodeBase64UrlString(value));  return json === null ? null : Option.getOrNull(decodeLoginStateJson(json));};