Class: Async::Limiter::Token

Inherits:
Object
  • Object
show all
Defined in:
lib/async/limiter/token.rb

Overview

Token that represents an acquired resource and can be used to release or re-acquire.

Tokens provide advanced resource management by encapsulating both the acquired resource and the acquisition options (timeout, cost, priority, etc.). This enables re-acquisition with modified parameters while maintaining the original context.

The token automatically tracks release state using the resource itself as the state indicator (nil = released, non-nil = acquired).

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(limiter, resource = nil) ⇒ Token

Initialize a new token.



48
49
50
51
# File 'lib/async/limiter/token.rb', line 48

def initialize(limiter, resource = nil)
	@limiter = limiter
	@resource = resource
end

Instance Attribute Details

#resourceObject (readonly)

Returns the value of attribute resource.



54
55
56
# File 'lib/async/limiter/token.rb', line 54

def resource
  @resource
end

Class Method Details

.acquire(limiter, **options, &block) ⇒ Object

Acquire a token from a limiter.

This class method provides a clean way to acquire tokens without adding token-specific methods to limiter classes.



31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/async/limiter/token.rb', line 31

def self.acquire(limiter, **options, &block)
	resource = limiter.acquire(**options)
	return nil unless resource
	
	token = new(limiter, resource)
	
	return token unless block_given?
	
	begin
		yield(token)
	ensure
		token.release
	end
end

Instance Method Details

#acquire(**options, &block) ⇒ Object

Re-acquire the resource with modified options.

This allows changing acquisition parameters (timeout, cost, priority, etc.) while maintaining the token context. The current resource is released and a new one is acquired with the merged options.



75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/async/limiter/token.rb', line 75

def acquire(**options, &block)
	raise "Token already acquired!" if @resource
	
	@resource = @limiter.acquire(reacquire: true, **options)
	
	return @resource unless block_given?
	
	begin
		return yield(@resource)
	ensure
		self.release
	end
end

#acquired?Boolean

Check if the token has been acquired.

Returns:

  • (Boolean)


91
92
93
# File 'lib/async/limiter/token.rb', line 91

def acquired?
	!!@resource
end

#releaseObject

Release the token back to the limiter.



57
58
59
60
61
62
# File 'lib/async/limiter/token.rb', line 57

def release
	if resource = @resource
		@resource = nil
		@limiter.release(resource)
	end
end

#released?Boolean

Check if the token has been released.

Returns:

  • (Boolean)


97
98
99
# File 'lib/async/limiter/token.rb', line 97

def released?
	!@resource
end

#The acquired resource (nil if released).=(acquiredresource(nil) ⇒ Object



54
# File 'lib/async/limiter/token.rb', line 54

attr_reader :resource