browserctl 0.8.2 → 0.8.3

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: c5145a9c65fc1dc92bd238aecd15c672286dfa41005333dbaa1e6a613834c9fc
4
- data.tar.gz: 0f1c56d87a58b41fbdea2e3ec1abf211bcf08a3677348d34565301f15bb76e96
3
+ metadata.gz: cd4d66743b0fba81220c113a7c99a09a94b216acee4d734a6e69ff76d27378b7
4
+ data.tar.gz: 60a8eb9469960e376c0d71a51bf801863e60d7a52e935578920ce227d8397e2b
5
5
  SHA512:
6
- metadata.gz: 162679d64a18bfb241ef1312a7ecfac12cc312407ccd598bc0741c2f985d1754dbdcbe00112ee2cc522a3987b88d8cd34dd4799b48651238efb548348123d58f
7
- data.tar.gz: 710809a3eb707ad0f1f7300c77cb4b6cfdc4f631dc7f1e02b4b426262164b061d7008ba1901e501483e85a09ecb7be63fd60afa08dba9039b79670e711532fa4
6
+ metadata.gz: ceed28ff7dd8603bbaaee3ddaa5f6e65669a623aca423633a3ce08f64584064d37a400e461f8828260f245c34bba509452431c4af8ce2c672764778337a51075
7
+ data.tar.gz: 932c20041989b25fc3fc7d20aa23909edd1651a00500071fbe1ceb4b38edb7c0d64c033cd267f5a4ad240fb3d3f60020320f94f5c45ad9912f79a1960549d7e0
data/CHANGELOG.md CHANGED
@@ -10,6 +10,18 @@ All notable changes to this project will be documented in this file.
10
10
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
11
11
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
12
12
 
13
+ ## [0.8.3](https://github.com/patrick204nqh/browserctl/compare/v0.8.2...v0.8.3) (2026-04-29)
14
+
15
+
16
+ ### Features
17
+
18
+ * expired_if: on load_session — detect stale sessions and auto-recover ([#67](https://github.com/patrick204nqh/browserctl/issues/67)) ([c6a4674](https://github.com/patrick204nqh/browserctl/commit/c6a467439835373165b1323c4aad6144388533be))
19
+
20
+
21
+ ### Miscellaneous Chores
22
+
23
+ * pin next release to 0.8.3 ([#69](https://github.com/patrick204nqh/browserctl/issues/69)) ([a017e3c](https://github.com/patrick204nqh/browserctl/commit/a017e3c3b464060ced2ecd4d76fa04049f40e46a))
24
+
13
25
  ## [0.8.2](https://github.com/patrick204nqh/browserctl/compare/v0.8.1...v0.8.2) (2026-04-29)
14
26
 
15
27
 
@@ -270,8 +270,8 @@ module Browserctl
270
270
  # Saves the current browser state (cookies, localStorage, open pages) to a named session.
271
271
  # @param session_name [String] name for the saved session
272
272
  # @return [Hash] `{ ok: true, path:, pages: N, cookies: N }` or `{ error: }`
273
- def session_save(session_name)
274
- call("session_save", session_name: session_name)
273
+ def session_save(session_name, encrypt: false)
274
+ call("session_save", session_name: session_name, encrypt: encrypt)
275
275
  end
276
276
 
277
277
  # Restores a previously saved session into the running daemon.
@@ -32,7 +32,8 @@ module Browserctl
32
32
  created_at: now, updated_at: now, pages: pages_meta },
33
33
  cookies: cookies,
34
34
  local_storage: local_storage,
35
- session_storage: {}
35
+ session_storage: {},
36
+ encrypt: req[:encrypt] || false
36
37
  )
37
38
  { ok: true, path: Browserctl::Session.path(req[:session_name]),
38
39
  pages: pages_meta.length, cookies: cookies.length }
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Browserctl
4
- VERSION = "0.8.2"
4
+ VERSION = "0.8.3"
5
5
  end
@@ -68,23 +68,21 @@ module Browserctl
68
68
  res
69
69
  end
70
70
 
71
- def load_session(session_name, fallback: nil)
71
+ def load_session(session_name, fallback: nil, expired_if: nil)
72
+ validate_expired_if!(expired_if)
73
+ fallback_name = fallback&.to_s
72
74
  res = @client.session_load(session_name)
73
- return res unless res[:error]
74
75
 
75
- raise WorkflowError, res[:error] unless fallback
76
+ if res[:error]
77
+ raise WorkflowError, res[:error] unless fallback_name
76
78
 
77
- invoke(fallback.to_s)
78
- res2 = @client.session_load(session_name)
79
- if res2[:error]
80
- msg = "session '#{session_name}' still unavailable after running fallback '#{fallback}'"
81
- unless Session.exist?(session_name)
82
- msg += "\n Hint: '#{fallback}' did not call save_session(\"#{session_name}\") — add it as the last step."
83
- end
84
- raise WorkflowError, msg
79
+ invoke(fallback_name)
80
+ return load_after_fallback(session_name, fallback_name)
85
81
  end
86
82
 
87
- res2
83
+ return res if expired_if.nil? || !call_expired_if(expired_if, session_name)
84
+
85
+ recover_expired_session(session_name, fallback_name, expired_if)
88
86
  end
89
87
 
90
88
  def list_sessions
@@ -108,6 +106,48 @@ module Browserctl
108
106
 
109
107
  private
110
108
 
109
+ def validate_expired_if!(expired_if)
110
+ return unless expired_if && !expired_if.lambda?
111
+
112
+ raise ArgumentError,
113
+ "expired_if: must be a lambda (-> { }), not a Proc — " \
114
+ "bare return inside a Proc unwinds the caller"
115
+ end
116
+
117
+ def call_expired_if(expired_if, session_name)
118
+ expired_if.call
119
+ rescue WorkflowError, StandardError => e
120
+ raise WorkflowError, "expired_if check failed for session '#{session_name}': #{e.message}"
121
+ end
122
+
123
+ def recover_expired_session(session_name, fallback_name, expired_if)
124
+ unless fallback_name
125
+ raise WorkflowError,
126
+ "session '#{session_name}' is expired; provide fallback: to auto-recover"
127
+ end
128
+
129
+ invoke(fallback_name)
130
+ res = load_after_fallback(session_name, fallback_name)
131
+
132
+ if call_expired_if(expired_if, session_name)
133
+ raise WorkflowError,
134
+ "session '#{session_name}' still expired after running fallback '#{fallback_name}'"
135
+ end
136
+
137
+ res
138
+ end
139
+
140
+ def load_after_fallback(session_name, fallback)
141
+ res = @client.session_load(session_name)
142
+ return res unless res[:error]
143
+
144
+ msg = "session '#{session_name}' still unavailable after running fallback '#{fallback}'"
145
+ unless Session.exist?(session_name)
146
+ msg += "\n Hint: '#{fallback}' did not call save_session(\"#{session_name}\") — add it as the last step."
147
+ end
148
+ raise WorkflowError, msg
149
+ end
150
+
111
151
  def invoke_stack
112
152
  @invoke_stack ||= []
113
153
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: browserctl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.2
4
+ version: 0.8.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patrick