Class: CloudflareWorkers::AsyncRegistry

Inherits:
Object
  • Object
show all
Defined in:
lib/cloudflare_workers/async_registry.rb

Defined Under Namespace

Classes: Builder

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeAsyncRegistry

Returns a new instance of AsyncRegistry.



101
102
103
104
105
106
107
108
109
# File 'lib/cloudflare_workers/async_registry.rb', line 101

def initialize
  @async_classes = {}
  @async_methods = {}
  @async_factories = {}
  @taint_returns = {}
  @async_accessors = {}
  @async_helpers = {}
  @helper_factories = {}
end

Instance Attribute Details

#async_accessorsObject (readonly)

Returns the value of attribute async_accessors.



99
100
101
# File 'lib/cloudflare_workers/async_registry.rb', line 99

def async_accessors
  @async_accessors
end

#async_classesObject (readonly)

Returns the value of attribute async_classes.



99
100
101
# File 'lib/cloudflare_workers/async_registry.rb', line 99

def async_classes
  @async_classes
end

#async_factoriesObject (readonly)

Returns the value of attribute async_factories.



99
100
101
# File 'lib/cloudflare_workers/async_registry.rb', line 99

def async_factories
  @async_factories
end

#async_helpersObject (readonly)

Returns the value of attribute async_helpers.



99
100
101
# File 'lib/cloudflare_workers/async_registry.rb', line 99

def async_helpers
  @async_helpers
end

#async_methodsObject (readonly)

Returns the value of attribute async_methods.



99
100
101
# File 'lib/cloudflare_workers/async_registry.rb', line 99

def async_methods
  @async_methods
end

#helper_factoriesObject (readonly)

Returns the value of attribute helper_factories.



99
100
101
# File 'lib/cloudflare_workers/async_registry.rb', line 99

def helper_factories
  @helper_factories
end

#taint_returnsObject (readonly)

Returns the value of attribute taint_returns.



99
100
101
# File 'lib/cloudflare_workers/async_registry.rb', line 99

def taint_returns
  @taint_returns
end

Class Method Details

.async?(class_name, method_name) ⇒ Boolean

Returns:

  • (Boolean)


55
56
57
# File 'lib/cloudflare_workers/async_registry.rb', line 55

def async?(class_name, method_name)
  instance.async?(class_name, method_name)
end

.auto_load_gem_async_sources(debug: false) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/cloudflare_workers/async_registry.rb', line 71

def auto_load_gem_async_sources(debug: false)
  return unless defined?(Gem) && Gem.respond_to?(:loaded_specs)

  loaded = 0
  Gem.loaded_specs.each_value do |spec|
    next if spec.full_gem_path.nil?

    lib_dir = File.join(spec.full_gem_path, 'lib')
    next unless Dir.exist?(lib_dir)

    Dir.glob(File.join(lib_dir, '**', '*.rb')).each do |path|
      next unless File.read(path, 8192).include?('register_async_source')

      require_path = path.sub(Regexp.new("^#{Regexp.escape(lib_dir)}/"), '').sub(/\.rb\z/, '')
      begin
        require require_path
        loaded += 1
        puts "[auto-await] loaded async source from #{spec.name}: #{require_path}" if debug
      rescue LoadError, StandardError => e
        warn "[auto-await] Warning: failed to load async source from #{spec.name}/#{require_path}: #{e.message}" if debug
      end
    end
  end

  puts "[auto-await] auto-loaded #{loaded} async source file(s)" if debug && loaded.positive?
end

.factory?(class_name, method_name) ⇒ Boolean

Returns:

  • (Boolean)


59
60
61
# File 'lib/cloudflare_workers/async_registry.rb', line 59

def factory?(class_name, method_name)
  instance.factory?(class_name, method_name)
end

.instanceObject



47
48
49
# File 'lib/cloudflare_workers/async_registry.rb', line 47

def instance
  @instance ||= new
end

.register_async_source(&block) ⇒ Object



42
43
44
45
# File 'lib/cloudflare_workers/async_registry.rb', line 42

def register_async_source(&block)
  builder = Builder.new(instance)
  builder.instance_eval(&block)
end

.reset!Object



51
52
53
# File 'lib/cloudflare_workers/async_registry.rb', line 51

def reset!
  @instance = new
end

.taint_return_class(class_name, method_name) ⇒ Object



63
64
65
# File 'lib/cloudflare_workers/async_registry.rb', line 63

def taint_return_class(class_name, method_name)
  instance.taint_return_class(class_name, method_name)
end

.tainted_class?(class_name) ⇒ Boolean

Returns:

  • (Boolean)


67
68
69
# File 'lib/cloudflare_workers/async_registry.rb', line 67

def tainted_class?(class_name)
  instance.tainted_class?(class_name)
end

Instance Method Details

#async?(class_name, method_name) ⇒ Boolean

Returns:

  • (Boolean)


111
112
113
114
115
116
117
118
# File 'lib/cloudflare_workers/async_registry.rb', line 111

def async?(class_name, method_name)
  return false if method_name == :new
  methods = @async_methods[class_name]
  return true if methods&.include?(method_name)
  except = @async_classes[class_name]
  return true if except && !except.include?(method_name.to_s) && !except.include?(method_name.to_sym)
  false
end

#factory?(class_name, method_name) ⇒ Boolean

Returns:

  • (Boolean)


120
121
122
# File 'lib/cloudflare_workers/async_registry.rb', line 120

def factory?(class_name, method_name)
  @async_factories[class_name]&.include?(method_name)
end

#taint_return_class(class_name, method_name) ⇒ Object



124
125
126
# File 'lib/cloudflare_workers/async_registry.rb', line 124

def taint_return_class(class_name, method_name)
  @taint_returns[class_name]&.[](method_name)
end

#tainted_class?(class_name) ⇒ Boolean

Returns:

  • (Boolean)


128
129
130
131
132
133
# File 'lib/cloudflare_workers/async_registry.rb', line 128

def tainted_class?(class_name)
  @async_classes.key?(class_name) ||
    @async_methods.key?(class_name) ||
    @async_factories.key?(class_name) ||
    @taint_returns.key?(class_name)
end