vigiles 0.1.0.pre.beta9 → 0.1.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7c95b320d216c89bd72c728b2b0402cae897d984554fd6c41e66739eac544e9b
4
- data.tar.gz: 55bd64c8191703e6d5b6aac98945c54fd9d06a65b5b094e2c338ad64c9641fb8
3
+ metadata.gz: aa4d66607b27003c6f7aa0e7a2371d97e2b982ca63d829791d7cc2b042aa75a1
4
+ data.tar.gz: c2a5a05744d8ef06ba60ee4185e8fa80b9c7f76f35d2dbfd0f4503e3abe70539
5
5
  SHA512:
6
- metadata.gz: e98f9cf83934a297eed7ac621f0200b118610690ccd1c9f51279759edce9bfa0db23bd4161adcd762a891b7a3aad6c3606d3e2d66b5ae566615c971ee3bd6460
7
- data.tar.gz: 8b90d7d720d5104d3280aefbf6065892f24d677489ae6c096bab31a887fbc4237ac76765f0425a16ed011aaee2dba4c2828f90a6411d6cc6dff95e761eddf943
6
+ metadata.gz: 77578a9fce6e3acb35e99c0d4d8323ec6485681a80f0236de6960d8e52cb1f6c501b065fa96447f6c09e6cddd5d011eaa9475806d96544236b15a0336e9dc7a1
7
+ data.tar.gz: 7496e7124c6f4511893d5299fa4918913203d060ba946c109e0eb712bc4f685a6e74c1ea440b902097fd8dcff053f73e929ae6e019ec887c86028e6a3ddf44c4
@@ -48,7 +48,7 @@ module Vigiles
48
48
  preferred_headers = Vigiles.spec.request_headers
49
49
  available_headers = request.original_headers
50
50
  recorded_headers = (available_headers if preferred_headers.empty?)
51
- recorded_headers ||= preferred_headers.to_h { |h| [h, available_headers[h]] }
51
+ recorded_headers ||= preferred_headers.to_h { [_1, available_headers[_1]] }
52
52
  unfucked_headers = recorded_headers.transform_keys { best_effort_unfuck_http_header _1 }
53
53
 
54
54
  Request.new(
@@ -59,7 +59,7 @@ module Vigiles
59
59
  protocol: request.protocol,
60
60
  headers: unfucked_headers,
61
61
  origin: request.origin || "unknown_origin_url",
62
- payload: request.body.read,
62
+ payload: Utilities::JSON.parse_benignly(request.body.read),
63
63
  http_method: Types::HttpMethod.deserialize(request.method),
64
64
  path: request.path,
65
65
  url: Utilities::URI.parse_into_http_or_https(request.url),
@@ -25,7 +25,6 @@ module Vigiles
25
25
 
26
26
  response = Response.from(res)
27
27
  request = Request.from(req)
28
-
29
28
  Conversation.create!(
30
29
  request_content_type: request.content_type,
31
30
  request_user_agent: request.user_agent,
@@ -1,16 +1,24 @@
1
1
  # typed: strict
2
2
  # frozen_string_literal: true
3
3
 
4
- require "logger"
5
4
  module Vigiles
6
5
  module Middleware
7
6
  class RecordConversation
8
- sig { params(app: T.untyped).void }
9
- def initialize(app)
10
- @app = app
7
+ sig { returns(Vigiles::Options) }
8
+ attr_reader :options
9
+
10
+ delegate \
11
+ :capture_exception,
12
+ :logger,
13
+ to: :options
14
+
15
+ sig { params(app: T.untyped, options: Vigiles::Options).void }
16
+ def initialize(app, options=Vigiles::Options.make_default_options)
17
+ @app = app
18
+ @options = options
11
19
  end
12
20
 
13
- sig { params(env: T.untyped).returns(T.untyped) }
21
+ sig { params(env: T::Hash[T.untyped, T.untyped]).returns(T.untyped) }
14
22
  def call(env)
15
23
  req = ActionDispatch::Request.new(env)
16
24
  record_conversation(req) do
@@ -20,11 +28,29 @@ module Vigiles
20
28
 
21
29
  sig { params(req: ActionDispatch::Request, blk: T.proc.returns(T.untyped)).returns(T.untyped) }
22
30
  private def record_conversation(req, &blk)
23
- res = Rack::Response[*blk.call]
24
- Vigiles.maybe_record_conversation(req:, res:)
25
- res.to_a
26
- ensure
27
- res.to_a
31
+ rack_response = blk.call
32
+ begin
33
+ res = Rack::Response[*rack_response]
34
+ convo = Vigiles.maybe_record_conversation(req:, res:)
35
+ logger.info \
36
+ "[vigiles] conversation recorder: " \
37
+ "conversation=#{convo.nil? ? "not_recorded" : convo.id} " \
38
+ "request=#{req.request_id}"
39
+ rescue => e
40
+ capture_exception.call(e)
41
+ logger.warn \
42
+ "[vigiles] conversation recorder error: " \
43
+ "error_message=#{e.message} " \
44
+ "error_class=#{e.class}"
45
+ ensure
46
+ # no matter what happens we shouldn't prevent the rack
47
+ # response from being returned. at this point, the only
48
+ # thing that could throw execution into this branch is
49
+ # an exception when the `capture_exception` proc is
50
+ # invoked.
51
+ rack_response
52
+ end
53
+ rack_response
28
54
  end
29
55
  end
30
56
  end
@@ -0,0 +1,19 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "logger"
5
+
6
+ module Vigiles
7
+ class Options < T::Struct
8
+ const :capture_exception, T.proc.params(a0: StandardError).void
9
+ const :logger, ::Logger
10
+
11
+ sig { returns(Options) }
12
+ def self.make_default_options
13
+ Options.new(
14
+ logger: T.unsafe(Rails).logger, # you should be using this within rails.
15
+ capture_exception: ->(e) { e } # a no-op exception capturer.
16
+ )
17
+ end
18
+ end
19
+ end
data/lib/vigiles/types.rb CHANGED
@@ -24,10 +24,12 @@ module Vigiles
24
24
  end
25
25
  end
26
26
 
27
- Headers = T.type_alias { T::Hash[String, T.untyped] }
28
- JsonPayload = T.type_alias { T::Hash[T.untyped, T.untyped] }
29
27
  HtmlPayload = String
28
+
29
+ UntypedHash = T.type_alias { T::Hash[T.untyped, T.untyped] }
30
+ JsonPayload = T.type_alias { UntypedHash }
30
31
  Payload = T.type_alias { T.any(JsonPayload, HtmlPayload) }
32
+ Headers = T.type_alias { T::Hash[String, T.untyped] }
31
33
 
32
34
  ContentTypeRecorder = T.type_alias do
33
35
  T::Hash[String, T.proc.params(arg0: ActionDispatch::Response).returns(Vigiles::Archive::Conversation)]
@@ -0,0 +1,17 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "json"
5
+
6
+ module Vigies
7
+ module Utilities
8
+ module JSON
9
+ sig { params(text: String).returns(T.any(String, Vigiles::Types::UntypedHash)) }
10
+ def self.parse_benignly(text)
11
+ ::JSON.parse(text)
12
+ rescue StandardError
13
+ text
14
+ end
15
+ end
16
+ end
17
+ end
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Vigiles
5
- VERSION = "0.1.0-beta9"
5
+ VERSION = "0.1.1"
6
6
  end
data/lib/vigiles.rb CHANGED
@@ -3,11 +3,11 @@
3
3
 
4
4
  require "zeitwerk"
5
5
  require "sorbet-runtime"
6
- require_relative "core_ext"
7
6
  require "action_dispatch"
7
+ require_relative "core_ext"
8
8
 
9
9
  loader = Zeitwerk::Loader.for_gem(warn_on_extra_files: false)
10
- loader.inflector.inflect("uri" => "URI")
10
+ loader.inflector.inflect("uri" => "URI", "json" => "JSON")
11
11
  loader.ignore("#{__dir__}/generators")
12
12
  loader.ignore("#{__dir__}/core_ext.rb")
13
13
  loader.ignore("#{__dir__}/core_ext")
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vigiles
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.pre.beta9
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yaw Boakye
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-05-26 00:00:00.000000000 Z
11
+ date: 2024-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sorbet-runtime
@@ -225,8 +225,10 @@ files:
225
225
  - lib/vigiles/conversation_recorders/application_json.rb
226
226
  - lib/vigiles/conversation_recorders/unknown.rb
227
227
  - lib/vigiles/middleware/record_conversation.rb
228
+ - lib/vigiles/options.rb
228
229
  - lib/vigiles/spec.rb
229
230
  - lib/vigiles/types.rb
231
+ - lib/vigiles/utilities/json.rb
230
232
  - lib/vigiles/utilities/uri.rb
231
233
  - lib/vigiles/version.rb
232
234
  - sorbet/config