Module: Cloudflare::Bindings

Defined in:
lib/homura/runtime.rb

Class Method Summary collapse

Class Method Details

.ai(env) ⇒ Object



973
974
975
976
977
978
979
980
# File 'lib/homura/runtime.rb', line 973

def ai(env)
  raw = env['cloudflare.AI']
  return nil if `(#{raw} == null || #{raw} === undefined || #{raw} === Opal.nil)`
  return raw if defined?(::Cloudflare::AI::Binding) && `(#{raw} != null && #{raw}.$$class === #{::Cloudflare::AI::Binding})`
  return ::Cloudflare::AI::Binding.new(raw) if defined?(::Cloudflare::AI::Binding)

  raw
end

.attach!(env, js_env, js_ctx = nil) ⇒ Object



909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
# File 'lib/homura/runtime.rb', line 909

def attach!(env, js_env, js_ctx = nil)
  env['cloudflare.env'] = js_env
  env['cloudflare.ctx'] = js_ctx unless `(#{js_ctx} == null || #{js_ctx} === undefined || #{js_ctx} === Opal.nil)`
  return env if `(#{js_env} == null || #{js_env} === undefined || #{js_env} === Opal.nil)`

  js_db = `#{js_env} && #{js_env}.DB`
  js_kv = `#{js_env} && #{js_env}.KV`
  js_r2 = `#{js_env} && #{js_env}.BUCKET`
  js_ai = `#{js_env} && #{js_env}.AI`
  env['cloudflare.DB']     = D1Database.new(js_db)  if `#{js_db} != null`
  env['cloudflare.KV']     = KVNamespace.new(js_kv) if `#{js_kv} != null`
  env['cloudflare.BUCKET'] = R2Bucket.new(js_r2)    if `#{js_r2} != null`
  env['cloudflare.AI']     = js_ai                  if `#{js_ai} != null`

  attach_durable_object!(env, :counter, `#{js_env} && #{js_env}.COUNTER`)
  attach_queue!(env, :jobs, `#{js_env} && #{js_env}.JOBS_QUEUE`, 'JOBS_QUEUE')
  attach_queue!(env, :jobs_dlq, `#{js_env} && #{js_env}.JOBS_DLQ`, 'JOBS_DLQ')
  attach_send_email!(env, js_env)

  env
end

.attach_durable_object!(env, name, js_binding) ⇒ Object



931
932
933
934
935
936
937
938
# File 'lib/homura/runtime.rb', line 931

def attach_durable_object!(env, name, js_binding)
  return env if `(#{js_binding} == null || #{js_binding} === undefined || #{js_binding} === Opal.nil)`
  return env unless defined?(::Cloudflare::DurableObjectNamespace)

  suffix = normalize_binding_name(name)
  env["cloudflare.DO_#{suffix}"] = DurableObjectNamespace.new(js_binding)
  env
end

.attach_queue!(env, name, js_binding, binding_name) ⇒ Object



940
941
942
943
944
945
946
947
# File 'lib/homura/runtime.rb', line 940

def attach_queue!(env, name, js_binding, binding_name)
  return env if `(#{js_binding} == null || #{js_binding} === undefined || #{js_binding} === Opal.nil)`
  return env unless defined?(::Cloudflare::Queue)

  suffix = normalize_binding_name(name)
  env["cloudflare.QUEUE_#{suffix}"] = Queue.new(js_binding, binding_name)
  env
end

.attach_send_email!(env, js_env) ⇒ Object



949
950
951
952
953
954
955
956
957
958
# File 'lib/homura/runtime.rb', line 949

def attach_send_email!(env, js_env)
  return env unless defined?(::Cloudflare::Email)

  js_send_email = `#{js_env} && #{js_env}.SEND_EMAIL`
  if `#{js_send_email} == null || #{js_send_email} === undefined`
    js_send_email = `(typeof globalThis !== 'undefined' && globalThis.__OPAL_WORKERS__ && globalThis.__OPAL_WORKERS__.sendEmailBinding) || null`
  end
  env['cloudflare.SEND_EMAIL'] = Email.new(js_send_email) if `#{js_send_email} != null`
  env
end

.build_env(js_env, js_ctx = nil, extras = nil) ⇒ Object



904
905
906
907
# File 'lib/homura/runtime.rb', line 904

def build_env(js_env, js_ctx = nil, extras = nil)
  env = extras ? extras.dup : {}
  attach!(env, js_env, js_ctx)
end

.durable_object(env, name, id_or_name = nil) ⇒ Object



964
965
966
967
968
969
970
971
# File 'lib/homura/runtime.rb', line 964

def durable_object(env, name, id_or_name = nil)
  suffix = normalize_binding_name(name)
  ns = env["cloudflare.DO_#{suffix}"] || env["cloudflare.#{suffix}"]
  return nil unless ns
  return ns if id_or_name.nil?

  ns.get_by_name(id_or_name.to_s)
end

.normalize_binding_name(name) ⇒ Object



960
961
962
# File 'lib/homura/runtime.rb', line 960

def normalize_binding_name(name)
  name.to_s.upcase.gsub(/[^A-Z0-9]+/, '_').sub(/\A_+/, '').sub(/_+\z/, '')
end