///|
fn BidiProtocol::resolve_realms_list(
self : BidiProtocol,
request_id : Int,
params : Json?,
) -> Array[Json]? {
let context_filter = match get_param_raw(params, "context") {
Some(String(ctx_id)) => {
if !self.manager.has_session(ctx_id) {
self.send_error(
request_id,
"no such frame",
"Unknown context: " + ctx_id,
)
return None
}
Some(ctx_id)
}
None => None
Some(_) => {
self.send_error(
request_id, "invalid argument", "context must be a string",
)
return None
}
}
match get_param_raw(params, "type") {
Some(String(t)) =>
if t != "window" {
self.send_error(request_id, "invalid argument", "type must be 'window'")
return None
}
None => ()
Some(_) => {
self.send_error(request_id, "invalid argument", "type must be a string")
return None
}
}
let realms : Array[Json] = []
for ctx_id in self.manager.list_sessions() {
let should_include = match context_filter {
Some(filter_ctx) => filter_ctx == ctx_id
None => true
}
if should_include {
let realm_id = self.context_realm.get(ctx_id).unwrap_or("realm-" + ctx_id)
let origin = self.get_context_origin(ctx_id)
realms.push(
make_object({
"realm": Json::string(realm_id),
"context": Json::string(ctx_id),
"type": Json::string("window"),
"origin": Json::string(origin),
"sandbox": Json::null(),
}),
)
let prefix = ctx_id + "::"
for key, sandbox_realm in self.context_sandbox_realm {
if key.has_prefix(prefix) {
let sandbox_name = key.unsafe_substring(
start=prefix.length(),
end=key.length(),
)
realms.push(
make_object({
"realm": Json::string(sandbox_realm),
"context": Json::string(ctx_id),
"type": Json::string("window"),
"origin": Json::string(origin),
"sandbox": Json::string(sandbox_name),
}),
)
}
}
}
}
Some(realms)
}