@@ -207,6 +207,51 @@ async function loadConfig(env = process.env, vaultService = null) {
207207 emailQueue : env . RABBITMQ_EMAIL_QUEUE || 'substream_emails_queue' ,
208208 leaderboardQueue : env . RABBITMQ_LEADERBOARD_QUEUE || 'substream_leaderboard_queue' ,
209209 } ,
210+ // Isolated BullMQ queue configuration for on-chain Soroban subscription events.
211+ // Each event type gets its own queue with independently-tunable settings.
212+ sorobanQueues : {
213+ defaultMaxAttempts : Number ( env . SOROBAN_QUEUE_MAX_ATTEMPTS || 5 ) ,
214+ defaultBackoffDelay : Number ( env . SOROBAN_QUEUE_BACKOFF_DELAY_MS || 2000 ) ,
215+ defaultConcurrency : Number ( env . SOROBAN_QUEUE_DEFAULT_CONCURRENCY || 5 ) ,
216+ defaultRetainCompleted : Number ( env . SOROBAN_QUEUE_RETAIN_COMPLETED || 200 ) ,
217+ defaultRetainFailed : Number ( env . SOROBAN_QUEUE_RETAIN_FAILED || 100 ) ,
218+ SubscriptionBilled : {
219+ concurrency : Number ( env . SOROBAN_QUEUE_BILLED_CONCURRENCY || 10 ) ,
220+ maxAttempts : Number ( env . SOROBAN_QUEUE_BILLED_MAX_ATTEMPTS || 5 ) ,
221+ backoffDelay : Number ( env . SOROBAN_QUEUE_BILLED_BACKOFF_MS || 2000 ) ,
222+ rateLimiter : {
223+ max : Number ( env . SOROBAN_QUEUE_BILLED_RATE_MAX || 100 ) ,
224+ duration : Number ( env . SOROBAN_QUEUE_BILLED_RATE_WINDOW_MS || 10000 ) ,
225+ } ,
226+ } ,
227+ TrialStarted : {
228+ concurrency : Number ( env . SOROBAN_QUEUE_TRIAL_CONCURRENCY || 8 ) ,
229+ maxAttempts : Number ( env . SOROBAN_QUEUE_TRIAL_MAX_ATTEMPTS || 5 ) ,
230+ backoffDelay : Number ( env . SOROBAN_QUEUE_TRIAL_BACKOFF_MS || 2000 ) ,
231+ rateLimiter : {
232+ max : Number ( env . SOROBAN_QUEUE_TRIAL_RATE_MAX || 50 ) ,
233+ duration : Number ( env . SOROBAN_QUEUE_TRIAL_RATE_WINDOW_MS || 10000 ) ,
234+ } ,
235+ } ,
236+ PaymentFailed : {
237+ concurrency : Number ( env . SOROBAN_QUEUE_PAYMENT_FAILED_CONCURRENCY || 4 ) ,
238+ maxAttempts : Number ( env . SOROBAN_QUEUE_PAYMENT_FAILED_MAX_ATTEMPTS || 7 ) ,
239+ backoffDelay : Number ( env . SOROBAN_QUEUE_PAYMENT_FAILED_BACKOFF_MS || 5000 ) ,
240+ rateLimiter : {
241+ max : Number ( env . SOROBAN_QUEUE_PAYMENT_FAILED_RATE_MAX || 30 ) ,
242+ duration : Number ( env . SOROBAN_QUEUE_PAYMENT_FAILED_RATE_WINDOW_MS || 10000 ) ,
243+ } ,
244+ } ,
245+ PaymentFailedGracePeriodStarted : {
246+ concurrency : Number ( env . SOROBAN_QUEUE_GRACE_PERIOD_CONCURRENCY || 4 ) ,
247+ maxAttempts : Number ( env . SOROBAN_QUEUE_GRACE_PERIOD_MAX_ATTEMPTS || 7 ) ,
248+ backoffDelay : Number ( env . SOROBAN_QUEUE_GRACE_PERIOD_BACKOFF_MS || 5000 ) ,
249+ rateLimiter : {
250+ max : Number ( env . SOROBAN_QUEUE_GRACE_PERIOD_RATE_MAX || 30 ) ,
251+ duration : Number ( env . SOROBAN_QUEUE_GRACE_PERIOD_RATE_WINDOW_MS || 10000 ) ,
252+ } ,
253+ } ,
254+ } ,
210255 substream : {
211256 baseDomain : env . SUBSTREAM_BASE_DOMAIN || 'substream.app' ,
212257 backendUrl : env . SUBSTREAM_BACKEND_URL || 'http://localhost:3000' ,
0 commit comments