Skip to content

Hypermodel after_commit handler is dropping errors instead of raising #453

Open
@catmando

Description

@catmando

in the after_commit method of hypermodel, the SendPacket operation is run which will return a promise, but it is not checked for an error state.

def self.after_commit(operation, model)
  # Calling public_columns_hash once insures all policies are loaded
  # before the first broadcast.
  @public_columns_hash ||= ActiveRecord::Base.public_columns_hash
  Hyperstack::InternalPolicy.regulate_broadcast(model) do |data|
    puts "Broadcast aftercommit hook: #{data}" if Hyperstack::Connection.show_diagnostics

    if !Hyperstack.on_server? && Hyperstack::Connection.root_path
      send_to_server(operation, data, model.__synchromesh_update_time) rescue nil # fails if server no longer running so ignore
    else
      SendPacket.run(data, operation: operation, updated_at: model.__synchromesh_update_time)
    end
  end
rescue ActiveRecord::StatementInvalid => e
  raise e unless e.message == "Could not find table 'hyperstack_connections'"
end unless RUBY_ENGINE == 'opal'

The line containing SendPacket should be

SendPacket.run(data, operation: operation, updated_at: model.__synchromesh_update_time).tap { |p| raise p.error if p.error }

The easiest way to patch this is by adding this:

module Hyperstack
  class InternalPolicy
    alias original_send_message send_message
    def send_message(*args, &block)
      original_send_message(*args, &block).tap { |p| raise p.error if p.is_a?(Promise) && p.error }
    end  
  end
end

This will catch the error with the smallest patch. Note the patch needs to check if its a promise, but the actual fix does not.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions