# Lib require 'securerandom' require 'net/http' require 'ostruct' require 'json' require 'time' require 'cgi' require 'logger' require 'concurrent' # Base require 'hawkei/version' require 'hawkei/formated_logger' require 'hawkei/library_name' require 'hawkei/util' require 'hawkei/config' require 'hawkei/errors' require 'hawkei/hawkei_object' require 'hawkei/request' require 'hawkei/api_resource' require 'hawkei/store' require 'hawkei/message' # Processor require 'hawkei/processor/async' require 'hawkei/processor/worker' require 'hawkei/processor/batch' # Operations require 'hawkei/api_operation/save' require 'hawkei/api_operation/delete' # Resources require 'hawkei/watcher' require 'hawkei/batch' # Plugins require 'hawkei/plugins' ## # Implementation of the Hawkei module Hawkei class << self TRACK_EVENTS_CREATE = 'track_events:create'.freeze IDENTIFY_EVENTS_CREATE = 'identify_events:create'.freeze GROUP_EVENTS_CREATE = 'group_events:create'.freeze WATCHERS_CREATE_ACTION = 'watchers:create'.freeze ## # @return [Hawkei::Config] configurations attr_reader :configurations ## # Configures the Hawkei API # # @example Default configuration # Hawkei.configure do |config| # config.api_key = 'acc_xx' # config.space_name = 'Hawkei' # config.environment_name = 'production' # end def configure yield @configurations = Hawkei::Config.new Hawkei.configurations.valid! end ## # Send a track event to the server # # @param [String] event name # @param [Hash] payload to be send # @param [Hash] options for the request # # @return [Boolean] status of the request def track(name, payload = {}, options = {}) return true unless configurations.enabled payload[:name] = name Hawkei::Plugins::Rails::Data.store_data if defined?(Hawkei::Plugins::Rails::Data) payload = Message.extended.merge(payload) processor.enqueue( action: TRACK_EVENTS_CREATE, payload: payload, options: options.select { |k, _v| %i[space_name environment_name].include?(k) }, ) end ## # Send an identify event to the server # # @param [String] user id from your database # @param [Hash] payload to be send # @param [Hash] options for the request # # @return [Boolean] status of the request def identify(user_id, payload = {}, options = {}) return true unless configurations.enabled payload[:user_id] = user_id Hawkei::Plugins::Rails::Data.store_data if defined?(Hawkei::Plugins::Rails::Data) payload = Message.extended.merge(payload) processor.enqueue( action: IDENTIFY_EVENTS_CREATE, payload: payload, options: options.select { |k, _v| %i[space_name environment_name].include?(k) }, ) end ## # Send a create/update for a group # # @param [String] group id from your database # @param [Hash] payload to be send # @param [Hash] options for the request # # @return [Boolean] status of the request def group(group_id, payload = {}, options = {}) return true unless configurations.enabled payload = Message.base.merge(payload) payload[:group_id] = group_id processor.enqueue( action: GROUP_EVENTS_CREATE, payload: payload, options: options.select { |k, _v| %i[space_name environment_name].include?(k) }, ) end ## # Send a create a watcher # # @param [String|Integer] template hawkei name or id # @param [Hash] payload to be send # @param [Hash] options for the request # # @return [Boolean|Watcher] status of the request def watch(flow, payload = {}, options = {}) return true unless configurations.enabled payload[:template_flow] = flow payload = Message.base.merge(payload) payload.delete(:session_tracker_id) if payload.delete(:without_session) if options[:sync] Watcher.create(payload, options) else processor.enqueue( action: WATCHERS_CREATE_ACTION, payload: payload, options: options.select { |k, _v| %i[space_name environment_name].include?(k) }, ) end end private def processor @processor ||= Processor::Async.new end end end