raffel 0.1.2 → 0.2.2

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.
Files changed (268) hide show
  1. package/README.md +314 -346
  2. package/dist/adapters/index.d.ts +3 -1
  3. package/dist/adapters/index.d.ts.map +1 -1
  4. package/dist/adapters/index.js +3 -1
  5. package/dist/adapters/index.js.map +1 -1
  6. package/dist/adapters/s3db/adapter.d.ts.map +1 -1
  7. package/dist/adapters/s3db/adapter.js +0 -3
  8. package/dist/adapters/s3db/adapter.js.map +1 -1
  9. package/dist/adapters/udp.d.ts +83 -0
  10. package/dist/adapters/udp.d.ts.map +1 -0
  11. package/dist/adapters/udp.int.test.d.ts +5 -0
  12. package/dist/adapters/udp.int.test.d.ts.map +1 -0
  13. package/dist/adapters/udp.int.test.js +397 -0
  14. package/dist/adapters/udp.int.test.js.map +1 -0
  15. package/dist/adapters/udp.js +391 -0
  16. package/dist/adapters/udp.js.map +1 -0
  17. package/dist/cache/drivers/file.d.ts.map +1 -1
  18. package/dist/cache/drivers/file.js +13 -1
  19. package/dist/cache/drivers/file.js.map +1 -1
  20. package/dist/cache/drivers/memory.d.ts.map +1 -1
  21. package/dist/cache/drivers/memory.js +1 -0
  22. package/dist/cache/drivers/memory.js.map +1 -1
  23. package/dist/cache/types.d.ts +1 -0
  24. package/dist/cache/types.d.ts.map +1 -1
  25. package/dist/docs/generators/http-generator.d.ts.map +1 -1
  26. package/dist/docs/generators/http-generator.js +0 -1
  27. package/dist/docs/generators/http-generator.js.map +1 -1
  28. package/dist/graphql/graphql.int.test.d.ts +10 -0
  29. package/dist/graphql/graphql.int.test.d.ts.map +1 -0
  30. package/dist/graphql/graphql.int.test.js +698 -0
  31. package/dist/graphql/graphql.int.test.js.map +1 -0
  32. package/dist/graphql/schema-generator.d.ts.map +1 -1
  33. package/dist/graphql/schema-generator.js +20 -7
  34. package/dist/graphql/schema-generator.js.map +1 -1
  35. package/dist/http/auth.d.ts.map +1 -1
  36. package/dist/http/auth.js +15 -1
  37. package/dist/http/auth.js.map +1 -1
  38. package/dist/http/http.int.test.d.ts +7 -0
  39. package/dist/http/http.int.test.d.ts.map +1 -0
  40. package/dist/http/http.int.test.js +604 -0
  41. package/dist/http/http.int.test.js.map +1 -0
  42. package/dist/http/index.d.ts +2 -0
  43. package/dist/http/index.d.ts.map +1 -1
  44. package/dist/http/index.js +2 -0
  45. package/dist/http/index.js.map +1 -1
  46. package/dist/http/oauth2.d.ts.map +1 -1
  47. package/dist/http/oauth2.js +39 -0
  48. package/dist/http/oauth2.js.map +1 -1
  49. package/dist/http/oidc.d.ts.map +1 -1
  50. package/dist/http/oidc.js +9 -1
  51. package/dist/http/oidc.js.map +1 -1
  52. package/dist/http/session-redis.d.ts +187 -0
  53. package/dist/http/session-redis.d.ts.map +1 -0
  54. package/dist/http/session-redis.int.test.d.ts +8 -0
  55. package/dist/http/session-redis.int.test.d.ts.map +1 -0
  56. package/dist/http/session-redis.int.test.js +492 -0
  57. package/dist/http/session-redis.int.test.js.map +1 -0
  58. package/dist/http/session-redis.js +320 -0
  59. package/dist/http/session-redis.js.map +1 -0
  60. package/dist/index.d.ts +2 -1
  61. package/dist/index.d.ts.map +1 -1
  62. package/dist/index.js +25 -0
  63. package/dist/index.js.map +1 -1
  64. package/dist/mcp/cli.js +2 -1
  65. package/dist/mcp/cli.js.map +1 -1
  66. package/dist/mcp/docs/adapters.d.ts.map +1 -1
  67. package/dist/mcp/docs/adapters.js +175 -145
  68. package/dist/mcp/docs/adapters.js.map +1 -1
  69. package/dist/mcp/docs/interceptors.d.ts +1 -1
  70. package/dist/mcp/docs/interceptors.d.ts.map +1 -1
  71. package/dist/mcp/docs/interceptors.js +231 -305
  72. package/dist/mcp/docs/interceptors.js.map +1 -1
  73. package/dist/mcp/docs/patterns.d.ts.map +1 -1
  74. package/dist/mcp/docs/patterns.js +20 -18
  75. package/dist/mcp/docs/patterns.js.map +1 -1
  76. package/dist/mcp/docs/quickstart.d.ts +1 -1
  77. package/dist/mcp/docs/quickstart.d.ts.map +1 -1
  78. package/dist/mcp/docs/quickstart.js +48 -46
  79. package/dist/mcp/docs/quickstart.js.map +1 -1
  80. package/dist/mcp/server.d.ts +1 -1
  81. package/dist/mcp/server.d.ts.map +1 -1
  82. package/dist/mcp/server.js +6 -7
  83. package/dist/mcp/server.js.map +1 -1
  84. package/dist/mcp/version.d.ts +7 -0
  85. package/dist/mcp/version.d.ts.map +1 -0
  86. package/dist/mcp/version.js +20 -0
  87. package/dist/mcp/version.js.map +1 -0
  88. package/dist/middleware/auth/oauth2.d.ts +294 -0
  89. package/dist/middleware/auth/oauth2.d.ts.map +1 -0
  90. package/dist/middleware/auth/oauth2.int.test.d.ts +2 -0
  91. package/dist/middleware/auth/oauth2.int.test.d.ts.map +1 -0
  92. package/dist/middleware/auth/oauth2.int.test.js +714 -0
  93. package/dist/middleware/auth/oauth2.int.test.js.map +1 -0
  94. package/dist/middleware/auth/oauth2.js +671 -0
  95. package/dist/middleware/auth/oauth2.js.map +1 -0
  96. package/dist/middleware/auth.d.ts +2 -0
  97. package/dist/middleware/auth.d.ts.map +1 -1
  98. package/dist/middleware/auth.js +16 -0
  99. package/dist/middleware/auth.js.map +1 -1
  100. package/dist/middleware/index.d.ts +5 -2
  101. package/dist/middleware/index.d.ts.map +1 -1
  102. package/dist/middleware/index.js +4 -0
  103. package/dist/middleware/index.js.map +1 -1
  104. package/dist/middleware/interceptors/circuit-breaker.d.ts.map +1 -1
  105. package/dist/middleware/interceptors/circuit-breaker.js +0 -1
  106. package/dist/middleware/interceptors/circuit-breaker.js.map +1 -1
  107. package/dist/middleware/interceptors/envelope.d.ts +176 -0
  108. package/dist/middleware/interceptors/envelope.d.ts.map +1 -0
  109. package/dist/middleware/interceptors/envelope.int.test.d.ts +5 -0
  110. package/dist/middleware/interceptors/envelope.int.test.d.ts.map +1 -0
  111. package/dist/middleware/interceptors/envelope.int.test.js +409 -0
  112. package/dist/middleware/interceptors/envelope.int.test.js.map +1 -0
  113. package/dist/middleware/interceptors/envelope.js +294 -0
  114. package/dist/middleware/interceptors/envelope.js.map +1 -0
  115. package/dist/middleware/interceptors/index.d.ts +2 -0
  116. package/dist/middleware/interceptors/index.d.ts.map +1 -1
  117. package/dist/middleware/interceptors/index.js +2 -0
  118. package/dist/middleware/interceptors/index.js.map +1 -1
  119. package/dist/middleware/types.d.ts +25 -0
  120. package/dist/middleware/types.d.ts.map +1 -1
  121. package/dist/rate-limit/drivers/drivers.int.test.d.ts +7 -0
  122. package/dist/rate-limit/drivers/drivers.int.test.d.ts.map +1 -0
  123. package/dist/rate-limit/drivers/drivers.int.test.js +466 -0
  124. package/dist/rate-limit/drivers/drivers.int.test.js.map +1 -0
  125. package/dist/server/builder.d.ts.map +1 -1
  126. package/dist/server/builder.int.test.js +41 -0
  127. package/dist/server/builder.int.test.js.map +1 -1
  128. package/dist/server/builder.js +72 -15
  129. package/dist/server/builder.js.map +1 -1
  130. package/dist/server/channel-utils.d.ts +4 -1
  131. package/dist/server/channel-utils.d.ts.map +1 -1
  132. package/dist/server/channel-utils.js +12 -2
  133. package/dist/server/channel-utils.js.map +1 -1
  134. package/dist/server/errors.d.ts.map +1 -1
  135. package/dist/server/errors.js +0 -22
  136. package/dist/server/errors.js.map +1 -1
  137. package/dist/server/fs-routes/watcher.js +1 -1
  138. package/dist/server/fs-routes/watcher.js.map +1 -1
  139. package/dist/server/index.d.ts +1 -1
  140. package/dist/server/index.d.ts.map +1 -1
  141. package/dist/server/index.js.map +1 -1
  142. package/dist/server/types.d.ts +37 -33
  143. package/dist/server/types.d.ts.map +1 -1
  144. package/dist/tracing/interceptor.d.ts.map +1 -1
  145. package/dist/tracing/interceptor.js +4 -5
  146. package/dist/tracing/interceptor.js.map +1 -1
  147. package/dist/types/envelope.d.ts +1 -1
  148. package/dist/types/envelope.d.ts.map +1 -1
  149. package/dist/types/envelope.js.map +1 -1
  150. package/dist/types/handlers.d.ts +8 -0
  151. package/dist/types/handlers.d.ts.map +1 -1
  152. package/dist/ui/core/index.d.ts +7 -0
  153. package/dist/ui/core/index.d.ts.map +1 -0
  154. package/dist/ui/docs/generators/content-types.d.ts +10 -0
  155. package/dist/ui/docs/generators/content-types.d.ts.map +1 -0
  156. package/dist/ui/docs/generators/errors-types.d.ts +409 -0
  157. package/dist/ui/docs/generators/errors-types.d.ts.map +1 -0
  158. package/dist/ui/docs/generators/errors.d.ts +88 -0
  159. package/dist/ui/docs/generators/errors.d.ts.map +1 -0
  160. package/dist/ui/docs/generators/grpc-generator.d.ts +53 -0
  161. package/dist/ui/docs/generators/grpc-generator.d.ts.map +1 -0
  162. package/dist/ui/docs/generators/http-generator.d.ts +49 -0
  163. package/dist/ui/docs/generators/http-generator.d.ts.map +1 -0
  164. package/dist/ui/docs/generators/index.d.ts +17 -0
  165. package/dist/ui/docs/generators/index.d.ts.map +1 -0
  166. package/dist/ui/docs/generators/jsonrpc-generator.d.ts +53 -0
  167. package/dist/ui/docs/generators/jsonrpc-generator.d.ts.map +1 -0
  168. package/dist/ui/docs/generators/schema-converter.d.ts +117 -0
  169. package/dist/ui/docs/generators/schema-converter.d.ts.map +1 -0
  170. package/dist/ui/docs/generators/streams-generator.d.ts +85 -0
  171. package/dist/ui/docs/generators/streams-generator.d.ts.map +1 -0
  172. package/dist/ui/docs/generators/tcp-generator.d.ts +133 -0
  173. package/dist/ui/docs/generators/tcp-generator.d.ts.map +1 -0
  174. package/dist/ui/docs/generators/udp-generator.d.ts +119 -0
  175. package/dist/ui/docs/generators/udp-generator.d.ts.map +1 -0
  176. package/dist/ui/docs/generators/usd-generator.d.ts +182 -0
  177. package/dist/ui/docs/generators/usd-generator.d.ts.map +1 -0
  178. package/dist/ui/docs/generators/websocket-generator.d.ts +49 -0
  179. package/dist/ui/docs/generators/websocket-generator.d.ts.map +1 -0
  180. package/dist/ui/docs/index.d.ts +31 -0
  181. package/dist/ui/docs/index.d.ts.map +1 -0
  182. package/dist/ui/docs/usd-middleware.d.ts +157 -0
  183. package/dist/ui/docs/usd-middleware.d.ts.map +1 -0
  184. package/dist/ui/errors/factories.d.ts +142 -0
  185. package/dist/ui/errors/factories.d.ts.map +1 -0
  186. package/dist/ui/errors/index.d.ts +9 -0
  187. package/dist/ui/errors/index.d.ts.map +1 -0
  188. package/dist/ui/server/fs-routes/index.d.ts +66 -0
  189. package/dist/ui/server/fs-routes/index.d.ts.map +1 -0
  190. package/dist/ui/server/fs-routes/loader.d.ts +28 -0
  191. package/dist/ui/server/fs-routes/loader.d.ts.map +1 -0
  192. package/dist/ui/server/fs-routes/middleware-processor.d.ts +19 -0
  193. package/dist/ui/server/fs-routes/middleware-processor.d.ts.map +1 -0
  194. package/dist/ui/server/fs-routes/resources/index.d.ts +8 -0
  195. package/dist/ui/server/fs-routes/resources/index.d.ts.map +1 -0
  196. package/dist/ui/server/fs-routes/resources/loader.d.ts +16 -0
  197. package/dist/ui/server/fs-routes/resources/loader.d.ts.map +1 -0
  198. package/dist/ui/server/fs-routes/resources/types.d.ts +256 -0
  199. package/dist/ui/server/fs-routes/resources/types.d.ts.map +1 -0
  200. package/dist/ui/server/fs-routes/rest/index.d.ts +8 -0
  201. package/dist/ui/server/fs-routes/rest/index.d.ts.map +1 -0
  202. package/dist/ui/server/fs-routes/rest/loader.d.ts +11 -0
  203. package/dist/ui/server/fs-routes/rest/loader.d.ts.map +1 -0
  204. package/dist/ui/server/fs-routes/rest/types.d.ts +288 -0
  205. package/dist/ui/server/fs-routes/rest/types.d.ts.map +1 -0
  206. package/dist/ui/server/fs-routes/tcp/index.d.ts +8 -0
  207. package/dist/ui/server/fs-routes/tcp/index.d.ts.map +1 -0
  208. package/dist/ui/server/fs-routes/tcp/loader.d.ts +15 -0
  209. package/dist/ui/server/fs-routes/tcp/loader.d.ts.map +1 -0
  210. package/dist/ui/server/fs-routes/tcp/types.d.ts +215 -0
  211. package/dist/ui/server/fs-routes/tcp/types.d.ts.map +1 -0
  212. package/dist/ui/server/fs-routes/types.d.ts +437 -0
  213. package/dist/ui/server/fs-routes/types.d.ts.map +1 -0
  214. package/dist/ui/server/fs-routes/udp/index.d.ts +8 -0
  215. package/dist/ui/server/fs-routes/udp/index.d.ts.map +1 -0
  216. package/dist/ui/server/fs-routes/udp/loader.d.ts +15 -0
  217. package/dist/ui/server/fs-routes/udp/loader.d.ts.map +1 -0
  218. package/dist/ui/server/fs-routes/udp/types.d.ts +164 -0
  219. package/dist/ui/server/fs-routes/udp/types.d.ts.map +1 -0
  220. package/dist/ui/server/fs-routes/watcher.d.ts +34 -0
  221. package/dist/ui/server/fs-routes/watcher.d.ts.map +1 -0
  222. package/dist/ui/types/envelope.d.ts +1 -1
  223. package/dist/ui/types/envelope.d.ts.map +1 -1
  224. package/dist/ui/types/handlers.d.ts +8 -0
  225. package/dist/ui/types/handlers.d.ts.map +1 -1
  226. package/dist/ui/usd/builder/document.d.ts.map +1 -1
  227. package/dist/ui/usd/export/openapi.d.ts.map +1 -1
  228. package/dist/ui/usd/parser/normalize.d.ts.map +1 -1
  229. package/dist/ui/usd/spec/types.d.ts +14 -20
  230. package/dist/ui/usd/spec/types.d.ts.map +1 -1
  231. package/dist/ui/usd/utils/refs.d.ts.map +1 -1
  232. package/dist/ui/usd/validator/index.d.ts.map +1 -1
  233. package/dist/ui/usd/validator/schema.d.ts.map +1 -1
  234. package/dist/ui/usd/validator/semantic.d.ts.map +1 -1
  235. package/dist/ui/utils/logger.d.ts +15 -0
  236. package/dist/ui/utils/logger.d.ts.map +1 -0
  237. package/dist/usd/builder/document.d.ts.map +1 -1
  238. package/dist/usd/builder/document.js.map +1 -1
  239. package/dist/usd/export/openapi.d.ts.map +1 -1
  240. package/dist/usd/export/openapi.js +2 -4
  241. package/dist/usd/export/openapi.js.map +1 -1
  242. package/dist/usd/parser/normalize.d.ts.map +1 -1
  243. package/dist/usd/parser/normalize.js +0 -1
  244. package/dist/usd/parser/normalize.js.map +1 -1
  245. package/dist/usd/usd.int.test.d.ts +10 -0
  246. package/dist/usd/usd.int.test.d.ts.map +1 -0
  247. package/dist/usd/usd.int.test.js +719 -0
  248. package/dist/usd/usd.int.test.js.map +1 -0
  249. package/dist/usd/utils/refs.d.ts.map +1 -1
  250. package/dist/usd/validator/index.d.ts.map +1 -1
  251. package/dist/usd/validator/index.js.map +1 -1
  252. package/dist/usd/validator/schema.d.ts.map +1 -1
  253. package/dist/usd/validator/schema.js.map +1 -1
  254. package/dist/usd/validator/semantic.d.ts.map +1 -1
  255. package/dist/usd/validator/semantic.js.map +1 -1
  256. package/package.json +1 -1
  257. package/dist/middleware/rate-limit.d.ts +0 -105
  258. package/dist/middleware/rate-limit.d.ts.map +0 -1
  259. package/dist/middleware/rate-limit.int.test.d.ts +0 -5
  260. package/dist/middleware/rate-limit.int.test.d.ts.map +0 -1
  261. package/dist/middleware/rate-limit.int.test.js +0 -350
  262. package/dist/middleware/rate-limit.int.test.js.map +0 -1
  263. package/dist/middleware/rate-limit.js +0 -206
  264. package/dist/middleware/rate-limit.js.map +0 -1
  265. package/dist/openapi/index.d.ts +0 -9
  266. package/dist/openapi/index.d.ts.map +0 -1
  267. package/dist/openapi/index.js +0 -9
  268. package/dist/openapi/index.js.map +0 -1
@@ -0,0 +1,492 @@
1
+ /**
2
+ * Redis Session Store Integration Tests
3
+ *
4
+ * Tests the Redis session store with a mock Redis client.
5
+ * For real Redis integration tests, use a test container or Redis instance.
6
+ */
7
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
8
+ import { createRedisSessionStore, RedisSessionStore } from './session-redis.js';
9
+ // ─────────────────────────────────────────────────────────────────────────────
10
+ // Mock Redis Client
11
+ // ─────────────────────────────────────────────────────────────────────────────
12
+ function createMockRedis() {
13
+ const data = new Map();
14
+ const sets = new Map();
15
+ const ttls = new Map();
16
+ return {
17
+ _data: data,
18
+ _sets: sets,
19
+ async get(key) {
20
+ // Check TTL
21
+ const expiry = ttls.get(key);
22
+ if (expiry && expiry < Date.now()) {
23
+ data.delete(key);
24
+ ttls.delete(key);
25
+ return null;
26
+ }
27
+ return data.get(key) ?? null;
28
+ },
29
+ async set(key, value, ...args) {
30
+ data.set(key, value);
31
+ // Handle EX argument for TTL
32
+ const exIndex = args.indexOf('EX');
33
+ if (exIndex !== -1 && typeof args[exIndex + 1] === 'number') {
34
+ const ttl = args[exIndex + 1];
35
+ ttls.set(key, Date.now() + ttl * 1000);
36
+ }
37
+ return 'OK';
38
+ },
39
+ async del(...keys) {
40
+ let count = 0;
41
+ for (const key of keys) {
42
+ if (data.has(key) || sets.has(key)) {
43
+ data.delete(key);
44
+ sets.delete(key);
45
+ ttls.delete(key);
46
+ count++;
47
+ }
48
+ }
49
+ return count;
50
+ },
51
+ async expire(key, seconds) {
52
+ if (data.has(key) || sets.has(key)) {
53
+ ttls.set(key, Date.now() + seconds * 1000);
54
+ return 1;
55
+ }
56
+ return 0;
57
+ },
58
+ async ttl(key) {
59
+ const expiry = ttls.get(key);
60
+ if (!expiry)
61
+ return -2; // Key doesn't exist
62
+ const remaining = Math.ceil((expiry - Date.now()) / 1000);
63
+ return remaining > 0 ? remaining : -2;
64
+ },
65
+ async keys(pattern) {
66
+ const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
67
+ return [...data.keys(), ...sets.keys()].filter((k) => regex.test(k));
68
+ },
69
+ async sadd(key, ...members) {
70
+ let set = sets.get(key);
71
+ if (!set) {
72
+ set = new Set();
73
+ sets.set(key, set);
74
+ }
75
+ let added = 0;
76
+ for (const member of members) {
77
+ if (!set.has(member)) {
78
+ set.add(member);
79
+ added++;
80
+ }
81
+ }
82
+ return added;
83
+ },
84
+ async srem(key, ...members) {
85
+ const set = sets.get(key);
86
+ if (!set)
87
+ return 0;
88
+ let removed = 0;
89
+ for (const member of members) {
90
+ if (set.delete(member)) {
91
+ removed++;
92
+ }
93
+ }
94
+ return removed;
95
+ },
96
+ async smembers(key) {
97
+ return [...(sets.get(key) ?? [])];
98
+ },
99
+ async scan(cursor, ...args) {
100
+ // Simple implementation: return all matching keys on first scan
101
+ if (cursor === '0' || cursor === 0) {
102
+ const matchIndex = args.indexOf('MATCH');
103
+ const pattern = matchIndex !== -1 ? args[matchIndex + 1] : '*';
104
+ const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
105
+ const allKeys = [...data.keys(), ...sets.keys()].filter((k) => regex.test(k));
106
+ return ['0', allKeys];
107
+ }
108
+ return ['0', []];
109
+ },
110
+ multi() {
111
+ const operations = [];
112
+ const self = this;
113
+ const multi = {
114
+ del(...keys) {
115
+ operations.push(async () => {
116
+ await self.del(...keys);
117
+ });
118
+ return multi;
119
+ },
120
+ srem(key, ...members) {
121
+ operations.push(async () => {
122
+ await self.srem(key, ...members);
123
+ });
124
+ return multi;
125
+ },
126
+ async exec() {
127
+ const results = [];
128
+ for (const op of operations) {
129
+ results.push(await op());
130
+ }
131
+ return results;
132
+ },
133
+ };
134
+ return multi;
135
+ },
136
+ };
137
+ }
138
+ function createTestSession(overrides = {}) {
139
+ const now = Date.now();
140
+ return {
141
+ id: 'test-session-1',
142
+ userId: 'user-123',
143
+ createdAt: now,
144
+ lastAccessedAt: now,
145
+ expiresAt: now + 3600000, // 1 hour
146
+ ip: '127.0.0.1',
147
+ userAgent: 'TestAgent/1.0',
148
+ data: { foo: 'bar' },
149
+ ...overrides,
150
+ };
151
+ }
152
+ // ─────────────────────────────────────────────────────────────────────────────
153
+ // Tests
154
+ // ─────────────────────────────────────────────────────────────────────────────
155
+ describe('RedisSessionStore', () => {
156
+ let redis;
157
+ let store;
158
+ beforeEach(() => {
159
+ redis = createMockRedis();
160
+ store = createRedisSessionStore(redis);
161
+ });
162
+ describe('get()', () => {
163
+ it('should return undefined for non-existent session', async () => {
164
+ const session = await store.get('non-existent');
165
+ expect(session).toBeUndefined();
166
+ });
167
+ it('should get an existing session', async () => {
168
+ const testSession = createTestSession();
169
+ await store.set(testSession.id, testSession);
170
+ const session = await store.get(testSession.id);
171
+ expect(session).toBeDefined();
172
+ expect(session?.id).toBe(testSession.id);
173
+ expect(session?.userId).toBe(testSession.userId);
174
+ expect(session?.data).toEqual(testSession.data);
175
+ });
176
+ it('should return undefined for expired session', async () => {
177
+ const expiredSession = createTestSession({
178
+ expiresAt: Date.now() - 1000, // Expired 1 second ago
179
+ });
180
+ await store.set(expiredSession.id, expiredSession);
181
+ const session = await store.get(expiredSession.id);
182
+ expect(session).toBeUndefined();
183
+ });
184
+ it('should handle invalid JSON gracefully', async () => {
185
+ // Directly set invalid data
186
+ await redis.set('raffel:session:invalid', 'not-json');
187
+ const session = await store.get('invalid');
188
+ expect(session).toBeUndefined();
189
+ });
190
+ });
191
+ describe('set()', () => {
192
+ it('should store a session', async () => {
193
+ const testSession = createTestSession();
194
+ await store.set(testSession.id, testSession);
195
+ const stored = await redis.get(`raffel:session:${testSession.id}`);
196
+ expect(stored).not.toBeNull();
197
+ const parsed = JSON.parse(stored);
198
+ expect(parsed.id).toBe(testSession.id);
199
+ });
200
+ it('should add session to user index when userId is present', async () => {
201
+ const testSession = createTestSession({ userId: 'user-456' });
202
+ await store.set(testSession.id, testSession);
203
+ const userSessions = await redis.smembers('raffel:user_sessions:user-456');
204
+ expect(userSessions).toContain(testSession.id);
205
+ });
206
+ it('should not add to user index when userId is undefined', async () => {
207
+ const testSession = createTestSession({ userId: undefined });
208
+ await store.set(testSession.id, testSession);
209
+ const userSessions = await redis.smembers('raffel:user_sessions:undefined');
210
+ expect(userSessions).toHaveLength(0);
211
+ });
212
+ it('should update existing session', async () => {
213
+ const testSession = createTestSession();
214
+ await store.set(testSession.id, testSession);
215
+ const updatedSession = { ...testSession, data: { updated: true } };
216
+ await store.set(testSession.id, updatedSession);
217
+ const session = await store.get(testSession.id);
218
+ expect(session?.data).toEqual({ updated: true });
219
+ });
220
+ });
221
+ describe('delete()', () => {
222
+ it('should delete a session', async () => {
223
+ const testSession = createTestSession();
224
+ await store.set(testSession.id, testSession);
225
+ await store.delete(testSession.id);
226
+ const session = await store.get(testSession.id);
227
+ expect(session).toBeUndefined();
228
+ });
229
+ it('should remove session from user index', async () => {
230
+ const testSession = createTestSession({ userId: 'user-789' });
231
+ await store.set(testSession.id, testSession);
232
+ await store.delete(testSession.id);
233
+ const userSessions = await redis.smembers('raffel:user_sessions:user-789');
234
+ expect(userSessions).not.toContain(testSession.id);
235
+ });
236
+ it('should handle deleting non-existent session gracefully', async () => {
237
+ await expect(store.delete('non-existent')).resolves.not.toThrow();
238
+ });
239
+ });
240
+ describe('clear()', () => {
241
+ it('should clear all sessions', async () => {
242
+ // Create multiple sessions
243
+ await store.set('session-1', createTestSession({ id: 'session-1' }));
244
+ await store.set('session-2', createTestSession({ id: 'session-2' }));
245
+ await store.set('session-3', createTestSession({ id: 'session-3' }));
246
+ await store.clear();
247
+ const sessions = await store.getAll();
248
+ expect(sessions).toHaveLength(0);
249
+ });
250
+ it('should clear user indexes', async () => {
251
+ await store.set('session-1', createTestSession({ id: 'session-1', userId: 'user-1' }));
252
+ await store.set('session-2', createTestSession({ id: 'session-2', userId: 'user-1' }));
253
+ await store.clear();
254
+ const userSessions = await redis.smembers('raffel:user_sessions:user-1');
255
+ expect(userSessions).toHaveLength(0);
256
+ });
257
+ });
258
+ describe('getAll()', () => {
259
+ it('should return empty array when no sessions exist', async () => {
260
+ const sessions = await store.getAll();
261
+ expect(sessions).toEqual([]);
262
+ });
263
+ it('should return all active sessions', async () => {
264
+ await store.set('session-1', createTestSession({ id: 'session-1' }));
265
+ await store.set('session-2', createTestSession({ id: 'session-2' }));
266
+ const sessions = await store.getAll();
267
+ expect(sessions).toHaveLength(2);
268
+ });
269
+ it('should not include expired sessions', async () => {
270
+ await store.set('active', createTestSession({ id: 'active' }));
271
+ await store.set('expired', createTestSession({
272
+ id: 'expired',
273
+ expiresAt: Date.now() - 1000,
274
+ }));
275
+ const sessions = await store.getAll();
276
+ expect(sessions).toHaveLength(1);
277
+ expect(sessions[0].id).toBe('active');
278
+ });
279
+ });
280
+ describe('getByUserId()', () => {
281
+ it('should return empty array for user with no sessions', async () => {
282
+ const sessions = await store.getByUserId('unknown-user');
283
+ expect(sessions).toEqual([]);
284
+ });
285
+ it('should return all sessions for a user', async () => {
286
+ await store.set('session-1', createTestSession({
287
+ id: 'session-1',
288
+ userId: 'user-multi',
289
+ }));
290
+ await store.set('session-2', createTestSession({
291
+ id: 'session-2',
292
+ userId: 'user-multi',
293
+ }));
294
+ await store.set('session-3', createTestSession({
295
+ id: 'session-3',
296
+ userId: 'other-user',
297
+ }));
298
+ const sessions = await store.getByUserId('user-multi');
299
+ expect(sessions).toHaveLength(2);
300
+ expect(sessions.every((s) => s.userId === 'user-multi')).toBe(true);
301
+ });
302
+ it('should clean up orphaned index entries', async () => {
303
+ // Add session to index but not to storage (simulating Redis TTL expiry)
304
+ await redis.sadd('raffel:user_sessions:orphan-user', 'orphan-session');
305
+ const sessions = await store.getByUserId('orphan-user');
306
+ expect(sessions).toHaveLength(0);
307
+ // Index should be cleaned up
308
+ const remaining = await redis.smembers('raffel:user_sessions:orphan-user');
309
+ expect(remaining).not.toContain('orphan-session');
310
+ });
311
+ });
312
+ describe('deleteByUserId()', () => {
313
+ it('should delete all sessions for a user', async () => {
314
+ await store.set('session-1', createTestSession({
315
+ id: 'session-1',
316
+ userId: 'target-user',
317
+ }));
318
+ await store.set('session-2', createTestSession({
319
+ id: 'session-2',
320
+ userId: 'target-user',
321
+ }));
322
+ await store.set('session-3', createTestSession({
323
+ id: 'session-3',
324
+ userId: 'other-user',
325
+ }));
326
+ await store.deleteByUserId('target-user');
327
+ const targetSessions = await store.getByUserId('target-user');
328
+ expect(targetSessions).toHaveLength(0);
329
+ const otherSessions = await store.getByUserId('other-user');
330
+ expect(otherSessions).toHaveLength(1);
331
+ });
332
+ it('should handle user with no sessions', async () => {
333
+ await expect(store.deleteByUserId('no-sessions')).resolves.not.toThrow();
334
+ });
335
+ });
336
+ describe('cleanup()', () => {
337
+ it('should return count of cleaned entries', async () => {
338
+ // Add orphaned index entries
339
+ await redis.sadd('raffel:user_sessions:cleanup-user', 'orphan-1', 'orphan-2');
340
+ const count = await store.cleanup();
341
+ expect(count).toBe(2);
342
+ });
343
+ it('should clean up empty user indexes', async () => {
344
+ // Add orphaned entry
345
+ await redis.sadd('raffel:user_sessions:empty-user', 'orphan');
346
+ await store.cleanup();
347
+ // User index should be deleted since it's empty
348
+ const keys = await redis.keys('raffel:user_sessions:empty-user');
349
+ expect(keys).toHaveLength(0);
350
+ });
351
+ it('should not remove valid index entries', async () => {
352
+ const session = createTestSession({ id: 'valid-session', userId: 'valid-user' });
353
+ await store.set(session.id, session);
354
+ await store.cleanup();
355
+ const userSessions = await redis.smembers('raffel:user_sessions:valid-user');
356
+ expect(userSessions).toContain('valid-session');
357
+ });
358
+ });
359
+ describe('configuration', () => {
360
+ it('should use custom prefix', async () => {
361
+ const customStore = createRedisSessionStore(redis, {
362
+ prefix: 'custom:sess:',
363
+ });
364
+ const session = createTestSession({ id: 'custom-prefix' });
365
+ await customStore.set(session.id, session);
366
+ const stored = await redis.get('custom:sess:custom-prefix');
367
+ expect(stored).not.toBeNull();
368
+ });
369
+ it('should use custom user prefix', async () => {
370
+ const customStore = createRedisSessionStore(redis, {
371
+ userPrefix: 'custom:users:',
372
+ });
373
+ const session = createTestSession({ id: 'custom-user', userId: 'user-custom' });
374
+ await customStore.set(session.id, session);
375
+ const userSessions = await redis.smembers('custom:users:user-custom');
376
+ expect(userSessions).toContain('custom-user');
377
+ });
378
+ it('should use custom serializer', async () => {
379
+ const serialize = vi.fn(JSON.stringify);
380
+ const deserialize = vi.fn(JSON.parse);
381
+ const customStore = createRedisSessionStore(redis, {
382
+ serialize,
383
+ deserialize,
384
+ });
385
+ const session = createTestSession({ id: 'custom-serial' });
386
+ await customStore.set(session.id, session);
387
+ await customStore.get(session.id);
388
+ expect(serialize).toHaveBeenCalled();
389
+ expect(deserialize).toHaveBeenCalled();
390
+ });
391
+ it('should work with useScan: false', async () => {
392
+ const noScanStore = createRedisSessionStore(redis, {
393
+ useScan: false,
394
+ });
395
+ await noScanStore.set('scan-test-1', createTestSession({ id: 'scan-test-1' }));
396
+ await noScanStore.set('scan-test-2', createTestSession({ id: 'scan-test-2' }));
397
+ const sessions = await noScanStore.getAll();
398
+ expect(sessions).toHaveLength(2);
399
+ await noScanStore.clear();
400
+ const remaining = await noScanStore.getAll();
401
+ expect(remaining).toHaveLength(0);
402
+ });
403
+ });
404
+ describe('TTL handling', () => {
405
+ it('should calculate TTL from session expiry', async () => {
406
+ const session = createTestSession({
407
+ expiresAt: Date.now() + 7200000, // 2 hours
408
+ });
409
+ await store.set(session.id, session);
410
+ // Check that TTL was set (should be around 7200 seconds)
411
+ const ttl = await redis.ttl(`raffel:session:${session.id}`);
412
+ expect(ttl).toBeGreaterThan(7100);
413
+ expect(ttl).toBeLessThanOrEqual(7200);
414
+ });
415
+ it('should use minimum TTL of 1 second for nearly expired sessions', async () => {
416
+ const session = createTestSession({
417
+ expiresAt: Date.now() + 100, // 100ms from now
418
+ });
419
+ await store.set(session.id, session);
420
+ const ttl = await redis.ttl(`raffel:session:${session.id}`);
421
+ expect(ttl).toBeGreaterThanOrEqual(1);
422
+ });
423
+ });
424
+ describe('edge cases', () => {
425
+ it('should handle session with numeric userId', async () => {
426
+ const session = createTestSession({
427
+ id: 'numeric-user',
428
+ userId: 12345,
429
+ });
430
+ await store.set(session.id, session);
431
+ const sessions = await store.getByUserId(12345);
432
+ expect(sessions).toHaveLength(1);
433
+ expect(sessions[0].userId).toBe(12345);
434
+ });
435
+ it('should handle large session data', async () => {
436
+ const largeData = {};
437
+ for (let i = 0; i < 1000; i++) {
438
+ largeData[`key-${i}`] = `value-${i}`.repeat(10);
439
+ }
440
+ const session = createTestSession({
441
+ id: 'large-data',
442
+ data: largeData,
443
+ });
444
+ await store.set(session.id, session);
445
+ const retrieved = await store.get(session.id);
446
+ expect(retrieved?.data).toEqual(largeData);
447
+ });
448
+ it('should handle special characters in session ID', async () => {
449
+ const session = createTestSession({
450
+ id: 'session:with:colons:and-dashes_and_underscores',
451
+ });
452
+ await store.set(session.id, session);
453
+ const retrieved = await store.get(session.id);
454
+ expect(retrieved?.id).toBe(session.id);
455
+ });
456
+ it('should handle concurrent operations', async () => {
457
+ const sessions = Array.from({ length: 10 }, (_, i) => createTestSession({
458
+ id: `concurrent-${i}`,
459
+ userId: 'concurrent-user',
460
+ }));
461
+ // Set all sessions concurrently
462
+ await Promise.all(sessions.map((s) => store.set(s.id, s)));
463
+ const userSessions = await store.getByUserId('concurrent-user');
464
+ expect(userSessions).toHaveLength(10);
465
+ // Delete all concurrently
466
+ await Promise.all(sessions.map((s) => store.delete(s.id)));
467
+ const remaining = await store.getByUserId('concurrent-user');
468
+ expect(remaining).toHaveLength(0);
469
+ });
470
+ });
471
+ });
472
+ describe('createRedisSessionStore factory', () => {
473
+ it('should create a SessionStore instance', () => {
474
+ const redis = createMockRedis();
475
+ const store = createRedisSessionStore(redis);
476
+ expect(store).toBeDefined();
477
+ expect(typeof store.get).toBe('function');
478
+ expect(typeof store.set).toBe('function');
479
+ expect(typeof store.delete).toBe('function');
480
+ expect(typeof store.clear).toBe('function');
481
+ expect(typeof store.getAll).toBe('function');
482
+ expect(typeof store.getByUserId).toBe('function');
483
+ expect(typeof store.deleteByUserId).toBe('function');
484
+ expect(typeof store.cleanup).toBe('function');
485
+ });
486
+ it('should use default options when none provided', () => {
487
+ const redis = createMockRedis();
488
+ const store = createRedisSessionStore(redis);
489
+ expect(store).toBeInstanceOf(RedisSessionStore);
490
+ });
491
+ });
492
+ //# sourceMappingURL=session-redis.int.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-redis.int.test.js","sourceRoot":"","sources":["../../src/http/session-redis.int.test.ts"],"names":[],"mappings":"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"}