File size: 843 Bytes
3e05655
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import { createComputed, onCleanup } from "solid-js"

export function createSessionOwnership(sessionKey: () => string) {
  let current = sessionKey()
  let generation = 0
  const transition = () => {
    const next = sessionKey()
    if (next === current) return
    current = next
    generation++
  }
  createComputed(transition)
  onCleanup(() => generation++)

  return {
    key: () => {
      transition()
      return `${generation}:${current}`
    },
    capture() {
      transition()
      const captured = generation
      return {
        key: `${captured}:${current}`,
        current: () => {
          transition()
          return generation === captured
        },
        run<T>(action: () => T) {
          transition()
          if (generation !== captured) return
          return action()
        },
      }
    },
  }
}