Class: Cloudflare::DurableObjectStorage
- Inherits:
-
Object
- Object
- Cloudflare::DurableObjectStorage
- 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
-
#delete(key) ⇒ Object
Remove a key.
-
#delete_all ⇒ Object
Clear every key.
-
#get(key) ⇒ Object
Returns a JS Promise resolving to the stored Ruby value, or nil.
-
#initialize(js_storage) ⇒ DurableObjectStorage
constructor
A new instance of DurableObjectStorage.
-
#list(prefix: nil, limit: nil, reverse: nil, start: nil, end_key: nil) ⇒ Object
List keys.
-
#put(key, value) ⇒ Object
Store any JSON-serialisable Ruby value.
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_all ⇒ Object
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 |