@openora/core 0.4.1-canary.37 → 0.4.1-canary.39

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 (259) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/admin-console/__tests__/backoffice.router.test.js +67 -51
  3. package/dist/admin-console/__tests__/backoffice.router.test.js.map +1 -1
  4. package/dist/admin-console/__tests__/backoffice.service.test.js +1 -13
  5. package/dist/admin-console/__tests__/backoffice.service.test.js.map +1 -1
  6. package/dist/analytics/__tests__/analytics.contract.test.js +12 -0
  7. package/dist/analytics/__tests__/analytics.contract.test.js.map +1 -1
  8. package/dist/analytics/__tests__/financial-analytics.service.test.js +3 -3
  9. package/dist/analytics/__tests__/financial-analytics.service.test.js.map +1 -1
  10. package/dist/analytics/service/financial-analytics.service.d.ts.map +1 -1
  11. package/dist/analytics/service/financial-analytics.service.js +14 -17
  12. package/dist/analytics/service/financial-analytics.service.js.map +1 -1
  13. package/dist/analytics/service/funnel-analytics.service.d.ts.map +1 -1
  14. package/dist/analytics/service/funnel-analytics.service.js +8 -11
  15. package/dist/analytics/service/funnel-analytics.service.js.map +1 -1
  16. package/dist/audit/__tests__/audit.service.test.js +128 -251
  17. package/dist/audit/__tests__/audit.service.test.js.map +1 -1
  18. package/dist/casino/gaming/__tests__/gaming.service.test.js +83 -89
  19. package/dist/casino/gaming/__tests__/gaming.service.test.js.map +1 -1
  20. package/dist/casino/lobby/__tests__/lobby.cache.test.js +42 -33
  21. package/dist/casino/lobby/__tests__/lobby.cache.test.js.map +1 -1
  22. package/dist/cms/__tests__/cms.reads.test.js +59 -80
  23. package/dist/cms/__tests__/cms.reads.test.js.map +1 -1
  24. package/dist/cms/__tests__/cms.router.test.js +62 -20
  25. package/dist/cms/__tests__/cms.router.test.js.map +1 -1
  26. package/dist/cms/__tests__/cms.service.test.js +116 -14
  27. package/dist/cms/__tests__/cms.service.test.js.map +1 -1
  28. package/dist/common/errors/__tests__/errors.mapper.test.d.ts +2 -0
  29. package/dist/common/errors/__tests__/errors.mapper.test.d.ts.map +1 -0
  30. package/dist/common/errors/__tests__/errors.mapper.test.js +59 -0
  31. package/dist/common/errors/__tests__/errors.mapper.test.js.map +1 -0
  32. package/dist/compliance/__tests__/assert.test.d.ts +2 -0
  33. package/dist/compliance/__tests__/assert.test.d.ts.map +1 -0
  34. package/dist/compliance/__tests__/assert.test.js +34 -0
  35. package/dist/compliance/__tests__/assert.test.js.map +1 -0
  36. package/dist/compliance/__tests__/compliance.service.test.js +149 -84
  37. package/dist/compliance/__tests__/compliance.service.test.js.map +1 -1
  38. package/dist/compliance/__tests__/kyc.service.test.js +247 -155
  39. package/dist/compliance/__tests__/kyc.service.test.js.map +1 -1
  40. package/dist/compliance/__tests__/limits.contract.test.d.ts +2 -0
  41. package/dist/compliance/__tests__/limits.contract.test.d.ts.map +1 -0
  42. package/dist/compliance/__tests__/limits.contract.test.js +43 -0
  43. package/dist/compliance/__tests__/limits.contract.test.js.map +1 -0
  44. package/dist/compliance/__tests__/rg-monitoring.service.test.js +256 -101
  45. package/dist/compliance/__tests__/rg-monitoring.service.test.js.map +1 -1
  46. package/dist/compliance/__tests__/rg.contract.test.js +1 -20
  47. package/dist/compliance/__tests__/rg.contract.test.js.map +1 -1
  48. package/dist/compliance/__tests__/rg.router.test.js +113 -65
  49. package/dist/compliance/__tests__/rg.router.test.js.map +1 -1
  50. package/dist/compliance/__tests__/rg.service.test.js +277 -235
  51. package/dist/compliance/__tests__/rg.service.test.js.map +1 -1
  52. package/dist/compliance/service/rg-monitoring.service.d.ts.map +1 -1
  53. package/dist/compliance/service/rg-monitoring.service.js +11 -8
  54. package/dist/compliance/service/rg-monitoring.service.js.map +1 -1
  55. package/dist/contracts/__tests__/compose-contract.test.d.ts +2 -0
  56. package/dist/contracts/__tests__/compose-contract.test.d.ts.map +1 -0
  57. package/dist/contracts/__tests__/compose-contract.test.js +27 -0
  58. package/dist/contracts/__tests__/compose-contract.test.js.map +1 -0
  59. package/dist/contracts/adapters/__tests__/token.test.d.ts +2 -0
  60. package/dist/contracts/adapters/__tests__/token.test.d.ts.map +1 -0
  61. package/dist/contracts/adapters/__tests__/token.test.js +14 -0
  62. package/dist/contracts/adapters/__tests__/token.test.js.map +1 -0
  63. package/dist/contracts/schemas/__tests__/events.test.d.ts +2 -0
  64. package/dist/contracts/schemas/__tests__/events.test.d.ts.map +1 -0
  65. package/dist/contracts/schemas/__tests__/events.test.js +51 -0
  66. package/dist/contracts/schemas/__tests__/events.test.js.map +1 -0
  67. package/dist/contracts/schemas/__tests__/igaming-config.test.d.ts +2 -0
  68. package/dist/contracts/schemas/__tests__/igaming-config.test.d.ts.map +1 -0
  69. package/dist/contracts/schemas/__tests__/igaming-config.test.js +38 -0
  70. package/dist/contracts/schemas/__tests__/igaming-config.test.js.map +1 -0
  71. package/dist/contracts/schemas/reporting.d.ts +7 -2
  72. package/dist/contracts/schemas/reporting.d.ts.map +1 -1
  73. package/dist/contracts/schemas/reporting.js +2 -1
  74. package/dist/contracts/schemas/reporting.js.map +1 -1
  75. package/dist/engagement/chat/__tests__/chat.service.test.js +524 -364
  76. package/dist/engagement/chat/__tests__/chat.service.test.js.map +1 -1
  77. package/dist/engagement/notifications/__tests__/notifications.service.test.js +125 -68
  78. package/dist/engagement/notifications/__tests__/notifications.service.test.js.map +1 -1
  79. package/dist/iam/__tests__/iam.service.test.js +367 -596
  80. package/dist/iam/__tests__/iam.service.test.js.map +1 -1
  81. package/dist/pam/identity/__tests__/admin-user-directory.test.js +144 -68
  82. package/dist/pam/identity/__tests__/admin-user-directory.test.js.map +1 -1
  83. package/dist/pam/identity/__tests__/identity.rate-limit.test.js +33 -22
  84. package/dist/pam/identity/__tests__/identity.rate-limit.test.js.map +1 -1
  85. package/dist/pam/identity/__tests__/identity.service.test.js +217 -298
  86. package/dist/pam/identity/__tests__/identity.service.test.js.map +1 -1
  87. package/dist/pam/identity/__tests__/login-enforcement.service.test.js +97 -32
  88. package/dist/pam/identity/__tests__/login-enforcement.service.test.js.map +1 -1
  89. package/dist/pam/identity/__tests__/phone-login.service.test.js +163 -134
  90. package/dist/pam/identity/__tests__/phone-login.service.test.js.map +1 -1
  91. package/dist/pam/identity/__tests__/rg-guard.test.d.ts +2 -0
  92. package/dist/pam/identity/__tests__/rg-guard.test.d.ts.map +1 -0
  93. package/dist/pam/identity/__tests__/rg-guard.test.js +21 -0
  94. package/dist/pam/identity/__tests__/rg-guard.test.js.map +1 -0
  95. package/dist/pam/player-management/__tests__/kyc-status-writer.test.js +73 -26
  96. package/dist/pam/player-management/__tests__/kyc-status-writer.test.js.map +1 -1
  97. package/dist/pam/player-management/__tests__/player.router.test.js +63 -46
  98. package/dist/pam/player-management/__tests__/player.router.test.js.map +1 -1
  99. package/dist/pam/player-management/__tests__/player.service.test.js +207 -111
  100. package/dist/pam/player-management/__tests__/player.service.test.js.map +1 -1
  101. package/dist/pam/profile/__tests__/profile.service.test.js +89 -41
  102. package/dist/pam/profile/__tests__/profile.service.test.js.map +1 -1
  103. package/dist/pam/shared/__tests__/shared-mappers.test.d.ts +2 -0
  104. package/dist/pam/shared/__tests__/shared-mappers.test.d.ts.map +1 -0
  105. package/dist/pam/shared/__tests__/shared-mappers.test.js +55 -0
  106. package/dist/pam/shared/__tests__/shared-mappers.test.js.map +1 -0
  107. package/dist/pam/tag/__tests__/get-active-tag-keys.test.js +72 -30
  108. package/dist/pam/tag/__tests__/get-active-tag-keys.test.js.map +1 -1
  109. package/dist/pam/tag/__tests__/tag-evaluation.service.test.js +308 -235
  110. package/dist/pam/tag/__tests__/tag-evaluation.service.test.js.map +1 -1
  111. package/dist/pam/tag/__tests__/tag-rule.service.test.js +136 -140
  112. package/dist/pam/tag/__tests__/tag-rule.service.test.js.map +1 -1
  113. package/dist/pam/tag/__tests__/tag.router.test.js +76 -25
  114. package/dist/pam/tag/__tests__/tag.router.test.js.map +1 -1
  115. package/dist/pam/tag/__tests__/tag.service.test.js +224 -247
  116. package/dist/pam/tag/__tests__/tag.service.test.js.map +1 -1
  117. package/dist/server/auth/__tests__/admin-guard.test.js +107 -117
  118. package/dist/server/auth/__tests__/admin-guard.test.js.map +1 -1
  119. package/dist/server/auth/__tests__/permission-levels.test.d.ts +2 -0
  120. package/dist/server/auth/__tests__/permission-levels.test.d.ts.map +1 -0
  121. package/dist/server/auth/__tests__/permission-levels.test.js +89 -0
  122. package/dist/server/auth/__tests__/permission-levels.test.js.map +1 -0
  123. package/dist/server/auth/__tests__/session-resolver.test.js +45 -13
  124. package/dist/server/auth/__tests__/session-resolver.test.js.map +1 -1
  125. package/dist/server/db/__tests__/query-helpers.test.js +72 -1
  126. package/dist/server/db/__tests__/query-helpers.test.js.map +1 -1
  127. package/dist/server/db/outbox/__tests__/relay.test.js +74 -81
  128. package/dist/server/db/outbox/__tests__/relay.test.js.map +1 -1
  129. package/dist/server/kernel/__tests__/bullmq-job-queue.test.js +204 -154
  130. package/dist/server/kernel/__tests__/bullmq-job-queue.test.js.map +1 -1
  131. package/dist/server/kernel/__tests__/cache.test.js +26 -13
  132. package/dist/server/kernel/__tests__/cache.test.js.map +1 -1
  133. package/dist/server/kernel/__tests__/domain-error.test.d.ts +2 -0
  134. package/dist/server/kernel/__tests__/domain-error.test.d.ts.map +1 -0
  135. package/dist/server/kernel/__tests__/domain-error.test.js +35 -0
  136. package/dist/server/kernel/__tests__/domain-error.test.js.map +1 -0
  137. package/dist/server/kernel/__tests__/error-reporter.test.d.ts +2 -0
  138. package/dist/server/kernel/__tests__/error-reporter.test.d.ts.map +1 -0
  139. package/dist/server/kernel/__tests__/error-reporter.test.js +52 -0
  140. package/dist/server/kernel/__tests__/error-reporter.test.js.map +1 -0
  141. package/dist/server/kernel/__tests__/event-bus.test.js +60 -20
  142. package/dist/server/kernel/__tests__/event-bus.test.js.map +1 -1
  143. package/dist/server/kernel/__tests__/orpc-error-map.test.d.ts +2 -0
  144. package/dist/server/kernel/__tests__/orpc-error-map.test.d.ts.map +1 -0
  145. package/dist/server/kernel/__tests__/orpc-error-map.test.js +54 -0
  146. package/dist/server/kernel/__tests__/orpc-error-map.test.js.map +1 -0
  147. package/dist/server/kernel/__tests__/platform-config-loader.test.d.ts +2 -0
  148. package/dist/server/kernel/__tests__/platform-config-loader.test.d.ts.map +1 -0
  149. package/dist/server/kernel/__tests__/platform-config-loader.test.js +112 -0
  150. package/dist/server/kernel/__tests__/platform-config-loader.test.js.map +1 -0
  151. package/dist/server/kernel/__tests__/rate-limiter.test.js +22 -13
  152. package/dist/server/kernel/__tests__/rate-limiter.test.js.map +1 -1
  153. package/dist/server/kernel/__tests__/realtime-transport.test.d.ts.map +1 -0
  154. package/dist/{testing/fakes → server/kernel}/__tests__/realtime-transport.test.js.map +1 -1
  155. package/dist/server/kernel/__tests__/redis-cache.test.js +34 -34
  156. package/dist/server/kernel/__tests__/redis-cache.test.js.map +1 -1
  157. package/dist/server/kernel/__tests__/redis-rate-limiter.test.js +49 -44
  158. package/dist/server/kernel/__tests__/redis-rate-limiter.test.js.map +1 -1
  159. package/dist/server/kernel/__tests__/redis-streams-broker.test.js +141 -262
  160. package/dist/server/kernel/__tests__/redis-streams-broker.test.js.map +1 -1
  161. package/dist/server/kernel/__tests__/request-context.test.d.ts +2 -0
  162. package/dist/server/kernel/__tests__/request-context.test.d.ts.map +1 -0
  163. package/dist/server/kernel/__tests__/request-context.test.js +64 -0
  164. package/dist/server/kernel/__tests__/request-context.test.js.map +1 -0
  165. package/dist/server/kernel/__tests__/router-utils.test.d.ts +2 -0
  166. package/dist/server/kernel/__tests__/router-utils.test.d.ts.map +1 -0
  167. package/dist/server/kernel/__tests__/router-utils.test.js +80 -0
  168. package/dist/server/kernel/__tests__/router-utils.test.js.map +1 -0
  169. package/dist/server/kernel/bullmq-job-queue.d.ts.map +1 -1
  170. package/dist/server/kernel/bullmq-job-queue.js +8 -2
  171. package/dist/server/kernel/bullmq-job-queue.js.map +1 -1
  172. package/dist/server/runtime/__tests__/create-app.test.js +26 -18
  173. package/dist/server/runtime/__tests__/create-app.test.js.map +1 -1
  174. package/dist/testing/index.d.ts +2 -6
  175. package/dist/testing/index.d.ts.map +1 -1
  176. package/dist/testing/index.js +2 -10
  177. package/dist/testing/index.js.map +1 -1
  178. package/dist/testing/mock.d.ts +28 -16
  179. package/dist/testing/mock.d.ts.map +1 -1
  180. package/dist/testing/mock.js +58 -37
  181. package/dist/testing/mock.js.map +1 -1
  182. package/dist/testing/real-infra.d.ts +47 -0
  183. package/dist/testing/real-infra.d.ts.map +1 -0
  184. package/dist/testing/real-infra.js +122 -0
  185. package/dist/testing/real-infra.js.map +1 -0
  186. package/dist/wallet/__tests__/admin-reporting.test.js +201 -90
  187. package/dist/wallet/__tests__/admin-reporting.test.js.map +1 -1
  188. package/dist/wallet/__tests__/rail-for.test.d.ts +2 -0
  189. package/dist/wallet/__tests__/rail-for.test.d.ts.map +1 -0
  190. package/dist/wallet/__tests__/rail-for.test.js +22 -0
  191. package/dist/wallet/__tests__/rail-for.test.js.map +1 -0
  192. package/dist/wallet/__tests__/wallet-auto-rule.router.test.js +82 -63
  193. package/dist/wallet/__tests__/wallet-auto-rule.router.test.js.map +1 -1
  194. package/dist/wallet/__tests__/wallet-auto-withdrawal.test.js +414 -437
  195. package/dist/wallet/__tests__/wallet-auto-withdrawal.test.js.map +1 -1
  196. package/dist/wallet/__tests__/wallet-commands.service.test.js +116 -155
  197. package/dist/wallet/__tests__/wallet-commands.service.test.js.map +1 -1
  198. package/dist/wallet/__tests__/wallet-kyc-gate.test.js +63 -42
  199. package/dist/wallet/__tests__/wallet-kyc-gate.test.js.map +1 -1
  200. package/dist/wallet/__tests__/wallet-webhook.router.test.js +129 -51
  201. package/dist/wallet/__tests__/wallet-webhook.router.test.js.map +1 -1
  202. package/dist/wallet/__tests__/wallet.rate-limit.test.js +74 -21
  203. package/dist/wallet/__tests__/wallet.rate-limit.test.js.map +1 -1
  204. package/dist/wallet/__tests__/wallet.router.test.js +56 -36
  205. package/dist/wallet/__tests__/wallet.router.test.js.map +1 -1
  206. package/dist/wallet/__tests__/wallet.service.test.js +623 -887
  207. package/dist/wallet/__tests__/wallet.service.test.js.map +1 -1
  208. package/package.json +1 -2
  209. package/dist/casino/lobby/__tests__/lobby.service.test.d.ts +0 -2
  210. package/dist/casino/lobby/__tests__/lobby.service.test.d.ts.map +0 -1
  211. package/dist/casino/lobby/__tests__/lobby.service.test.js +0 -11
  212. package/dist/casino/lobby/__tests__/lobby.service.test.js.map +0 -1
  213. package/dist/contracts/schemas/__tests__/identity-schemas.test.d.ts +0 -2
  214. package/dist/contracts/schemas/__tests__/identity-schemas.test.d.ts.map +0 -1
  215. package/dist/contracts/schemas/__tests__/identity-schemas.test.js +0 -43
  216. package/dist/contracts/schemas/__tests__/identity-schemas.test.js.map +0 -1
  217. package/dist/testing/fakes/__tests__/cache.test.d.ts +0 -2
  218. package/dist/testing/fakes/__tests__/cache.test.d.ts.map +0 -1
  219. package/dist/testing/fakes/__tests__/cache.test.js +0 -89
  220. package/dist/testing/fakes/__tests__/cache.test.js.map +0 -1
  221. package/dist/testing/fakes/__tests__/job-queue.test.d.ts +0 -2
  222. package/dist/testing/fakes/__tests__/job-queue.test.d.ts.map +0 -1
  223. package/dist/testing/fakes/__tests__/job-queue.test.js +0 -135
  224. package/dist/testing/fakes/__tests__/job-queue.test.js.map +0 -1
  225. package/dist/testing/fakes/__tests__/rate-limiter.test.d.ts +0 -2
  226. package/dist/testing/fakes/__tests__/rate-limiter.test.d.ts.map +0 -1
  227. package/dist/testing/fakes/__tests__/rate-limiter.test.js +0 -83
  228. package/dist/testing/fakes/__tests__/rate-limiter.test.js.map +0 -1
  229. package/dist/testing/fakes/__tests__/realtime-authorizer.test.d.ts +0 -2
  230. package/dist/testing/fakes/__tests__/realtime-authorizer.test.d.ts.map +0 -1
  231. package/dist/testing/fakes/__tests__/realtime-authorizer.test.js +0 -19
  232. package/dist/testing/fakes/__tests__/realtime-authorizer.test.js.map +0 -1
  233. package/dist/testing/fakes/__tests__/realtime-transport.test.d.ts.map +0 -1
  234. package/dist/testing/fakes/cache.d.ts +0 -14
  235. package/dist/testing/fakes/cache.d.ts.map +0 -1
  236. package/dist/testing/fakes/cache.js +0 -56
  237. package/dist/testing/fakes/cache.js.map +0 -1
  238. package/dist/testing/fakes/event-bus.d.ts +0 -17
  239. package/dist/testing/fakes/event-bus.d.ts.map +0 -1
  240. package/dist/testing/fakes/event-bus.js +0 -30
  241. package/dist/testing/fakes/event-bus.js.map +0 -1
  242. package/dist/testing/fakes/job-queue.d.ts +0 -40
  243. package/dist/testing/fakes/job-queue.d.ts.map +0 -1
  244. package/dist/testing/fakes/job-queue.js +0 -200
  245. package/dist/testing/fakes/job-queue.js.map +0 -1
  246. package/dist/testing/fakes/rate-limiter.d.ts +0 -11
  247. package/dist/testing/fakes/rate-limiter.d.ts.map +0 -1
  248. package/dist/testing/fakes/rate-limiter.js +0 -39
  249. package/dist/testing/fakes/rate-limiter.js.map +0 -1
  250. package/dist/testing/fakes/realtime-authorizer.d.ts +0 -10
  251. package/dist/testing/fakes/realtime-authorizer.d.ts.map +0 -1
  252. package/dist/testing/fakes/realtime-authorizer.js +0 -10
  253. package/dist/testing/fakes/realtime-authorizer.js.map +0 -1
  254. package/dist/testing/fakes/realtime-transport.d.ts +0 -2
  255. package/dist/testing/fakes/realtime-transport.d.ts.map +0 -1
  256. package/dist/testing/fakes/realtime-transport.js +0 -2
  257. package/dist/testing/fakes/realtime-transport.js.map +0 -1
  258. /package/dist/{testing/fakes → server/kernel}/__tests__/realtime-transport.test.d.ts +0 -0
  259. /package/dist/{testing/fakes → server/kernel}/__tests__/realtime-transport.test.js +0 -0
@@ -1,293 +1,172 @@
1
- import { describe, it, expect, vi } from 'vitest';
1
+ import { describe, it, expect, vi, beforeAll, afterEach, afterAll } from 'vitest';
2
+ import { randomUUID } from 'node:crypto';
2
3
  import { RedisStreamsBroker } from '../redis-streams-broker.js';
3
- import { mock } from '../../../testing/mock.js';
4
- // Mirrors the un-exported STREAM_PREFIX in redis-streams-broker.ts.
5
- const STREAM_PREFIX = 'oss:evt:';
6
- // In-memory Redis Streams double: one Map<streamKey, entries[]> shared by the root
7
- // client and every client.duplicate() (mirrors duplicate() opening a second
8
- // connection to the SAME server/data), plus a per-(streamKey, group) read cursor.
9
- // A blocked xReadGroup call parks on a per-stream waiter list, woken by the next
10
- // xAdd (new data) or destroy() (reader torn down) - no timers, fully deterministic.
11
- //
12
- // Models the two node-redis behaviours the broker's reconnect path depends on:
13
- // `connect()` throws 'Socket already opened' once `isOpen` (so a loop that
14
- // re-connects blindly wedges here exactly as it would in production), and
15
- // xGroupCreate honours the start id - '$' seeds the cursor at the current stream
16
- // end (new entries only), '0' at the start (replays retained history).
17
- function fakeStreamsClient() {
18
- const streams = new Map();
19
- const cursors = new Map();
20
- const waiters = new Map();
21
- const duplicates = [];
22
- let seq = 0;
23
- // Armed before subscribe(), since the reader connection this would target does not
24
- // exist until the loop calls duplicate().
25
- let nextGroupCreateError = null;
26
- function wake(key) {
27
- const pending = waiters.get(key) ?? [];
28
- waiters.set(key, []);
29
- for (const resolve of pending) {
30
- resolve();
31
- }
32
- }
33
- function makeRaw() {
34
- let destroyed = false;
35
- const raw = {
36
- isReady: true,
37
- isOpen: false,
38
- on: vi.fn(),
39
- connect: vi.fn(async () => {
40
- // node-redis (socket.ts): connect() rejects once the socket is open, and
41
- // isOpen stays true across reconnectStrategy retries.
42
- if (raw.isOpen) {
43
- throw new Error('Socket already opened');
44
- }
45
- raw.isOpen = true;
46
- return raw;
47
- }),
48
- destroy: vi.fn(() => {
49
- destroyed = true;
50
- raw.isOpen = false;
51
- // Every parked reader, not just those whose stream already has entries - a
52
- // loop torn down before anything was ever published is parked on a key that
53
- // `streams` has never seen, and would otherwise never wake to observe
54
- // `destroyed` (hanging the `close()` that awaits it). Loops belonging to
55
- // other connections re-check their own flag and re-park.
56
- for (const key of waiters.keys()) {
57
- wake(key);
58
- }
59
- }),
60
- duplicate: vi.fn(() => {
61
- const dup = makeRaw();
62
- duplicates.push(dup);
63
- return mock(dup);
64
- }),
65
- xAdd: vi.fn(async (key, _id, message) => {
66
- const entries = streams.get(key) ?? [];
67
- const entryId = `${++seq}-0`;
68
- entries.push({ id: entryId, message });
69
- streams.set(key, entries);
70
- wake(key);
71
- return entryId;
72
- }),
73
- xGroupCreate: vi.fn(async (key, group, startId) => {
74
- if (nextGroupCreateError) {
75
- const err = nextGroupCreateError;
76
- nextGroupCreateError = null;
77
- throw err;
78
- }
79
- const cursorKey = `${key}::${group}`;
80
- if (cursors.has(cursorKey)) {
81
- throw new Error('BUSYGROUP Consumer Group name already exists');
82
- }
83
- cursors.set(cursorKey, startId === '0' ? 0 : (streams.get(key) ?? []).length);
84
- return 'OK';
85
- }),
86
- xReadGroup: vi.fn(async (group, _consumer, stream, opts) => {
87
- const { key } = stream;
88
- const cursorKey = `${key}::${group}`;
89
- for (;;) {
90
- if (destroyed) {
91
- throw new Error('reader destroyed');
92
- }
93
- const entries = streams.get(key) ?? [];
94
- const cursor = cursors.get(cursorKey) ?? 0;
95
- if (cursor < entries.length) {
96
- const slice = entries.slice(cursor, cursor + (opts?.COUNT ?? entries.length));
97
- cursors.set(cursorKey, cursor + slice.length);
98
- return [{ name: key, messages: slice }];
99
- }
100
- await new Promise((resolve) => {
101
- const pending = waiters.get(key) ?? [];
102
- pending.push(resolve);
103
- waiters.set(key, pending);
104
- });
105
- }
106
- }),
107
- xAck: vi.fn(async () => 1),
108
- xAutoClaim: vi.fn(async () => ({ nextId: '0-0', messages: [], deletedMessages: [] })),
109
- };
110
- return raw;
111
- }
112
- const root = makeRaw();
113
- const hasGroup = (topic, group) => cursors.has(`${STREAM_PREFIX}${topic}::${group}`);
114
- const failNextGroupCreate = (err) => {
115
- nextGroupCreateError = err;
116
- };
117
- return { client: mock(root), root, duplicates, hasGroup, failNextGroupCreate };
4
+ import { createTestRedis, waitForConsumerGroup } from '@openora/core/testing';
5
+ let redis;
6
+ const brokers = [];
7
+ function makeBroker(serviceName) {
8
+ const broker = new RedisStreamsBroker(redis.client, { serviceName });
9
+ brokers.push(broker);
10
+ return broker;
11
+ }
12
+ // A fresh topic per test so streams/groups never leak between tests.
13
+ function uniqueTopic() {
14
+ return `test.${randomUUID()}`;
118
15
  }
119
- // `subscribe()` returns before its consumer group exists - the loop creates the group
120
- // asynchronously, after `await reader.connect()`. Publishing into that window is the
121
- // one case a '$' group genuinely drops (see the class docstring), so a test that
122
- // means to exercise steady-state delivery must wait the group out first, the way a
123
- // real deployment finishes booting before it serves traffic.
124
- async function awaitGroup(fake, topic, group,
125
- // Default 1s is under the loop's 2s retry backoff, so a test exercising a failed
126
- // first attempt must allow for at least one of those.
127
- timeout = 4_000) {
128
- await vi.waitFor(() => {
129
- expect(fake.hasGroup(topic, group)).toBe(true);
130
- }, { timeout });
16
+ function streamOf(topic) {
17
+ return `oss:evt:${topic}`;
131
18
  }
132
- function makeEnvelope(topic, overrides = {}) {
19
+ function makeEnvelope(topic) {
133
20
  return {
134
- eventId: 'evt-1',
21
+ eventId: randomUUID(),
135
22
  topic,
136
23
  payload: { ok: true },
137
24
  occurredAt: '2026-01-01T00:00:00.000Z',
138
25
  schemaVersion: 1,
139
- ...overrides,
140
26
  };
141
27
  }
142
- function deferred() {
143
- let resolve;
144
- const promise = new Promise((r) => {
145
- resolve = r;
146
- });
147
- return { promise, resolve };
148
- }
28
+ beforeAll(async () => {
29
+ redis = await createTestRedis();
30
+ });
31
+ afterEach(async () => {
32
+ await Promise.allSettled(brokers.map((b) => b.close()));
33
+ brokers.length = 0;
34
+ await redis.flush();
35
+ });
36
+ afterAll(async () => {
37
+ await redis.quit();
38
+ });
149
39
  describe('RedisStreamsBroker', () => {
150
- it('publish XADDs the serialized envelope with a MAXLEN trim, on the shared client', async () => {
151
- const fake = fakeStreamsClient();
152
- const broker = new RedisStreamsBroker(fake.client, { serviceName: 'svc' });
153
- const envelope = makeEnvelope('wallet.deposit.completed');
40
+ it('publish XADDs the serialized envelope to the topic stream', async () => {
41
+ const broker = makeBroker('svc');
42
+ const topic = uniqueTopic();
43
+ const envelope = makeEnvelope(topic);
154
44
  await broker.publish(envelope);
155
- expect(fake.root.xAdd).toHaveBeenCalledWith('oss:evt:wallet.deposit.completed', '*', { data: JSON.stringify(envelope) }, { TRIM: { strategy: 'MAXLEN', strategyModifier: '~', threshold: expect.any(Number) } });
156
- // publish never touches a duplicated (blocking-read) connection.
157
- expect(fake.duplicates).toHaveLength(0);
45
+ const entries = await redis.client.xRange(streamOf(topic), '-', '+');
46
+ expect(entries).toHaveLength(1);
47
+ expect(JSON.parse(entries[0].message['data'])).toEqual(envelope);
158
48
  });
159
- it('coalesces two subscribers on the same topic into one loop: both receive, default group is the service name, one XACK', async () => {
160
- const fake = fakeStreamsClient();
161
- const broker = new RedisStreamsBroker(fake.client, { serviceName: 'wallet-svc' });
162
- const seen1 = deferred();
163
- const seen2 = deferred();
164
- broker.subscribe('wallet.deposit.completed', (env) => seen1.resolve(env));
165
- broker.subscribe('wallet.deposit.completed', (env) => seen2.resolve(env));
166
- expect(fake.duplicates).toHaveLength(1);
167
- await awaitGroup(fake, 'wallet.deposit.completed', 'wallet-svc');
168
- const envelope = makeEnvelope('wallet.deposit.completed');
49
+ it('coalesces two subscribers on one topic: both receive, the entry is ACKed', async () => {
50
+ const broker = makeBroker('wallet-svc');
51
+ const topic = uniqueTopic();
52
+ const seen1 = [];
53
+ const seen2 = [];
54
+ broker.subscribe(topic, (e) => {
55
+ seen1.push(e);
56
+ });
57
+ broker.subscribe(topic, (e) => {
58
+ seen2.push(e);
59
+ });
60
+ await waitForConsumerGroup(redis.client, { stream: streamOf(topic), group: 'wallet-svc' });
61
+ const envelope = makeEnvelope(topic);
169
62
  await broker.publish(envelope);
170
- expect(await seen1.promise).toEqual(envelope);
171
- expect(await seen2.promise).toEqual(envelope);
172
63
  await vi.waitFor(() => {
173
- expect(fake.duplicates[0]?.xAck).toHaveBeenCalledTimes(1);
64
+ expect(seen1).toEqual([envelope]);
65
+ expect(seen2).toEqual([envelope]);
66
+ });
67
+ await vi.waitFor(async () => {
68
+ const pending = await redis.client.xPending(streamOf(topic), 'wallet-svc');
69
+ expect(pending.pending).toBe(0);
174
70
  });
175
- expect(fake.duplicates[0]?.xGroupCreate).toHaveBeenCalledWith('oss:evt:wallet.deposit.completed', 'wallet-svc', '$', { MKSTREAM: true });
176
- await broker.close();
177
71
  });
178
- it('opts.consumerGroup overrides the default group and starts its own loop', async () => {
179
- const fake = fakeStreamsClient();
180
- const broker = new RedisStreamsBroker(fake.client, { serviceName: 'wallet-svc' });
181
- const seenDefault = deferred();
182
- const seenCustom = deferred();
183
- broker.subscribe('wallet.deposit.completed', (env) => seenDefault.resolve(env));
184
- broker.subscribe('wallet.deposit.completed', (env) => seenCustom.resolve(env), {
185
- consumerGroup: 'analytics',
72
+ it('uses the service name as the default consumer group', async () => {
73
+ const broker = makeBroker('wallet-svc');
74
+ const topic = uniqueTopic();
75
+ broker.subscribe(topic, () => undefined);
76
+ await waitForConsumerGroup(redis.client, { stream: streamOf(topic), group: 'wallet-svc' });
77
+ const groups = await redis.client.xInfoGroups(streamOf(topic));
78
+ expect(groups.map((g) => g.name)).toEqual(['wallet-svc']);
79
+ });
80
+ it('opts.consumerGroup starts a second group that also receives the event', async () => {
81
+ const broker = makeBroker('wallet-svc');
82
+ const topic = uniqueTopic();
83
+ const seenDefault = [];
84
+ const seenCustom = [];
85
+ broker.subscribe(topic, (e) => {
86
+ seenDefault.push(e);
186
87
  });
187
- // distinct (topic, group) pairs -> distinct loops/connections.
188
- expect(fake.duplicates).toHaveLength(2);
189
- await awaitGroup(fake, 'wallet.deposit.completed', 'wallet-svc');
190
- await awaitGroup(fake, 'wallet.deposit.completed', 'analytics');
191
- const envelope = makeEnvelope('wallet.deposit.completed');
88
+ broker.subscribe(topic, (e) => {
89
+ seenCustom.push(e);
90
+ }, { consumerGroup: 'analytics' });
91
+ await waitForConsumerGroup(redis.client, { stream: streamOf(topic), group: 'wallet-svc' });
92
+ await waitForConsumerGroup(redis.client, { stream: streamOf(topic), group: 'analytics' });
93
+ const envelope = makeEnvelope(topic);
192
94
  await broker.publish(envelope);
193
- expect(await seenDefault.promise).toEqual(envelope);
194
- expect(await seenCustom.promise).toEqual(envelope);
195
- expect(fake.duplicates.map((d) => d.xGroupCreate.mock.calls[0]?.[1])).toEqual(expect.arrayContaining(['wallet-svc', 'analytics']));
196
- await broker.close();
95
+ await vi.waitFor(() => {
96
+ expect(seenDefault).toEqual([envelope]);
97
+ expect(seenCustom).toEqual([envelope]);
98
+ });
99
+ const groups = await redis.client.xInfoGroups(streamOf(topic));
100
+ expect(groups.map((g) => g.name).sort()).toEqual(['analytics', 'wallet-svc']);
197
101
  });
198
- it('unsubscribe stops delivery to that handler and tears down the loop once the last handler leaves', async () => {
199
- const fake = fakeStreamsClient();
200
- const broker = new RedisStreamsBroker(fake.client, { serviceName: 'svc' });
201
- const handler1 = vi.fn();
202
- const seen2 = deferred();
203
- const unsubscribe1 = broker.subscribe('wallet.deposit.completed', handler1);
204
- const unsubscribe2 = broker.subscribe('wallet.deposit.completed', (env) => seen2.resolve(env));
102
+ it('unsubscribe stops delivery to that handler', async () => {
103
+ const broker = makeBroker('svc');
104
+ const topic = uniqueTopic();
105
+ const seen1 = [];
106
+ const seen2 = [];
107
+ const unsubscribe1 = broker.subscribe(topic, (e) => {
108
+ seen1.push(e);
109
+ });
110
+ broker.subscribe(topic, (e) => {
111
+ seen2.push(e);
112
+ });
113
+ await waitForConsumerGroup(redis.client, { stream: streamOf(topic), group: 'svc' });
205
114
  unsubscribe1();
206
- await awaitGroup(fake, 'wallet.deposit.completed', 'svc');
207
- const envelope = makeEnvelope('wallet.deposit.completed');
115
+ const envelope = makeEnvelope(topic);
208
116
  await broker.publish(envelope);
209
- expect(await seen2.promise).toEqual(envelope);
210
- expect(handler1).not.toHaveBeenCalled();
211
- const reader = fake.duplicates[0];
212
- expect(reader?.destroy).not.toHaveBeenCalled();
213
- unsubscribe2();
214
- expect(reader?.destroy).toHaveBeenCalledTimes(1);
117
+ await vi.waitFor(() => expect(seen2).toEqual([envelope]));
118
+ expect(seen1).toEqual([]);
215
119
  });
216
- it('close stops every loop by destroying its duplicated reader connection, not the shared client', async () => {
217
- const fake = fakeStreamsClient();
218
- const broker = new RedisStreamsBroker(fake.client, { serviceName: 'svc' });
219
- broker.subscribe('wallet.deposit.completed', vi.fn());
220
- broker.subscribe('kyc.verification.completed', vi.fn());
221
- expect(fake.duplicates).toHaveLength(2);
120
+ it('close stops the read loop so a later publish is not delivered', async () => {
121
+ const broker = makeBroker('svc');
122
+ const topic = uniqueTopic();
123
+ const seen = [];
124
+ broker.subscribe(topic, (e) => {
125
+ seen.push(e);
126
+ });
127
+ await waitForConsumerGroup(redis.client, { stream: streamOf(topic), group: 'svc' });
222
128
  await broker.close();
223
- for (const reader of fake.duplicates) {
224
- expect(reader.destroy).toHaveBeenCalledTimes(1);
225
- }
226
- expect(fake.root.destroy).not.toHaveBeenCalled();
129
+ await broker.publish(makeEnvelope(topic));
130
+ await new Promise((resolve) => setTimeout(resolve, 150));
131
+ expect(seen).toEqual([]);
132
+ expect(await redis.client.xLen(streamOf(topic))).toBe(1);
227
133
  });
228
- it('tolerates BUSYGROUP - a group a previous replica already created is not an error', async () => {
229
- const fake = fakeStreamsClient();
230
- const first = new RedisStreamsBroker(fake.client, { serviceName: 'svc' });
231
- first.subscribe('wallet.deposit.completed', vi.fn());
232
- await awaitGroup(fake, 'wallet.deposit.completed', 'svc');
233
- await first.close();
234
- // Same (topic, group) against the same Redis: xGroupCreate comes back BUSYGROUP,
235
- // which must not stop this loop from consuming.
236
- const second = new RedisStreamsBroker(fake.client, { serviceName: 'svc' });
237
- const seen = deferred();
238
- second.subscribe('wallet.deposit.completed', (env) => seen.resolve(env));
239
- const envelope = makeEnvelope('wallet.deposit.completed');
240
- await second.publish(envelope);
241
- // Delivery is the proof: the second loop got past a BUSYGROUP rejection.
242
- expect(await seen.promise).toEqual(envelope);
243
- await expect(fake.duplicates[1]?.xGroupCreate.mock.results[0]?.value).rejects.toThrow(/BUSYGROUP/);
244
- await second.close();
245
- });
246
- it('recovers from a failed group creation without re-opening the already-open socket', async () => {
247
- const fake = fakeStreamsClient();
248
- const broker = new RedisStreamsBroker(fake.client, { serviceName: 'svc' });
249
- // Fail the first group creation - it runs after connect() has already opened the
250
- // socket. A loop that reset its readiness and re-called connect() here would take
251
- // 'Socket already opened' on every retry and never consume again.
252
- fake.failNextGroupCreate(new Error('READONLY You cannot write against a replica'));
253
- const seen = deferred();
254
- broker.subscribe('wallet.deposit.completed', (env) => seen.resolve(env));
255
- await awaitGroup(fake, 'wallet.deposit.completed', 'svc');
256
- const envelope = makeEnvelope('wallet.deposit.completed');
257
- await broker.publish(envelope);
258
- expect(await seen.promise).toEqual(envelope);
259
- const reader = fake.duplicates[0];
260
- expect(reader?.xGroupCreate.mock.calls.length).toBeGreaterThan(1);
261
- expect(reader?.connect).toHaveBeenCalledTimes(1);
262
- await broker.close();
134
+ it('two instances sharing a service name split events: exactly one handles each', async () => {
135
+ const topic = uniqueTopic();
136
+ const seenA = [];
137
+ const seenB = [];
138
+ makeBroker('svc').subscribe(topic, (e) => {
139
+ seenA.push(e);
140
+ });
141
+ makeBroker('svc').subscribe(topic, (e) => {
142
+ seenB.push(e);
143
+ });
144
+ await waitForConsumerGroup(redis.client, { stream: streamOf(topic), group: 'svc' });
145
+ const envelope = makeEnvelope(topic);
146
+ await brokers[0].publish(envelope);
147
+ await vi.waitFor(() => expect(seenA.length + seenB.length).toBe(1));
148
+ // Give the other instance a beat to (wrongly) double-deliver - it must not.
149
+ await new Promise((resolve) => setTimeout(resolve, 150));
150
+ expect(seenA.length + seenB.length).toBe(1);
263
151
  });
264
- it('defaults the group to $ - a backlog published before it existed is not replayed', async () => {
265
- const fake = fakeStreamsClient();
266
- const broker = new RedisStreamsBroker(fake.client, { serviceName: 'svc' });
267
- const before = makeEnvelope('wallet.deposit.completed', { eventId: 'before' });
268
- await broker.publish(before);
269
- const handler = vi.fn();
270
- broker.subscribe('wallet.deposit.completed', handler);
271
- await awaitGroup(fake, 'wallet.deposit.completed', 'svc');
272
- const after = makeEnvelope('wallet.deposit.completed', { eventId: 'after' });
273
- await broker.publish(after);
152
+ it('two instances with different service names both handle the event', async () => {
153
+ const topic = uniqueTopic();
154
+ const seenA = [];
155
+ const seenB = [];
156
+ makeBroker('svc-a').subscribe(topic, (e) => {
157
+ seenA.push(e);
158
+ });
159
+ makeBroker('svc-b').subscribe(topic, (e) => {
160
+ seenB.push(e);
161
+ });
162
+ await waitForConsumerGroup(redis.client, { stream: streamOf(topic), group: 'svc-a' });
163
+ await waitForConsumerGroup(redis.client, { stream: streamOf(topic), group: 'svc-b' });
164
+ const envelope = makeEnvelope(topic);
165
+ await brokers[0].publish(envelope);
274
166
  await vi.waitFor(() => {
275
- expect(handler).toHaveBeenCalledWith(after);
167
+ expect(seenA).toEqual([envelope]);
168
+ expect(seenB).toEqual([envelope]);
276
169
  });
277
- expect(handler).toHaveBeenCalledTimes(1);
278
- expect(handler).not.toHaveBeenCalledWith(before);
279
- await broker.close();
280
- });
281
- it("startId '0' replays the retained backlog into a group created after the fact", async () => {
282
- const fake = fakeStreamsClient();
283
- const broker = new RedisStreamsBroker(fake.client, { serviceName: 'svc', startId: '0' });
284
- const before = makeEnvelope('wallet.deposit.completed', { eventId: 'before' });
285
- await broker.publish(before);
286
- const seen = deferred();
287
- broker.subscribe('wallet.deposit.completed', (env) => seen.resolve(env));
288
- expect(await seen.promise).toEqual(before);
289
- expect(fake.duplicates[0]?.xGroupCreate).toHaveBeenCalledWith(`${STREAM_PREFIX}wallet.deposit.completed`, 'svc', '0', { MKSTREAM: true });
290
- await broker.close();
291
170
  });
292
171
  });
293
172
  //# sourceMappingURL=redis-streams-broker.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"redis-streams-broker.test.js","sourceRoot":"","sources":["../../../../src/server/kernel/__tests__/redis-streams-broker.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"redis-streams-broker.test.js","sourceRoot":"","sources":["../../../../src/server/kernel/__tests__/redis-streams-broker.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=request-context.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-context.test.d.ts","sourceRoot":"","sources":["../../../../src/server/kernel/__tests__/request-context.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,64 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { withRequestContext, getCurrentRequestContext, getCurrentTraceId, getCurrentClientMeta, } from '../request-context.js';
3
+ const CLIENT_META = { ip: '203.0.113.7', userAgent: 'curl/8.4.0' };
4
+ const CONTEXT = { userId: 'user-1', traceId: 'trace-1', clientMeta: CLIENT_META };
5
+ describe('request context outside a request', () => {
6
+ it('has no context', () => {
7
+ expect(getCurrentRequestContext()).toBeUndefined();
8
+ });
9
+ it('has no trace id', () => {
10
+ expect(getCurrentTraceId()).toBeUndefined();
11
+ });
12
+ it('reports empty client meta rather than throwing on a background path', () => {
13
+ expect(getCurrentClientMeta()).toEqual({ ip: null, userAgent: null });
14
+ });
15
+ });
16
+ describe('withRequestContext', () => {
17
+ it('exposes the context to everything it wraps', () => {
18
+ withRequestContext(CONTEXT, () => {
19
+ expect(getCurrentRequestContext()).toEqual(CONTEXT);
20
+ expect(getCurrentTraceId()).toBe('trace-1');
21
+ expect(getCurrentClientMeta()).toEqual(CLIENT_META);
22
+ });
23
+ });
24
+ it('returns whatever the wrapped function returns', () => {
25
+ expect(withRequestContext(CONTEXT, () => 'result')).toBe('result');
26
+ });
27
+ it('tears the context down once the call finishes', () => {
28
+ withRequestContext(CONTEXT, () => getCurrentTraceId());
29
+ expect(getCurrentRequestContext()).toBeUndefined();
30
+ });
31
+ it('tears the context down even when the wrapped function throws', () => {
32
+ expect(() => withRequestContext(CONTEXT, () => {
33
+ throw new Error('boom');
34
+ })).toThrow('boom');
35
+ expect(getCurrentRequestContext()).toBeUndefined();
36
+ });
37
+ it('survives an await boundary inside the request', async () => {
38
+ await withRequestContext(CONTEXT, async () => {
39
+ await Promise.resolve();
40
+ expect(getCurrentTraceId()).toBe('trace-1');
41
+ });
42
+ });
43
+ it('keeps concurrent requests from seeing each other traces', async () => {
44
+ const traceAfterDelay = (traceId) => withRequestContext({ traceId }, async () => {
45
+ await new Promise((resolve) => setTimeout(resolve, 5));
46
+ return getCurrentTraceId();
47
+ });
48
+ expect(await Promise.all([traceAfterDelay('a'), traceAfterDelay('b')])).toEqual(['a', 'b']);
49
+ });
50
+ it('lets an inner request shadow the outer one and restores it after', () => {
51
+ withRequestContext(CONTEXT, () => {
52
+ withRequestContext({ traceId: 'inner' }, () => {
53
+ expect(getCurrentTraceId()).toBe('inner');
54
+ });
55
+ expect(getCurrentTraceId()).toBe('trace-1');
56
+ });
57
+ });
58
+ it('falls back to empty client meta when the request carries none', () => {
59
+ withRequestContext({ traceId: 'trace-2' }, () => {
60
+ expect(getCurrentClientMeta()).toEqual({ ip: null, userAgent: null });
61
+ });
62
+ });
63
+ });
64
+ //# sourceMappingURL=request-context.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-context.test.js","sourceRoot":"","sources":["../../../../src/server/kernel/__tests__/request-context.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=router-utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router-utils.test.d.ts","sourceRoot":"","sources":["../../../../src/server/kernel/__tests__/router-utils.test.ts"],"names":[],"mappings":""}