@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,83 +0,0 @@
1
- import { describe, it, expect, vi } from 'vitest';
2
- import { InProcessRateLimiter } from '../rate-limiter.js';
3
- const OPTS = { limit: 3, windowMs: 1000 };
4
- describe('InProcessRateLimiter', () => {
5
- it('allows calls up to the limit', async () => {
6
- const limiter = new InProcessRateLimiter();
7
- for (let i = 0; i < 3; i++) {
8
- await expect(limiter.consume('k', OPTS)).resolves.toEqual({ allowed: true, retryAfterMs: 0 });
9
- }
10
- limiter.close();
11
- });
12
- it('denies the call past the limit and reports the wait until the window resets', async () => {
13
- vi.useFakeTimers();
14
- const limiter = new InProcessRateLimiter();
15
- for (let i = 0; i < 3; i++) {
16
- await limiter.consume('k', OPTS);
17
- }
18
- vi.advanceTimersByTime(400);
19
- await expect(limiter.consume('k', OPTS)).resolves.toEqual({
20
- allowed: false,
21
- retryAfterMs: 600,
22
- });
23
- limiter.close();
24
- vi.useRealTimers();
25
- });
26
- it('a denied call does not extend the window', async () => {
27
- vi.useFakeTimers();
28
- const limiter = new InProcessRateLimiter();
29
- for (let i = 0; i < 3; i++) {
30
- await limiter.consume('k', OPTS);
31
- }
32
- vi.advanceTimersByTime(500);
33
- await limiter.consume('k', OPTS);
34
- vi.advanceTimersByTime(500);
35
- await expect(limiter.consume('k', OPTS)).resolves.toMatchObject({ allowed: true });
36
- limiter.close();
37
- vi.useRealTimers();
38
- });
39
- it('rolls over into a fresh window once the current one elapses', async () => {
40
- vi.useFakeTimers();
41
- const limiter = new InProcessRateLimiter();
42
- for (let i = 0; i < 3; i++) {
43
- await limiter.consume('k', OPTS);
44
- }
45
- await expect(limiter.consume('k', OPTS)).resolves.toMatchObject({ allowed: false });
46
- vi.advanceTimersByTime(1000);
47
- await expect(limiter.consume('k', OPTS)).resolves.toEqual({ allowed: true, retryAfterMs: 0 });
48
- limiter.close();
49
- vi.useRealTimers();
50
- });
51
- it('keys are isolated - exhausting one leaves another untouched', async () => {
52
- const limiter = new InProcessRateLimiter();
53
- for (let i = 0; i < 3; i++) {
54
- await limiter.consume('a', OPTS);
55
- }
56
- await expect(limiter.consume('a', OPTS)).resolves.toMatchObject({ allowed: false });
57
- await expect(limiter.consume('b', OPTS)).resolves.toMatchObject({ allowed: true });
58
- limiter.close();
59
- });
60
- it('reset clears a key back to a full allowance', async () => {
61
- const limiter = new InProcessRateLimiter();
62
- for (let i = 0; i < 3; i++) {
63
- await limiter.consume('k', OPTS);
64
- }
65
- await expect(limiter.consume('k', OPTS)).resolves.toMatchObject({ allowed: false });
66
- await limiter.reset('k');
67
- await expect(limiter.consume('k', OPTS)).resolves.toEqual({ allowed: true, retryAfterMs: 0 });
68
- limiter.close();
69
- });
70
- it('the sweep drops elapsed windows that are never consumed again', async () => {
71
- vi.useFakeTimers();
72
- const limiter = new InProcessRateLimiter();
73
- for (let i = 0; i < 3; i++) {
74
- await limiter.consume('k', OPTS);
75
- }
76
- // Past the window and the 60s sweep interval, without touching the key.
77
- await vi.advanceTimersByTimeAsync(60_000);
78
- await expect(limiter.consume('k', OPTS)).resolves.toEqual({ allowed: true, retryAfterMs: 0 });
79
- limiter.close();
80
- vi.useRealTimers();
81
- });
82
- });
83
- //# sourceMappingURL=rate-limiter.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rate-limiter.test.js","sourceRoot":"","sources":["../../../../src/testing/fakes/__tests__/rate-limiter.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAE1C,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QAChG,CAAC;QACD,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC;YACxD,OAAO,EAAE,KAAK;YACd,YAAY,EAAE,GAAG;SAClB,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACjC,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACnF,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACpF,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9F,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACpF,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACnF,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACpF,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9F,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,wEAAwE;QACxE,MAAM,EAAE,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9F,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=realtime-authorizer.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"realtime-authorizer.test.d.ts","sourceRoot":"","sources":["../../../../src/testing/fakes/__tests__/realtime-authorizer.test.ts"],"names":[],"mappings":""}
@@ -1,19 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { SseClientAuthorizer } from '../realtime-authorizer.js';
3
- describe('SseClientAuthorizer', () => {
4
- it('issues an SSE grant with the default stream path and the granted channels', () => {
5
- const auth = new SseClientAuthorizer();
6
- const grant = auth.issueGrant({ userId: 'u1', clientId: 'u1', channels: ['chat:global'] });
7
- expect(grant).toEqual({
8
- provider: 'sse',
9
- streamPath: '/chat/stream',
10
- channels: ['chat:global'],
11
- });
12
- });
13
- it('honors a custom stream path', () => {
14
- const auth = new SseClientAuthorizer({ streamPath: '/live' });
15
- const grant = auth.issueGrant({ userId: 'u1', clientId: 'c9', channels: [] });
16
- expect(grant).toMatchObject({ provider: 'sse', streamPath: '/live' });
17
- });
18
- });
19
- //# sourceMappingURL=realtime-authorizer.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"realtime-authorizer.test.js","sourceRoot":"","sources":["../../../../src/testing/fakes/__tests__/realtime-authorizer.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,IAAI,GAAG,IAAI,mBAAmB,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC3F,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;YACpB,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,cAAc;YAC1B,QAAQ,EAAE,CAAC,aAAa,CAAC;SAC1B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,IAAI,GAAG,IAAI,mBAAmB,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"realtime-transport.test.d.ts","sourceRoot":"","sources":["../../../../src/testing/fakes/__tests__/realtime-transport.test.ts"],"names":[],"mappings":""}
@@ -1,14 +0,0 @@
1
- import type { CacheAdapter } from '@openora/core/contracts';
2
- export declare class InProcessCache implements CacheAdapter {
3
- private readonly entries;
4
- private readonly sweeper;
5
- constructor();
6
- get<T>(key: string): Promise<T | undefined>;
7
- set<T>(key: string, value: T, opts: {
8
- ttlMs: number;
9
- }): Promise<void>;
10
- delete(key: string | string[]): Promise<void>;
11
- private sweep;
12
- close(): void;
13
- }
14
- //# sourceMappingURL=cache.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/testing/fakes/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAa5D,qBAAa,cAAe,YAAW,YAAY;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;;IAOzD,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAY3C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7C,OAAO,CAAC,KAAK;IASb,KAAK,IAAI,IAAI;CAId"}
@@ -1,56 +0,0 @@
1
- const SWEEP_INTERVAL_MS = 60_000;
2
- // ponytail: hard cap bounds memory against unbounded key growth (eg per-slug churn);
3
- // eviction is oldest-insert (Map iteration order), not LRU - swap for an LRU if
4
- // hit-rate under heavy key churn ever matters.
5
- const MAX_ENTRIES = 5_000;
6
- // Zero-dependency test-only double for `CACHE` (production auto-binds RedisCache on
7
- // REDIS_URL - see `assertDurableSeamsBound`). Expiry is lazy (checked on access) plus
8
- // an unref'd sweep so keys never revisited don't accumulate.
9
- export class InProcessCache {
10
- entries = new Map();
11
- sweeper;
12
- constructor() {
13
- this.sweeper = setInterval(() => this.sweep(), SWEEP_INTERVAL_MS);
14
- this.sweeper.unref?.();
15
- }
16
- get(key) {
17
- const entry = this.entries.get(key);
18
- if (!entry) {
19
- return Promise.resolve(undefined);
20
- }
21
- if (Date.now() >= entry.expiresAt) {
22
- this.entries.delete(key);
23
- return Promise.resolve(undefined);
24
- }
25
- return Promise.resolve(entry.value);
26
- }
27
- set(key, value, opts) {
28
- if (!this.entries.has(key) && this.entries.size >= MAX_ENTRIES) {
29
- const oldestKey = this.entries.keys().next().value;
30
- if (oldestKey !== undefined) {
31
- this.entries.delete(oldestKey);
32
- }
33
- }
34
- this.entries.set(key, { value, expiresAt: Date.now() + opts.ttlMs });
35
- return Promise.resolve();
36
- }
37
- delete(key) {
38
- for (const k of Array.isArray(key) ? key : [key]) {
39
- this.entries.delete(k);
40
- }
41
- return Promise.resolve();
42
- }
43
- sweep() {
44
- const now = Date.now();
45
- for (const [key, entry] of this.entries) {
46
- if (now >= entry.expiresAt) {
47
- this.entries.delete(key);
48
- }
49
- }
50
- }
51
- close() {
52
- clearInterval(this.sweeper);
53
- this.entries.clear();
54
- }
55
- }
56
- //# sourceMappingURL=cache.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/testing/fakes/cache.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACjC,qFAAqF;AACrF,gFAAgF;AAChF,+CAA+C;AAC/C,MAAM,WAAW,GAAG,KAAK,CAAC;AAI1B,oFAAoF;AACpF,sFAAsF;AACtF,6DAA6D;AAC7D,MAAM,OAAO,cAAc;IACR,OAAO,GAAG,IAAI,GAAG,EAAiB,CAAC;IACnC,OAAO,CAAiC;IAEzD;QACE,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,iBAAiB,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IACzB,CAAC;IAED,GAAG,CAAI,GAAW;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAU,CAAC,CAAC;IAC3C,CAAC;IAED,GAAG,CAAI,GAAW,EAAE,KAAQ,EAAE,IAAuB;QACnD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YACnD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACrE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,CAAC,GAAsB;QAC3B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAEO,KAAK;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxC,IAAI,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBAC3B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK;QACH,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
@@ -1,17 +0,0 @@
1
- import type { MessageBrokerAdapter, EventEnvelope, SubscribeOptions } from '@openora/core/contracts';
2
- /**
3
- * Test-only `MESSAGE_BROKER` double - `publish` fans out synchronously to
4
- * whatever's subscribed in THIS process only; it does not survive a restart
5
- * and does not reach other replicas. Production requires a durable
6
- * `MessageBrokerAdapter` overlay instead (`createApp` throws otherwise -
7
- * `assertDurableSeamsBound`). `subscribe`'s returned unsubscribe function is
8
- * safe to call mid-dispatch: the handler list is copied on write, never
9
- * mutated in place.
10
- */
11
- export declare class InMemoryBroker implements MessageBrokerAdapter {
12
- private readonly handlers;
13
- publish(envelope: EventEnvelope): void;
14
- subscribe(topic: string, handler: (env: EventEnvelope) => void | Promise<void>, _options?: SubscribeOptions): () => void;
15
- close(): Promise<void>;
16
- }
17
- //# sourceMappingURL=event-bus.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../../src/testing/fakes/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,gBAAgB,EACjB,MAAM,yBAAyB,CAAC;AAEjC;;;;;;;;GAQG;AACH,qBAAa,cAAe,YAAW,oBAAoB;IACzD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAGrB;IAEJ,OAAO,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAMtC,SAAS,CACP,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EACrD,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,MAAM,IAAI;IAaP,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -1,30 +0,0 @@
1
- /**
2
- * Test-only `MESSAGE_BROKER` double - `publish` fans out synchronously to
3
- * whatever's subscribed in THIS process only; it does not survive a restart
4
- * and does not reach other replicas. Production requires a durable
5
- * `MessageBrokerAdapter` overlay instead (`createApp` throws otherwise -
6
- * `assertDurableSeamsBound`). `subscribe`'s returned unsubscribe function is
7
- * safe to call mid-dispatch: the handler list is copied on write, never
8
- * mutated in place.
9
- */
10
- export class InMemoryBroker {
11
- handlers = new Map();
12
- publish(envelope) {
13
- for (const fn of this.handlers.get(envelope.topic) ?? []) {
14
- void fn(envelope);
15
- }
16
- }
17
- subscribe(topic, handler, _options) {
18
- const fns = this.handlers.get(topic) ?? [];
19
- const updated = [...fns, handler];
20
- this.handlers.set(topic, updated);
21
- return () => {
22
- const current = this.handlers.get(topic) ?? [];
23
- this.handlers.set(topic, current.filter((f) => f !== handler));
24
- };
25
- }
26
- async close() {
27
- this.handlers.clear();
28
- }
29
- }
30
- //# sourceMappingURL=event-bus.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../../src/testing/fakes/event-bus.ts"],"names":[],"mappings":"AAMA;;;;;;;;GAQG;AACH,MAAM,OAAO,cAAc;IACR,QAAQ,GAAG,IAAI,GAAG,EAGhC,CAAC;IAEJ,OAAO,CAAC,QAAuB;QAC7B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACzD,KAAK,EAAE,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED,SAAS,CACP,KAAa,EACb,OAAqD,EACrD,QAA2B;QAE3B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE;YACV,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC/C,IAAI,CAAC,QAAQ,CAAC,GAAG,CACf,KAAK,EACL,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,CACrC,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;CACF"}
@@ -1,40 +0,0 @@
1
- import type { Logger } from 'pino';
2
- import type { JobQueueAdapter, QueueName, EnqueueOptions, RepeatOptions, WorkerRegistration } from '@openora/core/contracts';
3
- /**
4
- * Test-only `JOB_QUEUE` double - process-local, non-durable (jobs are lost on
5
- * restart). `idempotencyKey` dedupes concurrent enqueues to a single job id;
6
- * `orderingKey` serializes execution into a per-key lane so jobs with the same
7
- * key never run concurrently or out of order (a lane failure is swallowed so
8
- * it can't poison later jobs on the same key). Retries run in-process with the
9
- * configured backoff; once `attempts` is exhausted the job goes to
10
- * `onDeadLetter` instead of throwing. `cron` repeat schedules are not
11
- * supported here (warns and is ignored) - only `everyMs` interval schedules
12
- * work; the BullMQ driver is the production analogue for real cron. `close()`
13
- * awaits every in-flight job and lane before resolving.
14
- */
15
- export declare class InProcessJobQueue implements JobQueueAdapter {
16
- private readonly logger;
17
- private readonly workers;
18
- private readonly pending;
19
- private readonly lanes;
20
- private readonly activeKeys;
21
- private readonly inFlight;
22
- private readonly timers;
23
- private readonly schedules;
24
- private counter;
25
- private closed;
26
- constructor(logger: Logger);
27
- enqueue<T>(queue: QueueName, payload: T, opts?: EnqueueOptions): Promise<{
28
- id: string;
29
- }>;
30
- registerWorker<T>(registration: WorkerRegistration<T>): void;
31
- schedule<T>(queue: QueueName, scheduleId: string, payload: T, repeat: RepeatOptions): Promise<void>;
32
- unschedule(queue: QueueName, scheduleId: string): Promise<void>;
33
- close(): Promise<void>;
34
- private dispatch;
35
- private track;
36
- private runJob;
37
- private deadLetter;
38
- private releaseKey;
39
- }
40
- //# sourceMappingURL=job-queue.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"job-queue.d.ts","sourceRoot":"","sources":["../../../src/testing/fakes/job-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EACT,cAAc,EACd,aAAa,EAEb,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AA6BjC;;;;;;;;;;;GAWG;AACH,qBAAa,iBAAkB,YAAW,eAAe;IAc3C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAbnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IAExD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;IAE1D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IAExD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4C;IACnE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqD;IAC/E,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,MAAM,CAAS;gBAEM,MAAM,EAAE,MAAM;IAE3C,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAiC5F,cAAc,CAAC,CAAC,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI;IAW5D,QAAQ,CAAC,CAAC,EACR,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,CAAC,EACV,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC;IA2BhB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B,OAAO,CAAC,QAAQ;IA8BhB,OAAO,CAAC,KAAK;YAKC,MAAM;YA+BN,UAAU;IAqBxB,OAAO,CAAC,UAAU;CAKnB"}
@@ -1,200 +0,0 @@
1
- function computeBackoffMs(opts, attempt) {
2
- const backoff = opts.backoff;
3
- if (!backoff) {
4
- return 0;
5
- }
6
- if (backoff.type === 'fixed') {
7
- return backoff.delayMs;
8
- }
9
- return backoff.delayMs * 2 ** (attempt - 1);
10
- }
11
- const sleep = (ms) => ms <= 0 ? Promise.resolve() : new Promise((r) => setTimeout(r, ms));
12
- /**
13
- * Test-only `JOB_QUEUE` double - process-local, non-durable (jobs are lost on
14
- * restart). `idempotencyKey` dedupes concurrent enqueues to a single job id;
15
- * `orderingKey` serializes execution into a per-key lane so jobs with the same
16
- * key never run concurrently or out of order (a lane failure is swallowed so
17
- * it can't poison later jobs on the same key). Retries run in-process with the
18
- * configured backoff; once `attempts` is exhausted the job goes to
19
- * `onDeadLetter` instead of throwing. `cron` repeat schedules are not
20
- * supported here (warns and is ignored) - only `everyMs` interval schedules
21
- * work; the BullMQ driver is the production analogue for real cron. `close()`
22
- * awaits every in-flight job and lane before resolving.
23
- */
24
- export class InProcessJobQueue {
25
- logger;
26
- workers = new Map();
27
- // Buffered until registerWorker fires (registration happens at boot, after providers).
28
- pending = new Map();
29
- lanes = new Map();
30
- // job id per idempotency key - dedupes duplicate enqueues.
31
- activeKeys = new Map();
32
- // Awaited on close() for a clean drain.
33
- inFlight = new Set();
34
- timers = new Set();
35
- schedules = new Map();
36
- counter = 0;
37
- closed = false;
38
- constructor(logger) {
39
- this.logger = logger;
40
- }
41
- enqueue(queue, payload, opts = {}) {
42
- if (this.closed) {
43
- throw new Error('[job-queue] enqueue after close()');
44
- }
45
- if (opts.idempotencyKey) {
46
- const existing = this.activeKeys.get(opts.idempotencyKey);
47
- if (existing) {
48
- return Promise.resolve({ id: existing });
49
- }
50
- }
51
- const id = `job-${++this.counter}`;
52
- if (opts.idempotencyKey) {
53
- this.activeKeys.set(opts.idempotencyKey, id);
54
- }
55
- const job = { id, queue, payload, opts, enqueuedAt: new Date() };
56
- if (opts.delayMs && opts.delayMs > 0) {
57
- const t = setTimeout(() => {
58
- this.timers.delete(t);
59
- this.dispatch(job);
60
- }, opts.delayMs);
61
- t.unref?.();
62
- this.timers.add(t);
63
- }
64
- else {
65
- queueMicrotask(() => this.dispatch(job));
66
- }
67
- return Promise.resolve({ id });
68
- }
69
- registerWorker(registration) {
70
- this.workers.set(registration.queue, registration);
71
- const buffered = this.pending.get(registration.queue);
72
- if (buffered) {
73
- this.pending.delete(registration.queue);
74
- for (const job of buffered) {
75
- this.dispatch(job);
76
- }
77
- }
78
- }
79
- schedule(queue, scheduleId, payload, repeat) {
80
- if (this.closed) {
81
- throw new Error('[job-queue] schedule after close()');
82
- }
83
- const key = `${queue}:${scheduleId}`;
84
- const existing = this.schedules.get(key);
85
- if (existing) {
86
- clearInterval(existing);
87
- }
88
- if (repeat.everyMs && repeat.everyMs > 0) {
89
- const interval = setInterval(() => {
90
- void this.enqueue(queue, payload);
91
- }, repeat.everyMs);
92
- interval.unref?.();
93
- this.schedules.set(key, interval);
94
- }
95
- else if (repeat.cron) {
96
- // Cron not supported in-process; a durable driver (BullMQ) provides real cron.
97
- // Warn so a misconfigured dev environment is loud, not silently broken.
98
- this.logger.warn({ queue, scheduleId, cron: repeat.cron }, '[job-queue] cron schedules require a durable driver (BullMQ overlay); ignored in-process');
99
- }
100
- return Promise.resolve();
101
- }
102
- unschedule(queue, scheduleId) {
103
- const key = `${queue}:${scheduleId}`;
104
- const interval = this.schedules.get(key);
105
- if (interval) {
106
- clearInterval(interval);
107
- this.schedules.delete(key);
108
- }
109
- return Promise.resolve();
110
- }
111
- async close() {
112
- this.closed = true;
113
- for (const t of this.timers) {
114
- clearTimeout(t);
115
- }
116
- this.timers.clear();
117
- for (const interval of this.schedules.values()) {
118
- clearInterval(interval);
119
- }
120
- this.schedules.clear();
121
- await Promise.allSettled([...this.inFlight, ...this.lanes.values()]);
122
- }
123
- dispatch(job) {
124
- const worker = this.workers.get(job.queue);
125
- if (!worker) {
126
- const buf = this.pending.get(job.queue) ?? [];
127
- buf.push(job);
128
- this.pending.set(job.queue, buf);
129
- return;
130
- }
131
- const orderingKey = job.opts.orderingKey;
132
- if (orderingKey) {
133
- const laneKey = `${job.queue}:${orderingKey}`;
134
- const prev = this.lanes.get(laneKey) ?? Promise.resolve();
135
- const next = prev.then(() => this.runJob(worker, job));
136
- // Swallow so one lane failure doesn't poison subsequent jobs on the same key.
137
- const settled = next.then(() => undefined, () => undefined);
138
- this.lanes.set(laneKey, settled);
139
- void settled.finally(() => {
140
- if (this.lanes.get(laneKey) === settled) {
141
- this.lanes.delete(laneKey);
142
- }
143
- });
144
- }
145
- else {
146
- this.track(this.runJob(worker, job));
147
- }
148
- }
149
- track(p) {
150
- this.inFlight.add(p);
151
- void p.finally(() => this.inFlight.delete(p));
152
- }
153
- async runJob(worker, job) {
154
- const attempts = Math.max(1, job.opts.attempts ?? 1);
155
- let lastError;
156
- for (let attempt = 1; attempt <= attempts; attempt++) {
157
- const ctx = {
158
- id: job.id,
159
- name: job.queue,
160
- payload: job.payload,
161
- attempt,
162
- enqueuedAt: job.enqueuedAt,
163
- meta: { ...job.opts.meta, idempotencyKey: job.opts.idempotencyKey },
164
- };
165
- try {
166
- ctx.payload = worker.schema.parse(job.payload);
167
- await worker.handler(ctx);
168
- this.releaseKey(job);
169
- return;
170
- }
171
- catch (err) {
172
- lastError = err instanceof Error ? err : new Error(String(err));
173
- if (attempt < attempts) {
174
- await sleep(computeBackoffMs(job.opts, attempt));
175
- continue;
176
- }
177
- await this.deadLetter(worker, ctx, lastError);
178
- this.releaseKey(job);
179
- return;
180
- }
181
- }
182
- }
183
- async deadLetter(worker, ctx, error) {
184
- this.logger.error({ queue: ctx.name, jobId: ctx.id, attempt: ctx.attempt, err: error }, '[job-queue] job exhausted retries -> dead-letter');
185
- if (worker.onDeadLetter) {
186
- try {
187
- await worker.onDeadLetter(ctx, error);
188
- }
189
- catch (hookErr) {
190
- this.logger.error({ queue: ctx.name, jobId: ctx.id, err: hookErr }, '[job-queue] onDeadLetter hook threw');
191
- }
192
- }
193
- }
194
- releaseKey(job) {
195
- if (job.opts.idempotencyKey && this.activeKeys.get(job.opts.idempotencyKey) === job.id) {
196
- this.activeKeys.delete(job.opts.idempotencyKey);
197
- }
198
- }
199
- }
200
- //# sourceMappingURL=job-queue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"job-queue.js","sourceRoot":"","sources":["../../../src/testing/fakes/job-queue.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- import type { RateLimiterAdapter, RateLimitOptions, RateLimitResult } from '@openora/core/contracts';
2
- export declare class InProcessRateLimiter implements RateLimiterAdapter {
3
- private readonly windows;
4
- private readonly sweeper;
5
- constructor();
6
- consume(key: string, opts: RateLimitOptions): Promise<RateLimitResult>;
7
- reset(key: string): Promise<void>;
8
- private sweep;
9
- close(): void;
10
- }
11
- //# sourceMappingURL=rate-limiter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../../src/testing/fakes/rate-limiter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EAChB,MAAM,yBAAyB,CAAC;AAgBjC,qBAAa,oBAAqB,YAAW,kBAAkB;IAC7D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;;IAOzD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAiBtE,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjC,OAAO,CAAC,KAAK;IASb,KAAK,IAAI,IAAI;CAId"}
@@ -1,39 +0,0 @@
1
- const SWEEP_INTERVAL_MS = 60_000;
2
- export class InProcessRateLimiter {
3
- windows = new Map();
4
- sweeper;
5
- constructor() {
6
- this.sweeper = setInterval(() => this.sweep(), SWEEP_INTERVAL_MS);
7
- this.sweeper.unref?.();
8
- }
9
- consume(key, opts) {
10
- const now = Date.now();
11
- const existing = this.windows.get(key);
12
- if (!existing || now >= existing.resetAt) {
13
- this.windows.set(key, { count: 1, resetAt: now + opts.windowMs });
14
- return Promise.resolve({ allowed: true, retryAfterMs: 0 });
15
- }
16
- if (existing.count < opts.limit) {
17
- existing.count += 1;
18
- return Promise.resolve({ allowed: true, retryAfterMs: 0 });
19
- }
20
- return Promise.resolve({ allowed: false, retryAfterMs: existing.resetAt - now });
21
- }
22
- reset(key) {
23
- this.windows.delete(key);
24
- return Promise.resolve();
25
- }
26
- sweep() {
27
- const now = Date.now();
28
- for (const [key, window] of this.windows) {
29
- if (now >= window.resetAt) {
30
- this.windows.delete(key);
31
- }
32
- }
33
- }
34
- close() {
35
- clearInterval(this.sweeper);
36
- this.windows.clear();
37
- }
38
- }
39
- //# sourceMappingURL=rate-limiter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../../src/testing/fakes/rate-limiter.ts"],"names":[],"mappings":"AAkBA,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAEjC,MAAM,OAAO,oBAAoB;IACd,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;IACpC,OAAO,CAAiC;IAEzD;QACE,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,iBAAiB,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IACzB,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,IAAsB;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEvC,IAAI,CAAC,QAAQ,IAAI,GAAG,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACzC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAClE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,IAAI,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAChC,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC;YACpB,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,GAAW;QACf,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAEO,KAAK;QACX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACzC,IAAI,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC1B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK;QACH,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
@@ -1,10 +0,0 @@
1
- import type { RealtimeClientAuthorizer, RealtimeClientAuthorizerInput, RealtimeConnectionGrant } from '@openora/core/contracts';
2
- export type SseClientAuthorizerOptions = {
3
- streamPath?: string;
4
- };
5
- export declare class SseClientAuthorizer implements RealtimeClientAuthorizer {
6
- private readonly streamPath;
7
- constructor(options?: SseClientAuthorizerOptions);
8
- issueGrant(input: RealtimeClientAuthorizerInput): RealtimeConnectionGrant;
9
- }
10
- //# sourceMappingURL=realtime-authorizer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"realtime-authorizer.d.ts","sourceRoot":"","sources":["../../../src/testing/fakes/realtime-authorizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,wBAAwB,EACxB,6BAA6B,EAC7B,uBAAuB,EACxB,MAAM,yBAAyB,CAAC;AAOjC,MAAM,MAAM,0BAA0B,GAAG;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,qBAAa,mBAAoB,YAAW,wBAAwB;IAClE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,OAAO,GAAE,0BAA+B;IAIpD,UAAU,CAAC,KAAK,EAAE,6BAA6B,GAAG,uBAAuB;CAG1E"}
@@ -1,10 +0,0 @@
1
- export class SseClientAuthorizer {
2
- streamPath;
3
- constructor(options = {}) {
4
- this.streamPath = options.streamPath ?? '/chat/stream';
5
- }
6
- issueGrant(input) {
7
- return { provider: 'sse', streamPath: this.streamPath, channels: input.channels };
8
- }
9
- }
10
- //# sourceMappingURL=realtime-authorizer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"realtime-authorizer.js","sourceRoot":"","sources":["../../../src/testing/fakes/realtime-authorizer.ts"],"names":[],"mappings":"AAeA,MAAM,OAAO,mBAAmB;IACb,UAAU,CAAS;IAEpC,YAAY,UAAsC,EAAE;QAClD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,cAAc,CAAC;IACzD,CAAC;IAED,UAAU,CAAC,KAAoC;QAC7C,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;IACpF,CAAC;CACF"}
@@ -1,2 +0,0 @@
1
- export { InProcessRealtimeTransport } from '@openora/core/server';
2
- //# sourceMappingURL=realtime-transport.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"realtime-transport.d.ts","sourceRoot":"","sources":["../../../src/testing/fakes/realtime-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC"}
@@ -1,2 +0,0 @@
1
- export { InProcessRealtimeTransport } from '@openora/core/server';
2
- //# sourceMappingURL=realtime-transport.js.map