@openora/core 0.4.0 → 0.4.1-canary.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE-COMMERCIAL.md +2 -2
- package/README.md +8 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/admin-console/__tests__/backoffice.service.test.js +1 -1
- package/dist/admin-console/__tests__/backoffice.service.test.js.map +1 -1
- package/dist/admin-console/contract/index.d.ts +14 -14
- package/dist/admin-console/contract/index.d.ts.map +1 -1
- package/dist/admin-console/contract/index.js +8 -8
- package/dist/admin-console/contract/index.js.map +1 -1
- package/dist/admin-console/router/index.d.ts +7 -7
- package/dist/admin-console/service/backoffice.service.d.ts +22 -49
- package/dist/admin-console/service/backoffice.service.d.ts.map +1 -1
- package/dist/admin-console/service/backoffice.service.js +16 -31
- package/dist/admin-console/service/backoffice.service.js.map +1 -1
- package/dist/audit/__tests__/audit.service.test.js +29 -2
- package/dist/audit/__tests__/audit.service.test.js.map +1 -1
- package/dist/audit/contract/index.d.ts.map +1 -1
- package/dist/audit/contract/index.js +2 -0
- package/dist/audit/contract/index.js.map +1 -1
- package/dist/audit/plugin.d.ts.map +1 -1
- package/dist/audit/plugin.js +54 -4
- package/dist/audit/plugin.js.map +1 -1
- package/dist/audit/service/audit.service.d.ts +1 -0
- package/dist/audit/service/audit.service.d.ts.map +1 -1
- package/dist/audit/service/audit.service.js +53 -25
- package/dist/audit/service/audit.service.js.map +1 -1
- package/dist/casino/gaming/contract/index.d.ts.map +1 -1
- package/dist/casino/gaming/contract/index.js +3 -3
- package/dist/casino/gaming/contract/index.js.map +1 -1
- package/dist/casino/gaming/drizzle/migrations/0001_easy_ben_grimm.sql +4 -0
- package/dist/casino/gaming/drizzle/migrations/meta/0001_snapshot.json +188 -0
- package/dist/casino/gaming/drizzle/migrations/meta/_journal.json +7 -0
- package/dist/casino/gaming/schema/index.js +2 -2
- package/dist/casino/gaming/schema/index.js.map +1 -1
- package/dist/casino/gaming/service/gaming.service.d.ts +11 -11
- package/dist/casino/gaming/service/gaming.service.d.ts.map +1 -1
- package/dist/casino/gaming/service/gaming.service.js +4 -14
- package/dist/casino/gaming/service/gaming.service.js.map +1 -1
- package/dist/cms/__tests__/cms.cache.test.js +1 -1
- package/dist/cms/__tests__/cms.cache.test.js.map +1 -1
- package/dist/cms/__tests__/cms.router.test.d.ts +2 -0
- package/dist/cms/__tests__/cms.router.test.d.ts.map +1 -0
- package/dist/cms/__tests__/cms.router.test.js +51 -0
- package/dist/cms/__tests__/cms.router.test.js.map +1 -0
- package/dist/cms/router/index.d.ts.map +1 -1
- package/dist/cms/router/index.js +12 -12
- package/dist/cms/router/index.js.map +1 -1
- package/dist/cms/service/cms.service.d.ts +7 -7
- package/dist/cms/service/cms.service.d.ts.map +1 -1
- package/dist/cms/service/cms.service.js +39 -23
- package/dist/cms/service/cms.service.js.map +1 -1
- package/dist/compliance/__tests__/compliance.service.test.js +2 -1
- package/dist/compliance/__tests__/compliance.service.test.js.map +1 -1
- package/dist/compliance/__tests__/kyc.service.test.js +12 -10
- package/dist/compliance/__tests__/kyc.service.test.js.map +1 -1
- package/dist/compliance/__tests__/rg-monitoring.service.test.js +17 -6
- package/dist/compliance/__tests__/rg-monitoring.service.test.js.map +1 -1
- package/dist/compliance/__tests__/rg.contract.test.js +18 -10
- package/dist/compliance/__tests__/rg.contract.test.js.map +1 -1
- package/dist/compliance/__tests__/rg.router.test.js +5 -4
- package/dist/compliance/__tests__/rg.router.test.js.map +1 -1
- package/dist/compliance/__tests__/rg.service.test.js +18 -12
- package/dist/compliance/__tests__/rg.service.test.js.map +1 -1
- package/dist/compliance/contract/index.d.ts +20 -14
- package/dist/compliance/contract/index.d.ts.map +1 -1
- package/dist/compliance/contract/limits.d.ts +9 -2
- package/dist/compliance/contract/limits.d.ts.map +1 -1
- package/dist/compliance/contract/limits.js +21 -3
- package/dist/compliance/contract/limits.js.map +1 -1
- package/dist/compliance/contract/rg.d.ts +28 -23
- package/dist/compliance/contract/rg.d.ts.map +1 -1
- package/dist/compliance/contract/rg.js +14 -9
- package/dist/compliance/contract/rg.js.map +1 -1
- package/dist/compliance/drizzle/migrations/0001_funny_vance_astro.sql +5 -0
- package/dist/compliance/drizzle/migrations/meta/0001_snapshot.json +660 -0
- package/dist/compliance/drizzle/migrations/meta/_journal.json +7 -0
- package/dist/compliance/plugin.d.ts.map +1 -1
- package/dist/compliance/plugin.js +26 -12
- package/dist/compliance/plugin.js.map +1 -1
- package/dist/compliance/router/index.d.ts +20 -14
- package/dist/compliance/router/index.d.ts.map +1 -1
- package/dist/compliance/router/index.js +2 -1
- package/dist/compliance/router/index.js.map +1 -1
- package/dist/compliance/schema/index.d.ts +31 -14
- package/dist/compliance/schema/index.d.ts.map +1 -1
- package/dist/compliance/schema/index.js +10 -7
- package/dist/compliance/schema/index.js.map +1 -1
- package/dist/compliance/service/compliance.service.d.ts +27 -22
- package/dist/compliance/service/compliance.service.d.ts.map +1 -1
- package/dist/compliance/service/compliance.service.js +9 -22
- package/dist/compliance/service/compliance.service.js.map +1 -1
- package/dist/compliance/service/kyc.service.d.ts +22 -19
- package/dist/compliance/service/kyc.service.d.ts.map +1 -1
- package/dist/compliance/service/kyc.service.js +19 -24
- package/dist/compliance/service/kyc.service.js.map +1 -1
- package/dist/compliance/service/re-kyc-trigger.d.ts +4 -4
- package/dist/compliance/service/re-kyc-trigger.d.ts.map +1 -1
- package/dist/compliance/service/re-kyc-trigger.js +10 -6
- package/dist/compliance/service/re-kyc-trigger.js.map +1 -1
- package/dist/compliance/service/rg-eval.d.ts.map +1 -1
- package/dist/compliance/service/rg-eval.js +4 -2
- package/dist/compliance/service/rg-eval.js.map +1 -1
- package/dist/compliance/service/rg-monitoring.service.d.ts +6 -5
- package/dist/compliance/service/rg-monitoring.service.d.ts.map +1 -1
- package/dist/compliance/service/rg-monitoring.service.js +62 -31
- package/dist/compliance/service/rg-monitoring.service.js.map +1 -1
- package/dist/compliance/service/rg.service.d.ts +28 -6
- package/dist/compliance/service/rg.service.d.ts.map +1 -1
- package/dist/compliance/service/rg.service.js +60 -34
- package/dist/compliance/service/rg.service.js.map +1 -1
- package/dist/contracts/adapters/admin-wallet-reporting.d.ts +5 -5
- package/dist/contracts/adapters/payment.d.ts +2 -2
- package/dist/contracts/adapters/wallet-commands.d.ts +5 -5
- package/dist/contracts/adapters/wallet-reader.d.ts +2 -2
- package/dist/contracts/adapters/wallet-reader.d.ts.map +1 -1
- package/dist/contracts/schemas/common.d.ts +2 -5
- package/dist/contracts/schemas/common.d.ts.map +1 -1
- package/dist/contracts/schemas/common.js +3 -4
- package/dist/contracts/schemas/common.js.map +1 -1
- package/dist/contracts/schemas/events.d.ts +35 -9
- package/dist/contracts/schemas/events.d.ts.map +1 -1
- package/dist/contracts/schemas/events.js +32 -7
- package/dist/contracts/schemas/events.js.map +1 -1
- package/dist/contracts/schemas/platform-config.d.ts +9 -9
- package/dist/contracts/schemas/platform-config.d.ts.map +1 -1
- package/dist/contracts/schemas/platform-config.js +6 -5
- package/dist/contracts/schemas/platform-config.js.map +1 -1
- package/dist/contracts/schemas/player.d.ts +2 -2
- package/dist/contracts/schemas/player.js +3 -3
- package/dist/contracts/schemas/player.js.map +1 -1
- package/dist/contracts/schemas/tag.d.ts +2 -2
- package/dist/contracts/schemas/tag.js +3 -3
- package/dist/contracts/schemas/tag.js.map +1 -1
- package/dist/engagement/chat/moderation/moderate.d.ts.map +1 -1
- package/dist/engagement/chat/moderation/moderate.js +2 -1
- package/dist/engagement/chat/moderation/moderate.js.map +1 -1
- package/dist/engagement/chat/react/use-chat-stream.d.ts +2 -3
- package/dist/engagement/chat/react/use-chat-stream.d.ts.map +1 -1
- package/dist/engagement/chat/react/use-chat-stream.js +4 -2
- package/dist/engagement/chat/react/use-chat-stream.js.map +1 -1
- package/dist/engagement/chat/router/index.d.ts.map +1 -1
- package/dist/engagement/chat/router/index.js +2 -1
- package/dist/engagement/chat/router/index.js.map +1 -1
- package/dist/engagement/chat/service/chat.service.d.ts.map +1 -1
- package/dist/engagement/chat/service/chat.service.js +22 -11
- package/dist/engagement/chat/service/chat.service.js.map +1 -1
- package/dist/engagement/notifications/__tests__/notifications.service.test.js +4 -3
- package/dist/engagement/notifications/__tests__/notifications.service.test.js.map +1 -1
- package/dist/engagement/notifications/contract/index.d.ts +24 -2
- package/dist/engagement/notifications/contract/index.d.ts.map +1 -1
- package/dist/engagement/notifications/contract/index.js +10 -1
- package/dist/engagement/notifications/contract/index.js.map +1 -1
- package/dist/engagement/notifications/index.d.ts +1 -1
- package/dist/engagement/notifications/index.d.ts.map +1 -1
- package/dist/engagement/notifications/plugin.d.ts.map +1 -1
- package/dist/engagement/notifications/plugin.js +6 -3
- package/dist/engagement/notifications/plugin.js.map +1 -1
- package/dist/engagement/notifications/router/index.d.ts +4 -1
- package/dist/engagement/notifications/router/index.d.ts.map +1 -1
- package/dist/engagement/notifications/router/index.js +15 -6
- package/dist/engagement/notifications/router/index.js.map +1 -1
- package/dist/engagement/notifications/service/notifications.service.d.ts +6 -13
- package/dist/engagement/notifications/service/notifications.service.d.ts.map +1 -1
- package/dist/engagement/notifications/service/notifications.service.js +6 -14
- package/dist/engagement/notifications/service/notifications.service.js.map +1 -1
- package/dist/iam/__tests__/iam.service.test.js +14 -9
- package/dist/iam/__tests__/iam.service.test.js.map +1 -1
- package/dist/iam/plugin.d.ts.map +1 -1
- package/dist/iam/plugin.js +4 -2
- package/dist/iam/plugin.js.map +1 -1
- package/dist/iam/seed/seed-default-roles.d.ts.map +1 -1
- package/dist/iam/seed/seed-default-roles.js +2 -1
- package/dist/iam/seed/seed-default-roles.js.map +1 -1
- package/dist/iam/service/iam.service.d.ts +19 -17
- package/dist/iam/service/iam.service.d.ts.map +1 -1
- package/dist/iam/service/iam.service.js +68 -34
- package/dist/iam/service/iam.service.js.map +1 -1
- package/dist/pam/identity/admin-user-directory.d.ts.map +1 -1
- package/dist/pam/identity/admin-user-directory.js +18 -9
- package/dist/pam/identity/admin-user-directory.js.map +1 -1
- package/dist/pam/identity/router/index.d.ts.map +1 -1
- package/dist/pam/identity/router/index.js +4 -2
- package/dist/pam/identity/router/index.js.map +1 -1
- package/dist/pam/identity/service/identity.service.d.ts +24 -2
- package/dist/pam/identity/service/identity.service.d.ts.map +1 -1
- package/dist/pam/identity/service/identity.service.js +51 -19
- package/dist/pam/identity/service/identity.service.js.map +1 -1
- package/dist/pam/identity/service/login-enforcement.service.d.ts +3 -3
- package/dist/pam/identity/service/login-enforcement.service.d.ts.map +1 -1
- package/dist/pam/identity/service/login-enforcement.service.js.map +1 -1
- package/dist/pam/identity/service/session.service.d.ts +5 -3
- package/dist/pam/identity/service/session.service.d.ts.map +1 -1
- package/dist/pam/identity/service/session.service.js +3 -3
- package/dist/pam/identity/service/session.service.js.map +1 -1
- package/dist/pam/player-management/__tests__/kyc-status-writer.test.js +2 -1
- package/dist/pam/player-management/__tests__/kyc-status-writer.test.js.map +1 -1
- package/dist/pam/player-management/__tests__/player.router.test.js +2 -2
- package/dist/pam/player-management/__tests__/player.router.test.js.map +1 -1
- package/dist/pam/player-management/__tests__/player.service.test.js +2 -1
- package/dist/pam/player-management/__tests__/player.service.test.js.map +1 -1
- package/dist/pam/player-management/contract/index.d.ts +10 -10
- package/dist/pam/player-management/router/index.d.ts +8 -8
- package/dist/pam/player-management/service/kyc-status-writer.d.ts.map +1 -1
- package/dist/pam/player-management/service/kyc-status-writer.js +2 -1
- package/dist/pam/player-management/service/kyc-status-writer.js.map +1 -1
- package/dist/pam/player-management/service/player.service.d.ts +15 -15
- package/dist/pam/player-management/service/player.service.d.ts.map +1 -1
- package/dist/pam/player-management/service/player.service.js +15 -12
- package/dist/pam/player-management/service/player.service.js.map +1 -1
- package/dist/pam/player-note/schema/index.d.ts +4 -4
- package/dist/pam/player-note/schema/index.js +6 -6
- package/dist/pam/player-note/schema/index.js.map +1 -1
- package/dist/pam/player-note/service/player-note.service.d.ts +11 -3
- package/dist/pam/player-note/service/player-note.service.d.ts.map +1 -1
- package/dist/pam/player-note/service/player-note.service.js +1 -1
- package/dist/pam/player-note/service/player-note.service.js.map +1 -1
- package/dist/pam/profile/__tests__/profile.service.test.js +2 -1
- package/dist/pam/profile/__tests__/profile.service.test.js.map +1 -1
- package/dist/pam/profile/contract/index.d.ts +4 -4
- package/dist/pam/profile/react/profile.d.ts +6 -7
- package/dist/pam/profile/react/profile.d.ts.map +1 -1
- package/dist/pam/profile/react/profile.js.map +1 -1
- package/dist/pam/profile/router/index.d.ts +4 -4
- package/dist/pam/profile/service/profile.service.d.ts +4 -4
- package/dist/pam/profile/service/profile.service.d.ts.map +1 -1
- package/dist/pam/profile/service/profile.service.js +2 -1
- package/dist/pam/profile/service/profile.service.js.map +1 -1
- package/dist/pam/shared/headers-mapper.d.ts.map +1 -1
- package/dist/pam/shared/headers-mapper.js +2 -1
- package/dist/pam/shared/headers-mapper.js.map +1 -1
- package/dist/pam/shared/player-mapper.d.ts +17 -2
- package/dist/pam/shared/player-mapper.d.ts.map +1 -1
- package/dist/pam/shared/player-mapper.js +2 -2
- package/dist/pam/shared/player-mapper.js.map +1 -1
- package/dist/pam/tag/__tests__/get-active-tag-keys.test.js +2 -1
- package/dist/pam/tag/__tests__/get-active-tag-keys.test.js.map +1 -1
- package/dist/pam/tag/__tests__/tag-evaluation.service.test.js +19 -18
- package/dist/pam/tag/__tests__/tag-evaluation.service.test.js.map +1 -1
- package/dist/pam/tag/__tests__/tag-mappers.test.js +6 -6
- package/dist/pam/tag/__tests__/tag-mappers.test.js.map +1 -1
- package/dist/pam/tag/__tests__/tag-rule.service.test.js +14 -14
- package/dist/pam/tag/__tests__/tag-rule.service.test.js.map +1 -1
- package/dist/pam/tag/__tests__/tag.router.test.d.ts +2 -0
- package/dist/pam/tag/__tests__/tag.router.test.d.ts.map +1 -0
- package/dist/pam/tag/__tests__/tag.router.test.js +38 -0
- package/dist/pam/tag/__tests__/tag.router.test.js.map +1 -0
- package/dist/pam/tag/contract/index.d.ts +3 -3
- package/dist/pam/tag/drizzle/migrations/0001_neat_iron_monger.sql +2 -0
- package/dist/pam/tag/drizzle/migrations/meta/0001_snapshot.json +295 -0
- package/dist/pam/tag/drizzle/migrations/meta/_journal.json +7 -0
- package/dist/pam/tag/router/index.d.ts +3 -3
- package/dist/pam/tag/schema/index.d.ts +16 -16
- package/dist/pam/tag/schema/index.d.ts.map +1 -1
- package/dist/pam/tag/schema/index.js +19 -19
- package/dist/pam/tag/schema/index.js.map +1 -1
- package/dist/pam/tag/seed/data/default-tag-rules.js +6 -6
- package/dist/pam/tag/seed/data/default-tag-rules.js.map +1 -1
- package/dist/pam/tag/seed/seed-default-tag-rules.d.ts.map +1 -1
- package/dist/pam/tag/seed/seed-default-tag-rules.js +5 -3
- package/dist/pam/tag/seed/seed-default-tag-rules.js.map +1 -1
- package/dist/pam/tag/service/tag-evaluation.service.d.ts.map +1 -1
- package/dist/pam/tag/service/tag-evaluation.service.js +32 -18
- package/dist/pam/tag/service/tag-evaluation.service.js.map +1 -1
- package/dist/pam/tag/service/tag-mappers.d.ts +8 -2
- package/dist/pam/tag/service/tag-mappers.d.ts.map +1 -1
- package/dist/pam/tag/service/tag-mappers.js +3 -8
- package/dist/pam/tag/service/tag-mappers.js.map +1 -1
- package/dist/pam/tag/service/tag-rule.service.d.ts +34 -4
- package/dist/pam/tag/service/tag-rule.service.d.ts.map +1 -1
- package/dist/pam/tag/service/tag-rule.service.js +9 -15
- package/dist/pam/tag/service/tag-rule.service.js.map +1 -1
- package/dist/pam/tag/service/tag.service.d.ts +51 -8
- package/dist/pam/tag/service/tag.service.d.ts.map +1 -1
- package/dist/pam/tag/service/tag.service.js +6 -11
- package/dist/pam/tag/service/tag.service.js.map +1 -1
- package/dist/react/context/api-client.d.ts.map +1 -1
- package/dist/react/context/api-client.js +14 -7
- package/dist/react/context/api-client.js.map +1 -1
- package/dist/react/hooks/use-event-stream.d.ts.map +1 -1
- package/dist/react/hooks/use-event-stream.js +6 -3
- package/dist/react/hooks/use-event-stream.js.map +1 -1
- package/dist/react/hooks/use-paginated-list.js +3 -3
- package/dist/react/hooks/use-paginated-list.js.map +1 -1
- package/dist/server/auth/admin-guard.d.ts +12 -0
- package/dist/server/auth/admin-guard.d.ts.map +1 -1
- package/dist/server/auth/admin-guard.js +14 -1
- package/dist/server/auth/admin-guard.js.map +1 -1
- package/dist/server/auth/auth.d.ts +9 -0
- package/dist/server/auth/auth.d.ts.map +1 -1
- package/dist/server/auth/auth.js +9 -1
- package/dist/server/auth/auth.js.map +1 -1
- package/dist/server/auth/permission-levels.d.ts.map +1 -1
- package/dist/server/auth/permission-levels.js +12 -6
- package/dist/server/auth/permission-levels.js.map +1 -1
- package/dist/server/db/drizzle.d.ts.map +1 -1
- package/dist/server/db/drizzle.js +2 -1
- package/dist/server/db/drizzle.js.map +1 -1
- package/dist/server/db/drizzle.service.d.ts.map +1 -1
- package/dist/server/db/drizzle.service.js +2 -1
- package/dist/server/db/drizzle.service.js.map +1 -1
- package/dist/server/db/index.d.ts +1 -1
- package/dist/server/db/index.d.ts.map +1 -1
- package/dist/server/db/index.js +1 -1
- package/dist/server/db/index.js.map +1 -1
- package/dist/server/db/migrate.d.ts.map +1 -1
- package/dist/server/db/migrate.js +2 -1
- package/dist/server/db/migrate.js.map +1 -1
- package/dist/server/db/outbox/__tests__/relay.test.js +4 -2
- package/dist/server/db/outbox/__tests__/relay.test.js.map +1 -1
- package/dist/server/db/outbox/relay.d.ts +15 -0
- package/dist/server/db/outbox/relay.d.ts.map +1 -1
- package/dist/server/db/outbox/relay.js +21 -14
- package/dist/server/db/outbox/relay.js.map +1 -1
- package/dist/server/db/query-helpers.d.ts +2 -0
- package/dist/server/db/query-helpers.d.ts.map +1 -1
- package/dist/server/db/query-helpers.js +28 -1
- package/dist/server/db/query-helpers.js.map +1 -1
- package/dist/server/kernel/__tests__/event-bus.test.js +10 -7
- package/dist/server/kernel/__tests__/event-bus.test.js.map +1 -1
- package/dist/server/kernel/__tests__/job-queue.test.js +5 -2
- package/dist/server/kernel/__tests__/job-queue.test.js.map +1 -1
- package/dist/server/kernel/__tests__/rate-limiter.test.js +10 -5
- package/dist/server/kernel/__tests__/rate-limiter.test.js.map +1 -1
- package/dist/server/kernel/__tests__/redis-cache.test.js +2 -1
- package/dist/server/kernel/__tests__/redis-cache.test.js.map +1 -1
- package/dist/server/kernel/bullmq-job-queue.d.ts +12 -0
- package/dist/server/kernel/bullmq-job-queue.d.ts.map +1 -1
- package/dist/server/kernel/bullmq-job-queue.js +21 -4
- package/dist/server/kernel/bullmq-job-queue.js.map +1 -1
- package/dist/server/kernel/cache.d.ts.map +1 -1
- package/dist/server/kernel/cache.js +14 -7
- package/dist/server/kernel/cache.js.map +1 -1
- package/dist/server/kernel/container.d.ts +10 -0
- package/dist/server/kernel/container.d.ts.map +1 -1
- package/dist/server/kernel/container.js +12 -1
- package/dist/server/kernel/container.js.map +1 -1
- package/dist/server/kernel/event-bus.d.ts +9 -0
- package/dist/server/kernel/event-bus.d.ts.map +1 -1
- package/dist/server/kernel/event-bus.js +9 -1
- package/dist/server/kernel/event-bus.js.map +1 -1
- package/dist/server/kernel/event-stream.d.ts.map +1 -1
- package/dist/server/kernel/event-stream.js +2 -1
- package/dist/server/kernel/event-stream.js.map +1 -1
- package/dist/server/kernel/job-queue.d.ts +12 -0
- package/dist/server/kernel/job-queue.d.ts.map +1 -1
- package/dist/server/kernel/job-queue.js +38 -15
- package/dist/server/kernel/job-queue.js.map +1 -1
- package/dist/server/kernel/ownership.d.ts.map +1 -1
- package/dist/server/kernel/ownership.js +2 -1
- package/dist/server/kernel/ownership.js.map +1 -1
- package/dist/server/kernel/platform-config-loader.d.ts.map +1 -1
- package/dist/server/kernel/platform-config-loader.js +34 -16
- package/dist/server/kernel/platform-config-loader.js.map +1 -1
- package/dist/server/kernel/rate-limiter.d.ts.map +1 -1
- package/dist/server/kernel/rate-limiter.js +6 -3
- package/dist/server/kernel/rate-limiter.js.map +1 -1
- package/dist/server/kernel/realtime-transport.d.ts.map +1 -1
- package/dist/server/kernel/realtime-transport.js +10 -5
- package/dist/server/kernel/realtime-transport.js.map +1 -1
- package/dist/server/kernel/redis-cache.d.ts.map +1 -1
- package/dist/server/kernel/redis-cache.js +10 -5
- package/dist/server/kernel/redis-cache.js.map +1 -1
- package/dist/server/kernel/redis-rate-limiter.d.ts +11 -0
- package/dist/server/kernel/redis-rate-limiter.d.ts.map +1 -1
- package/dist/server/kernel/redis-rate-limiter.js +13 -1
- package/dist/server/kernel/redis-rate-limiter.js.map +1 -1
- package/dist/server/kernel/serialize-row.d.ts.map +1 -1
- package/dist/server/kernel/serialize-row.js +4 -2
- package/dist/server/kernel/serialize-row.js.map +1 -1
- package/dist/server/plugin-host/load-extensions.js +2 -1
- package/dist/server/plugin-host/load-extensions.js.map +1 -1
- package/dist/server/plugin-host/load-plugins.d.ts.map +1 -1
- package/dist/server/plugin-host/load-plugins.js +4 -2
- package/dist/server/plugin-host/load-plugins.js.map +1 -1
- package/dist/server/plugin-host/service-manifest.d.ts.map +1 -1
- package/dist/server/plugin-host/service-manifest.js +4 -2
- package/dist/server/plugin-host/service-manifest.js.map +1 -1
- package/dist/server/runtime/create-app.d.ts +12 -0
- package/dist/server/runtime/create-app.d.ts.map +1 -1
- package/dist/server/runtime/create-app.js +27 -6
- package/dist/server/runtime/create-app.js.map +1 -1
- package/dist/wallet/__tests__/admin-reporting.test.js +2 -2
- package/dist/wallet/__tests__/admin-reporting.test.js.map +1 -1
- package/dist/wallet/__tests__/wallet-auto-rule.router.test.js +5 -5
- package/dist/wallet/__tests__/wallet-auto-rule.router.test.js.map +1 -1
- package/dist/wallet/__tests__/wallet-auto-withdrawal.test.js +45 -34
- package/dist/wallet/__tests__/wallet-auto-withdrawal.test.js.map +1 -1
- package/dist/wallet/__tests__/wallet-commands.service.test.js +54 -37
- package/dist/wallet/__tests__/wallet-commands.service.test.js.map +1 -1
- package/dist/wallet/__tests__/wallet-kyc-gate.test.js +5 -5
- package/dist/wallet/__tests__/wallet-kyc-gate.test.js.map +1 -1
- package/dist/wallet/__tests__/wallet.rate-limit.test.js +2 -2
- package/dist/wallet/__tests__/wallet.rate-limit.test.js.map +1 -1
- package/dist/wallet/__tests__/wallet.service.test.js +62 -34
- package/dist/wallet/__tests__/wallet.service.test.js.map +1 -1
- package/dist/wallet/adapters/mock/mock-payment-adapter.d.ts +2 -2
- package/dist/wallet/adapters/wallet-reader.service.d.ts +1 -1
- package/dist/wallet/adapters/wallet-reader.service.js +1 -1
- package/dist/wallet/adapters/wallet-reader.service.js.map +1 -1
- package/dist/wallet/admin-reporting.d.ts +4 -4
- package/dist/wallet/admin-reporting.d.ts.map +1 -1
- package/dist/wallet/admin-reporting.js +8 -8
- package/dist/wallet/admin-reporting.js.map +1 -1
- package/dist/wallet/contract/index.d.ts +20 -20
- package/dist/wallet/contract/index.d.ts.map +1 -1
- package/dist/wallet/contract/index.js +14 -10
- package/dist/wallet/contract/index.js.map +1 -1
- package/dist/wallet/drizzle/migrations/0001_redundant_micromacro.sql +4 -0
- package/dist/wallet/drizzle/migrations/meta/0001_snapshot.json +397 -0
- package/dist/wallet/drizzle/migrations/meta/_journal.json +7 -0
- package/dist/wallet/plugin.d.ts.map +1 -1
- package/dist/wallet/plugin.js +5 -1
- package/dist/wallet/plugin.js.map +1 -1
- package/dist/wallet/router/index.d.ts +11 -11
- package/dist/wallet/schema/index.js +3 -3
- package/dist/wallet/schema/index.js.map +1 -1
- package/dist/wallet/service/wallet-commands.service.d.ts +1 -0
- package/dist/wallet/service/wallet-commands.service.d.ts.map +1 -1
- package/dist/wallet/service/wallet-commands.service.js +32 -24
- package/dist/wallet/service/wallet-commands.service.js.map +1 -1
- package/dist/wallet/service/wallet.service.d.ts +46 -18
- package/dist/wallet/service/wallet.service.d.ts.map +1 -1
- package/dist/wallet/service/wallet.service.js +152 -74
- package/dist/wallet/service/wallet.service.js.map +1 -1
- package/oxlint/oxlintrc.json +19 -3
- package/package.json +1 -1
- package/turbo-generators/src/config.ts +18 -6
|
@@ -1,13 +1,40 @@
|
|
|
1
1
|
import { sql } from 'drizzle-orm';
|
|
2
2
|
export function findOneOrThrow(rows, error) {
|
|
3
3
|
const row = rows[0];
|
|
4
|
-
if (row === undefined)
|
|
4
|
+
if (row === undefined) {
|
|
5
5
|
throw error;
|
|
6
|
+
}
|
|
6
7
|
return row;
|
|
7
8
|
}
|
|
8
9
|
export function pageToOffset(page, limit) {
|
|
9
10
|
return (page - 1) * limit;
|
|
10
11
|
}
|
|
12
|
+
// The single sanctioned JS-side conversion point for a decimal-string money amount.
|
|
13
|
+
// Ledger writes and balance comparisons stay in SQL (numeric arithmetic); this is only
|
|
14
|
+
// for a coarse, non-ledger decision (a review-queue heuristic, a velocity/cap check)
|
|
15
|
+
// where float precision loss at the margins does not change the outcome.
|
|
16
|
+
export function moneyToNumber(amount) {
|
|
17
|
+
return Number(amount);
|
|
18
|
+
}
|
|
19
|
+
// Run `fn` over `items` with at most `concurrency` promises in flight, results in input
|
|
20
|
+
// order. Use this instead of `Promise.all(items.map(fn))` whenever `items` comes from a
|
|
21
|
+
// query (unbounded) and `fn` touches the DB: an uncapped fan-out opens one pool connection
|
|
22
|
+
// per item, exhausts the pool, and starves every other query on the same Postgres instance.
|
|
23
|
+
// Enforced in service files by oss-module-shape/no-unbounded-db-fanout.
|
|
24
|
+
export async function mapConcurrent(items, concurrency, fn) {
|
|
25
|
+
const results = Array.from({ length: items.length });
|
|
26
|
+
let cursor = 0;
|
|
27
|
+
const worker = async () => {
|
|
28
|
+
while (cursor < items.length) {
|
|
29
|
+
const index = cursor;
|
|
30
|
+
cursor += 1;
|
|
31
|
+
results[index] = await fn(items[index], index);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const workers = Math.max(1, Math.min(concurrency, items.length));
|
|
35
|
+
await Promise.all(Array.from({ length: workers }, worker));
|
|
36
|
+
return results;
|
|
37
|
+
}
|
|
11
38
|
// Serialize a critical section per `key` with a transaction-scoped Postgres advisory lock
|
|
12
39
|
// (auto-released on commit/rollback). `hashtext` maps the string key to the required bigint. Must run in a transaction.
|
|
13
40
|
export async function withAdvisoryXactLock(txn, key, fn) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-helpers.js","sourceRoot":"","sources":["../../../src/server/db/query-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGlC,MAAM,UAAU,cAAc,CAAI,IAAS,EAAE,KAAY;IACvD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,GAAG,KAAK,SAAS;
|
|
1
|
+
{"version":3,"file":"query-helpers.js","sourceRoot":"","sources":["../../../src/server/db/query-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGlC,MAAM,UAAU,cAAc,CAAI,IAAS,EAAE,KAAY;IACvD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,KAAa;IACtD,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AAC5B,CAAC;AAED,oFAAoF;AACpF,uFAAuF;AACvF,qFAAqF;AACrF,yEAAyE;AACzE,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC;AAED,wFAAwF;AACxF,wFAAwF;AACxF,2FAA2F;AAC3F,4FAA4F;AAC5F,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAmB,EACnB,WAAmB,EACnB,EAA0C;IAE1C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACxD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACxB,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,MAAM,CAAC;YACrB,MAAM,IAAI,CAAC,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;IACH,CAAC,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACjE,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,0FAA0F;AAC1F,wHAAwH;AACxH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,GAAc,EACd,GAAW,EACX,EAAoB;IAEpB,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAA,yCAAyC,GAAG,IAAI,CAAC,CAAC;IACvE,OAAO,EAAE,EAAE,CAAC;AACd,CAAC"}
|
|
@@ -14,12 +14,14 @@ describe('createEventBus', () => {
|
|
|
14
14
|
});
|
|
15
15
|
bus.emit('wallet.deposit.completed', {
|
|
16
16
|
userId: 'u1',
|
|
17
|
-
amount: 50,
|
|
17
|
+
amount: '50',
|
|
18
18
|
currency: 'USD',
|
|
19
19
|
transactionId: 'tx1',
|
|
20
20
|
});
|
|
21
21
|
await flush();
|
|
22
|
-
expect(received).toEqual([
|
|
22
|
+
expect(received).toEqual([
|
|
23
|
+
{ userId: 'u1', amount: '50', currency: 'USD', transactionId: 'tx1' },
|
|
24
|
+
]);
|
|
23
25
|
});
|
|
24
26
|
it('delivers the envelope as the optional second arg to handlers', async () => {
|
|
25
27
|
const bus = createEventBus(new InMemoryBroker(), fakeLogger());
|
|
@@ -29,7 +31,7 @@ describe('createEventBus', () => {
|
|
|
29
31
|
});
|
|
30
32
|
bus.emit('wallet.deposit.completed', {
|
|
31
33
|
userId: 'u1',
|
|
32
|
-
amount: 10,
|
|
34
|
+
amount: '10',
|
|
33
35
|
currency: 'USD',
|
|
34
36
|
transactionId: 'tx2',
|
|
35
37
|
});
|
|
@@ -39,25 +41,26 @@ describe('createEventBus', () => {
|
|
|
39
41
|
expect(typeof env?.eventId).toBe('string');
|
|
40
42
|
expect(env?.eventId).toHaveLength(36);
|
|
41
43
|
expect(env?.topic).toBe('wallet.deposit.completed');
|
|
42
|
-
expect(env?.schemaVersion).toBe(
|
|
44
|
+
expect(env?.schemaVersion).toBe(2);
|
|
43
45
|
expect(typeof env?.occurredAt).toBe('string');
|
|
44
46
|
});
|
|
45
47
|
it('envelope eventId is unique per emission', async () => {
|
|
46
48
|
const bus = createEventBus(new InMemoryBroker(), fakeLogger());
|
|
47
49
|
const ids = [];
|
|
48
50
|
bus.on('wallet.deposit.completed', (_p, env) => {
|
|
49
|
-
if (env?.eventId)
|
|
51
|
+
if (env?.eventId) {
|
|
50
52
|
ids.push(env.eventId);
|
|
53
|
+
}
|
|
51
54
|
});
|
|
52
55
|
bus.emit('wallet.deposit.completed', {
|
|
53
56
|
userId: 'u1',
|
|
54
|
-
amount: 1,
|
|
57
|
+
amount: '1',
|
|
55
58
|
currency: 'USD',
|
|
56
59
|
transactionId: 'a',
|
|
57
60
|
});
|
|
58
61
|
bus.emit('wallet.deposit.completed', {
|
|
59
62
|
userId: 'u1',
|
|
60
|
-
amount: 2,
|
|
63
|
+
amount: '2',
|
|
61
64
|
currency: 'USD',
|
|
62
65
|
transactionId: 'b',
|
|
63
66
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-bus.test.js","sourceRoot":"","sources":["../../../../src/server/kernel/__tests__/event-bus.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAGhD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjE,SAAS,UAAU;IACjB,OAAO,IAAI,CAAS,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAEzD,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,cAAc,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAc,EAAE,CAAC;QAC/B,GAAG,CAAC,EAAE,CAAC,0BAA0B,EAAE,CAAC,CAAC,EAAE,EAAE;YACvC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE;YACnC,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"event-bus.test.js","sourceRoot":"","sources":["../../../../src/server/kernel/__tests__/event-bus.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { describe, it, expect, vi } from 'vitest';
|
|
|
2
2
|
import { mock } from '../../../testing/mock.js';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import { queue } from '@openora/core/contracts';
|
|
5
|
+
import { findOneOrThrow } from '@openora/core/server';
|
|
5
6
|
import { InProcessJobQueue } from '../job-queue.js';
|
|
6
7
|
function fakeLogger() {
|
|
7
8
|
return mock({ error: vi.fn(), warn: vi.fn(), info: vi.fn(), debug: vi.fn() });
|
|
@@ -11,8 +12,9 @@ const wait = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
|
11
12
|
// Returns as soon as predicate holds rather than sleeping a fixed amount, avoiding CI scheduling jitter.
|
|
12
13
|
async function waitFor(predicate, timeoutMs = 2000) {
|
|
13
14
|
const deadline = Date.now() + timeoutMs;
|
|
14
|
-
while (!predicate() && Date.now() < deadline)
|
|
15
|
+
while (!predicate() && Date.now() < deadline) {
|
|
15
16
|
await wait(5);
|
|
17
|
+
}
|
|
16
18
|
}
|
|
17
19
|
const Payload = z.object({ value: z.string() });
|
|
18
20
|
describe('InProcessJobQueue', () => {
|
|
@@ -68,7 +70,8 @@ describe('InProcessJobQueue', () => {
|
|
|
68
70
|
await waitFor(() => dead.mock.calls.length > 0);
|
|
69
71
|
expect(attempts).toEqual([1, 2, 3]);
|
|
70
72
|
expect(dead).toHaveBeenCalledOnce();
|
|
71
|
-
|
|
73
|
+
const deadCall = findOneOrThrow(dead.mock.calls, new Error('expected a dead-letter call'));
|
|
74
|
+
expect(deadCall[1].message).toBe('boom');
|
|
72
75
|
await q.close();
|
|
73
76
|
});
|
|
74
77
|
it('serializes jobs that share an orderingKey', async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"job-queue.test.js","sourceRoot":"","sources":["../../../../src/server/kernel/__tests__/job-queue.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAChD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,SAAS,UAAU;IACjB,OAAO,IAAI,CAAS,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACzD,MAAM,IAAI,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAEnE,yGAAyG;AACzG,KAAK,UAAU,OAAO,CAAC,SAAwB,EAAE,SAAS,GAAG,IAAI;IAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ;
|
|
1
|
+
{"version":3,"file":"job-queue.test.js","sourceRoot":"","sources":["../../../../src/server/kernel/__tests__/job-queue.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,15 +8,17 @@ describe('InProcessRateLimiter', () => {
|
|
|
8
8
|
it('allows up to the limit then denies within the same window', async () => {
|
|
9
9
|
const limiter = new InProcessRateLimiter();
|
|
10
10
|
const results = [];
|
|
11
|
-
for (let i = 0; i < 4; i++)
|
|
11
|
+
for (let i = 0; i < 4; i++) {
|
|
12
12
|
results.push(await limiter.consume('k', OPTS));
|
|
13
|
+
}
|
|
13
14
|
expect(results.map((r) => r.allowed)).toEqual([true, true, true, false]);
|
|
14
15
|
limiter.close();
|
|
15
16
|
});
|
|
16
17
|
it('reports retryAfterMs equal to the time left in the window on denial', async () => {
|
|
17
18
|
const limiter = new InProcessRateLimiter();
|
|
18
|
-
for (let i = 0; i < 3; i++)
|
|
19
|
+
for (let i = 0; i < 3; i++) {
|
|
19
20
|
await limiter.consume('k', OPTS);
|
|
21
|
+
}
|
|
20
22
|
vi.advanceTimersByTime(400);
|
|
21
23
|
const denied = await limiter.consume('k', OPTS);
|
|
22
24
|
expect(denied.allowed).toBe(false);
|
|
@@ -25,8 +27,9 @@ describe('InProcessRateLimiter', () => {
|
|
|
25
27
|
});
|
|
26
28
|
it('rolls over: a fresh budget is available once the window elapses', async () => {
|
|
27
29
|
const limiter = new InProcessRateLimiter();
|
|
28
|
-
for (let i = 0; i < 3; i++)
|
|
30
|
+
for (let i = 0; i < 3; i++) {
|
|
29
31
|
await limiter.consume('k', OPTS);
|
|
32
|
+
}
|
|
30
33
|
expect((await limiter.consume('k', OPTS)).allowed).toBe(false);
|
|
31
34
|
vi.advanceTimersByTime(1000);
|
|
32
35
|
expect((await limiter.consume('k', OPTS)).allowed).toBe(true);
|
|
@@ -34,8 +37,9 @@ describe('InProcessRateLimiter', () => {
|
|
|
34
37
|
});
|
|
35
38
|
it('isolates budgets between keys', async () => {
|
|
36
39
|
const limiter = new InProcessRateLimiter();
|
|
37
|
-
for (let i = 0; i < 3; i++)
|
|
40
|
+
for (let i = 0; i < 3; i++) {
|
|
38
41
|
await limiter.consume('a', OPTS);
|
|
42
|
+
}
|
|
39
43
|
expect((await limiter.consume('a', OPTS)).allowed).toBe(false);
|
|
40
44
|
expect((await limiter.consume('b', OPTS)).allowed).toBe(true);
|
|
41
45
|
limiter.close();
|
|
@@ -45,8 +49,9 @@ describe('assertRateLimit / makeRateLimitError', () => {
|
|
|
45
49
|
it('throws a TOO_MANY_REQUESTS ORPCError carrying retryAfterMs once the limit is hit', async () => {
|
|
46
50
|
vi.useFakeTimers();
|
|
47
51
|
const limiter = new InProcessRateLimiter();
|
|
48
|
-
for (let i = 0; i < 3; i++)
|
|
52
|
+
for (let i = 0; i < 3; i++) {
|
|
49
53
|
await assertRateLimit(limiter, 'k', OPTS);
|
|
54
|
+
}
|
|
50
55
|
await expect(assertRateLimit(limiter, 'k', OPTS)).rejects.toMatchObject({
|
|
51
56
|
code: 'TOO_MANY_REQUESTS',
|
|
52
57
|
data: { retryAfterMs: OPTS.windowMs },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limiter.test.js","sourceRoot":"","sources":["../../../../src/server/kernel/__tests__/rate-limiter.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE/F,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAE1C,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;IACrC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;IAEpC,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,OAAO,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;
|
|
1
|
+
{"version":3,"file":"rate-limiter.test.js","sourceRoot":"","sources":["../../../../src/server/kernel/__tests__/rate-limiter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,8 +9,9 @@ function fakeClient(isReady = true) {
|
|
|
9
9
|
});
|
|
10
10
|
const get = vi.fn(async (key) => store.get(key) ?? null);
|
|
11
11
|
const del = vi.fn(async (keys) => {
|
|
12
|
-
for (const k of keys)
|
|
12
|
+
for (const k of keys) {
|
|
13
13
|
store.delete(k);
|
|
14
|
+
}
|
|
14
15
|
return keys.length;
|
|
15
16
|
});
|
|
16
17
|
return { isReady, get, set, del };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redis-cache.test.js","sourceRoot":"","sources":["../../../../src/server/kernel/__tests__/redis-cache.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAEhD,SAAS,UAAU,CAAC,OAAO,GAAG,IAAI;IAChC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,KAAa,EAAE,EAAE;QACrD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAc,EAAE,EAAE;QACzC,KAAK,MAAM,CAAC,IAAI,IAAI;
|
|
1
|
+
{"version":3,"file":"redis-cache.test.js","sourceRoot":"","sources":["../../../../src/server/kernel/__tests__/redis-cache.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAEhD,SAAS,UAAU,CAAC,OAAO,GAAG,IAAI;IAChC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,KAAa,EAAE,EAAE;QACrD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAW,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,IAAc,EAAE,EAAE;QACzC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACpC,CAAC;AAED,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QACpF,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAc,IAAI,CAAC,CAAC,CAAC;QAEtD,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7D,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE;YACtF,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;SACxC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAc,UAAU,EAAE,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAc,IAAI,CAAC,CAAC,CAAC;QAEtD,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QAEpC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAc,IAAI,CAAC,CAAC,CAAC;QAEtD,MAAM,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACjD,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAE1D,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,4 +1,16 @@
|
|
|
1
1
|
import type { JobQueueAdapter, QueueName, EnqueueOptions, RepeatOptions, WorkerRegistration } from '@openora/core/contracts';
|
|
2
|
+
/**
|
|
3
|
+
* Durable `JOB_QUEUE` reference driver, auto-bound by `createApp` when
|
|
4
|
+
* `REDIS_URL` is set - jobs survive a process restart and `cron`/`everyMs`
|
|
5
|
+
* schedules run for real. `idempotencyKey` maps to the BullMQ `jobId`, so
|
|
6
|
+
* BullMQ itself dedupes concurrent enqueues. `orderingKey` is NOT honoured
|
|
7
|
+
* (OSS BullMQ has no per-key ordering groups) - jobs run unordered regardless
|
|
8
|
+
* of the key, so every handler must be idempotent under any interleaving, not
|
|
9
|
+
* just under retries. The `'failed'` listener only triggers the dead-letter
|
|
10
|
+
* hook once `attemptsMade` reaches the job's own `attempts` (default 1) -
|
|
11
|
+
* intermediate retry failures are silent by design. `close()` closes workers
|
|
12
|
+
* before queues so in-flight jobs drain first.
|
|
13
|
+
*/
|
|
2
14
|
export declare class BullMqJobQueue implements JobQueueAdapter {
|
|
3
15
|
private readonly logger;
|
|
4
16
|
private readonly connection;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bullmq-job-queue.d.ts","sourceRoot":"","sources":["../../../src/server/kernel/bullmq-job-queue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EACT,cAAc,EACd,aAAa,EAEb,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AAgBjC,qBAAa,cAAe,YAAW,eAAe;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAChE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;gBAExC,QAAQ,EAAE,MAAM;IAK5B,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;IAgC5F,cAAc,CAAC,CAAC,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"bullmq-job-queue.d.ts","sourceRoot":"","sources":["../../../src/server/kernel/bullmq-job-queue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,SAAS,EACT,cAAc,EACd,aAAa,EAEb,kBAAkB,EACnB,MAAM,yBAAyB,CAAC;AAgBjC;;;;;;;;;;;GAWG;AACH,qBAAa,cAAe,YAAW,eAAe;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAC3D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAChE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAqB;gBAExC,QAAQ,EAAE,MAAM;IAK5B,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;IAgC5F,cAAc,CAAC,CAAC,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI;IAqC5D,QAAQ,CAAC,CAAC,EACR,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,CAAC,EACV,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC;IAWhB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,OAAO,CAAC,QAAQ;YAUF,UAAU;CAwBzB"}
|
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
import { Queue, Worker } from 'bullmq';
|
|
2
2
|
import { createLogger } from './logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Durable `JOB_QUEUE` reference driver, auto-bound by `createApp` when
|
|
5
|
+
* `REDIS_URL` is set - jobs survive a process restart and `cron`/`everyMs`
|
|
6
|
+
* schedules run for real. `idempotencyKey` maps to the BullMQ `jobId`, so
|
|
7
|
+
* BullMQ itself dedupes concurrent enqueues. `orderingKey` is NOT honoured
|
|
8
|
+
* (OSS BullMQ has no per-key ordering groups) - jobs run unordered regardless
|
|
9
|
+
* of the key, so every handler must be idempotent under any interleaving, not
|
|
10
|
+
* just under retries. The `'failed'` listener only triggers the dead-letter
|
|
11
|
+
* hook once `attemptsMade` reaches the job's own `attempts` (default 1) -
|
|
12
|
+
* intermediate retry failures are silent by design. `close()` closes workers
|
|
13
|
+
* before queues so in-flight jobs drain first.
|
|
14
|
+
*/
|
|
3
15
|
export class BullMqJobQueue {
|
|
4
16
|
logger = createLogger('bullmq-job-queue');
|
|
5
17
|
connection;
|
|
@@ -48,15 +60,19 @@ export class BullMqJobQueue {
|
|
|
48
60
|
meta: job.data.meta,
|
|
49
61
|
};
|
|
50
62
|
await reg.handler(ctx);
|
|
51
|
-
},
|
|
63
|
+
},
|
|
64
|
+
// BullMQ rejects an explicit `concurrency: undefined`; default to 1 when unset.
|
|
65
|
+
{ connection: this.connection, concurrency: registration.options?.concurrency ?? 1 });
|
|
52
66
|
// 'failed' fires per attempt; act only once retries are exhausted (attemptsMade has
|
|
53
67
|
// reached the job's own attempts, default 1) - mirrors the in-process dead-letter.
|
|
54
68
|
worker.on('failed', (job, error) => {
|
|
55
|
-
if (!job)
|
|
69
|
+
if (!job) {
|
|
56
70
|
return;
|
|
71
|
+
}
|
|
57
72
|
const maxAttempts = job.opts.attempts ?? 1;
|
|
58
|
-
if (job.attemptsMade < maxAttempts)
|
|
73
|
+
if (job.attemptsMade < maxAttempts) {
|
|
59
74
|
return;
|
|
75
|
+
}
|
|
60
76
|
void this.deadLetter(reg, job, error);
|
|
61
77
|
});
|
|
62
78
|
this.workers.push(worker);
|
|
@@ -80,8 +96,9 @@ export class BullMqJobQueue {
|
|
|
80
96
|
}
|
|
81
97
|
getQueue(queue) {
|
|
82
98
|
const existing = this.queues.get(queue);
|
|
83
|
-
if (existing)
|
|
99
|
+
if (existing) {
|
|
84
100
|
return existing;
|
|
101
|
+
}
|
|
85
102
|
const created = new Queue(queue, { connection: this.connection });
|
|
86
103
|
this.queues.set(queue, created);
|
|
87
104
|
return created;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bullmq-job-queue.js","sourceRoot":"","sources":["../../../src/server/kernel/bullmq-job-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAsD,MAAM,QAAQ,CAAC;AAS3F,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAe3C,MAAM,OAAO,cAAc;IACR,MAAM,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;IAC1C,UAAU,CAAoB;IAC9B,MAAM,GAAG,IAAI,GAAG,EAA8B,CAAC;IAC/C,OAAO,GAA0B,EAAE,CAAC;IACpC,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEpD,YAAY,QAAgB;QAC1B,kFAAkF;QAClF,IAAI,CAAC,UAAU,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC;IAClE,CAAC;IAED,OAAO,CAAI,KAAgB,EAAE,OAAU,EAAE,OAAuB,EAAE;QAChE,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC/B,mFAAmF;YACnF,qFAAqF;YACrF,uEAAuE;YACvE,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,EAAE,KAAK,EAAE,EACT,sHAAsH,CACvH,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAgB;YAC5B,OAAO;YACP,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE;SAC5D,CAAC;QAEF,MAAM,OAAO,GAAgB;YAC3B,6DAA6D;YAC7D,KAAK,EAAE,IAAI,CAAC,cAAc;YAC1B,KAAK,EAAE,IAAI,CAAC,OAAO;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;YAC5F,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,qFAAqF;SACtF,CAAC;QAEF,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;aACxB,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC;aAC7B,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,cAAc,CAAI,YAAmC;QACnD,MAAM,GAAG,GAAG,YAAyB,CAAC;QACtC,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC;QAErC,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,SAAS,EACT,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,MAAM,GAAG,GAAwB;gBAC/B,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE;gBAChB,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC3C,OAAO,EAAE,GAAG,CAAC,YAAY,GAAG,CAAC;gBAC7B,UAAU,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;gBACnC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI;aACpB,CAAC;YACF,MAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC,
|
|
1
|
+
{"version":3,"file":"bullmq-job-queue.js","sourceRoot":"","sources":["../../../src/server/kernel/bullmq-job-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/server/kernel/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAgB5D,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;
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/server/kernel/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAgB5D,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;AAKD,wBAAsB,MAAM,CAAC,CAAC,EAC5B,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACvB,OAAO,CAAC,CAAC,CAAC,CAuBZ;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC,CASf"}
|
|
@@ -17,8 +17,9 @@ export class InProcessCache {
|
|
|
17
17
|
}
|
|
18
18
|
get(key) {
|
|
19
19
|
const entry = this.entries.get(key);
|
|
20
|
-
if (!entry)
|
|
20
|
+
if (!entry) {
|
|
21
21
|
return Promise.resolve(undefined);
|
|
22
|
+
}
|
|
22
23
|
if (Date.now() >= entry.expiresAt) {
|
|
23
24
|
this.entries.delete(key);
|
|
24
25
|
return Promise.resolve(undefined);
|
|
@@ -28,22 +29,25 @@ export class InProcessCache {
|
|
|
28
29
|
set(key, value, opts) {
|
|
29
30
|
if (!this.entries.has(key) && this.entries.size >= MAX_ENTRIES) {
|
|
30
31
|
const oldestKey = this.entries.keys().next().value;
|
|
31
|
-
if (oldestKey !== undefined)
|
|
32
|
+
if (oldestKey !== undefined) {
|
|
32
33
|
this.entries.delete(oldestKey);
|
|
34
|
+
}
|
|
33
35
|
}
|
|
34
36
|
this.entries.set(key, { value, expiresAt: Date.now() + opts.ttlMs });
|
|
35
37
|
return Promise.resolve();
|
|
36
38
|
}
|
|
37
39
|
delete(key) {
|
|
38
|
-
for (const k of Array.isArray(key) ? key : [key])
|
|
40
|
+
for (const k of Array.isArray(key) ? key : [key]) {
|
|
39
41
|
this.entries.delete(k);
|
|
42
|
+
}
|
|
40
43
|
return Promise.resolve();
|
|
41
44
|
}
|
|
42
45
|
sweep() {
|
|
43
46
|
const now = Date.now();
|
|
44
47
|
for (const [key, entry] of this.entries) {
|
|
45
|
-
if (now >= entry.expiresAt)
|
|
48
|
+
if (now >= entry.expiresAt) {
|
|
46
49
|
this.entries.delete(key);
|
|
50
|
+
}
|
|
47
51
|
}
|
|
48
52
|
}
|
|
49
53
|
close() {
|
|
@@ -55,8 +59,9 @@ export class InProcessCache {
|
|
|
55
59
|
// `loader`, so a hot key can stampede on cache-miss. Acceptable for the TTLs this
|
|
56
60
|
// is bound at (seconds); add a per-key in-flight promise map if that ever changes.
|
|
57
61
|
export async function cached(cache, key, ttlMs, loader) {
|
|
58
|
-
if (!cache)
|
|
62
|
+
if (!cache) {
|
|
59
63
|
return loader();
|
|
64
|
+
}
|
|
60
65
|
let hit;
|
|
61
66
|
try {
|
|
62
67
|
hit = await cache.get(key);
|
|
@@ -65,8 +70,9 @@ export async function cached(cache, key, ttlMs, loader) {
|
|
|
65
70
|
logger.warn({ key, err }, 'cache get failed');
|
|
66
71
|
hit = undefined;
|
|
67
72
|
}
|
|
68
|
-
if (hit !== undefined)
|
|
73
|
+
if (hit !== undefined) {
|
|
69
74
|
return hit;
|
|
75
|
+
}
|
|
70
76
|
const value = await loader();
|
|
71
77
|
try {
|
|
72
78
|
await cache.set(key, value, { ttlMs });
|
|
@@ -77,8 +83,9 @@ export async function cached(cache, key, ttlMs, loader) {
|
|
|
77
83
|
return value;
|
|
78
84
|
}
|
|
79
85
|
export async function invalidate(cache, keys) {
|
|
80
|
-
if (!cache)
|
|
86
|
+
if (!cache) {
|
|
81
87
|
return;
|
|
88
|
+
}
|
|
82
89
|
try {
|
|
83
90
|
await cache.delete(keys);
|
|
84
91
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/server/kernel/cache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;AAIrC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACjC,qFAAqF;AACrF,gFAAgF;AAChF,+CAA+C;AAC/C,MAAM,WAAW,GAAG,KAAK,CAAC;AAE1B,kFAAkF;AAClF,iFAAiF;AACjF,kDAAkD;AAClD,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;
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/server/kernel/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
import type { AnyToken } from '@openora/core/contracts';
|
|
2
2
|
export type Factory<T> = (c: Container) => T;
|
|
3
|
+
/**
|
|
4
|
+
* Functional DI container - no decorators, no reflection. `get()` resolves
|
|
5
|
+
* lazily and caches the instance for the container's lifetime; `register()`
|
|
6
|
+
* for an already-resolved token clears the cached instance, so a later
|
|
7
|
+
* `register()` (an overlay rebinding an adapter after the default plugin
|
|
8
|
+
* loads) always wins on the next `get()`. Resolving a token whose factory
|
|
9
|
+
* transitively depends on itself throws rather than recursing forever.
|
|
10
|
+
* `dispose()` runs every `onDispose` callback in REVERSE registration order -
|
|
11
|
+
* register dependencies before their dependents so teardown happens safely.
|
|
12
|
+
*/
|
|
3
13
|
export declare class Container {
|
|
4
14
|
private readonly factories;
|
|
5
15
|
private readonly instances;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../src/server/kernel/container.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAUxD,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,KAAK,CAAC,CAAC;AAE7C,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuC;IACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IACxD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IAEnE,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAK1D,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO;IAItC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../src/server/kernel/container.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAUxD,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,KAAK,CAAC,CAAC;AAE7C;;;;;;;;;GASG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuC;IACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IACxD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IAEnE,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;IAK1D,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO;IAItC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;IAsB7B,SAAS,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIzC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAK/B"}
|
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Functional DI container - no decorators, no reflection. `get()` resolves
|
|
3
|
+
* lazily and caches the instance for the container's lifetime; `register()`
|
|
4
|
+
* for an already-resolved token clears the cached instance, so a later
|
|
5
|
+
* `register()` (an overlay rebinding an adapter after the default plugin
|
|
6
|
+
* loads) always wins on the next `get()`. Resolving a token whose factory
|
|
7
|
+
* transitively depends on itself throws rather than recursing forever.
|
|
8
|
+
* `dispose()` runs every `onDispose` callback in REVERSE registration order -
|
|
9
|
+
* register dependencies before their dependents so teardown happens safely.
|
|
10
|
+
*/
|
|
1
11
|
export class Container {
|
|
2
12
|
factories = new Map();
|
|
3
13
|
instances = new Map();
|
|
@@ -11,8 +21,9 @@ export class Container {
|
|
|
11
21
|
return this.factories.has(token);
|
|
12
22
|
}
|
|
13
23
|
get(token) {
|
|
14
|
-
if (this.instances.has(token))
|
|
24
|
+
if (this.instances.has(token)) {
|
|
15
25
|
return this.instances.get(token);
|
|
26
|
+
}
|
|
16
27
|
const factory = this.factories.get(token);
|
|
17
28
|
if (!factory) {
|
|
18
29
|
throw new Error(`No provider registered for token "${token.description ?? String(token)}"`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../../src/server/kernel/container.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,SAAS;IACH,SAAS,GAAG,IAAI,GAAG,EAA4B,CAAC;IAChD,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAC;IACvC,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,SAAS,GAAsC,EAAE,CAAC;IAEnE,QAAQ,CAAI,KAAkB,EAAE,OAAmB;QACjD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,OAA2B,CAAC,CAAC;QACvD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,GAAG,CAAC,KAAwB;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,GAAG,CAAI,KAAkB;QACvB,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"container.js","sourceRoot":"","sources":["../../../src/server/kernel/container.ts"],"names":[],"mappings":"AAYA;;;;;;;;;GASG;AACH,MAAM,OAAO,SAAS;IACH,SAAS,GAAG,IAAI,GAAG,EAA4B,CAAC;IAChD,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAC;IACvC,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,SAAS,GAAsC,EAAE,CAAC;IAEnE,QAAQ,CAAI,KAAkB,EAAE,OAAmB;QACjD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,OAA2B,CAAC,CAAC;QACvD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,GAAG,CAAC,KAAwB;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,GAAG,CAAI,KAAkB;QACvB,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAM,CAAC;QACxC,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,qCAAqC,KAAK,CAAC,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9F,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CACb,wCAAwC,KAAK,CAAC,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAC9E,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAM,CAAC;QACpC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,SAAS,CAAC,EAA8B;QACtC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/C,MAAM,EAAE,EAAE,CAAC;QACb,CAAC;IACH,CAAC;CACF"}
|
|
@@ -10,6 +10,15 @@ export type EventBus = {
|
|
|
10
10
|
on(event: string, handler: EventHandler): () => void;
|
|
11
11
|
};
|
|
12
12
|
export declare const EVENT_BUS: Token<EventBus>;
|
|
13
|
+
/**
|
|
14
|
+
* Default in-process `MESSAGE_BROKER` - `publish` fans out synchronously to
|
|
15
|
+
* whatever's subscribed in THIS process only; it does not survive a restart
|
|
16
|
+
* and does not reach other replicas. An overlay rebinds `MESSAGE_BROKER` to a
|
|
17
|
+
* durable `MessageBrokerAdapter` (eg RabbitMQ via `AMQP_URL`) once events must
|
|
18
|
+
* cross a process boundary. `subscribe`'s returned unsubscribe function is
|
|
19
|
+
* safe to call mid-dispatch: the handler list is copied on write, never
|
|
20
|
+
* mutated in place.
|
|
21
|
+
*/
|
|
13
22
|
export declare class InMemoryBroker implements MessageBrokerAdapter {
|
|
14
23
|
private readonly handlers;
|
|
15
24
|
publish(envelope: EventEnvelope): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../../src/server/kernel/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,KAAK,EACV,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EAGrB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACxB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAInC,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI,CACtC,OAAO,EAAE,CAAC,EACV,QAAQ,CAAC,EAAE,aAAa,KACrB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAK1B,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAChF,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAS5C,iBAAiB,CAAC,CAAC,SAAS,eAAe,EACzC,EAAE,EAAE,OAAO,EACX,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,iBAAiB,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E,EAAE,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;IAClG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,IAAI,CAAC;CACtD,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,QAAQ,CAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../../src/server/kernel/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,KAAK,EACV,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EAGrB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACxB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAInC,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI,CACtC,OAAO,EAAE,CAAC,EACV,QAAQ,CAAC,EAAE,aAAa,KACrB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAK1B,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAChF,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAS5C,iBAAiB,CAAC,CAAC,SAAS,eAAe,EACzC,EAAE,EAAE,OAAO,EACX,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,iBAAiB,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E,EAAE,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;IAClG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,IAAI,CAAC;CACtD,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,QAAQ,CAA4B,CAAC;AAEnE;;;;;;;;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;AAkBD,iIAAiI;AACjI,wBAAgB,cAAc,CAC5B,MAAM,EAAE,oBAAoB,EAC5B,MAAM,GAAE,MAAkC,EAC1C,MAAM,CAAC,EAAE,YAAY,GACpB,QAAQ,CAyCV"}
|
|
@@ -2,7 +2,15 @@ import { createToken, domainEventSchemas, getEventVersion, } from '@openora/core
|
|
|
2
2
|
import { createLogger } from './logger.js';
|
|
3
3
|
import { getCurrentTraceId } from './request-context.js';
|
|
4
4
|
export const EVENT_BUS = createToken('EVENT_BUS');
|
|
5
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Default in-process `MESSAGE_BROKER` - `publish` fans out synchronously to
|
|
7
|
+
* whatever's subscribed in THIS process only; it does not survive a restart
|
|
8
|
+
* and does not reach other replicas. An overlay rebinds `MESSAGE_BROKER` to a
|
|
9
|
+
* durable `MessageBrokerAdapter` (eg RabbitMQ via `AMQP_URL`) once events must
|
|
10
|
+
* cross a process boundary. `subscribe`'s returned unsubscribe function is
|
|
11
|
+
* safe to call mid-dispatch: the handler list is copied on write, never
|
|
12
|
+
* mutated in place.
|
|
13
|
+
*/
|
|
6
14
|
export class InMemoryBroker {
|
|
7
15
|
handlers = new Map();
|
|
8
16
|
publish(envelope) {
|