Class: Cloudflare::DurableObjectStorage

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

Overview

Thin Ruby wrapper around state.storage. Values are serialised to JSON on ‘put` and parsed on `get`, so user code can pass/retrieve plain Ruby Hashes, Arrays, numbers, strings, booleans without reaching for a backtick.

Instance Method Summary collapse

Constructor Details

#initialize(js_storage) ⇒ DurableObjectStorage

Returns a new instance of DurableObjectStorage.



451
452
453
# File 'lib/cloudflare_workers/durable_object.rb', line 451

def initialize(js_storage)
  @js = js_storage
end

Instance Method Details

#delete(key) ⇒ Object

Remove a key. Returns a JS Promise resolving to a boolean (true if a key was deleted). We coerce to Ruby true/false.



474
475
476
477
478
# File 'lib/cloudflare_workers/durable_object.rb', line 474

def delete(key)
  js = @js
  err_klass = Cloudflare::DurableObjectError
  `#{js}.delete(#{key.to_s}).then(function(v) { return v ? true : false; }).catch(function(e) { #{Kernel}.$raise(#{err_klass}.$new(e && e.message ? e.message : String(e), Opal.hash({ operation: 'storage.delete' }))); })`
end

#delete_allObject

Clear every key. Returns a JS Promise.



481
482
483
484
485
# File 'lib/cloudflare_workers/durable_object.rb', line 481

def delete_all
  js = @js
  err_klass = Cloudflare::DurableObjectError
  `#{js}.deleteAll().catch(function(e) { #{Kernel}.$raise(#{err_klass}.$new(e && e.message ? e.message : String(e), Opal.hash({ operation: 'storage.deleteAll' }))); })`
end

#get(key) ⇒ Object

Returns a JS Promise resolving to the stored Ruby value, or nil.



456
457
458
459
460
# File 'lib/cloudflare_workers/durable_object.rb', line 456

def get(key)
  js = @js
  err_klass = Cloudflare::DurableObjectError
  `#{js}.get(#{key.to_s}).then(function(v) { if (v == null) return nil; if (typeof v === 'string') { try { return JSON.parse(v); } catch (e) { return v; } } return v; }).catch(function(e) { #{Kernel}.$raise(#{err_klass}.$new(e && e.message ? e.message : String(e), Opal.hash({ operation: 'storage.get' }))); })`
end

#list(prefix: nil, limit: nil, reverse: nil, start: nil, end_key: nil) ⇒ Object

List keys. Returns a JS Promise resolving to a Ruby ‘Hash` of `{ key => parsed-value }` (values are JSON-parsed when they round-tripped through `put`; opaque strings are returned as-is). Options `prefix:`, `limit:`, `reverse:`, `start:`, `end_key:` forward to the underlying Workers `storage.list(…)` call.

The earlier iteration returned a JS ‘Map`; that was documented as a Ruby Hash but forced callers to reach for JS iteration, which Copilot review (#9) flagged. The JS side still builds the intermediate Map (the Workers runtime also gives us a Map) and we copy it into a Ruby Hash before resolving so downstream code can use `each` / `[]` / `keys` without backticks.



499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
# File 'lib/cloudflare_workers/durable_object.rb', line 499

def list(prefix: nil, limit: nil, reverse: nil, start: nil, end_key: nil)
  js = @js
  err_klass = Cloudflare::DurableObjectError
  js_opts = `({})`
  `#{js_opts}.prefix  = #{prefix.to_s}` unless prefix.nil?
  `#{js_opts}.limit   = #{limit.to_i}`  unless limit.nil?
  `#{js_opts}.reverse = #{!!reverse}`   unless reverse.nil?
  `#{js_opts}.start   = #{start.to_s}`  unless start.nil?
  `#{js_opts}.end     = #{end_key.to_s}` unless end_key.nil?
  js_promise = `#{js}.list(#{js_opts}).catch(function(e) { #{Kernel}.$raise(#{err_klass}.$new(e && e.message ? e.message : String(e), Opal.hash({ operation: 'storage.list' }))); })`
  js_result = js_promise.__await__
  out = {}
  return out if `#{js_result} == null`
  `(#{js_result}.forEach && typeof #{js_result}.forEach === 'function') && #{js_result}.forEach(function(v, k) { var pv = v; if (typeof pv === 'string') { try { pv = JSON.parse(pv); } catch (_) {} } #{out}.$store(String(k), pv); })`
  out
end

#put(key, value) ⇒ Object

Store any JSON-serialisable Ruby value. Always serialises via ‘to_json` to avoid the JS-side “$$is_hash:true” Opal leakage. Returns a JS Promise.



465
466
467
468
469
470
# File 'lib/cloudflare_workers/durable_object.rb', line 465

def put(key, value)
  js = @js
  err_klass = Cloudflare::DurableObjectError
  js_value = value.nil? ? 'null' : value.to_json
  `#{js}.put(#{key.to_s}, #{js_value}).catch(function(e) { #{Kernel}.$raise(#{err_klass}.$new(e && e.message ? e.message : String(e), Opal.hash({ operation: 'storage.put' }))); })`
end