capsium 0.3.0 → 0.6.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 (82) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +7 -3
  3. data/CHANGELOG.md +197 -0
  4. data/README.adoc +323 -14
  5. data/capsium.gemspec +2 -0
  6. data/lib/capsium/cli/package.rb +62 -25
  7. data/lib/capsium/cli/reactor.rb +112 -6
  8. data/lib/capsium/cli.rb +29 -0
  9. data/lib/capsium/log_buffer.rb +47 -0
  10. data/lib/capsium/package/bundle.rb +136 -0
  11. data/lib/capsium/package/cipher.rb +73 -17
  12. data/lib/capsium/package/composition.rb +28 -12
  13. data/lib/capsium/package/dataset.rb +20 -0
  14. data/lib/capsium/package/dependency_resolver.rb +39 -9
  15. data/lib/capsium/package/encryption_config.rb +7 -3
  16. data/lib/capsium/package/manifest.rb +1 -1
  17. data/lib/capsium/package/merged_view.rb +4 -2
  18. data/lib/capsium/package/metadata.rb +1 -1
  19. data/lib/capsium/package/metadata_config.rb +9 -1
  20. data/lib/capsium/package/open_pgp.rb +65 -0
  21. data/lib/capsium/package/open_pgp_cipher.rb +66 -0
  22. data/lib/capsium/package/open_pgp_signer.rb +176 -0
  23. data/lib/capsium/package/security_config.rb +6 -2
  24. data/lib/capsium/package/signer.rb +18 -3
  25. data/lib/capsium/package/store.rb +27 -0
  26. data/lib/capsium/package/validator.rb +27 -2
  27. data/lib/capsium/package/verification.rb +7 -5
  28. data/lib/capsium/package.rb +24 -5
  29. data/lib/capsium/packager.rb +64 -22
  30. data/lib/capsium/reactor/content_api.rb +110 -0
  31. data/lib/capsium/reactor/data_api.rb +154 -0
  32. data/lib/capsium/reactor/endpoints.rb +37 -0
  33. data/lib/capsium/reactor/graphql_api.rb +123 -0
  34. data/lib/capsium/reactor/graphql_schema.rb +138 -0
  35. data/lib/capsium/reactor/introspection.rb +151 -34
  36. data/lib/capsium/reactor/metrics.rb +30 -0
  37. data/lib/capsium/reactor/mount.rb +206 -0
  38. data/lib/capsium/reactor/overlay.rb +248 -0
  39. data/lib/capsium/reactor/package_saver.rb +99 -0
  40. data/lib/capsium/reactor/responses.rb +41 -0
  41. data/lib/capsium/reactor/serving.rb +90 -11
  42. data/lib/capsium/reactor.rb +96 -49
  43. data/lib/capsium/registry/local.rb +120 -0
  44. data/lib/capsium/registry/remote.rb +105 -0
  45. data/lib/capsium/registry.rb +190 -0
  46. data/lib/capsium/version.rb +1 -1
  47. data/lib/capsium.rb +2 -0
  48. data/sig/capsium/log_buffer.rbs +30 -0
  49. data/sig/capsium/package/bundle.rbs +43 -0
  50. data/sig/capsium/package/cipher.rbs +12 -1
  51. data/sig/capsium/package/composition.rbs +4 -3
  52. data/sig/capsium/package/dataset.rbs +8 -0
  53. data/sig/capsium/package/dependency_resolver.rbs +8 -4
  54. data/sig/capsium/package/encryption_config.rbs +6 -2
  55. data/sig/capsium/package/merged_view.rbs +2 -1
  56. data/sig/capsium/package/metadata.rbs +1 -0
  57. data/sig/capsium/package/open_pgp.rbs +38 -0
  58. data/sig/capsium/package/open_pgp_cipher.rbs +15 -0
  59. data/sig/capsium/package/open_pgp_signer.rbs +46 -0
  60. data/sig/capsium/package/security_config.rbs +6 -3
  61. data/sig/capsium/package/signer.rbs +8 -1
  62. data/sig/capsium/package/store.rbs +6 -0
  63. data/sig/capsium/package/verification.rbs +5 -3
  64. data/sig/capsium/package.rbs +8 -3
  65. data/sig/capsium/reactor/content_api.rbs +19 -0
  66. data/sig/capsium/reactor/data_api.rbs +23 -0
  67. data/sig/capsium/reactor/endpoints.rbs +16 -0
  68. data/sig/capsium/reactor/graphql_api.rbs +27 -0
  69. data/sig/capsium/reactor/graphql_schema.rbs +20 -0
  70. data/sig/capsium/reactor/introspection.rbs +27 -7
  71. data/sig/capsium/reactor/metrics.rbs +13 -0
  72. data/sig/capsium/reactor/mount.rbs +83 -0
  73. data/sig/capsium/reactor/overlay.rbs +72 -0
  74. data/sig/capsium/reactor/package_saver.rbs +12 -0
  75. data/sig/capsium/reactor/responses.rbs +23 -0
  76. data/sig/capsium/reactor/serving.rbs +28 -4
  77. data/sig/capsium/reactor.rbs +17 -2
  78. data/sig/capsium/registry/local.rbs +16 -0
  79. data/sig/capsium/registry/remote.rbs +18 -0
  80. data/sig/capsium/registry.rbs +83 -0
  81. data/sig/graphql.rbs +12 -0
  82. metadata +66 -1
@@ -0,0 +1,72 @@
1
+ module Capsium
2
+ class Reactor
3
+ # The writable top overlay layer of a mounted package
4
+ # (ARCHITECTURE.md section 5a): an append-only record of writes in
5
+ # the reactor workdir (content files, tombstones, per-dataset
6
+ # mutation logs). The immutable package never changes on disk.
7
+ class Overlay
8
+ # Base class for the typed overlay errors the APIs map to HTTP
9
+ # statuses.
10
+ class Error < Capsium::Error
11
+ end
12
+
13
+ # The addressed item does not exist in the merged collection (404).
14
+ class ItemNotFoundError < Error
15
+ end
16
+
17
+ # The write conflicts with existing state (409).
18
+ class ConflictError < Error
19
+ end
20
+
21
+ # The dataset cannot take item writes or the path is unsafe.
22
+ class UnsupportedDatasetError < Error
23
+ end
24
+
25
+ # The candidate document violates the dataset's JSON schema (422).
26
+ class SchemaViolationError < Error
27
+ attr_reader messages: Array[String]
28
+
29
+ def initialize: (Array[String] messages) -> void
30
+ end
31
+
32
+ TOMBSTONE_FILE: String
33
+ SAFE_NAME_PATTERN: Regexp
34
+
35
+ attr_reader root: String
36
+ attr_reader tombstones: Set[String]
37
+
38
+ def initialize: (root: String root) -> void
39
+
40
+ def content_root: () -> String
41
+
42
+ def data_root: () -> String
43
+
44
+ # The overlay as the topmost MergedView layer.
45
+ def layer: () -> Package::MergedView::Layer
46
+
47
+ def write_content: (String content_relative, String body) -> void
48
+
49
+ def delete_content: (String content_relative) -> void
50
+
51
+ # The dataset as served: base data merged with the mutation log.
52
+ def dataset_data: (Package::Dataset dataset) -> untyped
53
+
54
+ # The merged item collection.
55
+ def items: (Package::Dataset dataset) -> Array[untyped]
56
+
57
+ def item: (Package::Dataset dataset, String id) -> untyped
58
+
59
+ def append_item: (Package::Dataset dataset, untyped item) -> String
60
+
61
+ def replace_item: (Package::Dataset dataset, String id, untyped item) -> void
62
+
63
+ def delete_item: (Package::Dataset dataset, String id) -> nil
64
+
65
+ # Whether the dataset has recorded mutations.
66
+ def mutations?: (String name) -> bool
67
+
68
+ # The item id convention: an "id" field, else nil (positional).
69
+ def item_id: (untyped item) -> String?
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,12 @@
1
+ module Capsium
2
+ class Reactor
3
+ # Folds a mounted package's base plus its overlay into a NEW
4
+ # versioned .cap (name-version+patch.cap) in the reactor workdir.
5
+ class PackageSaver
6
+ def initialize: (Mount mount) -> void
7
+
8
+ # Saves and returns the {"path", "sha256", "name", "version"} hash.
9
+ def save: (String workdir) -> Hash[String, String]
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,23 @@
1
+ module Capsium
2
+ class Reactor
3
+ # Plain HTTP response writers shared by the reactor dispatch, the
4
+ # route serving and the API handlers (data, GraphQL, save).
5
+ module Responses
6
+ private
7
+
8
+ def respond_not_found: (untyped response) -> untyped
9
+
10
+ def respond_forbidden: (untyped response) -> untyped
11
+
12
+ def respond_not_implemented: (untyped response) -> untyped
13
+
14
+ def respond_method_not_allowed: (untyped response) -> untyped
15
+
16
+ def respond_text: (untyped response, Integer status, String body) -> untyped
17
+
18
+ def respond_json: (untyped response, Integer status, untyped body) -> untyped
19
+
20
+ def respond_error: (untyped response, Integer status, String message, ?messages: Array[String]? messages) -> untyped
21
+ end
22
+ end
23
+ end
@@ -4,19 +4,43 @@ module Capsium
4
4
  # datasets, handler-route 501s), mixed into Reactor. Includes route
5
5
  # inheritance processing per 05x-routing.
6
6
  module Serving
7
+ include Responses
8
+
7
9
  private
8
10
 
9
- def serve_route: (Package::Route route, untyped response) -> untyped
11
+ # One request metric and one log line per served request.
12
+ def record_request: (untyped request, untyped response) -> untyped
13
+
14
+ # The mount answering a request path: longest matching prefix wins.
15
+ def resolve_mount: (String path) -> Mount?
16
+
17
+ def mounts_by_length: () -> Array[Mount]
18
+
19
+ # The root ("/") mount, or the first mount when nothing is mounted
20
+ # at the root.
21
+ def root_mount: () -> Mount
22
+
23
+ # Serves a request that matched a mount.
24
+ def serve_mounted_request: (Mount mount, untyped identity, untyped request, untyped response) -> untyped
25
+
26
+ def serve_data_api: (Mount mount, untyped identity, String inner, untyped request, untyped response) -> untyped
27
+
28
+ def serve_content_api: (Mount mount, untyped identity, String inner, untyped request, untyped response) -> untyped
29
+
30
+ # Route-level access control; false when the response was written.
31
+ def authorized?: (untyped identity, Package::Route route, untyped response) -> bool
32
+
33
+ def serve_route: (Mount mount, Package::Route route, untyped response) -> untyped
10
34
 
11
- def serve_file: (Package::Route route, untyped response) -> untyped
35
+ def serve_file: (Mount mount, Package::Route route, untyped response) -> untyped
12
36
 
13
37
  def inherited_processing: (Package::Route route, String body, Hash[String, String] headers) -> [String, Hash[String, String]]
14
38
 
15
- def content_type_for: (Package::Route route, String content_path) -> String
39
+ def content_type_for: (Mount mount, Package::Route route, String content_path) -> String
16
40
 
17
41
  def headers_for: (Package::Route route) -> Hash[String, String]
18
42
 
19
- def serve_dataset: (String dataset_name, untyped response) -> untyped
43
+ def serve_dataset: (Mount mount, String dataset_name, untyped response) -> untyped
20
44
  end
21
45
  end
22
46
  end
@@ -3,10 +3,13 @@ module Capsium
3
3
  # Monitoring HTTP API (ARCHITECTURE.md section 7) and reloads the
4
4
  # package on filesystem changes.
5
5
  class Reactor
6
+ include Responses
7
+ include Endpoints
6
8
  include Serving
7
9
 
8
10
  DEFAULT_PORT: Integer
9
11
  DEFAULT_CACHE_CONTROL: String
12
+ PACKAGE_SAVE_PATTERN: Regexp
10
13
 
11
14
  attr_reader package: Package
12
15
  attr_reader package_path: String
@@ -17,12 +20,22 @@ module Capsium
17
20
  attr_reader server_thread: Thread?
18
21
  attr_reader introspection: Introspection
19
22
  attr_reader authenticator: Authenticator
23
+ attr_reader store: (Package::Store | String)?
24
+ attr_reader registry: (Capsium::Registry | String)?
25
+ attr_reader started_at: Time
26
+ attr_reader metrics: Metrics
27
+ attr_reader log_buffer: Capsium::LogBuffer
28
+ attr_reader mounts: Array[Mount]
29
+ attr_reader workdir: String
20
30
 
21
- def initialize: (package: Package | String package, ?port: Integer port,
31
+ def initialize: (?package: (Package | String)? package, ?mounts: Array[Mount]? mounts,
32
+ ?port: Integer port,
22
33
  ?cache_control: String? cache_control,
23
34
  ?do_not_listen: bool do_not_listen,
24
35
  ?store: (Package::Store | String)? store,
25
- ?deploy: (Hash[String, untyped] | String)? deploy) -> void
36
+ ?deploy: (Hash[String, untyped] | String)? deploy,
37
+ ?registry: (Capsium::Registry | String)? registry,
38
+ ?workdir: String? workdir) -> void
26
39
 
27
40
  def serve: () -> untyped
28
41
 
@@ -31,5 +44,7 @@ module Capsium
31
44
  def mount_routes: () -> void
32
45
 
33
46
  def restart_server: () -> Thread
47
+
48
+ def cleanup: () -> void
34
49
  end
35
50
  end
@@ -0,0 +1,16 @@
1
+ module Capsium
2
+ class Registry
3
+ # A static registry in a local directory (read-write).
4
+ class Local < Registry
5
+ attr_reader dir: String
6
+
7
+ def initialize: (String dir) -> void
8
+
9
+ def location: () -> String
10
+
11
+ # Validates cap_path, copies it into the registry and records it
12
+ # in index.json. Returns the recorded Entry.
13
+ def push: (String cap_path) -> Entry
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ module Capsium
2
+ class Registry
3
+ # A read-only static registry behind an https base URL (plain http
4
+ # for loopback hosts only).
5
+ class Remote < Registry
6
+ OPEN_TIMEOUT: Integer
7
+ READ_TIMEOUT: Integer
8
+ MAX_REDIRECTS: Integer
9
+ LOOPBACK_NETWORKS: Array[untyped]
10
+
11
+ attr_reader base_url: String
12
+
13
+ def initialize: (String base_url) -> void
14
+
15
+ def location: () -> String
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,83 @@
1
+ module Capsium
2
+ # A static package registry (directory or https base URL with an
3
+ # index.json): Capsium::Registry::Local (read-write) and
4
+ # Capsium::Registry::Remote (read-only). See lib/capsium/registry.rb.
5
+ class Registry
6
+ INDEX_FILE: String
7
+ ENV_VAR: String
8
+
9
+ # Base error for every registry failure.
10
+ class RegistryError < Capsium::Error
11
+ end
12
+
13
+ # No registry reference was given (neither flag nor CAPSIUM_REGISTRY).
14
+ class RegistryNotConfiguredError < RegistryError
15
+ end
16
+
17
+ # The registry itself is unusable (bad path or URL, unreadable index).
18
+ class InvalidRegistryError < RegistryError
19
+ end
20
+
21
+ # A .cap offered to push failed package validation.
22
+ class InvalidPackageError < RegistryError
23
+ end
24
+
25
+ # The index has no entry for the requested package GUID.
26
+ class PackageNotFoundError < RegistryError
27
+ end
28
+
29
+ # The registry has the GUID but no version satisfies the constraint.
30
+ class UnsatisfiableConstraintError < RegistryError
31
+ end
32
+
33
+ # A fetched .cap does not match the sha256 declared in the index.
34
+ class ChecksumMismatchError < RegistryError
35
+ end
36
+
37
+ # A registry file could not be retrieved (network or HTTP failure).
38
+ class FetchError < RegistryError
39
+ end
40
+
41
+ # One indexed version of a registry package.
42
+ class Entry
43
+ def self.new: (guid: String, name: String, version: Package::Version,
44
+ file: String, sha256: String, size: Integer) -> void
45
+
46
+ def guid: () -> String
47
+ def name: () -> String
48
+ def version: () -> Package::Version
49
+ def file: () -> String
50
+ def sha256: () -> String
51
+ def size: () -> Integer
52
+
53
+ # The canonical store file name for this entry's .cap.
54
+ def cap_file_name: () -> String
55
+ end
56
+
57
+ # The registry at the given reference: a Local directory or a Remote
58
+ # http(s) base URL. Raises RegistryNotConfiguredError when no
59
+ # reference is given.
60
+ def self.fetch: (String? ref) -> Registry
61
+
62
+ # The registry named by the CAPSIUM_REGISTRY environment variable,
63
+ # or nil when unset.
64
+ def self.default: () -> Registry?
65
+
66
+ def initialize: () -> void
67
+
68
+ # Where this registry lives (directory path or base URL).
69
+ def location: () -> String
70
+
71
+ # The newest indexed version of the package GUID satisfying the
72
+ # semver constraint.
73
+ def resolve: (String guid, ?String constraint) -> Entry
74
+
75
+ # Resolves, fetches, checksum-verifies and installs the newest
76
+ # satisfying .cap into the package store, returning the store path.
77
+ def install: (String guid, ?String constraint,
78
+ store: (Package::Store | String) store) -> String
79
+
80
+ # Only Local registries are writable.
81
+ def push: (String cap_path) -> Entry
82
+ end
83
+ end
data/sig/graphql.rbs ADDED
@@ -0,0 +1,12 @@
1
+ # Minimal RBS stubs for the graphql gem: only the constants capsium's
2
+ # own signatures reference (the gem ships full sigs, but this project
3
+ # does not use an RBS collection).
4
+ module GraphQL
5
+ class Schema
6
+ def self.execute: (String query, ?variables: Hash[String, untyped] variables, ?operation_name: String? operation_name) -> untyped
7
+
8
+ class Scalar
9
+ def self.graphql_name: (?String name) -> void
10
+ end
11
+ end
12
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capsium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
@@ -37,6 +37,20 @@ dependencies:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
39
  version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: graphql
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
40
54
  - !ruby/object:Gem::Dependency
41
55
  name: json
42
56
  requirement: !ruby/object:Gem::Requirement
@@ -113,6 +127,20 @@ dependencies:
113
127
  - - ">="
114
128
  - !ruby/object:Gem::Version
115
129
  version: '0'
130
+ - !ruby/object:Gem::Dependency
131
+ name: rnp
132
+ requirement: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '1.0'
137
+ type: :runtime
138
+ prerelease: false
139
+ version_requirements: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '1.0'
116
144
  - !ruby/object:Gem::Dependency
117
145
  name: rubyzip
118
146
  requirement: !ruby/object:Gem::Requirement
@@ -223,9 +251,11 @@ files:
223
251
  - lib/capsium/cli/reactor.rb
224
252
  - lib/capsium/converters.rb
225
253
  - lib/capsium/converters/jekyll.rb
254
+ - lib/capsium/log_buffer.rb
226
255
  - lib/capsium/package.rb
227
256
  - lib/capsium/package/authentication.rb
228
257
  - lib/capsium/package/authentication_config.rb
258
+ - lib/capsium/package/bundle.rb
229
259
  - lib/capsium/package/cipher.rb
230
260
  - lib/capsium/package/composition.rb
231
261
  - lib/capsium/package/dataset.rb
@@ -236,6 +266,9 @@ files:
236
266
  - lib/capsium/package/merged_view.rb
237
267
  - lib/capsium/package/metadata.rb
238
268
  - lib/capsium/package/metadata_config.rb
269
+ - lib/capsium/package/open_pgp.rb
270
+ - lib/capsium/package/open_pgp_cipher.rb
271
+ - lib/capsium/package/open_pgp_signer.rb
239
272
  - lib/capsium/package/preparation.rb
240
273
  - lib/capsium/package/routes.rb
241
274
  - lib/capsium/package/routes_config.rb
@@ -260,18 +293,33 @@ files:
260
293
  - lib/capsium/packager.rb
261
294
  - lib/capsium/reactor.rb
262
295
  - lib/capsium/reactor/authenticator.rb
296
+ - lib/capsium/reactor/content_api.rb
297
+ - lib/capsium/reactor/data_api.rb
263
298
  - lib/capsium/reactor/deploy.rb
299
+ - lib/capsium/reactor/endpoints.rb
300
+ - lib/capsium/reactor/graphql_api.rb
301
+ - lib/capsium/reactor/graphql_schema.rb
264
302
  - lib/capsium/reactor/htpasswd.rb
265
303
  - lib/capsium/reactor/introspection.rb
304
+ - lib/capsium/reactor/metrics.rb
305
+ - lib/capsium/reactor/mount.rb
266
306
  - lib/capsium/reactor/oauth2.rb
307
+ - lib/capsium/reactor/overlay.rb
308
+ - lib/capsium/reactor/package_saver.rb
309
+ - lib/capsium/reactor/responses.rb
267
310
  - lib/capsium/reactor/serving.rb
268
311
  - lib/capsium/reactor/session.rb
312
+ - lib/capsium/registry.rb
313
+ - lib/capsium/registry/local.rb
314
+ - lib/capsium/registry/remote.rb
269
315
  - lib/capsium/thor_ext.rb
270
316
  - lib/capsium/version.rb
271
317
  - sig/capsium.rbs
318
+ - sig/capsium/log_buffer.rbs
272
319
  - sig/capsium/package.rbs
273
320
  - sig/capsium/package/authentication.rbs
274
321
  - sig/capsium/package/authentication_config.rbs
322
+ - sig/capsium/package/bundle.rbs
275
323
  - sig/capsium/package/cipher.rbs
276
324
  - sig/capsium/package/composition.rbs
277
325
  - sig/capsium/package/dataset.rbs
@@ -282,6 +330,9 @@ files:
282
330
  - sig/capsium/package/merged_view.rbs
283
331
  - sig/capsium/package/metadata.rbs
284
332
  - sig/capsium/package/metadata_config.rbs
333
+ - sig/capsium/package/open_pgp.rbs
334
+ - sig/capsium/package/open_pgp_cipher.rbs
335
+ - sig/capsium/package/open_pgp_signer.rbs
285
336
  - sig/capsium/package/preparation.rbs
286
337
  - sig/capsium/package/routes.rbs
287
338
  - sig/capsium/package/routes_config.rbs
@@ -306,12 +357,26 @@ files:
306
357
  - sig/capsium/packager.rbs
307
358
  - sig/capsium/reactor.rbs
308
359
  - sig/capsium/reactor/authenticator.rbs
360
+ - sig/capsium/reactor/content_api.rbs
361
+ - sig/capsium/reactor/data_api.rbs
309
362
  - sig/capsium/reactor/deploy.rbs
363
+ - sig/capsium/reactor/endpoints.rbs
364
+ - sig/capsium/reactor/graphql_api.rbs
365
+ - sig/capsium/reactor/graphql_schema.rbs
310
366
  - sig/capsium/reactor/htpasswd.rbs
311
367
  - sig/capsium/reactor/introspection.rbs
368
+ - sig/capsium/reactor/metrics.rbs
369
+ - sig/capsium/reactor/mount.rbs
312
370
  - sig/capsium/reactor/oauth2.rbs
371
+ - sig/capsium/reactor/overlay.rbs
372
+ - sig/capsium/reactor/package_saver.rbs
373
+ - sig/capsium/reactor/responses.rbs
313
374
  - sig/capsium/reactor/serving.rbs
314
375
  - sig/capsium/reactor/session.rbs
376
+ - sig/capsium/registry.rbs
377
+ - sig/capsium/registry/local.rbs
378
+ - sig/capsium/registry/remote.rbs
379
+ - sig/graphql.rbs
315
380
  homepage: https://github.com/capsiums/capsium
316
381
  licenses:
317
382
  - MIT