lib/redis_token.rb in redis_token-0.0.6 vs lib/redis_token.rb in redis_token-0.0.7

- old
+ new

@@ -7,11 +7,11 @@ require 'time' class RedisToken # Token lives 14 days by default DEFAULT_TTL = 14 * 24 * 60 * 60 - DEFAULT_PREFIX = 'tokens.'.freeze + DEFAULT_PREFIX = 'tokens'.freeze attr_reader :redis attr_accessor :default_ttl attr_accessor :prefix attr_reader :created_value @@ -41,23 +41,24 @@ end end # Create a new token # - # @param [String] owner owner of a token, e.g. 'client.1' or 'user-123' # @param [Hash] args + # @option args [String] :owner owner of a token, e.g. 'client.1' or 'user-123' # @option args [String] :token (SecureRandom.hex(16)) user defined token # @option args :payload # @option args [Integer] :ttl redefines the default ttl # # @return [String] a new token - def create(owner, args = {}) - raise 'owner should be specified' unless owner - + def create(args = {}) token = args[:token] || generate_token - value = { owner: owner, at: Time.now.to_i } + value = { at: Time.now.to_i } + owner = args[:owner] + value[:owner] = owner if owner + payload = args[:payload] value[:payload] = payload if payload @created_value = value key_ttl = args[:ttl] || @default_ttl @@ -104,10 +105,11 @@ # @return [Boolean] def set(token, args = {}) key = token_to_key(token) value = redis_get(key) return false unless value + value[:payload] = args[:payload] key_ttl = args[:ttl] || @redis.ttl(key) @redis.multi do |multi| @@ -122,19 +124,33 @@ # # @param [String] owner # # @return [Enumerator] def owned_by(owner) - owned_tokens(owner).map { |token| [token, redis_get(token_to_key(token))] } + owned_tokens(owner) end + # Tokens without an owner + # + # @return [Enumerator] + def without_owner + owned_tokens + end + + # All tokens + # + # @return [Enumerator] + def all + all_tokens + end + # Delete a token # # @param [String] token # # @return [Boolean] - def del(token) + def delete(token) key = token_to_key(token) value = redis_get(key) return false unless value @redis.multi do |multi| @@ -143,28 +159,34 @@ end true end - alias delete del + alias del delete # Delete all tokens of an owner # # @params [String] owner # # @return [Integer] number of deleted tokens - def del_all(owner) - deleted = 0 - owned_tokens(owner).each do |token| - del(token) - deleted += 1 - end + def delete_owned_by(owner) + delete_tokens(owned_tokens(owner)) + end - deleted + # Delete tokens without an owner + # + # @return [Integer] number of deleted tokens + def delete_without_owner + delete_tokens(owned_tokens) end - alias delete_all del_all + # Delete all tokens + # + # @return [Integer] number of deleted tokens + def delete_all + delete_tokens(all_tokens) + end # Retrieve the remaining ttl of a token # # @return [Integer] ttl def ttl(token) @@ -199,11 +221,11 @@ # def unpack(value) # MessagePack.unpack(value) # end # end # - # RedisToken.new(prefix: PREFIX).use(MsgPackSerializer) + # r = RedisToken.new.use(MsgPackSerializer) # # @param [Object] serializer_class # # @return [RedisToken] def use(serializer_class) @@ -224,49 +246,67 @@ @serializer_class = args[:serializer_class] @serializer_class = Serializers::Native unless @serializer_class end def token_to_key(token) - "#{@prefix}#{token}" + "#{@prefix}.t.#{token}" end def token_to_owner(owner, token) - "#{@prefix}#{owner}.#{token}" + "#{@prefix}.o.#{owner}.#{token}" end def owner_key_to_token(owner, key) - key.sub("#{@prefix}#{owner}.", '') + key.sub("#{@prefix}.o.#{owner}.", '') end + def key_to_token(key) + key.sub("#{@prefix}.t.", '') + end + def redis_get(key) value = @redis.get(key) return unless value serializer.unpack(value) end - def owned_tokens(owner) - mask = "#{@prefix}#{owner}.*" + def owned_tokens(owner = nil) + iterator(owner) + end + def all_tokens + iterator(nil, true) + end + + def iterator(owner = nil, all = false) + mask = all ? "#{@prefix}.t.*" : "#{@prefix}.o.#{owner}.*" + Enumerator.new do |y| cursor = '0' loop do cursor, r = @redis.scan(cursor, match: mask) r.each do |key| - token = owner_key_to_token(owner, key) - y << token + y << (all ? key_to_token(key) : owner_key_to_token(owner, key)) end break if cursor == '0' end end end + def delete_tokens(enum) + enum.reduce(0) do |deleted, token| + del(token) + deleted += 1 + end + end + def serializer @serializer ||= @serializer_class.new end # Some serializers can't store symbols out of the box def hash_get(hash, sym) - hash.key?(sym) ? hash[sym] : hash[sym.to_s] + hash.fetch(sym, hash[sym.to_s]) end end