ioredis-toolkit 0.0.11 → 0.0.13

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.0.13
4
+
5
+ ### Patch Changes
6
+
7
+ - 09c266a: resolve bug
8
+
9
+ ## 0.0.12
10
+
11
+ ### Patch Changes
12
+
13
+ - e218550: Removed lua scripts
14
+
3
15
  ## 0.0.11
4
16
 
5
17
  ### Patch Changes
@@ -1,9 +1,9 @@
1
1
  export declare const SCRIPT_SOURCES: {
2
2
  readonly create_session: "-- KEYS[1] session key\n-- KEYS[2] user index\n-- ARGV[1] serialized record\n-- ARGV[2] ttl seconds\n-- ARGV[3] createdAt score\n-- ARGV[4] tokenHash\n-- ARGV[5] max sessions (0 = unlimited)\n-- ARGV[6] namespace\n-- ARGV[7] userTag\nlocal created = redis.call('SET', KEYS[1], ARGV[1], 'NX', 'EX', ARGV[2])\nif not created then return {-1} end\nredis.call('ZADD', KEYS[2], ARGV[3], ARGV[4])\nif tonumber(ARGV[5]) > 0 then\n local count = redis.call('ZCARD', KEYS[2])\n if count > tonumber(ARGV[5]) then\n local excess = count - tonumber(ARGV[5])\n local old = redis.call('ZRANGE', KEYS[2], 0, excess - 1)\n for _, evictedHash in ipairs(old) do\n redis.call('ZREM', KEYS[2], evictedHash)\n redis.call('DEL', ARGV[6] .. ':session:{' .. ARGV[7] .. '}:' .. evictedHash)\n redis.call('DEL', ARGV[6] .. ':token-index:' .. evictedHash)\n end\n return {1, excess}\n end\nend\nreturn {1}\n";
3
- readonly touch_session: "-- KEYS[1] session key\n-- ARGV[1] now epoch seconds\n-- ARGV[2] touch interval\n-- ARGV[3] new idle expiry epoch seconds (0 = no idle timeout)\n-- ARGV[4] new absolute expiry epoch seconds (0 = no absolute timeout)\nlocal raw = redis.call('GET', KEYS[1])\nif not raw then return {0} end\nlocal ok, s = pcall(cjson.decode, raw)\nif not ok or not s.data then return {-4} end\nlocal r = s.data\nif r.status ~= 'active' then return {-1} end\nlocal now = tonumber(ARGV[1])\nif tonumber(r.expiresAt) <= now then return {-2} end\nif r.absoluteExpiresAt and r.absoluteExpiresAt ~= cjson.null and tonumber(r.absoluteExpiresAt) > 0 and tonumber(r.absoluteExpiresAt) <= now then return {-2} end\nif r.idleExpiresAt and tonumber(r.idleExpiresAt) > 0 and tonumber(r.idleExpiresAt) <= now then return {-3} end\nif now - tonumber(r.lastAccessedAt) < tonumber(ARGV[2]) then return {2} end\nlocal idle = tonumber(ARGV[3])\nlocal absolute = tonumber(ARGV[4])\nif absolute > 0 and idle > absolute then idle = absolute end\nr.lastAccessedAt = now\nr.idleExpiresAt = idle > 0 and idle or cjson.null\nr.version = tonumber(r.version) + 1\nlocal wrapper = {v=1, data=r}\nlocal encoded = cjson.encode(wrapper)\nlocal ttl = tonumber(r.expiresAt) - now\nif ttl <= 0 then return {-2} end\nredis.call('SET', KEYS[1], encoded, 'XX', 'EX', ttl)\nreturn {1, r.version, idle}\n";
4
- readonly consume_session: "-- KEYS[1] session key\n-- ARGV[1] now epoch seconds\n-- ARGV[2] tombstone ttl seconds\nlocal raw = redis.call('GET', KEYS[1])\nif not raw then return {0} end\nlocal ok, s = pcall(cjson.decode, raw)\nif not ok or not s.data then return {-4} end\nlocal r = s.data\nif r.status == 'consumed' then return {-1} end\nif r.status == 'revoked' then return {-3} end\nlocal now = tonumber(ARGV[1])\nif tonumber(r.expiresAt) <= now then return {-2} end\nif r.absoluteExpiresAt and r.absoluteExpiresAt ~= cjson.null and tonumber(r.absoluteExpiresAt) > 0 and tonumber(r.absoluteExpiresAt) <= now then return {-2} end\nif r.idleExpiresAt and tonumber(r.idleExpiresAt) > 0 and tonumber(r.idleExpiresAt) <= now then return {-2} end\nr.status = 'consumed'\nr.consumedAt = now\nr.version = tonumber(r.version) + 1\nlocal ttl = tonumber(ARGV[2])\nlocal encoded = cjson.encode({v=1, data=r})\nredis.call('SET', KEYS[1], encoded, 'XX', 'EX', ttl)\nreturn {1, r.userId, r.jti, r.version}\n";
5
- readonly revoke_session: "-- KEYS[1] session key\n-- ARGV[1] now\n-- ARGV[2] tombstone ttl\nlocal raw = redis.call('GET', KEYS[1])\nif not raw then return {0} end\nlocal ok, s = pcall(cjson.decode, raw)\nif not ok or not s.data then return {-4} end\nlocal r=s.data\nif r.status == 'revoked' then return {2} end\nr.status='revoked'; r.version=tonumber(r.version)+1\nlocal ttl=tonumber(ARGV[2])\nif ttl < 1 then redis.call('DEL', KEYS[1]) else redis.call('SET', KEYS[1], cjson.encode({v=1,data=r}), 'XX', 'EX', ttl) end\nreturn {1}\n";
6
- readonly update_session: "-- KEYS[1] session key\n-- ARGV[1] expected version\n-- ARGV[2] now\n-- ARGV[3] serialized replacement\nlocal raw = redis.call('GET', KEYS[1])\nif not raw then return {0} end\nlocal ok, s = pcall(cjson.decode, raw)\nif not ok or not s.data then return {-4} end\nif s.data.status ~= 'active' then return {-3} end\nif tonumber(s.data.version) ~= tonumber(ARGV[1]) then return {-2, s.data.version} end\nlocal replacement = ARGV[3]\nlocal ok2, parsed = pcall(cjson.decode, replacement)\nif not ok2 or not parsed.data then return {-4} end\nif parsed.data.userId ~= s.data.userId or parsed.data.jti ~= s.data.jti or parsed.data.id ~= s.data.id or parsed.data.createdAt ~= s.data.createdAt or parsed.data.absoluteExpiresAt ~= s.data.absoluteExpiresAt then return {-5} end\nlocal ttl = tonumber(s.data.expiresAt) - tonumber(ARGV[2])\nif ttl <= 0 then return {-1} end\nredis.call('SET', KEYS[1], replacement, 'XX', 'EX', ttl)\nreturn {1}\n";
3
+ readonly touch_session: "-- KEYS[1] session key\n-- ARGV[1] now epoch seconds\n-- ARGV[2] touch interval\n-- ARGV[3] new idle expiry epoch seconds (0 = no idle timeout)\n-- ARGV[4] new absolute expiry epoch seconds (0 = no absolute timeout)\nlocal raw = redis.call('GET', KEYS[1])\nif not raw then return {0} end\nlocal ok, s = pcall(cjson.decode, raw)\nif not ok or not s.data then return {-4} end\nlocal r = cjson.decode(s.data)\nif r.status ~= 'active' then return {-1} end\nlocal now = tonumber(ARGV[1])\nif tonumber(r.expiresAt) <= now then return {-2} end\nif r.absoluteExpiresAt and r.absoluteExpiresAt ~= cjson.null and tonumber(r.absoluteExpiresAt) > 0 and tonumber(r.absoluteExpiresAt) <= now then return {-2} end\nif r.idleExpiresAt and r.idleExpiresAt ~= cjson.null and tonumber(r.idleExpiresAt) > 0 and tonumber(r.idleExpiresAt) <= now then return {-3} end\nif now - tonumber(r.lastAccessedAt) < tonumber(ARGV[2]) then return {2} end\nlocal idle = tonumber(ARGV[3])\nlocal absolute = tonumber(ARGV[4])\nif absolute > 0 and idle > absolute then idle = absolute end\nr.lastAccessedAt = now\nr.idleExpiresAt = idle > 0 and idle or cjson.null\nr.version = tonumber(r.version) + 1\nlocal wrapper = {v=1, data=cjson.encode(r)}\nlocal encoded = cjson.encode(wrapper)\nlocal ttl = tonumber(r.expiresAt) - now\nif ttl <= 0 then return {-2} end\nredis.call('SET', KEYS[1], encoded, 'XX', 'EX', ttl)\nreturn {1, r.version, idle}\n";
4
+ readonly consume_session: "-- KEYS[1] session key\n-- ARGV[1] now epoch seconds\n-- ARGV[2] tombstone ttl seconds\nlocal raw = redis.call('GET', KEYS[1])\nif not raw then return {0} end\nlocal ok, s = pcall(cjson.decode, raw)\nif not ok or not s.data then return {-4} end\nlocal r = cjson.decode(s.data)\nif r.status == 'consumed' then return {-1} end\nif r.status == 'revoked' then return {-3} end\nlocal now = tonumber(ARGV[1])\nif tonumber(r.expiresAt) <= now then return {-2} end\nif r.absoluteExpiresAt and r.absoluteExpiresAt ~= cjson.null and tonumber(r.absoluteExpiresAt) > 0 and tonumber(r.absoluteExpiresAt) <= now then return {-2} end\nif r.idleExpiresAt and r.idleExpiresAt ~= cjson.null and tonumber(r.idleExpiresAt) > 0 and tonumber(r.idleExpiresAt) <= now then return {-2} end\nr.status = 'consumed'\nr.consumedAt = now\nr.version = tonumber(r.version) + 1\nlocal ttl = tonumber(ARGV[2])\nlocal encoded = cjson.encode({v=1, data=cjson.encode(r)})\nredis.call('SET', KEYS[1], encoded, 'XX', 'EX', ttl)\nreturn {1, r.userId, r.jti, r.version}\n";
5
+ readonly revoke_session: "-- KEYS[1] session key\n-- ARGV[1] now\n-- ARGV[2] tombstone ttl\nlocal raw = redis.call('GET', KEYS[1])\nif not raw then return {0} end\nlocal ok, s = pcall(cjson.decode, raw)\nif not ok or not s.data then return {-4} end\nlocal r=cjson.decode(s.data)\nif r.status == 'revoked' then return {2} end\nr.status='revoked'; r.version=tonumber(r.version)+1\nlocal ttl=tonumber(ARGV[2])\nif ttl < 1 then redis.call('DEL', KEYS[1]) else redis.call('SET', KEYS[1], cjson.encode({v=1,data=cjson.encode(r)}), 'XX', 'EX', ttl) end\nreturn {1}\n";
6
+ readonly update_session: "-- KEYS[1] session key\n-- ARGV[1] expected version\n-- ARGV[2] now\n-- ARGV[3] serialized replacement\nlocal raw = redis.call('GET', KEYS[1])\nif not raw then return {0} end\nlocal ok, s = pcall(cjson.decode, raw)\nif not ok or not s.data then return {-4} end\ns.data = cjson.decode(s.data)\nif s.data.status ~= 'active' then return {-3} end\nif tonumber(s.data.version) ~= tonumber(ARGV[1]) then return {-2, s.data.version} end\nlocal replacement = ARGV[3]\nlocal ok2, parsed = pcall(cjson.decode, replacement)\nif not ok2 or not parsed.data then return {-4} end\nparsed.data = cjson.decode(parsed.data)\nif parsed.data.userId ~= s.data.userId or parsed.data.jti ~= s.data.jti or parsed.data.id ~= s.data.id or parsed.data.createdAt ~= s.data.createdAt or parsed.data.absoluteExpiresAt ~= s.data.absoluteExpiresAt then return {-5} end\nlocal ttl = tonumber(s.data.expiresAt) - tonumber(ARGV[2])\nif ttl <= 0 then return {-1} end\nredis.call('SET', KEYS[1], replacement, 'XX', 'EX', ttl)\nreturn {1}\n";
7
7
  readonly delete: "-- KEYS[1] session key\nreturn redis.call('DEL', KEYS[1])\n";
8
8
  readonly enforce_limit: "-- Bounded helper. The application must pass session keys to delete as KEYS.\n-- KEYS[1] user index; KEYS[2..N] session keys corresponding to the oldest members.\n-- ARGV[1] max sessions; ARGV[2] number of candidate keys.\nlocal max=tonumber(ARGV[1])\nlocal candidateCount=tonumber(ARGV[2])\nlocal count=redis.call('ZCARD', KEYS[1])\nif max <= 0 or count <= max then return {0} end\nlocal excess=math.min(count-max, candidateCount)\nlocal removed=0\nfor i=1,excess do\n local tokenHash=redis.call('ZRANGE', KEYS[1], 0, 0)[1]\n if not tokenHash then break end\n redis.call('ZREM', KEYS[1], tokenHash)\n redis.call('DEL', KEYS[i+1])\n removed=removed+1\nend\nreturn {removed}\n";
9
9
  readonly cleanup_index: "-- KEYS[1] user index\n-- ARGV[1..N] stale token hashes (user-index ZSET members, not JTIs)\nfor i=1,#ARGV do redis.call('ZREM', KEYS[1], ARGV[i]) end\nreturn #ARGV\n";
@@ -1 +1 @@
1
- {"version":3,"file":"script-sources.d.ts","sourceRoot":"","sources":["../../src/session/script-sources.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc;;;;;;;;;CA0IjB,CAAC"}
1
+ {"version":3,"file":"script-sources.d.ts","sourceRoot":"","sources":["../../src/session/script-sources.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc;;;;;;;;;CA4IjB,CAAC"}
@@ -35,12 +35,12 @@ local raw = redis.call('GET', KEYS[1])
35
35
  if not raw then return {0} end
36
36
  local ok, s = pcall(cjson.decode, raw)
37
37
  if not ok or not s.data then return {-4} end
38
- local r = s.data
38
+ local r = cjson.decode(s.data)
39
39
  if r.status ~= 'active' then return {-1} end
40
40
  local now = tonumber(ARGV[1])
41
41
  if tonumber(r.expiresAt) <= now then return {-2} end
42
42
  if r.absoluteExpiresAt and r.absoluteExpiresAt ~= cjson.null and tonumber(r.absoluteExpiresAt) > 0 and tonumber(r.absoluteExpiresAt) <= now then return {-2} end
43
- if r.idleExpiresAt and tonumber(r.idleExpiresAt) > 0 and tonumber(r.idleExpiresAt) <= now then return {-3} end
43
+ if r.idleExpiresAt and r.idleExpiresAt ~= cjson.null and tonumber(r.idleExpiresAt) > 0 and tonumber(r.idleExpiresAt) <= now then return {-3} end
44
44
  if now - tonumber(r.lastAccessedAt) < tonumber(ARGV[2]) then return {2} end
45
45
  local idle = tonumber(ARGV[3])
46
46
  local absolute = tonumber(ARGV[4])
@@ -48,7 +48,7 @@ if absolute > 0 and idle > absolute then idle = absolute end
48
48
  r.lastAccessedAt = now
49
49
  r.idleExpiresAt = idle > 0 and idle or cjson.null
50
50
  r.version = tonumber(r.version) + 1
51
- local wrapper = {v=1, data=r}
51
+ local wrapper = {v=1, data=cjson.encode(r)}
52
52
  local encoded = cjson.encode(wrapper)
53
53
  local ttl = tonumber(r.expiresAt) - now
54
54
  if ttl <= 0 then return {-2} end
@@ -62,18 +62,18 @@ local raw = redis.call('GET', KEYS[1])
62
62
  if not raw then return {0} end
63
63
  local ok, s = pcall(cjson.decode, raw)
64
64
  if not ok or not s.data then return {-4} end
65
- local r = s.data
65
+ local r = cjson.decode(s.data)
66
66
  if r.status == 'consumed' then return {-1} end
67
67
  if r.status == 'revoked' then return {-3} end
68
68
  local now = tonumber(ARGV[1])
69
69
  if tonumber(r.expiresAt) <= now then return {-2} end
70
70
  if r.absoluteExpiresAt and r.absoluteExpiresAt ~= cjson.null and tonumber(r.absoluteExpiresAt) > 0 and tonumber(r.absoluteExpiresAt) <= now then return {-2} end
71
- if r.idleExpiresAt and tonumber(r.idleExpiresAt) > 0 and tonumber(r.idleExpiresAt) <= now then return {-2} end
71
+ if r.idleExpiresAt and r.idleExpiresAt ~= cjson.null and tonumber(r.idleExpiresAt) > 0 and tonumber(r.idleExpiresAt) <= now then return {-2} end
72
72
  r.status = 'consumed'
73
73
  r.consumedAt = now
74
74
  r.version = tonumber(r.version) + 1
75
75
  local ttl = tonumber(ARGV[2])
76
- local encoded = cjson.encode({v=1, data=r})
76
+ local encoded = cjson.encode({v=1, data=cjson.encode(r)})
77
77
  redis.call('SET', KEYS[1], encoded, 'XX', 'EX', ttl)
78
78
  return {1, r.userId, r.jti, r.version}
79
79
  `,
@@ -84,11 +84,11 @@ local raw = redis.call('GET', KEYS[1])
84
84
  if not raw then return {0} end
85
85
  local ok, s = pcall(cjson.decode, raw)
86
86
  if not ok or not s.data then return {-4} end
87
- local r=s.data
87
+ local r=cjson.decode(s.data)
88
88
  if r.status == 'revoked' then return {2} end
89
89
  r.status='revoked'; r.version=tonumber(r.version)+1
90
90
  local ttl=tonumber(ARGV[2])
91
- if ttl < 1 then redis.call('DEL', KEYS[1]) else redis.call('SET', KEYS[1], cjson.encode({v=1,data=r}), 'XX', 'EX', ttl) end
91
+ if ttl < 1 then redis.call('DEL', KEYS[1]) else redis.call('SET', KEYS[1], cjson.encode({v=1,data=cjson.encode(r)}), 'XX', 'EX', ttl) end
92
92
  return {1}
93
93
  `,
94
94
  'update_session': `-- KEYS[1] session key
@@ -99,11 +99,13 @@ local raw = redis.call('GET', KEYS[1])
99
99
  if not raw then return {0} end
100
100
  local ok, s = pcall(cjson.decode, raw)
101
101
  if not ok or not s.data then return {-4} end
102
+ s.data = cjson.decode(s.data)
102
103
  if s.data.status ~= 'active' then return {-3} end
103
104
  if tonumber(s.data.version) ~= tonumber(ARGV[1]) then return {-2, s.data.version} end
104
105
  local replacement = ARGV[3]
105
106
  local ok2, parsed = pcall(cjson.decode, replacement)
106
107
  if not ok2 or not parsed.data then return {-4} end
108
+ parsed.data = cjson.decode(parsed.data)
107
109
  if parsed.data.userId ~= s.data.userId or parsed.data.jti ~= s.data.jti or parsed.data.id ~= s.data.id or parsed.data.createdAt ~= s.data.createdAt or parsed.data.absoluteExpiresAt ~= s.data.absoluteExpiresAt then return {-5} end
108
110
  local ttl = tonumber(s.data.expiresAt) - tonumber(ARGV[2])
109
111
  if ttl <= 0 then return {-1} end
@@ -1 +1 @@
1
- {"version":3,"file":"script-sources.js","sourceRoot":"","sources":["../../src/session/script-sources.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BnB;IACC,eAAe,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BlB;IACC,iBAAiB,EAAE;;;;;;;;;;;;;;;;;;;;;CAqBpB;IACC,gBAAgB,EAAE;;;;;;;;;;;;;CAanB;IACC,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;CAkBnB;IACC,QAAQ,EAAE;;CAEX;IACC,eAAe,EAAE;;;;;;;;;;;;;;;;;CAiBlB;IACC,eAAe,EAAE;;;;CAIlB;CACS,CAAC"}
1
+ {"version":3,"file":"script-sources.js","sourceRoot":"","sources":["../../src/session/script-sources.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BnB;IACC,eAAe,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BlB;IACC,iBAAiB,EAAE;;;;;;;;;;;;;;;;;;;;;CAqBpB;IACC,gBAAgB,EAAE;;;;;;;;;;;;;CAanB;IACC,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;CAoBnB;IACC,QAAQ,EAAE;;CAEX;IACC,eAAe,EAAE;;;;;;;;;;;;;;;;;CAiBlB;IACC,eAAe,EAAE;;;;CAIlB;CACS,CAAC"}
@@ -230,6 +230,8 @@ function errorForReason(reason) {
230
230
  return new SessionExpiredError();
231
231
  if (reason === 'revoked')
232
232
  return new SessionRevokedError();
233
+ if (reason === 'consumed')
234
+ return new SessionReplayError();
233
235
  return new SessionInvalidError();
234
236
  }
235
237
  //# sourceMappingURL=service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/session/service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/session/service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ioredis-toolkit",
3
- "version": "0.0.11",
3
+ "version": "0.0.13",
4
4
  "description": "Production-grade Redis sessions, cache, locks, rate limiting, Pub/Sub, and Streams for Node.js",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,4 +0,0 @@
1
- -- KEYS[1] user index
2
- -- ARGV[1..N] stale token hashes (user-index ZSET members, not JTIs)
3
- for i=1,#ARGV do redis.call('ZREM', KEYS[1], ARGV[i]) end
4
- return #ARGV
@@ -1,21 +0,0 @@
1
- -- Reference copy only. This duplicates update-session.lua: both must mirror the
2
- -- authoritative script actually executed at runtime, SCRIPT_SOURCES.update_session
3
- -- in src/session/script-sources.ts. Do not use this script directly.
4
- -- KEYS[1] session key
5
- -- ARGV[1] expected version
6
- -- ARGV[2] now
7
- -- ARGV[3] serialized replacement
8
- local raw = redis.call('GET', KEYS[1])
9
- if not raw then return {0} end
10
- local ok, s = pcall(cjson.decode, raw)
11
- if not ok or not s.data then return {-4} end
12
- if s.data.status ~= 'active' then return {-3} end
13
- if tonumber(s.data.version) ~= tonumber(ARGV[1]) then return {-2, s.data.version} end
14
- local replacement = ARGV[3]
15
- local ok2, parsed = pcall(cjson.decode, replacement)
16
- if not ok2 or not parsed.data then return {-4} end
17
- if parsed.data.userId ~= s.data.userId or parsed.data.jti ~= s.data.jti or parsed.data.id ~= s.data.id or parsed.data.createdAt ~= s.data.createdAt or parsed.data.absoluteExpiresAt ~= s.data.absoluteExpiresAt then return {-5} end
18
- local ttl = tonumber(s.data.expiresAt) - tonumber(ARGV[2])
19
- if ttl <= 0 then return {-1} end
20
- redis.call('SET', KEYS[1], replacement, 'XX', 'EX', ttl)
21
- return {1}
@@ -1,21 +0,0 @@
1
- -- KEYS[1] session key
2
- -- ARGV[1] now epoch seconds
3
- -- ARGV[2] tombstone ttl seconds
4
- local raw = redis.call('GET', KEYS[1])
5
- if not raw then return {0} end
6
- local ok, s = pcall(cjson.decode, raw)
7
- if not ok or not s.data then return {-4} end
8
- local r = s.data
9
- if r.status == 'consumed' then return {-1} end
10
- if r.status == 'revoked' then return {-3} end
11
- local now = tonumber(ARGV[1])
12
- if tonumber(r.expiresAt) <= now then return {-2} end
13
- if r.absoluteExpiresAt and r.absoluteExpiresAt ~= cjson.null and tonumber(r.absoluteExpiresAt) > 0 and tonumber(r.absoluteExpiresAt) <= now then return {-2} end
14
- if r.idleExpiresAt and tonumber(r.idleExpiresAt) > 0 and tonumber(r.idleExpiresAt) <= now then return {-2} end
15
- r.status = 'consumed'
16
- r.consumedAt = now
17
- r.version = tonumber(r.version) + 1
18
- local ttl = tonumber(ARGV[2])
19
- local encoded = cjson.encode({v=1, data=r})
20
- redis.call('SET', KEYS[1], encoded, 'XX', 'EX', ttl)
21
- return {1, r.userId, r.jti, r.version}
@@ -1,28 +0,0 @@
1
- -- Reference copy only. The authoritative script actually executed at runtime is
2
- -- SCRIPT_SOURCES.create_session in src/session/script-sources.ts — keep this file in sync with it.
3
- -- KEYS[1] session key
4
- -- KEYS[2] user index
5
- -- ARGV[1] serialized record
6
- -- ARGV[2] ttl seconds
7
- -- ARGV[3] createdAt score
8
- -- ARGV[4] tokenHash
9
- -- ARGV[5] max sessions (0 = unlimited)
10
- -- ARGV[6] namespace
11
- -- ARGV[7] userTag
12
- local created = redis.call('SET', KEYS[1], ARGV[1], 'NX', 'EX', ARGV[2])
13
- if not created then return {-1} end
14
- redis.call('ZADD', KEYS[2], ARGV[3], ARGV[4])
15
- if tonumber(ARGV[5]) > 0 then
16
- local count = redis.call('ZCARD', KEYS[2])
17
- if count > tonumber(ARGV[5]) then
18
- local excess = count - tonumber(ARGV[5])
19
- local old = redis.call('ZRANGE', KEYS[2], 0, excess - 1)
20
- for _, evictedHash in ipairs(old) do
21
- redis.call('ZREM', KEYS[2], evictedHash)
22
- redis.call('DEL', ARGV[6] .. ':session:{' .. ARGV[7] .. '}:' .. evictedHash)
23
- redis.call('DEL', ARGV[6] .. ':token-index:' .. evictedHash)
24
- end
25
- return {1, excess}
26
- end
27
- end
28
- return {1}
@@ -1,2 +0,0 @@
1
- -- KEYS[1] session key
2
- return redis.call('DEL', KEYS[1])
@@ -1,13 +0,0 @@
1
- -- Reference copy only. Not present in SCRIPT_SOURCES and not executed by the
2
- -- repository at runtime (SessionRepository.revokeAll implements the equivalent
3
- -- operation in TypeScript via a pipeline). Bounded helper: the application must
4
- -- pass session keys to delete as KEYS, matching enforce-limit.lua's pattern.
5
- -- KEYS[1] user index; KEYS[2..N] session keys corresponding to the returned members.
6
- -- ARGV[1] max batch
7
- local n = tonumber(ARGV[1])
8
- local members = redis.call('ZRANGE', KEYS[1], 0, n - 1)
9
- for i, tokenHash in ipairs(members) do
10
- redis.call('ZREM', KEYS[1], tokenHash)
11
- redis.call('DEL', KEYS[i + 1])
12
- end
13
- return members
@@ -1,17 +0,0 @@
1
- -- Bounded helper. The application must pass session keys to delete as KEYS.
2
- -- KEYS[1] user index; KEYS[2..N] session keys corresponding to the oldest members.
3
- -- ARGV[1] max sessions; ARGV[2] number of candidate keys.
4
- local max=tonumber(ARGV[1])
5
- local candidateCount=tonumber(ARGV[2])
6
- local count=redis.call('ZCARD', KEYS[1])
7
- if max <= 0 or count <= max then return {0} end
8
- local excess=math.min(count-max, candidateCount)
9
- local removed=0
10
- for i=1,excess do
11
- local tokenHash=redis.call('ZRANGE', KEYS[1], 0, 0)[1]
12
- if not tokenHash then break end
13
- redis.call('ZREM', KEYS[1], tokenHash)
14
- redis.call('DEL', KEYS[i+1])
15
- removed=removed+1
16
- end
17
- return {removed}
@@ -1,13 +0,0 @@
1
- -- KEYS[1] session key
2
- -- ARGV[1] now
3
- -- ARGV[2] tombstone ttl
4
- local raw = redis.call('GET', KEYS[1])
5
- if not raw then return {0} end
6
- local ok, s = pcall(cjson.decode, raw)
7
- if not ok or not s.data then return {-4} end
8
- local r=s.data
9
- if r.status == 'revoked' then return {2} end
10
- r.status='revoked'; r.version=tonumber(r.version)+1
11
- local ttl=tonumber(ARGV[2])
12
- if ttl < 1 then redis.call('DEL', KEYS[1]) else redis.call('SET', KEYS[1], cjson.encode({v=1,data=r}), 'XX', 'EX', ttl) end
13
- return {1}
@@ -1,24 +0,0 @@
1
- -- Reference copy only. This duplicates consume-session.lua: both must mirror the
2
- -- authoritative script actually executed at runtime, SCRIPT_SOURCES.consume_session
3
- -- in src/session/script-sources.ts. Do not use this script directly.
4
- -- KEYS[1] session key
5
- -- ARGV[1] now epoch seconds
6
- -- ARGV[2] tombstone ttl seconds
7
- local raw = redis.call('GET', KEYS[1])
8
- if not raw then return {0} end
9
- local ok, s = pcall(cjson.decode, raw)
10
- if not ok or not s.data then return {-4} end
11
- local r = s.data
12
- if r.status == 'consumed' then return {-1} end
13
- if r.status == 'revoked' then return {-3} end
14
- local now = tonumber(ARGV[1])
15
- if tonumber(r.expiresAt) <= now then return {-2} end
16
- if r.absoluteExpiresAt and r.absoluteExpiresAt ~= cjson.null and tonumber(r.absoluteExpiresAt) > 0 and tonumber(r.absoluteExpiresAt) <= now then return {-2} end
17
- if r.idleExpiresAt and tonumber(r.idleExpiresAt) > 0 and tonumber(r.idleExpiresAt) <= now then return {-2} end
18
- r.status = 'consumed'
19
- r.consumedAt = now
20
- r.version = tonumber(r.version) + 1
21
- local ttl = tonumber(ARGV[2])
22
- local encoded = cjson.encode({v=1, data=r})
23
- redis.call('SET', KEYS[1], encoded, 'XX', 'EX', ttl)
24
- return {1, r.userId, r.jti, r.version}
@@ -1,28 +0,0 @@
1
- -- KEYS[1] session key
2
- -- ARGV[1] now epoch seconds
3
- -- ARGV[2] touch interval
4
- -- ARGV[3] new idle expiry epoch seconds (0 = no idle timeout)
5
- -- ARGV[4] new absolute expiry epoch seconds (0 = no absolute timeout)
6
- local raw = redis.call('GET', KEYS[1])
7
- if not raw then return {0} end
8
- local ok, s = pcall(cjson.decode, raw)
9
- if not ok or not s.data then return {-4} end
10
- local r = s.data
11
- if r.status ~= 'active' then return {-1} end
12
- local now = tonumber(ARGV[1])
13
- if tonumber(r.expiresAt) <= now then return {-2} end
14
- if r.absoluteExpiresAt and r.absoluteExpiresAt ~= cjson.null and tonumber(r.absoluteExpiresAt) > 0 and tonumber(r.absoluteExpiresAt) <= now then return {-2} end
15
- if r.idleExpiresAt and tonumber(r.idleExpiresAt) > 0 and tonumber(r.idleExpiresAt) <= now then return {-3} end
16
- if now - tonumber(r.lastAccessedAt) < tonumber(ARGV[2]) then return {2} end
17
- local idle = tonumber(ARGV[3])
18
- local absolute = tonumber(ARGV[4])
19
- if absolute > 0 and idle > absolute then idle = absolute end
20
- r.lastAccessedAt = now
21
- r.idleExpiresAt = idle > 0 and idle or cjson.null
22
- r.version = tonumber(r.version) + 1
23
- local wrapper = {v=1, data=r}
24
- local encoded = cjson.encode(wrapper)
25
- local ttl = tonumber(r.expiresAt) - now
26
- if ttl <= 0 then return {-2} end
27
- redis.call('SET', KEYS[1], encoded, 'XX', 'EX', ttl)
28
- return {1, r.version, idle}
@@ -1,18 +0,0 @@
1
- -- KEYS[1] session key
2
- -- ARGV[1] expected version
3
- -- ARGV[2] now
4
- -- ARGV[3] serialized replacement
5
- local raw = redis.call('GET', KEYS[1])
6
- if not raw then return {0} end
7
- local ok, s = pcall(cjson.decode, raw)
8
- if not ok or not s.data then return {-4} end
9
- if s.data.status ~= 'active' then return {-3} end
10
- if tonumber(s.data.version) ~= tonumber(ARGV[1]) then return {-2, s.data.version} end
11
- local replacement = ARGV[3]
12
- local ok2, parsed = pcall(cjson.decode, replacement)
13
- if not ok2 or not parsed.data then return {-4} end
14
- if parsed.data.userId ~= s.data.userId or parsed.data.jti ~= s.data.jti or parsed.data.id ~= s.data.id or parsed.data.createdAt ~= s.data.createdAt or parsed.data.absoluteExpiresAt ~= s.data.absoluteExpiresAt then return {-5} end
15
- local ttl = tonumber(s.data.expiresAt) - tonumber(ARGV[2])
16
- if ttl <= 0 then return {-1} end
17
- redis.call('SET', KEYS[1], replacement, 'XX', 'EX', ttl)
18
- return {1}