///|
/// Check if subscribed to event for a specific context
fn BidiProtocol::is_subscribed_for_context(
self : BidiProtocol,
event : String,
ctx_id : String,
) -> Bool {
let module_key = get_subscription_key(event)
let blocked_global = array_contains(
self.subscription_state.global_unsubscribed_events,
event,
)
// Check legacy module-level subscription
if !blocked_global &&
self.subscription_state.subscriptions.get(module_key).unwrap_or(false) {
return true
}
// Check global subscriptions (exact event match or module match)
for sub in self.subscription_state.global_subscriptions {
if sub == event {
return true
}
if !blocked_global && sub == module_key {
return true
}
}
// Check context-specific subscriptions (including ancestors).
if self.is_subscribed_for_context_chain(event, module_key, ctx_id) {
return true
}
// Check user-context subscriptions for this browsing context.
let user_ctx = self.context_user_context.get(ctx_id).unwrap_or("default")
match self.subscription_state.user_context_subscriptions.get(user_ctx) {
Some(events) =>
for sub in events {
if sub == event || sub == module_key {
return true
}
}
None => ()
}
false
}
///|
/// Check context-specific subscriptions for context and its ancestors.
fn BidiProtocol::is_subscribed_for_context_chain(
self : BidiProtocol,
event : String,
module_key : String,
ctx_id : String,
) -> Bool {
match self.subscription_state.context_subscriptions.get(ctx_id) {
Some(events) =>
for sub in events {
if sub == event || sub == module_key {
return true
}
}
None => ()
}
match self.context_parent.get(ctx_id) {
Some(parent_ctx_id) =>
self.is_subscribed_for_context_chain(event, module_key, parent_ctx_id)
None => false
}
}
///|
/// Normalize subscription key
fn get_subscription_key(name : String) -> String {
let buf = StringBuilder::new()
for c in name.iter() {
if c == '.' {
break
}
buf.write_char(c)
}
let key = buf.to_string()
if key.length() == 0 {
name
} else {
key
}
}
///|
/// Check whether module is globally subscribed as a module key.
fn BidiProtocol::has_global_module_subscription(
self : BidiProtocol,
module_key : String,
) -> Bool {
array_contains(self.subscription_state.global_subscriptions, module_key)
}
///|
/// Check whether event is effectively globally subscribed.
fn BidiProtocol::has_global_event_subscription(
self : BidiProtocol,
event_name : String,
) -> Bool {
if array_contains(
self.subscription_state.global_unsubscribed_events,
event_name,
) {
return false
}
let module_key = get_subscription_key(event_name)
for sub in self.subscription_state.global_subscriptions {
if sub == event_name || sub == module_key {
return true
}
}
false
}
///|
/// Check whether module has any event-level global overrides.
fn BidiProtocol::has_global_event_override_for_module(
self : BidiProtocol,
module_key : String,
) -> Bool {
for event_name in self.subscription_state.global_unsubscribed_events {
if get_subscription_key(event_name) == module_key {
return true
}
}
false
}