redmineup 1.1.11 → 1.1.12

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: ecb516fc8ae25a65558bec625b9603e7aacd7188d473e80b23eb27223050d2ac
4
- data.tar.gz: 66e4cecc1aa21ab23211e51774fbd262840f5df3efdbb9bb355d20870d142909
3
+ metadata.gz: 16f1cce1801a74eabcd8a01b4c1039f3bec3a1e4ced0911a75f1f01b2294a7ec
4
+ data.tar.gz: 9d8172c485f65ca0c76fa2af110e2b326ed9282b5655d00ed8532cf69e75a0d8
5
5
  SHA512:
6
- metadata.gz: 43bddd0b96c58e00fc4645476801b1792022bce7c13588dc99f00486f77f47031e0fce58a4b5fe41d11b3dfca899527d003f294e1030957662141042e96e6a71
7
- data.tar.gz: 4164a606ad2a264bb4501d3ec773215b5396b7da7dcdbc58bb09adadae630875d14dc9bdf4d669749b391ce19ff620df38c204d6474f2785f465d1e7b461a0b7
6
+ metadata.gz: 46644a7392b9f57a5343499c03d7bc5a1c87a76793b09c5c6bde68c79f007bd7a65228fa5bf67cc2cf1ddccb9232c83b1dc0038195ee1bc810597dba3b2fb83e
7
+ data.tar.gz: 49f143063899297dfed5ea555c2fc38d3d22b534ec3ec63013784f802571ccd10c511d0b24790f68a4456ef8fa15b6d174381bea2a33059704f89236caf1c286
@@ -1,5 +1,7 @@
1
1
  const connections = new Map();
2
2
  const MAX_PENDING_ACK = 3;
3
+ const RETRY_BASE_DELAY = 5000;
4
+ const RETRY_MAX_DELAY = 320000;
3
5
 
4
6
  self.onconnect = function (event) {
5
7
  const clientPort = event.ports[0];
@@ -114,26 +116,41 @@ function sendSubscribe(socket, identifier) {
114
116
  }
115
117
 
116
118
  function initSocketStruct() {
117
- return { socket: null, clients: new Map() };
119
+ return { socket: null, clients: new Map(), retryDelay: RETRY_BASE_DELAY };
118
120
  }
119
121
 
120
122
  function initWebSocket(url) {
121
123
  const conn = connections.get(url);
122
124
  if (!conn) return;
123
125
 
124
- conn.socket = new WebSocket(url);
126
+ if (conn.socket) {
127
+ try {
128
+ conn.socket.onopen =
129
+ conn.socket.onmessage =
130
+ conn.socket.onclose =
131
+ conn.socket.onerror =
132
+ null;
133
+ conn.socket.close();
134
+ } catch (e) {}
135
+ }
136
+
137
+ const socket = new WebSocket(url);
138
+ conn.socket = socket;
125
139
 
126
140
  conn.socket.onopen = function () {
141
+ if (conn.socket !== socket) return;
142
+ conn.retryDelay = RETRY_BASE_DELAY;
127
143
  const seen = new Set();
128
144
  for (const { channelIdentifier } of conn.clients.values()) {
129
145
  if (!seen.has(channelIdentifier)) {
130
146
  seen.add(channelIdentifier);
131
- sendSubscribe(conn.socket, channelIdentifier);
147
+ sendSubscribe(socket, channelIdentifier);
132
148
  }
133
149
  }
134
150
  };
135
151
 
136
152
  conn.socket.onmessage = function (event) {
153
+ if (conn.socket !== socket) return;
137
154
  const messageData = (event.data && JSON.parse(event.data)) || {};
138
155
 
139
156
  if (messageData.type === "confirm_subscription") {
@@ -154,15 +171,18 @@ function initWebSocket(url) {
154
171
  });
155
172
  };
156
173
 
157
- conn.socket.onclose = function () {
174
+ socket.onclose = function () {
175
+ if (conn.socket !== socket) return;
158
176
  broadcastTo(conn, { type: "disconnected" });
177
+ const delay = conn.retryDelay;
178
+ conn.retryDelay = Math.min(conn.retryDelay * 2, RETRY_MAX_DELAY);
159
179
  setTimeout(function () {
160
- if (connections.has(url)) initWebSocket(url);
161
- }, 5000);
180
+ if (connections.has(url) && conn.socket === socket) initWebSocket(url);
181
+ }, delay);
162
182
  };
163
183
 
164
- conn.socket.onerror = function (error) {
165
- conn.socket.close();
184
+ socket.onerror = function (error) {
185
+ socket.close();
166
186
  };
167
187
  }
168
188
 
data/doc/CHANGELOG CHANGED
@@ -4,6 +4,11 @@ Redmine UP gem - general functions for plugins (tags, vote, viewing, currency)
4
4
  Copyright (C) 2011-2026 Kirill Bezrukov (RedmineUP)
5
5
  https://www.redmineup.com/
6
6
 
7
+ == 2026-07-23 v1.1.12
8
+
9
+ * Fixed race condition and added exponential backoff to shared worker websocket reconnect logic
10
+ * Added `Redmineup::TestHelper#load_plugin_fixtures` for loading plugin test fixtures
11
+
7
12
  == 2026-06-26 v1.1.11
8
13
 
9
14
  * Added shared workers for websocket connection
@@ -0,0 +1,12 @@
1
+ module Redmineup
2
+ module TestHelper
3
+ module ClassMethods
4
+ def load_plugin_fixtures(plugin_name, *names)
5
+ fixtures_dir = File.join(Redmine::Plugin.find(plugin_name).directory, 'test', 'fixtures')
6
+ ActiveRecord::FixtureSet.create_fixtures(fixtures_dir, names)
7
+ end
8
+ end
9
+ end
10
+ end
11
+
12
+ ActiveSupport::TestCase.extend Redmineup::TestHelper::ClassMethods
@@ -1,3 +1,3 @@
1
1
  module Redmineup
2
- VERSION = '1.1.11'
2
+ VERSION = '1.1.12'
3
3
  end
data/lib/redmineup.rb CHANGED
@@ -45,6 +45,7 @@ require 'redmineup/helpers/external_assets_helper'
45
45
  require 'redmineup/helpers/form_tag_helper'
46
46
  require 'redmineup/helpers/calendars_helper'
47
47
  require 'redmineup/helpers/datetime_helper'
48
+ require 'redmineup/helpers/test_helper'
48
49
  require 'redmineup/assets_manager'
49
50
 
50
51
  require 'redmineup/patches/liquid_patch'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redmineup
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.11
4
+ version: 1.1.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - RedmineUP
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-06-29 00:00:00.000000000 Z
11
+ date: 2026-07-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -174,6 +174,7 @@ files:
174
174
  - lib/redmineup/helpers/external_assets_helper.rb
175
175
  - lib/redmineup/helpers/form_tag_helper.rb
176
176
  - lib/redmineup/helpers/tags_helper.rb
177
+ - lib/redmineup/helpers/test_helper.rb
177
178
  - lib/redmineup/helpers/vote_helper.rb
178
179
  - lib/redmineup/hooks/views_layouts_hook.rb
179
180
  - lib/redmineup/liquid/drops/attachment_drop.rb