hotsock-turbo 0.2.1 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: aa8e10033b8676f3818b4c8988046b24f410258c07f0632cd4082e9a1ed9865d
4
- data.tar.gz: 575ebb35a85d1bc5ab915b6ab83c32dba6bdb542cd36c8fde03c6ad21a38946b
3
+ metadata.gz: 855667dd61bba20964a93972d108e1ae299df990c157670b6005f979ac736c2a
4
+ data.tar.gz: cde85dbe0e22fa654230f283efcbfa460541daa87f6efa0992cf6c94063df7b2
5
5
  SHA512:
6
- metadata.gz: 443b7bae1effc3d21e06d5d1249cf8d93fda03a38f8876eacc60d9d414360887e8b20d88689a508a7b181124493bdd2ca8af2b81750fbeafc8324903bec3aa4d
7
- data.tar.gz: b29f910dd278d6143812b0ab65ebbb01deb75dbde72614084880e10be081a1a1450fe7730d443a119f9e4230f09191275f100143f0d43525fb2177121f82f1c9
6
+ metadata.gz: 61e34a6b641bb36ea43fab13fadde47c034b9080dd9ebaec35686742526c8115e0cde07cfe5569333b6759e25473e88b83580d139590ac5dc65acf36cf0faf50
7
+ data.tar.gz: efcd9736e449b9043f96449918f4145040bd9c8649117881c5f5ae4ab025e8d050e9590bb5e870e4af7506830fb9c930b9e189be76a6b73719c7e2902ce4e9a4
data/Gemfile CHANGED
@@ -11,6 +11,6 @@ group :development, :test do
11
11
  end
12
12
 
13
13
  group :test do
14
- gem "maxitest"
14
+ gem "maxitest", "< 7"
15
15
  gem "ostruct"
16
16
  end
@@ -32,10 +32,19 @@ function createHotsockClient() {
32
32
  const hotsockClient = window.Hotsock || createHotsockClient()
33
33
  window.Hotsock = hotsockClient
34
34
 
35
- // Track active subscriptions by channel
36
35
  const subscriptions = new Map() // channel -> { binding, elements: Set, unsubscribeTimer }
36
+ const lastMessageIds = new Map() // channel -> lastMessageId (ULID)
37
37
  const UNSUBSCRIBE_DELAY_MS = 250
38
38
 
39
+ function isReplaceOrUpdateAction(html) {
40
+ return /<turbo-stream[^>]+action=["'](replace|update)["']/.test(html)
41
+ }
42
+
43
+ function isNewerMessage(newId, lastId) {
44
+ if (!lastId) return true
45
+ return newId > lastId
46
+ }
47
+
39
48
  class HotsockTurboStreamSourceElement extends HTMLElement {
40
49
  #channel = null
41
50
 
@@ -75,8 +84,17 @@ class HotsockTurboStreamSourceElement extends HTMLElement {
75
84
  const { Turbo } = window
76
85
  const binding = hotsockClient.bind(
77
86
  "turbo_stream",
78
- ({ data }) => {
87
+ ({ id, data }) => {
79
88
  if (!data?.html) return
89
+
90
+ if (isReplaceOrUpdateAction(data.html)) {
91
+ const lastId = lastMessageIds.get(channel)
92
+ if (!isNewerMessage(id, lastId)) {
93
+ return
94
+ }
95
+ lastMessageIds.set(channel, id)
96
+ }
97
+
80
98
  try {
81
99
  Turbo.renderStreamMessage(data.html)
82
100
  } catch (error) {
@@ -115,6 +133,7 @@ class HotsockTurboStreamSourceElement extends HTMLElement {
115
133
  if (sub.elements.size === 0) {
116
134
  sub.binding.unbind()
117
135
  subscriptions.delete(channel)
136
+ lastMessageIds.delete(channel)
118
137
  }
119
138
  }, UNSUBSCRIBE_DELAY_MS)
120
139
  }
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Hotsock
4
4
  module Turbo
5
- VERSION = "0.2.1"
5
+ VERSION = "0.3.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hotsock-turbo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Miller