<commit_before>class Events
  activeTab: null

  constructor: ->
    @$ = $ this
    @setupListeners()

  setupListeners: ->
    chrome.runtime.onMessage.addListener @onMessage

  onMessage: (req, sender) =>
    @activeTab = sender.tab
    @trigger(req.event, req.data) if req.event

  trigger: (eventName, eventData) =>
    @$.trigger eventName, eventData

  sendTrigger: (eventName, eventData) =>
    chrome.tabs.sendMessage @activeTab?.id, { event: eventName, data: eventData }

  globalTrigger: (eventName, eventData) =>
    @trigger eventName, eventData
    @sendTrigger eventName, eventData

window.Events = new Events
<commit_msg>Don't send message if tab id is undefined<commit_after>class Events
  activeTab: null

  constructor: ->
    @$ = $ this
    @setupListeners()

  setupListeners: ->
    chrome.runtime.onMessage.addListener @onMessage

  onMessage: (req, sender) =>
    @activeTab = sender.tab
    @trigger(req.event, req.data) if req.event

  trigger: (eventName, eventData) =>
    @$.trigger eventName, eventData

  sendTrigger: (eventName, eventData) =>
    return unless @activeTab?.id
    chrome.tabs.sendMessage @activeTab.id, { event: eventName, data: eventData }

  globalTrigger: (eventName, eventData) =>
    @trigger eventName, eventData
    @sendTrigger eventName, eventData

window.Events = new Events

{'fraction_non_alphanumeric': 0.11619190404797601, 'fraction_numerical': 0.0, 'mean_word_length': 3.8369565217391304, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 15, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1186556', 'n_tokens_mistral': 419, 'n_tokens_neox': 405, 'n_words': 102}