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 +12 -0
- package/dist/session/script-sources.d.ts +4 -4
- package/dist/session/script-sources.d.ts.map +1 -1
- package/dist/session/script-sources.js +10 -8
- package/dist/session/script-sources.js.map +1 -1
- package/dist/session/service.js +2 -0
- package/dist/session/service.js.map +1 -1
- package/package.json +1 -1
- package/src/scripts/cleanup-index.lua +0 -4
- package/src/scripts/conditional-update.lua +0 -21
- package/src/scripts/consume-session.lua +0 -21
- package/src/scripts/create-session.lua +0 -28
- package/src/scripts/delete.lua +0 -2
- package/src/scripts/destroy-user.lua +0 -13
- package/src/scripts/enforce-limit.lua +0 -17
- package/src/scripts/revoke-session.lua +0 -13
- package/src/scripts/rotate.lua +0 -24
- package/src/scripts/touch-session.lua +0 -28
- package/src/scripts/update-session.lua +0 -18
package/CHANGELOG.md
CHANGED
|
@@ -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;;;;;;;;;
|
|
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
|
|
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"}
|
package/dist/session/service.js
CHANGED
|
@@ -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,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}
|
package/src/scripts/delete.lua
DELETED
|
@@ -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}
|
package/src/scripts/rotate.lua
DELETED
|
@@ -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}
|