kobako 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/.release-please-manifest.json +1 -0
  3. data/CHANGELOG.md +29 -0
  4. data/Cargo.lock +1 -1
  5. data/README.md +0 -1
  6. data/data/kobako.wasm +0 -0
  7. data/ext/kobako/Cargo.toml +1 -1
  8. data/ext/kobako/src/lib.rs +4 -2
  9. data/ext/kobako/src/{wasm → runtime}/cache.rs +12 -16
  10. data/ext/kobako/src/runtime/capture.rs +91 -0
  11. data/ext/kobako/src/runtime/config.rs +26 -0
  12. data/ext/kobako/src/runtime/dispatch.rs +211 -0
  13. data/ext/kobako/src/runtime/exports.rs +51 -0
  14. data/ext/kobako/src/runtime/guest_mem.rs +228 -0
  15. data/ext/kobako/src/{wasm/host_state.rs → runtime/invocation.rs} +94 -86
  16. data/ext/kobako/src/runtime/trap.rs +134 -0
  17. data/ext/kobako/src/runtime.rs +782 -0
  18. data/ext/kobako/src/snapshot.rs +110 -0
  19. data/lib/kobako/capture.rb +11 -16
  20. data/lib/kobako/catalog/handles.rb +107 -0
  21. data/lib/kobako/catalog/namespaces.rb +99 -0
  22. data/lib/kobako/{snippet/table.rb → catalog/snippets.rb} +37 -62
  23. data/lib/kobako/catalog.rb +18 -0
  24. data/lib/kobako/codec/decoder.rb +13 -5
  25. data/lib/kobako/codec/factory.rb +12 -12
  26. data/lib/kobako/codec/utils.rb +56 -59
  27. data/lib/kobako/codec.rb +6 -3
  28. data/lib/kobako/errors.rb +45 -28
  29. data/lib/kobako/fault.rb +40 -0
  30. data/lib/kobako/handle.rb +4 -6
  31. data/lib/kobako/namespace.rb +67 -0
  32. data/lib/kobako/outcome.rb +31 -35
  33. data/lib/kobako/runtime.rb +30 -0
  34. data/lib/kobako/sandbox.rb +83 -72
  35. data/lib/kobako/sandbox_options.rb +6 -9
  36. data/lib/kobako/snapshot.rb +40 -0
  37. data/lib/kobako/snippet/binary.rb +6 -7
  38. data/lib/kobako/snippet/source.rb +8 -8
  39. data/lib/kobako/snippet.rb +7 -9
  40. data/lib/kobako/transport/dispatcher.rb +195 -0
  41. data/lib/kobako/{rpc/wire_error.rb → transport/error.rb} +7 -6
  42. data/lib/kobako/transport/request.rb +78 -0
  43. data/lib/kobako/transport/response.rb +69 -0
  44. data/lib/kobako/transport/run.rb +141 -0
  45. data/lib/kobako/transport/yield.rb +91 -0
  46. data/lib/kobako/transport/yielder.rb +89 -0
  47. data/lib/kobako/transport.rb +24 -0
  48. data/lib/kobako/version.rb +1 -1
  49. data/lib/kobako.rb +4 -4
  50. data/release-please-config.json +24 -0
  51. data/sig/kobako/capture.rbs +0 -2
  52. data/sig/kobako/catalog/handles.rbs +19 -0
  53. data/sig/kobako/catalog/namespaces.rbs +17 -0
  54. data/sig/kobako/{snippet/table.rbs → catalog/snippets.rbs} +2 -11
  55. data/sig/kobako/{rpc.rbs → catalog.rbs} +1 -1
  56. data/sig/kobako/codec/decoder.rbs +2 -1
  57. data/sig/kobako/codec/factory.rbs +2 -2
  58. data/sig/kobako/codec/utils.rbs +5 -5
  59. data/sig/kobako/errors.rbs +7 -7
  60. data/sig/kobako/fault.rbs +19 -0
  61. data/sig/kobako/handle.rbs +2 -3
  62. data/sig/kobako/namespace.rbs +19 -0
  63. data/sig/kobako/outcome.rbs +2 -2
  64. data/sig/kobako/runtime.rbs +23 -0
  65. data/sig/kobako/sandbox.rbs +5 -8
  66. data/sig/kobako/snapshot.rbs +15 -0
  67. data/sig/kobako/transport/dispatcher.rbs +34 -0
  68. data/sig/kobako/transport/error.rbs +6 -0
  69. data/sig/kobako/transport/request.rbs +32 -0
  70. data/sig/kobako/transport/response.rbs +30 -0
  71. data/sig/kobako/transport/run.rbs +27 -0
  72. data/sig/kobako/transport/yield.rbs +34 -0
  73. data/sig/kobako/transport/yielder.rbs +21 -0
  74. data/sig/kobako/transport.rbs +4 -0
  75. metadata +48 -30
  76. data/ext/kobako/src/wasm/dispatch.rs +0 -162
  77. data/ext/kobako/src/wasm/instance.rs +0 -873
  78. data/ext/kobako/src/wasm.rs +0 -126
  79. data/lib/kobako/handle_table.rb +0 -119
  80. data/lib/kobako/invocation.rb +0 -143
  81. data/lib/kobako/rpc/dispatcher.rb +0 -171
  82. data/lib/kobako/rpc/envelope.rb +0 -118
  83. data/lib/kobako/rpc/fault.rb +0 -41
  84. data/lib/kobako/rpc/namespace.rb +0 -74
  85. data/lib/kobako/rpc/server.rb +0 -146
  86. data/lib/kobako/rpc.rb +0 -11
  87. data/lib/kobako/wasm.rb +0 -25
  88. data/sig/kobako/handle_table.rbs +0 -23
  89. data/sig/kobako/invocation.rbs +0 -25
  90. data/sig/kobako/rpc/dispatcher.rbs +0 -33
  91. data/sig/kobako/rpc/envelope.rbs +0 -51
  92. data/sig/kobako/rpc/fault.rbs +0 -20
  93. data/sig/kobako/rpc/namespace.rbs +0 -24
  94. data/sig/kobako/rpc/server.rbs +0 -31
  95. data/sig/kobako/rpc/wire_error.rbs +0 -6
  96. data/sig/kobako/wasm.rbs +0 -41
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kobako
4
- module RPC
5
- # Wire-level value object for an ext-0x02 Exception envelope.
6
- #
7
- # SPEC pins the payload
8
- # ({docs/wire-codec.md}[link:../../../docs/wire-codec.md] § Ext Types
9
- # → ext 0x02) to a msgpack map with exactly three keys:
10
- # * "type" — one of "runtime", "argument", "disconnected", "undefined"
11
- # * "message" — human-readable string
12
- # * "details" — any wire-legal value, or nil when absent
13
- #
14
- # This object holds the *encoded* form. Reifying the corresponding Ruby
15
- # exception class (RuntimeError, ArgumentError, Kobako::ServiceError, ...)
16
- # is the responsibility of the dispatch layer, not the codec.
17
- #
18
- # Built on +Data.define+ so equality, hash, and immutability are
19
- # inherited from the value-object machinery; only the field invariants
20
- # ride on top.
21
- Fault = Data.define(:type, :message, :details) do
22
- # +VALID_TYPES+ is attached to the Exception class below this block.
23
- # Reach it through +self.class::VALID_TYPES+ — Data.define's block
24
- # scope resolves bare constants against the enclosing +Wire+ module,
25
- # so a bare +VALID_TYPES+ would raise +NameError+. Same pattern as
26
- # +Kobako::Handle+.
27
- # steep:ignore:start
28
- def initialize(type:, message:, details: nil)
29
- valid_types = self.class::VALID_TYPES
30
- raise ArgumentError, "type must be String" unless type.is_a?(String)
31
- raise ArgumentError, "message must be String" unless message.is_a?(String)
32
- raise ArgumentError, "type=#{type.inspect} not one of #{valid_types.inspect}" unless valid_types.include?(type)
33
-
34
- super
35
- end
36
- # steep:ignore:end
37
- end
38
-
39
- Fault::VALID_TYPES = %w[runtime argument disconnected undefined].freeze
40
- end
41
- end
@@ -1,74 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kobako
4
- module RPC
5
- # A named grouping of Members for one Sandbox
6
- # ({docs/behavior.md B-07..B-11}[link:../../../docs/behavior.md]). Returned by
7
- # +Sandbox#define+. Each instance owns a flat name→object table of
8
- # Members; member binding is validated against {NAME_PATTERN}.
9
- class Namespace
10
- # Ruby constant-name pattern shared by Namespace and Member names
11
- # ({docs/behavior.md B-07/B-08 Notes}[link:../../../docs/behavior.md]).
12
- NAME_PATTERN = /\A[A-Z]\w*\z/
13
-
14
- attr_reader :name, :members
15
-
16
- # Build a new Namespace. +name+ is an already-validated Namespace
17
- # name (must satisfy {NAME_PATTERN}; validation is the caller's
18
- # responsibility).
19
- def initialize(name)
20
- @name = name
21
- @members = {}
22
- end
23
-
24
- # Bind +object+ under +member+ inside this Namespace. +member+ is a
25
- # constant-form name as a +Symbol+ or +String+. +object+ is any Ruby
26
- # object that responds to the methods guest code will invoke. Returns
27
- # +self+ for chaining. Raises +ArgumentError+ when +member+ does not
28
- # match the constant pattern, or a Member of the same name is already
29
- # bound ({docs/behavior.md B-11}[link:../../../docs/behavior.md]).
30
- def bind(member, object)
31
- member_str = validate_member_name!(member)
32
- raise ArgumentError, "Member #{@name}::#{member_str} is already bound" if @members.key?(member_str)
33
-
34
- @members[member_str] = object
35
- self
36
- end
37
-
38
- # Member lookup. Returns the bound object or +nil+ when missing.
39
- def [](member)
40
- @members[member.to_s]
41
- end
42
-
43
- # Strict variant of {#[]}; raises +KeyError+ when no Member is
44
- # registered under +member+.
45
- def fetch(member)
46
- member_str = member.to_s
47
- unless @members.key?(member_str)
48
- raise KeyError,
49
- "no member named #{member_str.inspect} in namespace #{@name.inspect}"
50
- end
51
-
52
- @members[member_str]
53
- end
54
-
55
- # Structured description for the guest preamble (Frame 1). Returns a
56
- # two-element array +[name, member_keys]+ suitable for msgpack encoding.
57
- def to_preamble
58
- [@name, @members.keys]
59
- end
60
-
61
- private
62
-
63
- def validate_member_name!(member)
64
- member_str = member.to_s
65
- unless NAME_PATTERN.match?(member_str)
66
- raise ArgumentError,
67
- "MemberName must match #{NAME_PATTERN.inspect} (got #{member.inspect})"
68
- end
69
-
70
- member_str
71
- end
72
- end
73
- end
74
- end
@@ -1,146 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "msgpack"
4
- require_relative "../errors"
5
- require_relative "envelope"
6
- require_relative "namespace"
7
- require_relative "../handle_table"
8
- require_relative "dispatcher"
9
-
10
- module Kobako
11
- module RPC
12
- # Kobako::RPC::Server — per-Sandbox host-side RPC coordinator. Maintains
13
- # the Namespace / Member registry, owns the HandleTable, and routes
14
- # incoming Requests to the resolved Service object
15
- # ({docs/behavior.md B-07..B-21}[link:../../../docs/behavior.md]).
16
- #
17
- # Public API:
18
- #
19
- # server = Kobako::RPC::Server.new
20
- # namespace = server.define(:MyService) # => Kobako::RPC::Namespace
21
- # namespace.bind(:KV, kv_object) # => namespace (chainable)
22
- # server.to_preamble # => array for Frame 1
23
- # server.dispatch(request_bytes) # => msgpack bytes (delegated to Dispatcher)
24
- #
25
- # Namespaces live at +Kobako::RPC::Namespace+
26
- # (lib/kobako/rpc/namespace.rb). The opaque Handle allocator lives at
27
- # +Kobako::HandleTable+ (lib/kobako/handle_table.rb) and is owned by
28
- # the Sandbox — the Server only holds an injected reference so RPC
29
- # dispatch resolves against the same table the wire layer allocates
30
- # into (docs/behavior.md B-19). Dispatch helpers live at
31
- # +Kobako::RPC::Dispatcher+ (lib/kobako/rpc/dispatcher.rb).
32
- class Server
33
- # Build a fresh Server. +handle_table+ is an internal seam that
34
- # injects a pre-configured +HandleTable+; tests pass one whose +next_id+
35
- # is pinned near +MAX_ID+ to exercise the B-21 cap-exhaustion path
36
- # without 2³¹ allocations. Production callers leave it at the default.
37
- def initialize(handle_table: HandleTable.new)
38
- @namespaces = {} # : Hash[String, Kobako::RPC::Namespace]
39
- @handle_table = handle_table
40
- @sealed = false
41
- end
42
-
43
- # Declare or retrieve the Namespace named +name+ (idempotent — docs/behavior.md B-10).
44
- # +name+ is a constant-form name as a +Symbol+ or +String+ (must satisfy
45
- # +Namespace::NAME_PATTERN+). Returns the +Kobako::RPC::Namespace+ for
46
- # that name, creating it if it does not exist. Raises +ArgumentError+
47
- # when +name+ is malformed, or when called after the owning Sandbox has
48
- # been sealed by its first invocation ({docs/behavior.md B-07}[link:../../../docs/behavior.md]).
49
- def define(name)
50
- raise ArgumentError, "cannot define after first Sandbox invocation" if @sealed
51
-
52
- name_str = name.to_s
53
- unless Namespace::NAME_PATTERN.match?(name_str)
54
- raise ArgumentError,
55
- "Namespace name must match #{Namespace::NAME_PATTERN.inspect} (got #{name.inspect})"
56
- end
57
-
58
- @namespaces[name_str] ||= Namespace.new(name_str)
59
- end
60
-
61
- # Resolve a +target+ path of the form +"Namespace::Member"+ to the
62
- # bound Host object. +target+ is a two-level path using the +::+
63
- # separator. Returns the bound Host object. Raises +KeyError+ when the
64
- # namespace or the member is not bound.
65
- def lookup(target)
66
- namespace, member_name, namespace_name = parse_target(target)
67
- raise KeyError, "no namespace named #{namespace_name.inspect}" if namespace.nil?
68
- raise KeyError, "no member #{target.inspect} bound on server" unless member_name
69
-
70
- namespace.fetch(member_name)
71
- end
72
-
73
- # Returns +true+ when +target+ (a +"Namespace::Member"+ path) resolves
74
- # to a bound member, +false+ otherwise.
75
- def bound?(target)
76
- namespace, member_name, = parse_target(target)
77
- !namespace.nil? && !member_name.nil? && !namespace[member_name].nil?
78
- end
79
-
80
- # Returns the number of declared namespaces as an +Integer+.
81
- def size
82
- @namespaces.size
83
- end
84
-
85
- # Returns +true+ when no namespaces have been declared, +false+ otherwise.
86
- def empty?
87
- @namespaces.empty?
88
- end
89
-
90
- # Structured Frame 1 description. Called by +Sandbox#eval+ when
91
- # assembling stdin Frame 1
92
- # ({docs/behavior.md B-02}[link:../../../docs/behavior.md]). Returns an
93
- # unencoded preamble array — an +Array+ of two-element +[name, members]+
94
- # arrays, one per declared namespace.
95
- def to_preamble
96
- @namespaces.values.map(&:to_preamble)
97
- end
98
-
99
- # Encode the preamble as msgpack bytes for stdin Frame 1 delivery
100
- # ({docs/behavior.md B-02}[link:../../../docs/behavior.md]). Uses plain MessagePack (no
101
- # kobako ext types) because the preamble contains only strings — no
102
- # Handles or Fault envelopes. Structure:
103
- # +[["Namespace", ["MemberA", "MemberB"]], ...]+. Returns a binary
104
- # +String+ of msgpack bytes.
105
- def encoded_preamble
106
- MessagePack.pack(to_preamble)
107
- end
108
-
109
- # Mark the Server as sealed. Called by +Sandbox+ on the first
110
- # invocation. After sealing, #define raises ArgumentError. Idempotent.
111
- def seal!
112
- @sealed = true
113
- self
114
- end
115
-
116
- # Returns +true+ when {#seal!} has been called, +false+ otherwise.
117
- def sealed?
118
- @sealed
119
- end
120
-
121
- # Dispatch a single RPC request and return the encoded response bytes
122
- # ({docs/behavior.md B-12}[link:../../../docs/behavior.md]). +request_bytes+ is a
123
- # msgpack-encoded Request envelope. Called by the Rust ext from inside
124
- # +__kobako_dispatch+. Always returns a binary +String+ — never raises.
125
- # Forwards both the Server (for namespace lookup) and the injected
126
- # +HandleTable+ (for Handle resolution / return-value wrapping) to
127
- # +Dispatcher.dispatch+. The Server holds the HandleTable as an
128
- # injected reference, not an owned resource — the Sandbox owns it
129
- # (B-19) — so the table is not exposed via accessors.
130
- def dispatch(request_bytes)
131
- Dispatcher.dispatch(request_bytes, self, @handle_table)
132
- end
133
-
134
- private
135
-
136
- # Split +target+ on the +::+ separator and resolve the namespace half.
137
- # Returns +[namespace_or_nil, member_str_or_nil, namespace_name_str]+ so
138
- # each public method ({#lookup} / {#bound?}) only owns its boundary
139
- # semantics (raise vs predicate).
140
- def parse_target(target)
141
- namespace_name, member_name = target.to_s.split("::", 2)
142
- [@namespaces[namespace_name], member_name, namespace_name]
143
- end
144
- end
145
- end
146
- end
data/lib/kobako/rpc.rb DELETED
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kobako
4
- # Kobako::RPC — protocol namespace for host↔guest RPC. Houses the value
5
- # objects that travel on the wire (+Handle+, +Request+, +Response+,
6
- # +Fault+) and the host-side Server coordinator. See
7
- # {SPEC.md Refinement → Internal Concepts}[link:../../SPEC.md] for the
8
- # RPC role split.
9
- module RPC
10
- end
11
- end
data/lib/kobako/wasm.rb DELETED
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kobako
4
- # Host-side wasmtime wrapper, surfaced as Ruby classes by the native ext
5
- # (see ext/kobako/src/wasm.rs). This module is the foundational binding
6
- # layer for Sandbox (#14), the run path (#16) and RPC dispatch (#18).
7
- #
8
- # The classes themselves (Instance) and the error hierarchy (Error /
9
- # ModuleNotBuiltError) are defined from Rust at ext load time; this file
10
- # only adds the pure-Ruby helpers that have no reason to live in Rust.
11
- module Wasm
12
- # Absolute path to the gem-bundled `data/kobako.wasm` artifact. Computed
13
- # from this file's location so it works for both `bundle exec` (running
14
- # from the repo) and an installed gem (running from the gem dir).
15
- #
16
- # Returns a String regardless of whether the file currently exists —
17
- # call sites that need the file to be present should pass this through
18
- # +Kobako::Wasm::Instance.from_path+, which raises +ModuleNotBuiltError+
19
- # with a clear remediation message.
20
- def self.default_path
21
- dir = __dir__ or raise Error, "Kobako::Wasm.default_path requires __dir__"
22
- File.expand_path("../../data/kobako.wasm", dir)
23
- end
24
- end
25
- end
@@ -1,23 +0,0 @@
1
- module Kobako
2
- class HandleTable
3
- def initialize: (?next_id: Integer) -> void
4
-
5
- def alloc: (untyped object) -> Kobako::Handle
6
-
7
- def fetch: (Integer id) -> untyped
8
-
9
- def release: (Integer id) -> untyped
10
-
11
- def reset!: () -> self
12
-
13
- def mark_disconnected: (Integer id) -> self
14
-
15
- def size: () -> Integer
16
-
17
- def include?: (Integer id) -> bool
18
-
19
- private
20
-
21
- def require_bound!: (Integer id) -> void
22
- end
23
- end
@@ -1,25 +0,0 @@
1
- module Kobako
2
- class Invocation < Data
3
- NAME_PATTERN: Regexp
4
-
5
- attr_reader entrypoint: Symbol
6
- attr_reader args: Array[untyped]
7
- attr_reader kwargs: Hash[Symbol, untyped]
8
-
9
- def self.new: (entrypoint: Symbol | String, ?args: Array[untyped], ?kwargs: Hash[untyped, untyped]) -> Invocation
10
-
11
- def initialize: (entrypoint: Symbol | String, ?args: Array[untyped], ?kwargs: Hash[untyped, untyped]) -> void
12
-
13
- def encode: (Kobako::HandleTable handle_table) -> String
14
-
15
- private
16
-
17
- def normalize_entrypoint: (Symbol | String target) -> Symbol
18
-
19
- def validate_args!: (Array[untyped] args) -> Array[untyped]
20
-
21
- def validate_kwargs!: (Hash[untyped, untyped] kwargs) -> Hash[Symbol, untyped]
22
-
23
- def forged_handle_message: (String slot) -> String
24
- end
25
- end
@@ -1,33 +0,0 @@
1
- module Kobako
2
- module RPC
3
- module Dispatcher
4
- class UndefinedTargetError < StandardError
5
- end
6
-
7
- class DisconnectedTargetError < StandardError
8
- end
9
-
10
- def self?.dispatch: (String request_bytes, Server server, Kobako::HandleTable handle_table) -> String
11
-
12
- def self?.encode_caught_error: (StandardError error) -> String
13
-
14
- def self?.invoke: (untyped target, String method, Array[untyped] args, Hash[Symbol, untyped] kwargs) -> untyped
15
-
16
- def self?.resolve_arg: (untyped value, Kobako::HandleTable handle_table) -> untyped
17
-
18
- def self?.resolve_target: (String | Kobako::Handle target, Server server, Kobako::HandleTable handle_table) -> untyped
19
-
20
- def self?.resolve_path: (String path, Server server) -> untyped
21
-
22
- def self?.resolve_handle: (Kobako::Handle handle, Kobako::HandleTable handle_table) -> untyped
23
-
24
- def self?.require_live_object!: (Integer id, Kobako::HandleTable handle_table) -> untyped
25
-
26
- def self?.encode_ok: (untyped value, Kobako::HandleTable handle_table) -> String
27
-
28
- def self?.wrap_as_handle: (untyped value, Kobako::HandleTable handle_table) -> Kobako::Handle
29
-
30
- def self?.encode_error: (String type, String message) -> String
31
- end
32
- end
33
- end
@@ -1,51 +0,0 @@
1
- module Kobako
2
- module RPC
3
- STATUS_OK: Integer
4
- STATUS_ERROR: Integer
5
-
6
- class Request
7
- attr_reader target: String | Kobako::Handle
8
- attr_reader method_name: String
9
- attr_reader args: Array[untyped]
10
- attr_reader kwargs: Hash[Symbol, untyped]
11
-
12
- def initialize: (target: String | Kobako::Handle, method: String, ?args: Array[untyped], ?kwargs: Hash[Symbol, untyped]) -> void
13
-
14
- def with: (?target: String | Kobako::Handle, ?method: String, ?args: Array[untyped], ?kwargs: Hash[Symbol, untyped]) -> Request
15
-
16
- def ==: (untyped other) -> bool
17
-
18
- def hash: () -> Integer
19
- end
20
-
21
- def self.encode_request: (Request request) -> String
22
-
23
- def self.decode_request: (String bytes) -> Request
24
-
25
- class Response
26
- attr_reader status: Integer
27
- attr_reader payload: untyped
28
-
29
- def self.ok: (untyped value) -> Response
30
-
31
- def self.error: (Kobako::RPC::Fault fault) -> Response
32
-
33
- def initialize: (Integer status, untyped payload) -> void
34
- | (status: Integer, payload: untyped) -> void
35
-
36
- def with: (?status: Integer, ?payload: untyped) -> Response
37
-
38
- def ok?: () -> bool
39
-
40
- def error?: () -> bool
41
-
42
- def ==: (untyped other) -> bool
43
-
44
- def hash: () -> Integer
45
- end
46
-
47
- def self.encode_response: (Response response) -> String
48
-
49
- def self.decode_response: (String bytes) -> Response
50
- end
51
- end
@@ -1,20 +0,0 @@
1
- module Kobako
2
- module RPC
3
- class Fault
4
- VALID_TYPES: Array[String]
5
-
6
- attr_reader type: String
7
- attr_reader message: String
8
- attr_reader details: untyped
9
-
10
- def initialize: (String type, String message, untyped details) -> void
11
- | (type: String, message: String, ?details: untyped) -> void
12
-
13
- def with: (?type: String, ?message: String, ?details: untyped) -> Fault
14
-
15
- def ==: (untyped other) -> bool
16
-
17
- def hash: () -> Integer
18
- end
19
- end
20
- end
@@ -1,24 +0,0 @@
1
- module Kobako
2
- module RPC
3
- class Namespace
4
- NAME_PATTERN: Regexp
5
-
6
- attr_reader name: String
7
- attr_reader members: Hash[String, untyped]
8
-
9
- def initialize: (String name) -> void
10
-
11
- def bind: (Symbol | String member, untyped object) -> self
12
-
13
- def []: (Symbol | String member) -> untyped
14
-
15
- def fetch: (Symbol | String member) -> untyped
16
-
17
- def to_preamble: () -> [String, Array[String]]
18
-
19
- private
20
-
21
- def validate_member_name!: (Symbol | String member) -> String
22
- end
23
- end
24
- end
@@ -1,31 +0,0 @@
1
- module Kobako
2
- module RPC
3
- class Server
4
- def initialize: (?handle_table: Kobako::HandleTable) -> void
5
-
6
- def define: (Symbol | String name) -> Kobako::RPC::Namespace
7
-
8
- def lookup: (String target) -> untyped
9
-
10
- def bound?: (String target) -> bool
11
-
12
- def size: () -> Integer
13
-
14
- def empty?: () -> bool
15
-
16
- def to_preamble: () -> Array[[String, Array[String]]]
17
-
18
- def encoded_preamble: () -> String
19
-
20
- def seal!: () -> self
21
-
22
- def sealed?: () -> bool
23
-
24
- def dispatch: (String request_bytes) -> String
25
-
26
- private
27
-
28
- def parse_target: (String target) -> [Kobako::RPC::Namespace?, String?, String?]
29
- end
30
- end
31
- end
@@ -1,6 +0,0 @@
1
- module Kobako
2
- module RPC
3
- class WireError < Kobako::SandboxError
4
- end
5
- end
6
- end
data/sig/kobako/wasm.rbs DELETED
@@ -1,41 +0,0 @@
1
- module Kobako
2
- module Wasm
3
- class Error < StandardError
4
- end
5
-
6
- class ModuleNotBuiltError < Error
7
- end
8
-
9
- def self.default_path: () -> String
10
-
11
- class TimeoutError < Error
12
- end
13
-
14
- class MemoryLimitError < Error
15
- end
16
-
17
- class Instance
18
- def self.from_path: (
19
- String path,
20
- (Float | Integer)? timeout_seconds,
21
- Integer? memory_limit,
22
- Integer? stdout_limit_bytes,
23
- Integer? stderr_limit_bytes
24
- ) -> Instance
25
-
26
- def server=: (Kobako::RPC::Server server) -> void
27
-
28
- def eval: (String preamble, String source, String snippets) -> void
29
-
30
- def run: (String preamble, String snippets, String envelope) -> void
31
-
32
- def stdout: () -> [String, bool]
33
-
34
- def stderr: () -> [String, bool]
35
-
36
- def outcome!: () -> String
37
-
38
- def usage: () -> [Float, Integer]
39
- end
40
- end
41
- end