alepha 0.13.0 → 0.13.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/api-files/index.d.ts +28 -91
- package/dist/api-files/index.js +10 -755
- package/dist/api-files/index.js.map +1 -1
- package/dist/api-jobs/index.d.ts +67 -67
- package/dist/api-jobs/index.js +13 -13
- package/dist/api-jobs/index.js.map +1 -1
- package/dist/api-notifications/index.d.ts +129 -146
- package/dist/api-notifications/index.js +17 -39
- package/dist/api-notifications/index.js.map +1 -1
- package/dist/api-parameters/index.d.ts +21 -22
- package/dist/api-parameters/index.js +22 -22
- package/dist/api-parameters/index.js.map +1 -1
- package/dist/api-users/index.d.ts +224 -2001
- package/dist/api-users/index.js +914 -4787
- package/dist/api-users/index.js.map +1 -1
- package/dist/api-verifications/index.d.ts +96 -96
- package/dist/batch/index.d.ts +13 -13
- package/dist/batch/index.js +8 -8
- package/dist/batch/index.js.map +1 -1
- package/dist/bucket/index.d.ts +14 -14
- package/dist/bucket/index.js +12 -12
- package/dist/bucket/index.js.map +1 -1
- package/dist/cache/index.d.ts +11 -11
- package/dist/cache/index.js +9 -9
- package/dist/cache/index.js.map +1 -1
- package/dist/cli/{dist-Sz2EXvQX.cjs → dist-Dl9Vl7Ur.js} +17 -13
- package/dist/cli/{dist-BBPjuQ56.js.map → dist-Dl9Vl7Ur.js.map} +1 -1
- package/dist/cli/index.d.ts +31 -37
- package/dist/cli/index.js +152 -83
- package/dist/cli/index.js.map +1 -1
- package/dist/command/index.d.ts +19 -19
- package/dist/command/index.js +25 -25
- package/dist/command/index.js.map +1 -1
- package/dist/core/index.browser.js +218 -218
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +232 -232
- package/dist/core/index.js +218 -218
- package/dist/core/index.js.map +1 -1
- package/dist/core/{index.cjs → index.native.js} +304 -455
- package/dist/core/index.native.js.map +1 -0
- package/dist/datetime/index.d.ts +9 -9
- package/dist/datetime/index.js +7 -7
- package/dist/datetime/index.js.map +1 -1
- package/dist/email/index.d.ts +16 -16
- package/dist/email/index.js +80 -82
- package/dist/email/index.js.map +1 -1
- package/dist/file/index.js +1 -1
- package/dist/file/index.js.map +1 -1
- package/dist/lock/index.d.ts +9 -9
- package/dist/lock/index.js +8 -8
- package/dist/lock/index.js.map +1 -1
- package/dist/lock-redis/index.js +3 -66
- package/dist/lock-redis/index.js.map +1 -1
- package/dist/logger/index.d.ts +5 -5
- package/dist/logger/index.js +8 -8
- package/dist/logger/index.js.map +1 -1
- package/dist/orm/index.browser.js +114 -114
- package/dist/orm/index.browser.js.map +1 -1
- package/dist/orm/index.d.ts +219 -219
- package/dist/orm/index.js +46 -46
- package/dist/orm/index.js.map +1 -1
- package/dist/queue/index.d.ts +25 -25
- package/dist/queue/index.js +20 -20
- package/dist/queue/index.js.map +1 -1
- package/dist/queue-redis/index.d.ts +2 -2
- package/dist/redis/index.d.ts +10 -10
- package/dist/retry/index.d.ts +20 -20
- package/dist/retry/index.js +9 -9
- package/dist/retry/index.js.map +1 -1
- package/dist/scheduler/index.d.ts +12 -12
- package/dist/scheduler/index.js +9 -9
- package/dist/scheduler/index.js.map +1 -1
- package/dist/security/index.d.ts +53 -53
- package/dist/security/index.js +32 -32
- package/dist/security/index.js.map +1 -1
- package/dist/server/index.browser.js +1 -1
- package/dist/server/index.browser.js.map +1 -1
- package/dist/server/index.d.ts +101 -101
- package/dist/server/index.js +17 -17
- package/dist/server/index.js.map +1 -1
- package/dist/server-auth/index.browser.js +4 -982
- package/dist/server-auth/index.browser.js.map +1 -1
- package/dist/server-auth/index.d.ts +204 -785
- package/dist/server-auth/index.js +47 -1239
- package/dist/server-auth/index.js.map +1 -1
- package/dist/server-cache/index.d.ts +10 -10
- package/dist/server-cache/index.js +2 -2
- package/dist/server-cache/index.js.map +1 -1
- package/dist/server-compress/index.d.ts +4 -4
- package/dist/server-compress/index.js +1 -1
- package/dist/server-compress/index.js.map +1 -1
- package/dist/server-cookies/index.browser.js +8 -8
- package/dist/server-cookies/index.browser.js.map +1 -1
- package/dist/server-cookies/index.d.ts +17 -17
- package/dist/server-cookies/index.js +10 -10
- package/dist/server-cookies/index.js.map +1 -1
- package/dist/server-cors/index.d.ts +17 -17
- package/dist/server-cors/index.js +9 -9
- package/dist/server-cors/index.js.map +1 -1
- package/dist/server-health/index.d.ts +2 -2
- package/dist/server-helmet/index.d.ts +1 -1
- package/dist/server-links/index.browser.js +12 -12
- package/dist/server-links/index.browser.js.map +1 -1
- package/dist/server-links/index.d.ts +59 -251
- package/dist/server-links/index.js +23 -502
- package/dist/server-links/index.js.map +1 -1
- package/dist/server-metrics/index.d.ts +4 -4
- package/dist/server-metrics/index.js +170 -174
- package/dist/server-metrics/index.js.map +1 -1
- package/dist/server-multipart/index.d.ts +2 -2
- package/dist/server-proxy/index.d.ts +12 -12
- package/dist/server-proxy/index.js +10 -10
- package/dist/server-proxy/index.js.map +1 -1
- package/dist/server-rate-limit/index.d.ts +22 -22
- package/dist/server-rate-limit/index.js +12 -12
- package/dist/server-rate-limit/index.js.map +1 -1
- package/dist/server-security/index.d.ts +24 -24
- package/dist/server-security/index.js +15 -15
- package/dist/server-security/index.js.map +1 -1
- package/dist/server-static/index.d.ts +14 -14
- package/dist/server-static/index.js +8 -8
- package/dist/server-static/index.js.map +1 -1
- package/dist/server-swagger/index.d.ts +25 -184
- package/dist/server-swagger/index.js +21 -724
- package/dist/server-swagger/index.js.map +1 -1
- package/dist/sms/index.d.ts +14 -14
- package/dist/sms/index.js +9 -9
- package/dist/sms/index.js.map +1 -1
- package/dist/thread/index.d.ts +11 -11
- package/dist/thread/index.js +17 -17
- package/dist/thread/index.js.map +1 -1
- package/dist/topic/index.d.ts +26 -26
- package/dist/topic/index.js +16 -16
- package/dist/topic/index.js.map +1 -1
- package/dist/topic-redis/index.d.ts +1 -1
- package/dist/vite/index.d.ts +3 -3
- package/dist/vite/index.js +12 -13
- package/dist/vite/index.js.map +1 -1
- package/dist/websocket/index.browser.js +11 -11
- package/dist/websocket/index.browser.js.map +1 -1
- package/dist/websocket/index.d.ts +51 -51
- package/dist/websocket/index.js +13 -13
- package/dist/websocket/index.js.map +1 -1
- package/package.json +62 -52
- package/src/api-files/services/FileService.ts +5 -7
- package/src/api-jobs/index.ts +1 -1
- package/src/api-jobs/{descriptors → primitives}/$job.ts +8 -8
- package/src/api-jobs/providers/JobProvider.ts +9 -9
- package/src/api-jobs/services/JobService.ts +5 -5
- package/src/api-notifications/index.ts +5 -15
- package/src/api-notifications/{descriptors → primitives}/$notification.ts +10 -10
- package/src/api-notifications/services/NotificationSenderService.ts +3 -3
- package/src/api-parameters/index.ts +1 -1
- package/src/api-parameters/{descriptors → primitives}/$config.ts +7 -12
- package/src/api-users/index.ts +1 -1
- package/src/api-users/{descriptors → primitives}/$userRealm.ts +8 -8
- package/src/api-users/providers/UserRealmProvider.ts +1 -1
- package/src/batch/index.ts +3 -3
- package/src/batch/{descriptors → primitives}/$batch.ts +13 -16
- package/src/bucket/index.ts +8 -8
- package/src/bucket/{descriptors → primitives}/$bucket.ts +8 -8
- package/src/bucket/providers/LocalFileStorageProvider.ts +3 -3
- package/src/cache/index.ts +4 -4
- package/src/cache/{descriptors → primitives}/$cache.ts +15 -15
- package/src/cli/apps/AlephaPackageBuilderCli.ts +30 -3
- package/src/cli/assets/appRouterTs.ts +9 -0
- package/src/cli/assets/indexHtml.ts +2 -1
- package/src/cli/assets/mainBrowserTs.ts +10 -0
- package/src/cli/commands/CoreCommands.ts +6 -5
- package/src/cli/commands/DrizzleCommands.ts +69 -61
- package/src/cli/commands/VerifyCommands.ts +2 -2
- package/src/cli/commands/ViteCommands.ts +6 -1
- package/src/cli/services/ProjectUtils.ts +78 -41
- package/src/command/index.ts +5 -5
- package/src/command/{descriptors → primitives}/$command.ts +9 -12
- package/src/command/providers/CliProvider.ts +10 -10
- package/src/core/Alepha.ts +30 -33
- package/src/core/constants/KIND.ts +1 -1
- package/src/core/constants/OPTIONS.ts +1 -1
- package/src/core/helpers/{descriptor.ts → primitive.ts} +18 -18
- package/src/core/helpers/ref.ts +1 -1
- package/src/core/index.shared.ts +8 -8
- package/src/core/{descriptors → primitives}/$context.ts +5 -5
- package/src/core/{descriptors → primitives}/$hook.ts +4 -4
- package/src/core/{descriptors → primitives}/$inject.ts +2 -2
- package/src/core/{descriptors → primitives}/$module.ts +9 -9
- package/src/core/{descriptors → primitives}/$use.ts +2 -2
- package/src/core/providers/CodecManager.ts +1 -1
- package/src/core/providers/JsonSchemaCodec.ts +1 -1
- package/src/core/providers/StateManager.ts +2 -2
- package/src/datetime/index.ts +3 -3
- package/src/datetime/{descriptors → primitives}/$interval.ts +6 -6
- package/src/email/index.ts +4 -4
- package/src/email/{descriptors → primitives}/$email.ts +8 -8
- package/src/file/index.ts +1 -1
- package/src/lock/index.ts +3 -3
- package/src/lock/{descriptors → primitives}/$lock.ts +10 -10
- package/src/logger/index.ts +8 -8
- package/src/logger/{descriptors → primitives}/$logger.ts +2 -2
- package/src/logger/services/Logger.ts +1 -1
- package/src/orm/constants/PG_SYMBOLS.ts +2 -2
- package/src/orm/index.browser.ts +2 -2
- package/src/orm/index.ts +8 -8
- package/src/orm/{descriptors → primitives}/$entity.ts +11 -11
- package/src/orm/{descriptors → primitives}/$repository.ts +2 -2
- package/src/orm/{descriptors → primitives}/$sequence.ts +8 -8
- package/src/orm/{descriptors → primitives}/$transaction.ts +4 -4
- package/src/orm/providers/DrizzleKitProvider.ts +1 -1
- package/src/orm/providers/PostgresTypeProvider.ts +3 -3
- package/src/orm/providers/RepositoryProvider.ts +4 -4
- package/src/orm/providers/drivers/DatabaseProvider.ts +7 -7
- package/src/orm/services/ModelBuilder.ts +9 -9
- package/src/orm/services/PgRelationManager.ts +2 -2
- package/src/orm/services/PostgresModelBuilder.ts +5 -5
- package/src/orm/services/Repository.ts +7 -7
- package/src/orm/services/SqliteModelBuilder.ts +5 -5
- package/src/queue/index.ts +7 -7
- package/src/queue/{descriptors → primitives}/$consumer.ts +15 -15
- package/src/queue/{descriptors → primitives}/$queue.ts +12 -12
- package/src/queue/providers/WorkerProvider.ts +7 -7
- package/src/retry/index.ts +3 -3
- package/src/retry/{descriptors → primitives}/$retry.ts +19 -17
- package/src/scheduler/index.ts +3 -3
- package/src/scheduler/{descriptors → primitives}/$scheduler.ts +9 -9
- package/src/scheduler/providers/CronProvider.ts +1 -1
- package/src/security/index.ts +9 -9
- package/src/security/{descriptors → primitives}/$permission.ts +7 -7
- package/src/security/{descriptors → primitives}/$realm.ts +6 -12
- package/src/security/{descriptors → primitives}/$role.ts +12 -12
- package/src/security/{descriptors → primitives}/$serviceAccount.ts +8 -8
- package/src/server/index.browser.ts +1 -1
- package/src/server/index.ts +14 -14
- package/src/server/{descriptors → primitives}/$action.ts +13 -13
- package/src/server/{descriptors → primitives}/$route.ts +9 -9
- package/src/server/providers/NodeHttpServerProvider.ts +2 -2
- package/src/server/services/HttpClient.ts +1 -1
- package/src/server-auth/index.browser.ts +1 -1
- package/src/server-auth/index.ts +6 -6
- package/src/server-auth/{descriptors → primitives}/$auth.ts +10 -10
- package/src/server-auth/{descriptors → primitives}/$authCredentials.ts +4 -4
- package/src/server-auth/{descriptors → primitives}/$authGithub.ts +4 -4
- package/src/server-auth/{descriptors → primitives}/$authGoogle.ts +4 -4
- package/src/server-auth/providers/ServerAuthProvider.ts +4 -4
- package/src/server-cache/providers/ServerCacheProvider.ts +7 -7
- package/src/server-compress/providers/ServerCompressProvider.ts +3 -3
- package/src/server-cookies/index.browser.ts +2 -2
- package/src/server-cookies/index.ts +5 -5
- package/src/server-cookies/{descriptors → primitives}/$cookie.browser.ts +12 -12
- package/src/server-cookies/{descriptors → primitives}/$cookie.ts +13 -13
- package/src/server-cookies/providers/ServerCookiesProvider.ts +4 -4
- package/src/server-cookies/services/CookieParser.ts +1 -1
- package/src/server-cors/index.ts +3 -3
- package/src/server-cors/{descriptors → primitives}/$cors.ts +11 -13
- package/src/server-cors/providers/ServerCorsProvider.ts +5 -5
- package/src/server-links/index.browser.ts +5 -5
- package/src/server-links/index.ts +9 -9
- package/src/server-links/{descriptors → primitives}/$remote.ts +11 -11
- package/src/server-links/providers/LinkProvider.ts +7 -7
- package/src/server-links/providers/{RemoteDescriptorProvider.ts → RemotePrimitiveProvider.ts} +6 -6
- package/src/server-links/providers/ServerLinksProvider.ts +3 -3
- package/src/server-proxy/index.ts +3 -3
- package/src/server-proxy/{descriptors → primitives}/$proxy.ts +8 -8
- package/src/server-proxy/providers/ServerProxyProvider.ts +4 -4
- package/src/server-rate-limit/index.ts +6 -6
- package/src/server-rate-limit/{descriptors → primitives}/$rateLimit.ts +13 -13
- package/src/server-rate-limit/providers/ServerRateLimitProvider.ts +5 -5
- package/src/server-security/index.ts +3 -3
- package/src/server-security/{descriptors → primitives}/$basicAuth.ts +13 -13
- package/src/server-security/providers/ServerBasicAuthProvider.ts +5 -5
- package/src/server-security/providers/ServerSecurityProvider.ts +4 -4
- package/src/server-static/index.ts +3 -3
- package/src/server-static/{descriptors → primitives}/$serve.ts +8 -10
- package/src/server-static/providers/ServerStaticProvider.ts +6 -6
- package/src/server-swagger/index.ts +5 -5
- package/src/server-swagger/{descriptors → primitives}/$swagger.ts +9 -9
- package/src/server-swagger/providers/ServerSwaggerProvider.ts +11 -10
- package/src/sms/index.ts +4 -4
- package/src/sms/{descriptors → primitives}/$sms.ts +8 -8
- package/src/thread/index.ts +3 -3
- package/src/thread/{descriptors → primitives}/$thread.ts +13 -13
- package/src/thread/providers/ThreadProvider.ts +7 -9
- package/src/topic/index.ts +5 -5
- package/src/topic/{descriptors → primitives}/$subscriber.ts +14 -14
- package/src/topic/{descriptors → primitives}/$topic.ts +10 -10
- package/src/topic/providers/TopicProvider.ts +4 -4
- package/src/vite/helpers/boot.ts +3 -3
- package/src/vite/tasks/copyAssets.ts +1 -1
- package/src/vite/tasks/generateSitemap.ts +3 -3
- package/src/vite/tasks/prerenderPages.ts +2 -2
- package/src/vite/tasks/runAlepha.ts +2 -2
- package/src/websocket/index.browser.ts +3 -3
- package/src/websocket/index.shared.ts +2 -2
- package/src/websocket/index.ts +4 -4
- package/src/websocket/interfaces/WebSocketInterfaces.ts +3 -3
- package/src/websocket/{descriptors → primitives}/$channel.ts +10 -10
- package/src/websocket/{descriptors → primitives}/$websocket.ts +8 -8
- package/src/websocket/providers/NodeWebSocketServerProvider.ts +7 -7
- package/src/websocket/providers/WebSocketServerProvider.ts +3 -3
- package/src/websocket/services/WebSocketClient.ts +5 -5
- package/dist/api-files/index.cjs +0 -1293
- package/dist/api-files/index.cjs.map +0 -1
- package/dist/api-files/index.d.cts +0 -829
- package/dist/api-jobs/index.cjs +0 -274
- package/dist/api-jobs/index.cjs.map +0 -1
- package/dist/api-jobs/index.d.cts +0 -654
- package/dist/api-notifications/index.cjs +0 -380
- package/dist/api-notifications/index.cjs.map +0 -1
- package/dist/api-notifications/index.d.cts +0 -289
- package/dist/api-parameters/index.cjs +0 -66
- package/dist/api-parameters/index.cjs.map +0 -1
- package/dist/api-parameters/index.d.cts +0 -84
- package/dist/api-users/index.cjs +0 -6009
- package/dist/api-users/index.cjs.map +0 -1
- package/dist/api-users/index.d.cts +0 -4740
- package/dist/api-verifications/index.cjs +0 -407
- package/dist/api-verifications/index.cjs.map +0 -1
- package/dist/api-verifications/index.d.cts +0 -207
- package/dist/batch/index.cjs +0 -408
- package/dist/batch/index.cjs.map +0 -1
- package/dist/batch/index.d.cts +0 -330
- package/dist/bin/index.cjs +0 -17
- package/dist/bin/index.cjs.map +0 -1
- package/dist/bin/index.d.cts +0 -1
- package/dist/bucket/index.cjs +0 -303
- package/dist/bucket/index.cjs.map +0 -1
- package/dist/bucket/index.d.cts +0 -355
- package/dist/cache/index.cjs +0 -241
- package/dist/cache/index.cjs.map +0 -1
- package/dist/cache/index.d.cts +0 -202
- package/dist/cache-redis/index.cjs +0 -84
- package/dist/cache-redis/index.cjs.map +0 -1
- package/dist/cache-redis/index.d.cts +0 -40
- package/dist/cli/chunk-DSlc6foC.cjs +0 -43
- package/dist/cli/dist-BBPjuQ56.js +0 -2778
- package/dist/cli/dist-Sz2EXvQX.cjs.map +0 -1
- package/dist/cli/index.cjs +0 -1241
- package/dist/cli/index.cjs.map +0 -1
- package/dist/cli/index.d.cts +0 -422
- package/dist/command/index.cjs +0 -693
- package/dist/command/index.cjs.map +0 -1
- package/dist/command/index.d.cts +0 -340
- package/dist/core/index.cjs.map +0 -1
- package/dist/core/index.d.cts +0 -1927
- package/dist/datetime/index.cjs +0 -318
- package/dist/datetime/index.cjs.map +0 -1
- package/dist/datetime/index.d.cts +0 -145
- package/dist/email/index.cjs +0 -10874
- package/dist/email/index.cjs.map +0 -1
- package/dist/email/index.d.cts +0 -186
- package/dist/fake/index.cjs +0 -34641
- package/dist/fake/index.cjs.map +0 -1
- package/dist/fake/index.d.cts +0 -74
- package/dist/file/index.cjs +0 -1212
- package/dist/file/index.cjs.map +0 -1
- package/dist/file/index.d.cts +0 -698
- package/dist/lock/index.cjs +0 -226
- package/dist/lock/index.cjs.map +0 -1
- package/dist/lock/index.d.cts +0 -361
- package/dist/lock-redis/index.cjs +0 -113
- package/dist/lock-redis/index.cjs.map +0 -1
- package/dist/lock-redis/index.d.cts +0 -24
- package/dist/logger/index.cjs +0 -521
- package/dist/logger/index.cjs.map +0 -1
- package/dist/logger/index.d.cts +0 -281
- package/dist/orm/index.cjs +0 -2986
- package/dist/orm/index.cjs.map +0 -1
- package/dist/orm/index.d.cts +0 -2213
- package/dist/queue/index.cjs +0 -1044
- package/dist/queue/index.cjs.map +0 -1
- package/dist/queue/index.d.cts +0 -1265
- package/dist/queue-redis/index.cjs +0 -873
- package/dist/queue-redis/index.cjs.map +0 -1
- package/dist/queue-redis/index.d.cts +0 -82
- package/dist/redis/index.cjs +0 -153
- package/dist/redis/index.cjs.map +0 -1
- package/dist/redis/index.d.cts +0 -82
- package/dist/retry/index.cjs +0 -146
- package/dist/retry/index.cjs.map +0 -1
- package/dist/retry/index.d.cts +0 -172
- package/dist/router/index.cjs +0 -111
- package/dist/router/index.cjs.map +0 -1
- package/dist/router/index.d.cts +0 -46
- package/dist/scheduler/index.cjs +0 -576
- package/dist/scheduler/index.cjs.map +0 -1
- package/dist/scheduler/index.d.cts +0 -145
- package/dist/security/index.cjs +0 -2402
- package/dist/security/index.cjs.map +0 -1
- package/dist/security/index.d.cts +0 -598
- package/dist/server/index.cjs +0 -1680
- package/dist/server/index.cjs.map +0 -1
- package/dist/server/index.d.cts +0 -810
- package/dist/server-auth/index.cjs +0 -3146
- package/dist/server-auth/index.cjs.map +0 -1
- package/dist/server-auth/index.d.cts +0 -1164
- package/dist/server-cache/index.cjs +0 -252
- package/dist/server-cache/index.cjs.map +0 -1
- package/dist/server-cache/index.d.cts +0 -164
- package/dist/server-compress/index.cjs +0 -141
- package/dist/server-compress/index.cjs.map +0 -1
- package/dist/server-compress/index.d.cts +0 -38
- package/dist/server-cookies/index.cjs +0 -234
- package/dist/server-cookies/index.cjs.map +0 -1
- package/dist/server-cookies/index.d.cts +0 -144
- package/dist/server-cors/index.cjs +0 -201
- package/dist/server-cors/index.cjs.map +0 -1
- package/dist/server-cors/index.d.cts +0 -140
- package/dist/server-health/index.cjs +0 -62
- package/dist/server-health/index.cjs.map +0 -1
- package/dist/server-health/index.d.cts +0 -58
- package/dist/server-helmet/index.cjs +0 -131
- package/dist/server-helmet/index.cjs.map +0 -1
- package/dist/server-helmet/index.d.cts +0 -97
- package/dist/server-links/index.cjs +0 -992
- package/dist/server-links/index.cjs.map +0 -1
- package/dist/server-links/index.d.cts +0 -513
- package/dist/server-metrics/index.cjs +0 -4535
- package/dist/server-metrics/index.cjs.map +0 -1
- package/dist/server-metrics/index.d.cts +0 -35
- package/dist/server-multipart/index.cjs +0 -237
- package/dist/server-multipart/index.cjs.map +0 -1
- package/dist/server-multipart/index.d.cts +0 -50
- package/dist/server-proxy/index.cjs +0 -186
- package/dist/server-proxy/index.cjs.map +0 -1
- package/dist/server-proxy/index.d.cts +0 -234
- package/dist/server-rate-limit/index.cjs +0 -241
- package/dist/server-rate-limit/index.cjs.map +0 -1
- package/dist/server-rate-limit/index.d.cts +0 -183
- package/dist/server-security/index.cjs +0 -316
- package/dist/server-security/index.cjs.map +0 -1
- package/dist/server-security/index.d.cts +0 -173
- package/dist/server-static/index.cjs +0 -170
- package/dist/server-static/index.cjs.map +0 -1
- package/dist/server-static/index.d.cts +0 -121
- package/dist/server-swagger/index.cjs +0 -1021
- package/dist/server-swagger/index.cjs.map +0 -1
- package/dist/server-swagger/index.d.cts +0 -382
- package/dist/sms/index.cjs +0 -221
- package/dist/sms/index.cjs.map +0 -1
- package/dist/sms/index.d.cts +0 -130
- package/dist/thread/index.cjs +0 -350
- package/dist/thread/index.cjs.map +0 -1
- package/dist/thread/index.d.cts +0 -260
- package/dist/topic/index.cjs +0 -282
- package/dist/topic/index.cjs.map +0 -1
- package/dist/topic/index.d.cts +0 -523
- package/dist/topic-redis/index.cjs +0 -71
- package/dist/topic-redis/index.cjs.map +0 -1
- package/dist/topic-redis/index.d.cts +0 -42
- package/dist/vite/index.cjs +0 -1077
- package/dist/vite/index.cjs.map +0 -1
- package/dist/vite/index.d.cts +0 -542
- package/dist/websocket/index.cjs +0 -1117
- package/dist/websocket/index.cjs.map +0 -1
- package/dist/websocket/index.d.cts +0 -861
- package/src/api-notifications/providers/MemorySmsProvider.ts +0 -20
- package/src/api-notifications/providers/SmsProvider.ts +0 -8
- /package/src/core/{descriptors → primitives}/$atom.ts +0 -0
- /package/src/core/{descriptors → primitives}/$env.ts +0 -0
- /package/src/server-auth/{descriptors → primitives}/$authApple.ts +0 -0
- /package/src/server-links/{descriptors → primitives}/$client.ts +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["t","QueueProvider","RedisProvider","job: QueueJob<T>","result: Record<string, string>","jobIds: string[]","jobs: QueueJob[]","stalledJobIds: string[]","alepha","QueueProvider","AlephaQueue"],"sources":["../../src/queue-redis/providers/RedisQueueProvider.ts","../../src/queue-redis/index.ts"],"sourcesContent":["import { $env, $hook, $inject, type Static, t } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport {\n type QueueAcquiredJob,\n type QueueCleanOptions,\n type QueueGetJobsOptions,\n type QueueJob,\n type QueueJobCounts,\n type QueueJobOptions,\n type QueueJobStatus,\n QueueProvider,\n} from \"alepha/queue\";\nimport { type RedisClient, RedisProvider } from \"alepha/redis\";\n\n// Default job options\nconst DEFAULT_MAX_ATTEMPTS = 1;\nconst DEFAULT_LOCK_DURATION = 30000; // 30 seconds\nconst DEFAULT_BACKOFF_DELAY = 1000; // 1 second\nconst DEFAULT_BACKOFF_MAX_DELAY = 30000; // 30 seconds\n\nconst envSchema = t.object({\n REDIS_QUEUE_PREFIX: t.text({\n default: \"queue\",\n }),\n});\n\n// Lua script for atomic job acquisition\n// This script atomically:\n// 1. Gets the highest priority job from waiting ZSET\n// 2. Removes it from waiting\n// 3. Adds it to active SET\n// 4. Updates job state in HASH\n// Returns: job data as JSON string, or nil if no job available\nconst ACQUIRE_JOB_SCRIPT = `\nlocal waitingKey = KEYS[1]\nlocal activeKey = KEYS[2]\nlocal jobKeyPrefix = KEYS[3]\nlocal workerId = ARGV[1]\nlocal now = tonumber(ARGV[2])\nlocal lockDuration = tonumber(ARGV[3])\n\n-- Get highest priority job (lowest score)\nlocal jobs = redis.call('ZRANGE', waitingKey, 0, 0)\nif #jobs == 0 then\n return nil\nend\n\nlocal jobId = jobs[1]\nlocal jobKey = jobKeyPrefix .. ':' .. jobId\n\n-- Remove from waiting (atomic check)\nlocal removed = redis.call('ZREM', waitingKey, jobId)\nif removed == 0 then\n return nil\nend\n\n-- Get current job data\nlocal jobData = redis.call('HGETALL', jobKey)\nif #jobData == 0 then\n return nil\nend\n\n-- Parse job data into table\nlocal job = {}\nfor i = 1, #jobData, 2 do\n job[jobData[i]] = jobData[i + 1]\nend\n\n-- Parse current state\nlocal state = cjson.decode(job['state'])\nlocal options = cjson.decode(job['options'])\n\n-- Update state\nstate['status'] = 'active'\nstate['attempts'] = state['attempts'] + 1\nstate['lockedBy'] = workerId\nstate['lockedUntil'] = now + (options['lockDuration'] or lockDuration)\nstate['processedAt'] = now\n\n-- Save updated state\nredis.call('HSET', jobKey, 'state', cjson.encode(state))\n\n-- Add to active set\nredis.call('SADD', activeKey, jobId)\n\n-- Return job data\nreturn cjson.encode({\n id = job['id'],\n queue = job['queue'],\n payload = cjson.decode(job['payload']),\n options = options,\n state = state\n})\n`;\n\n// Lua script for completing a job with removeOnComplete support\nconst COMPLETE_JOB_SCRIPT = `\nlocal jobKey = KEYS[1]\nlocal activeKey = KEYS[2]\nlocal completedKey = KEYS[3]\nlocal jobId = ARGV[1]\nlocal now = tonumber(ARGV[2])\nlocal result = ARGV[3]\n\n-- Get job data\nlocal jobData = redis.call('HGETALL', jobKey)\nif #jobData == 0 then\n return nil\nend\n\n-- Parse job data\nlocal job = {}\nfor i = 1, #jobData, 2 do\n job[jobData[i]] = jobData[i + 1]\nend\n\nlocal state = cjson.decode(job['state'])\nlocal options = cjson.decode(job['options'])\nlocal processedAt = state['processedAt'] or now\n\n-- Remove from active\nredis.call('SREM', activeKey, jobId)\n\n-- Update state\nstate['status'] = 'completed'\nstate['completedAt'] = now\nstate['result'] = result ~= '' and cjson.decode(result) or nil\nstate['lockedBy'] = nil\nstate['lockedUntil'] = nil\n\nlocal removeOnComplete = options['removeOnComplete']\n\nif removeOnComplete == true then\n -- Remove job immediately\n redis.call('DEL', jobKey)\n return cjson.encode({ removed = true, duration = now - processedAt })\nelse\n -- Update job state\n redis.call('HSET', jobKey, 'state', cjson.encode(state))\n\n -- Add to completed list (newest first)\n redis.call('LPUSH', completedKey, jobId)\n\n -- If removeOnComplete is a number, trim the list (0 means keep none)\n if type(removeOnComplete) == 'number' and removeOnComplete >= 0 then\n -- Get jobs to remove\n local toRemove = redis.call('LRANGE', completedKey, removeOnComplete, -1)\n for _, oldJobId in ipairs(toRemove) do\n redis.call('DEL', jobKey:gsub(jobId, oldJobId))\n end\n redis.call('LTRIM', completedKey, 0, removeOnComplete - 1)\n end\n\n return cjson.encode({ removed = false, duration = now - processedAt })\nend\n`;\n\n// Lua script for failing a job with retry support\nconst FAIL_JOB_SCRIPT = `\nlocal jobKey = KEYS[1]\nlocal activeKey = KEYS[2]\nlocal delayedKey = KEYS[3]\nlocal failedKey = KEYS[4]\nlocal jobId = ARGV[1]\nlocal now = tonumber(ARGV[2])\nlocal errorMsg = ARGV[3]\nlocal stackTrace = ARGV[4]\nlocal backoffDelay = tonumber(ARGV[5])\n\n-- Get job data\nlocal jobData = redis.call('HGETALL', jobKey)\nif #jobData == 0 then\n return nil\nend\n\n-- Parse job data\nlocal job = {}\nfor i = 1, #jobData, 2 do\n job[jobData[i]] = jobData[i + 1]\nend\n\nlocal state = cjson.decode(job['state'])\nlocal options = cjson.decode(job['options'])\n\n-- Remove from active\nredis.call('SREM', activeKey, jobId)\n\nlocal maxAttempts = options['maxAttempts'] or 1\nlocal hasMoreAttempts = state['attempts'] < maxAttempts\n\nif hasMoreAttempts then\n -- Schedule for retry\n state['status'] = 'delayed'\n state['availableAt'] = now + backoffDelay\n state['error'] = errorMsg\n state['stackTrace'] = stackTrace ~= '' and stackTrace or nil\n state['lockedBy'] = nil\n state['lockedUntil'] = nil\n\n redis.call('HSET', jobKey, 'state', cjson.encode(state))\n redis.call('ZADD', delayedKey, now + backoffDelay, jobId)\n\n return cjson.encode({ status = 'retrying', delay = backoffDelay, attempt = state['attempts'] + 1 })\nelse\n -- Permanently failed\n state['status'] = 'failed'\n state['failedAt'] = now\n state['error'] = errorMsg\n state['stackTrace'] = stackTrace ~= '' and stackTrace or nil\n state['lockedBy'] = nil\n state['lockedUntil'] = nil\n\n local removeOnFail = options['removeOnFail']\n\n if removeOnFail == true then\n redis.call('DEL', jobKey)\n return cjson.encode({ status = 'failed', removed = true, attempts = state['attempts'] })\n else\n redis.call('HSET', jobKey, 'state', cjson.encode(state))\n redis.call('LPUSH', failedKey, jobId)\n\n if type(removeOnFail) == 'number' and removeOnFail >= 0 then\n local toRemove = redis.call('LRANGE', failedKey, removeOnFail, -1)\n for _, oldJobId in ipairs(toRemove) do\n redis.call('DEL', jobKey:gsub(jobId, oldJobId))\n end\n redis.call('LTRIM', failedKey, 0, removeOnFail - 1)\n end\n\n return cjson.encode({ status = 'failed', removed = false, attempts = state['attempts'] })\n end\nend\n`;\n\n/**\n * Redis-based queue provider with full job support.\n *\n * Features:\n * - Atomic job acquisition using Lua scripts\n * - Blocking wait using Redis BZPOPMIN (no polling)\n * - Event emission for job lifecycle\n * - removeOnComplete/removeOnFail support\n *\n * Uses the following Redis data structures:\n * - HASH `{prefix}:job:{queue}:{id}` - Job data\n * - ZSET `{prefix}:waiting:{queue}` - Waiting jobs (score = priority)\n * - ZSET `{prefix}:delayed:{queue}` - Delayed jobs (score = availableAt timestamp)\n * - SET `{prefix}:active:{queue}` - Active jobs\n * - LIST `{prefix}:completed:{queue}` - Completed jobs (newest first)\n * - LIST `{prefix}:failed:{queue}` - Failed jobs (newest first)\n * - LIST `{prefix}:messages:{queue}` - Simple message queue (backward compat)\n * - LIST `{prefix}:notify:{queue}` - Notification list for blocking wait\n */\nexport class RedisQueueProvider extends QueueProvider {\n protected readonly log = $logger();\n protected readonly env: Static<typeof envSchema> = $env(envSchema);\n protected readonly redisProvider: RedisProvider = $inject(RedisProvider);\n\n // Dedicated connection for blocking operations\n protected blockingClient: RedisClient | undefined;\n protected shouldStop = false;\n\n // Loaded Lua script SHAs\n protected acquireJobSha: string | undefined;\n protected completeJobSha: string | undefined;\n protected failJobSha: string | undefined;\n\n protected readonly start = $hook({\n on: \"start\",\n handler: async () => {\n this.shouldStop = false;\n this.blockingClient = this.redisProvider.duplicate();\n await this.blockingClient.connect();\n\n // Load Lua scripts\n const redis = this.redisProvider.publisher;\n const acquireSha = await redis.scriptLoad(ACQUIRE_JOB_SCRIPT);\n const completeSha = await redis.scriptLoad(COMPLETE_JOB_SCRIPT);\n const failSha = await redis.scriptLoad(FAIL_JOB_SCRIPT);\n this.acquireJobSha = acquireSha.toString();\n this.completeJobSha = completeSha.toString();\n this.failJobSha = failSha.toString();\n },\n });\n\n protected readonly stop = $hook({\n on: \"stop\",\n handler: async () => {\n this.shouldStop = true;\n if (this.blockingClient?.isOpen) {\n await this.blockingClient.close();\n }\n },\n });\n\n // ===========================================\n // Key helpers\n // ===========================================\n\n protected key(type: string, queue: string, id?: string): string {\n const base = `${this.env.REDIS_QUEUE_PREFIX}:${type}:${queue}`;\n return id ? `${base}:${id}` : base;\n }\n\n protected messageKey(queue: string): string {\n return `${this.env.REDIS_QUEUE_PREFIX}:${queue}`;\n }\n\n protected notifyKey(queue: string): string {\n return `${this.env.REDIS_QUEUE_PREFIX}:notify:${queue}`;\n }\n\n // ===========================================\n // Simple Message API (backward compatible)\n // ===========================================\n\n public async push(queue: string, message: string): Promise<void> {\n await this.redisProvider.publisher.LPUSH(this.messageKey(queue), message);\n }\n\n public async pop(queue: string): Promise<string | undefined> {\n const value = await this.redisProvider.publisher.RPOP(\n this.messageKey(queue),\n );\n if (value == null) return undefined;\n return String(value);\n }\n\n public async popBlocking(\n queues: string[],\n timeoutSeconds: number,\n ): Promise<{ queue: string; message: string } | undefined> {\n if (queues.length === 0 || !this.blockingClient) {\n return undefined;\n }\n\n const prefixedQueues = queues.map((q) => this.messageKey(q));\n const result = await this.blockingClient.BRPOP(\n prefixedQueues,\n timeoutSeconds,\n );\n\n if (result == null) return undefined;\n\n const key = result.key.toString();\n const prefixLength = this.env.REDIS_QUEUE_PREFIX.length + 1;\n const queue = key.substring(prefixLength);\n\n return { queue, message: result.element.toString() };\n }\n\n // ===========================================\n // Job API Implementation\n // ===========================================\n\n protected async generateJobId(): Promise<string> {\n const counter = await this.redisProvider.publisher.INCR(\n `${this.env.REDIS_QUEUE_PREFIX}:job_counter`,\n );\n return `job_${counter}_${Date.now()}`;\n }\n\n protected serializeJob(job: QueueJob): Record<string, string> {\n return {\n id: job.id,\n queue: job.queue,\n payload: JSON.stringify(job.payload),\n options: JSON.stringify(job.options),\n state: JSON.stringify(job.state),\n };\n }\n\n protected deserializeJob(data: Record<string, string>): QueueJob | undefined {\n if (!data.id) return undefined;\n return {\n id: data.id,\n queue: data.queue,\n payload: JSON.parse(data.payload),\n options: JSON.parse(data.options),\n state: JSON.parse(data.state),\n };\n }\n\n public async addJob<T>(\n queue: string,\n payload: T,\n options?: QueueJobOptions,\n ): Promise<QueueJob<T>> {\n const redis = this.redisProvider.publisher;\n const now = Date.now();\n const delay = options?.delay ?? 0;\n const isDelayed = delay > 0;\n\n const job: QueueJob<T> = {\n id: await this.generateJobId(),\n queue,\n payload,\n options: {\n priority: options?.priority ?? 0,\n delay: options?.delay ?? 0,\n maxAttempts: options?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS,\n backoff: options?.backoff,\n lockDuration: options?.lockDuration ?? DEFAULT_LOCK_DURATION,\n removeOnComplete: options?.removeOnComplete,\n removeOnFail: options?.removeOnFail,\n },\n state: {\n status: isDelayed ? \"delayed\" : \"waiting\",\n attempts: 0,\n createdAt: now,\n availableAt: isDelayed ? now + delay : now,\n },\n };\n\n // Store job data\n await redis.HSET(this.key(\"job\", queue, job.id), this.serializeJob(job));\n\n // Add to appropriate queue\n if (isDelayed) {\n await redis.ZADD(this.key(\"delayed\", queue), {\n score: job.state.availableAt!,\n value: job.id,\n });\n } else {\n await redis.ZADD(this.key(\"waiting\", queue), {\n score: job.options.priority ?? 0,\n value: job.id,\n });\n\n // Notify blocking waiters by pushing to notify list\n await redis.LPUSH(this.notifyKey(queue), job.id);\n }\n\n this.log.debug(`Added job ${job.id} to queue ${queue}`, {\n status: job.state.status,\n priority: job.options.priority,\n });\n\n // Emit waiting event\n if (!isDelayed) {\n await this.emit({\n type: \"waiting\",\n queue,\n jobId: job.id,\n timestamp: now,\n job,\n });\n }\n\n return job;\n }\n\n public async acquireJob(\n queues: string[],\n workerId: string,\n timeoutSeconds: number,\n ): Promise<QueueAcquiredJob | undefined> {\n if (!this.blockingClient || this.shouldStop) {\n return undefined;\n }\n\n const redis = this.redisProvider.publisher;\n const now = Date.now();\n const endTime = now + timeoutSeconds * 1000;\n\n while (Date.now() < endTime && !this.shouldStop) {\n // Try to acquire a job from each queue using Lua script\n for (const queue of queues) {\n try {\n const result = await redis.evalSha(this.acquireJobSha!, {\n keys: [\n this.key(\"waiting\", queue),\n this.key(\"active\", queue),\n this.key(\"job\", queue),\n ],\n arguments: [\n workerId,\n String(Date.now()),\n String(DEFAULT_LOCK_DURATION),\n ],\n });\n\n if (result) {\n const job = JSON.parse(result as string) as QueueJob;\n\n this.log.debug(`Worker ${workerId} acquired job ${job.id}`, {\n queue,\n attempt: job.state.attempts,\n });\n\n // Emit active event\n await this.emit({\n type: \"active\",\n queue,\n jobId: job.id,\n timestamp: Date.now(),\n workerId,\n attempt: job.state.attempts,\n });\n\n return { queue, job };\n }\n } catch (error) {\n // Script might fail if job data is corrupted, log and continue\n this.log.warn(`Failed to acquire job from ${queue}`, error);\n }\n }\n\n // No job found, wait for notification using BRPOP\n // This blocks until a new job is added or timeout\n const notifyKeys = queues.map((q) => this.notifyKey(q));\n const remainingTimeout = Math.max(\n 1,\n Math.ceil((endTime - Date.now()) / 1000),\n );\n\n try {\n const notification = await this.blockingClient.BRPOP(\n notifyKeys,\n Math.min(remainingTimeout, 5), // Check every 5s max for shutdown\n );\n\n // If we got a notification, loop back to try acquiring\n // The notification just signals that a job was added\n if (notification) {\n }\n } catch {\n // Blocking client closed during shutdown\n if (this.shouldStop) {\n return undefined;\n }\n }\n }\n\n return undefined;\n }\n\n protected bufferRecordToString(\n record: Record<string, Buffer>,\n ): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [key, value] of Object.entries(record)) {\n result[key] = value?.toString() ?? \"\";\n }\n return result;\n }\n\n public async completeJob(\n queue: string,\n jobId: string,\n result?: unknown,\n ): Promise<void> {\n const redis = this.redisProvider.publisher;\n const now = Date.now();\n\n try {\n const luaResult = await redis.evalSha(this.completeJobSha!, {\n keys: [\n this.key(\"job\", queue, jobId),\n this.key(\"active\", queue),\n this.key(\"completed\", queue),\n ],\n arguments: [\n jobId,\n String(now),\n result !== undefined ? JSON.stringify(result) : \"\",\n ],\n });\n\n if (!luaResult) {\n this.log.warn(`Attempted to complete unknown job ${jobId}`);\n return;\n }\n\n const { removed, duration } = JSON.parse(luaResult as string);\n this.log.debug(`Job ${jobId} completed${removed ? \" and removed\" : \"\"}`, {\n queue,\n result,\n });\n\n // Emit completed event\n await this.emit({\n type: \"completed\",\n queue,\n jobId,\n timestamp: now,\n result,\n duration,\n });\n } catch (error) {\n // Fallback to non-atomic completion if Lua fails\n this.log.warn(`Lua completeJob failed, using fallback`, error);\n await this.completeJobFallback(queue, jobId, result);\n }\n }\n\n protected async completeJobFallback(\n queue: string,\n jobId: string,\n result?: unknown,\n ): Promise<void> {\n const redis = this.redisProvider.publisher;\n const now = Date.now();\n\n // Get job data\n const jobData = await redis.HGETALL(this.key(\"job\", queue, jobId));\n const job = this.deserializeJob(this.bufferRecordToString(jobData));\n if (!job) {\n this.log.warn(`Attempted to complete unknown job ${jobId}`);\n return;\n }\n\n const duration = now - (job.state.processedAt ?? now);\n\n // Remove from active\n await redis.SREM(this.key(\"active\", queue), jobId);\n\n // Update job state\n job.state.status = \"completed\";\n job.state.completedAt = now;\n job.state.result = result;\n job.state.lockedBy = undefined;\n job.state.lockedUntil = undefined;\n\n const removeOnComplete = job.options.removeOnComplete;\n if (removeOnComplete === true) {\n await redis.DEL(this.key(\"job\", queue, jobId));\n } else {\n await redis.HSET(this.key(\"job\", queue, jobId), {\n state: JSON.stringify(job.state),\n });\n await redis.LPUSH(this.key(\"completed\", queue), jobId);\n\n if (typeof removeOnComplete === \"number\" && removeOnComplete >= 0) {\n await this.cleanJobs(queue, \"completed\", {\n maxCount: removeOnComplete,\n });\n }\n }\n\n this.log.debug(`Job ${jobId} completed`, { queue });\n\n // Emit completed event\n await this.emit({\n type: \"completed\",\n queue,\n jobId,\n timestamp: now,\n result,\n duration,\n });\n }\n\n public async failJob(\n queue: string,\n jobId: string,\n error: string,\n stackTrace?: string,\n ): Promise<void> {\n const redis = this.redisProvider.publisher;\n const now = Date.now();\n\n // Get job to calculate backoff\n const jobData = await redis.HGETALL(this.key(\"job\", queue, jobId));\n const job = this.deserializeJob(this.bufferRecordToString(jobData));\n if (!job) {\n this.log.warn(`Attempted to fail unknown job ${jobId}`);\n return;\n }\n\n const backoffDelay = this.calculateBackoff(job);\n\n try {\n const luaResult = await redis.evalSha(this.failJobSha!, {\n keys: [\n this.key(\"job\", queue, jobId),\n this.key(\"active\", queue),\n this.key(\"delayed\", queue),\n this.key(\"failed\", queue),\n ],\n arguments: [\n jobId,\n String(now),\n error,\n stackTrace ?? \"\",\n String(backoffDelay),\n ],\n });\n\n if (!luaResult) {\n this.log.warn(`Attempted to fail unknown job ${jobId}`);\n return;\n }\n\n const result = JSON.parse(luaResult as string);\n\n if (result.status === \"retrying\") {\n this.log.debug(`Job ${jobId} failed, will retry in ${result.delay}ms`, {\n queue,\n attempt: job.state.attempts,\n error,\n });\n\n // Emit retrying event\n await this.emit({\n type: \"retrying\",\n queue,\n jobId,\n timestamp: now,\n error,\n attempt: result.attempt,\n delay: result.delay,\n });\n } else {\n this.log.debug(\n `Job ${jobId} permanently failed${result.removed ? \" and removed\" : \"\"}`,\n { queue, error },\n );\n\n // Emit failed event\n await this.emit({\n type: \"failed\",\n queue,\n jobId,\n timestamp: now,\n error,\n stackTrace,\n attempts: result.attempts,\n });\n }\n } catch (luaError) {\n // Fallback to non-atomic fail if Lua fails\n this.log.warn(`Lua failJob failed, using fallback`, luaError);\n await this.failJobFallback(queue, jobId, error, stackTrace);\n }\n }\n\n protected async failJobFallback(\n queue: string,\n jobId: string,\n error: string,\n stackTrace?: string,\n ): Promise<void> {\n const redis = this.redisProvider.publisher;\n const now = Date.now();\n\n const jobData = await redis.HGETALL(this.key(\"job\", queue, jobId));\n const job = this.deserializeJob(this.bufferRecordToString(jobData));\n if (!job) {\n this.log.warn(`Attempted to fail unknown job ${jobId}`);\n return;\n }\n\n // Remove from active\n await redis.SREM(this.key(\"active\", queue), jobId);\n\n const maxAttempts = job.options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;\n const hasMoreAttempts = job.state.attempts < maxAttempts;\n\n if (hasMoreAttempts) {\n const backoffDelay = this.calculateBackoff(job);\n\n job.state.status = \"delayed\";\n job.state.availableAt = now + backoffDelay;\n job.state.error = error;\n job.state.stackTrace = stackTrace;\n job.state.lockedBy = undefined;\n job.state.lockedUntil = undefined;\n\n await redis.HSET(this.key(\"job\", queue, jobId), {\n state: JSON.stringify(job.state),\n });\n await redis.ZADD(this.key(\"delayed\", queue), {\n score: job.state.availableAt,\n value: jobId,\n });\n\n this.log.debug(`Job ${jobId} failed, will retry in ${backoffDelay}ms`, {\n queue,\n attempt: job.state.attempts,\n maxAttempts,\n });\n\n // Emit retrying event\n await this.emit({\n type: \"retrying\",\n queue,\n jobId,\n timestamp: now,\n error,\n attempt: job.state.attempts + 1,\n delay: backoffDelay,\n });\n } else {\n job.state.status = \"failed\";\n job.state.failedAt = now;\n job.state.error = error;\n job.state.stackTrace = stackTrace;\n job.state.lockedBy = undefined;\n job.state.lockedUntil = undefined;\n\n const removeOnFail = job.options.removeOnFail;\n if (removeOnFail === true) {\n await redis.DEL(this.key(\"job\", queue, jobId));\n } else {\n await redis.HSET(this.key(\"job\", queue, jobId), {\n state: JSON.stringify(job.state),\n });\n await redis.LPUSH(this.key(\"failed\", queue), jobId);\n\n if (typeof removeOnFail === \"number\" && removeOnFail >= 0) {\n await this.cleanJobs(queue, \"failed\", { maxCount: removeOnFail });\n }\n }\n\n this.log.debug(`Job ${jobId} permanently failed`, { queue });\n\n // Emit failed event\n await this.emit({\n type: \"failed\",\n queue,\n jobId,\n timestamp: now,\n error,\n stackTrace,\n attempts: job.state.attempts,\n });\n }\n }\n\n protected calculateBackoff(job: QueueJob): number {\n const backoff = job.options.backoff;\n const attempt = job.state.attempts;\n\n if (!backoff) return DEFAULT_BACKOFF_DELAY;\n\n const baseDelay = backoff.delay ?? DEFAULT_BACKOFF_DELAY;\n const maxDelay = backoff.maxDelay ?? DEFAULT_BACKOFF_MAX_DELAY;\n\n if (backoff.type === \"fixed\") return baseDelay;\n\n const exponentialDelay = baseDelay * 2 ** (attempt - 1);\n return Math.min(exponentialDelay, maxDelay);\n }\n\n public async renewJobLock(\n queue: string,\n jobId: string,\n workerId: string,\n ): Promise<boolean> {\n const redis = this.redisProvider.publisher;\n\n const jobData = await redis.HGETALL(this.key(\"job\", queue, jobId));\n const job = this.deserializeJob(this.bufferRecordToString(jobData));\n if (!job || job.state.lockedBy !== workerId) {\n return false;\n }\n\n job.state.lockedUntil =\n Date.now() + (job.options.lockDuration ?? DEFAULT_LOCK_DURATION);\n await redis.HSET(this.key(\"job\", queue, jobId), {\n state: JSON.stringify(job.state),\n });\n\n return true;\n }\n\n public async getJob(\n queue: string,\n jobId: string,\n ): Promise<QueueJob | undefined> {\n const redis = this.redisProvider.publisher;\n const jobData = await redis.HGETALL(this.key(\"job\", queue, jobId));\n return this.deserializeJob(this.bufferRecordToString(jobData));\n }\n\n public async getJobs(\n queue: string,\n status: QueueJobStatus,\n options?: QueueGetJobsOptions,\n ): Promise<QueueJob[]> {\n const redis = this.redisProvider.publisher;\n const limit = options?.limit ?? 100;\n const offset = options?.offset ?? 0;\n\n let jobIds: string[];\n\n switch (status) {\n case \"waiting\": {\n const results = await redis.ZRANGE(\n this.key(\"waiting\", queue),\n offset,\n offset + limit - 1,\n );\n jobIds = results.map((r) => r.toString());\n break;\n }\n case \"delayed\": {\n const results = await redis.ZRANGE(\n this.key(\"delayed\", queue),\n offset,\n offset + limit - 1,\n );\n jobIds = results.map((r) => r.toString());\n break;\n }\n case \"active\": {\n const results = await redis.SMEMBERS(this.key(\"active\", queue));\n jobIds = results.map((r) => r.toString()).slice(offset, offset + limit);\n break;\n }\n case \"completed\": {\n const results = await redis.LRANGE(\n this.key(\"completed\", queue),\n offset,\n offset + limit - 1,\n );\n jobIds = results.map((r) => r.toString());\n break;\n }\n case \"failed\": {\n const results = await redis.LRANGE(\n this.key(\"failed\", queue),\n offset,\n offset + limit - 1,\n );\n jobIds = results.map((r) => r.toString());\n break;\n }\n default:\n jobIds = [];\n }\n\n const jobs: QueueJob[] = [];\n for (const jobId of jobIds) {\n const job = await this.getJob(queue, jobId);\n if (job) jobs.push(job);\n }\n\n return jobs;\n }\n\n public async getJobCounts(queue: string): Promise<QueueJobCounts> {\n const redis = this.redisProvider.publisher;\n\n const [waiting, delayed, active, completed, failed] = await Promise.all([\n redis.ZCARD(this.key(\"waiting\", queue)),\n redis.ZCARD(this.key(\"delayed\", queue)),\n redis.SCARD(this.key(\"active\", queue)),\n redis.LLEN(this.key(\"completed\", queue)),\n redis.LLEN(this.key(\"failed\", queue)),\n ]);\n\n return { waiting, delayed, active, completed, failed };\n }\n\n public async promoteDelayedJobs(queue: string): Promise<number> {\n const redis = this.redisProvider.publisher;\n const now = Date.now();\n\n // Get jobs whose availableAt has passed\n const results = await redis.ZRANGEBYSCORE(\n this.key(\"delayed\", queue),\n \"-inf\",\n now,\n );\n\n let promoted = 0;\n for (const result of results) {\n const jobId = result.toString();\n\n // Remove from delayed\n const removed = await redis.ZREM(this.key(\"delayed\", queue), jobId);\n if (removed === 0) continue;\n\n // Get and update job\n const job = await this.getJob(queue, jobId);\n if (!job) continue;\n\n job.state.status = \"waiting\";\n await redis.HSET(this.key(\"job\", queue, jobId), {\n state: JSON.stringify(job.state),\n });\n\n // Add to waiting with priority score\n await redis.ZADD(this.key(\"waiting\", queue), {\n score: job.options.priority ?? 0,\n value: jobId,\n });\n\n // Notify waiting workers\n await redis.LPUSH(this.notifyKey(queue), jobId);\n\n promoted++;\n this.log.debug(`Promoted delayed job ${jobId}`, { queue });\n\n // Emit waiting event\n await this.emit({\n type: \"waiting\",\n queue,\n jobId,\n timestamp: now,\n job,\n });\n }\n\n return promoted;\n }\n\n public async recoverStalledJobs(\n queue: string,\n stalledThresholdMs: number,\n ): Promise<string[]> {\n const redis = this.redisProvider.publisher;\n const now = Date.now();\n\n const activeJobIds = await redis.SMEMBERS(this.key(\"active\", queue));\n const stalledJobIds: string[] = [];\n\n for (const result of activeJobIds) {\n const jobId = result.toString();\n const job = await this.getJob(queue, jobId);\n if (!job) continue;\n\n const lockExpired =\n (job.state.lockedUntil ?? 0) + stalledThresholdMs < now;\n if (!lockExpired) continue;\n\n stalledJobIds.push(jobId);\n const workerId = job.state.lockedBy;\n\n // Remove from active\n await redis.SREM(this.key(\"active\", queue), jobId);\n\n const maxAttempts = job.options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;\n const hasMoreAttempts = job.state.attempts < maxAttempts;\n\n // Emit stalled event\n await this.emit({\n type: \"stalled\",\n queue,\n jobId,\n timestamp: now,\n workerId,\n willRetry: hasMoreAttempts,\n });\n\n if (hasMoreAttempts) {\n job.state.status = \"waiting\";\n job.state.lockedBy = undefined;\n job.state.lockedUntil = undefined;\n job.state.error = \"Job stalled (worker timeout)\";\n\n await redis.HSET(this.key(\"job\", queue, jobId), {\n state: JSON.stringify(job.state),\n });\n await redis.ZADD(this.key(\"waiting\", queue), {\n score: job.options.priority ?? 0,\n value: jobId,\n });\n\n // Notify waiting workers\n await redis.LPUSH(this.notifyKey(queue), jobId);\n\n this.log.warn(`Recovered stalled job ${jobId}`, { queue });\n\n // Emit waiting event\n await this.emit({\n type: \"waiting\",\n queue,\n jobId,\n timestamp: now,\n job,\n });\n } else {\n job.state.status = \"failed\";\n job.state.failedAt = now;\n job.state.lockedBy = undefined;\n job.state.lockedUntil = undefined;\n job.state.error =\n \"Job stalled (worker timeout) - max attempts exceeded\";\n\n const removeOnFail = job.options.removeOnFail;\n if (removeOnFail === true) {\n await redis.DEL(this.key(\"job\", queue, jobId));\n } else {\n await redis.HSET(this.key(\"job\", queue, jobId), {\n state: JSON.stringify(job.state),\n });\n await redis.LPUSH(this.key(\"failed\", queue), jobId);\n\n if (typeof removeOnFail === \"number\" && removeOnFail >= 0) {\n await this.cleanJobs(queue, \"failed\", { maxCount: removeOnFail });\n }\n }\n\n this.log.warn(`Stalled job ${jobId} permanently failed`, { queue });\n\n // Emit failed event\n await this.emit({\n type: \"failed\",\n queue,\n jobId,\n timestamp: now,\n error: job.state.error,\n attempts: job.state.attempts,\n });\n }\n }\n\n return stalledJobIds;\n }\n\n public async cleanJobs(\n queue: string,\n status: \"completed\" | \"failed\",\n options?: QueueCleanOptions,\n ): Promise<number> {\n const redis = this.redisProvider.publisher;\n const listKey = this.key(status, queue);\n const maxAge = options?.maxAge;\n const maxCount = options?.maxCount;\n\n let removed = 0;\n\n // Remove by age\n if (maxAge !== undefined) {\n const now = Date.now();\n const cutoff = now - maxAge;\n\n const jobIds = await redis.LRANGE(listKey, 0, -1);\n for (const result of jobIds) {\n const jobId = result.toString();\n const job = await this.getJob(queue, jobId);\n if (!job) continue;\n\n const timestamp =\n status === \"completed\" ? job.state.completedAt : job.state.failedAt;\n\n if (timestamp && timestamp < cutoff) {\n await redis.LREM(listKey, 1, jobId);\n await redis.DEL(this.key(\"job\", queue, jobId));\n removed++;\n }\n }\n }\n\n // Remove by count\n if (maxCount !== undefined) {\n const currentLen = await redis.LLEN(listKey);\n if (currentLen > maxCount) {\n // Get jobs to remove (oldest ones)\n const toRemove = await redis.LRANGE(listKey, maxCount, -1);\n for (const result of toRemove) {\n const jobId = result.toString();\n await redis.DEL(this.key(\"job\", queue, jobId));\n removed++;\n }\n // Trim the list\n await redis.LTRIM(listKey, 0, maxCount - 1);\n }\n }\n\n return removed;\n }\n\n public async removeJob(queue: string, jobId: string): Promise<void> {\n const redis = this.redisProvider.publisher;\n const job = await this.getJob(queue, jobId);\n if (!job) return;\n\n const previousStatus = job.state.status;\n\n // Remove from appropriate list\n switch (job.state.status) {\n case \"waiting\":\n await redis.ZREM(this.key(\"waiting\", queue), jobId);\n break;\n case \"delayed\":\n await redis.ZREM(this.key(\"delayed\", queue), jobId);\n break;\n case \"active\":\n await redis.SREM(this.key(\"active\", queue), jobId);\n break;\n case \"completed\":\n await redis.LREM(this.key(\"completed\", queue), 1, jobId);\n break;\n case \"failed\":\n await redis.LREM(this.key(\"failed\", queue), 1, jobId);\n break;\n }\n\n // Delete job data\n await redis.DEL(this.key(\"job\", queue, jobId));\n\n // Emit removed event\n await this.emit({\n type: \"removed\",\n queue,\n jobId,\n timestamp: Date.now(),\n previousStatus,\n });\n }\n\n public cancelWaiters(): void {\n this.shouldStop = true;\n }\n}\n","import { $module, type Alepha } from \"alepha\";\nimport { AlephaQueue, QueueProvider } from \"alepha/queue\";\nimport { RedisQueueProvider } from \"./providers/RedisQueueProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./providers/RedisQueueProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Plugin for Alepha Queue that provides Redis queue capabilities.\n *\n * @see {@link RedisQueueProvider}\n * @module alepha.queue.redis\n */\nexport const AlephaQueueRedis = $module({\n name: \"alepha.queue.redis\",\n services: [RedisQueueProvider],\n register: (alepha: Alepha) =>\n alepha\n .with({\n optional: true,\n provide: QueueProvider,\n use: RedisQueueProvider,\n })\n .with(AlephaQueue),\n});\n"],"mappings":"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"}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import * as alepha1 from "alepha";
|
|
2
|
-
import { Static } from "alepha";
|
|
3
|
-
import * as alepha_logger0 from "alepha/logger";
|
|
4
|
-
import { QueueAcquiredJob, QueueCleanOptions, QueueGetJobsOptions, QueueJob, QueueJobCounts, QueueJobOptions, QueueJobStatus, QueueProvider } from "alepha/queue";
|
|
5
|
-
import { RedisClient, RedisProvider } from "alepha/redis";
|
|
6
|
-
|
|
7
|
-
//#region src/queue-redis/providers/RedisQueueProvider.d.ts
|
|
8
|
-
declare const envSchema: alepha1.TObject<{
|
|
9
|
-
REDIS_QUEUE_PREFIX: alepha1.TString;
|
|
10
|
-
}>;
|
|
11
|
-
/**
|
|
12
|
-
* Redis-based queue provider with full job support.
|
|
13
|
-
*
|
|
14
|
-
* Features:
|
|
15
|
-
* - Atomic job acquisition using Lua scripts
|
|
16
|
-
* - Blocking wait using Redis BZPOPMIN (no polling)
|
|
17
|
-
* - Event emission for job lifecycle
|
|
18
|
-
* - removeOnComplete/removeOnFail support
|
|
19
|
-
*
|
|
20
|
-
* Uses the following Redis data structures:
|
|
21
|
-
* - HASH `{prefix}:job:{queue}:{id}` - Job data
|
|
22
|
-
* - ZSET `{prefix}:waiting:{queue}` - Waiting jobs (score = priority)
|
|
23
|
-
* - ZSET `{prefix}:delayed:{queue}` - Delayed jobs (score = availableAt timestamp)
|
|
24
|
-
* - SET `{prefix}:active:{queue}` - Active jobs
|
|
25
|
-
* - LIST `{prefix}:completed:{queue}` - Completed jobs (newest first)
|
|
26
|
-
* - LIST `{prefix}:failed:{queue}` - Failed jobs (newest first)
|
|
27
|
-
* - LIST `{prefix}:messages:{queue}` - Simple message queue (backward compat)
|
|
28
|
-
* - LIST `{prefix}:notify:{queue}` - Notification list for blocking wait
|
|
29
|
-
*/
|
|
30
|
-
declare class RedisQueueProvider extends QueueProvider {
|
|
31
|
-
protected readonly log: alepha_logger0.Logger;
|
|
32
|
-
protected readonly env: Static<typeof envSchema>;
|
|
33
|
-
protected readonly redisProvider: RedisProvider;
|
|
34
|
-
protected blockingClient: RedisClient | undefined;
|
|
35
|
-
protected shouldStop: boolean;
|
|
36
|
-
protected acquireJobSha: string | undefined;
|
|
37
|
-
protected completeJobSha: string | undefined;
|
|
38
|
-
protected failJobSha: string | undefined;
|
|
39
|
-
protected readonly start: alepha1.HookDescriptor<"start">;
|
|
40
|
-
protected readonly stop: alepha1.HookDescriptor<"stop">;
|
|
41
|
-
protected key(type: string, queue: string, id?: string): string;
|
|
42
|
-
protected messageKey(queue: string): string;
|
|
43
|
-
protected notifyKey(queue: string): string;
|
|
44
|
-
push(queue: string, message: string): Promise<void>;
|
|
45
|
-
pop(queue: string): Promise<string | undefined>;
|
|
46
|
-
popBlocking(queues: string[], timeoutSeconds: number): Promise<{
|
|
47
|
-
queue: string;
|
|
48
|
-
message: string;
|
|
49
|
-
} | undefined>;
|
|
50
|
-
protected generateJobId(): Promise<string>;
|
|
51
|
-
protected serializeJob(job: QueueJob): Record<string, string>;
|
|
52
|
-
protected deserializeJob(data: Record<string, string>): QueueJob | undefined;
|
|
53
|
-
addJob<T>(queue: string, payload: T, options?: QueueJobOptions): Promise<QueueJob<T>>;
|
|
54
|
-
acquireJob(queues: string[], workerId: string, timeoutSeconds: number): Promise<QueueAcquiredJob | undefined>;
|
|
55
|
-
protected bufferRecordToString(record: Record<string, Buffer>): Record<string, string>;
|
|
56
|
-
completeJob(queue: string, jobId: string, result?: unknown): Promise<void>;
|
|
57
|
-
protected completeJobFallback(queue: string, jobId: string, result?: unknown): Promise<void>;
|
|
58
|
-
failJob(queue: string, jobId: string, error: string, stackTrace?: string): Promise<void>;
|
|
59
|
-
protected failJobFallback(queue: string, jobId: string, error: string, stackTrace?: string): Promise<void>;
|
|
60
|
-
protected calculateBackoff(job: QueueJob): number;
|
|
61
|
-
renewJobLock(queue: string, jobId: string, workerId: string): Promise<boolean>;
|
|
62
|
-
getJob(queue: string, jobId: string): Promise<QueueJob | undefined>;
|
|
63
|
-
getJobs(queue: string, status: QueueJobStatus, options?: QueueGetJobsOptions): Promise<QueueJob[]>;
|
|
64
|
-
getJobCounts(queue: string): Promise<QueueJobCounts>;
|
|
65
|
-
promoteDelayedJobs(queue: string): Promise<number>;
|
|
66
|
-
recoverStalledJobs(queue: string, stalledThresholdMs: number): Promise<string[]>;
|
|
67
|
-
cleanJobs(queue: string, status: "completed" | "failed", options?: QueueCleanOptions): Promise<number>;
|
|
68
|
-
removeJob(queue: string, jobId: string): Promise<void>;
|
|
69
|
-
cancelWaiters(): void;
|
|
70
|
-
}
|
|
71
|
-
//#endregion
|
|
72
|
-
//#region src/queue-redis/index.d.ts
|
|
73
|
-
/**
|
|
74
|
-
* Plugin for Alepha Queue that provides Redis queue capabilities.
|
|
75
|
-
*
|
|
76
|
-
* @see {@link RedisQueueProvider}
|
|
77
|
-
* @module alepha.queue.redis
|
|
78
|
-
*/
|
|
79
|
-
declare const AlephaQueueRedis: alepha1.Service<alepha1.Module>;
|
|
80
|
-
//#endregion
|
|
81
|
-
export { AlephaQueueRedis, RedisQueueProvider };
|
|
82
|
-
//# sourceMappingURL=index.d.cts.map
|
package/dist/redis/index.cjs
DELETED
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
let alepha = require("alepha");
|
|
2
|
-
let __redis_client = require("@redis/client");
|
|
3
|
-
let alepha_logger = require("alepha/logger");
|
|
4
|
-
|
|
5
|
-
//#region src/redis/providers/RedisProvider.ts
|
|
6
|
-
const envSchema = alepha.t.object({
|
|
7
|
-
REDIS_PORT: alepha.t.integer({ default: "6379" }),
|
|
8
|
-
REDIS_HOST: alepha.t.text({ default: "localhost" }),
|
|
9
|
-
REDIS_PASSWORD: alepha.t.optional(alepha.t.text())
|
|
10
|
-
});
|
|
11
|
-
/**
|
|
12
|
-
* Redis client provider.
|
|
13
|
-
*/
|
|
14
|
-
var RedisProvider = class {
|
|
15
|
-
log = (0, alepha_logger.$logger)();
|
|
16
|
-
alepha = (0, alepha.$inject)(alepha.Alepha);
|
|
17
|
-
env = (0, alepha.$env)(envSchema);
|
|
18
|
-
client = this.createClient();
|
|
19
|
-
get publisher() {
|
|
20
|
-
if (!this.client.isReady) throw new Error("Redis client is not ready");
|
|
21
|
-
return this.client;
|
|
22
|
-
}
|
|
23
|
-
start = (0, alepha.$hook)({
|
|
24
|
-
on: "start",
|
|
25
|
-
handler: () => this.connect()
|
|
26
|
-
});
|
|
27
|
-
stop = (0, alepha.$hook)({
|
|
28
|
-
on: "stop",
|
|
29
|
-
handler: () => this.close()
|
|
30
|
-
});
|
|
31
|
-
/**
|
|
32
|
-
* Connect to the Redis server.
|
|
33
|
-
*/
|
|
34
|
-
async connect() {
|
|
35
|
-
this.log.debug("Connecting...");
|
|
36
|
-
await this.client.connect();
|
|
37
|
-
this.log.info("Connection OK");
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Close the connection to the Redis server.
|
|
41
|
-
*/
|
|
42
|
-
async close() {
|
|
43
|
-
this.log.debug("Closing connection...");
|
|
44
|
-
await this.client.close();
|
|
45
|
-
this.log.info("Connection closed");
|
|
46
|
-
}
|
|
47
|
-
duplicate(options) {
|
|
48
|
-
return this.client.duplicate({
|
|
49
|
-
...options,
|
|
50
|
-
RESP: 3
|
|
51
|
-
}).withTypeMapping({ [__redis_client.RESP_TYPES.BLOB_STRING]: Buffer });
|
|
52
|
-
}
|
|
53
|
-
async get(key) {
|
|
54
|
-
this.log.trace(`Getting key ${key}`);
|
|
55
|
-
const resp = await this.publisher.get(key);
|
|
56
|
-
if (resp === null) return;
|
|
57
|
-
return Buffer.from(resp);
|
|
58
|
-
}
|
|
59
|
-
async set(key, value, options) {
|
|
60
|
-
const buf = Buffer.isBuffer(value) ? value : Buffer.from(value, "utf-8");
|
|
61
|
-
const resp = await this.publisher.set(key, buf, options);
|
|
62
|
-
if (resp === "OK" || !resp) return buf;
|
|
63
|
-
return Buffer.from(resp);
|
|
64
|
-
}
|
|
65
|
-
async has(key) {
|
|
66
|
-
return await this.publisher.exists(key) > 0;
|
|
67
|
-
}
|
|
68
|
-
async keys(pattern) {
|
|
69
|
-
return (await this.publisher.keys(pattern)).map((key) => key.toString());
|
|
70
|
-
}
|
|
71
|
-
async del(keys) {
|
|
72
|
-
if (keys.length === 0) return;
|
|
73
|
-
await this.publisher.del(keys);
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Redis subscriber client factory method.
|
|
77
|
-
*/
|
|
78
|
-
createClient() {
|
|
79
|
-
const url = new URL("redis://127.0.0.1:6379");
|
|
80
|
-
if (this.env.REDIS_PASSWORD) url.password = this.env.REDIS_PASSWORD;
|
|
81
|
-
if (this.env.REDIS_HOST) url.hostname = this.env.REDIS_HOST;
|
|
82
|
-
if (this.env.REDIS_PORT) url.port = String(this.env.REDIS_PORT);
|
|
83
|
-
const client = (0, __redis_client.createClient)({
|
|
84
|
-
url: url.toString(),
|
|
85
|
-
RESP: 3
|
|
86
|
-
}).withTypeMapping({ [__redis_client.RESP_TYPES.BLOB_STRING]: Buffer });
|
|
87
|
-
client.on("error", (error) => {
|
|
88
|
-
if (this.alepha.isStarted()) this.log.error(error);
|
|
89
|
-
});
|
|
90
|
-
return client;
|
|
91
|
-
}
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
//#endregion
|
|
95
|
-
//#region src/redis/providers/RedisSubscriberProvider.ts
|
|
96
|
-
var RedisSubscriberProvider = class {
|
|
97
|
-
log = (0, alepha_logger.$logger)();
|
|
98
|
-
alepha = (0, alepha.$inject)(alepha.Alepha);
|
|
99
|
-
redisProvider = (0, alepha.$inject)(RedisProvider);
|
|
100
|
-
client = this.createClient();
|
|
101
|
-
get subscriber() {
|
|
102
|
-
if (!this.client.isReady) throw new Error("Redis client is not ready");
|
|
103
|
-
return this.client;
|
|
104
|
-
}
|
|
105
|
-
start = (0, alepha.$hook)({
|
|
106
|
-
on: "start",
|
|
107
|
-
handler: () => this.connect()
|
|
108
|
-
});
|
|
109
|
-
stop = (0, alepha.$hook)({
|
|
110
|
-
on: "stop",
|
|
111
|
-
handler: () => this.close()
|
|
112
|
-
});
|
|
113
|
-
async connect() {
|
|
114
|
-
this.log.debug("Connecting...");
|
|
115
|
-
await this.client.connect();
|
|
116
|
-
this.log.info("Connection OK");
|
|
117
|
-
}
|
|
118
|
-
async close() {
|
|
119
|
-
this.log.debug("Closing connection...");
|
|
120
|
-
this.subscriber.close();
|
|
121
|
-
this.log.info("Connection closed");
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Redis subscriber client factory method.
|
|
125
|
-
*/
|
|
126
|
-
createClient() {
|
|
127
|
-
const client = this.redisProvider.duplicate();
|
|
128
|
-
client.on("error", (error) => {
|
|
129
|
-
if (this.alepha.isStarted()) this.log.error(error);
|
|
130
|
-
});
|
|
131
|
-
return client;
|
|
132
|
-
}
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
//#endregion
|
|
136
|
-
//#region src/redis/index.ts
|
|
137
|
-
/**
|
|
138
|
-
* Redis client provider for Alepha applications.
|
|
139
|
-
*
|
|
140
|
-
* @see {@link RedisProvider}
|
|
141
|
-
* @module alepha.redis
|
|
142
|
-
*/
|
|
143
|
-
const AlephaRedis = (0, alepha.$module)({
|
|
144
|
-
name: "alepha.redis",
|
|
145
|
-
services: [RedisProvider, RedisSubscriberProvider],
|
|
146
|
-
register: (alepha$1) => alepha$1.with(RedisProvider)
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
//#endregion
|
|
150
|
-
exports.AlephaRedis = AlephaRedis;
|
|
151
|
-
exports.RedisProvider = RedisProvider;
|
|
152
|
-
exports.RedisSubscriberProvider = RedisSubscriberProvider;
|
|
153
|
-
//# sourceMappingURL=index.cjs.map
|
package/dist/redis/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["t","Alepha","RESP_TYPES","Alepha","alepha"],"sources":["../../src/redis/providers/RedisProvider.ts","../../src/redis/providers/RedisSubscriberProvider.ts","../../src/redis/index.ts"],"sourcesContent":["import {\n createClient,\n RESP_TYPES,\n type RedisClientType,\n type SetOptions,\n} from \"@redis/client\";\nimport { $env, $hook, $inject, Alepha, type Static, t } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\n\nconst envSchema = t.object({\n REDIS_PORT: t.integer({\n default: \"6379\",\n }),\n REDIS_HOST: t.text({\n default: \"localhost\",\n }),\n REDIS_PASSWORD: t.optional(t.text()),\n});\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof envSchema>> {}\n}\n\nexport type RedisClient = RedisClientType<\n {},\n {},\n {},\n 3,\n { 36: BufferConstructor }\n>;\nexport type RedisClientOptions = Parameters<typeof createClient>[0];\nexport type RedisSetOptions = SetOptions;\n\n/**\n * Redis client provider.\n */\nexport class RedisProvider {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly env = $env(envSchema);\n protected readonly client = this.createClient();\n\n public get publisher(): RedisClient {\n if (!this.client.isReady) {\n throw new Error(\"Redis client is not ready\");\n }\n\n return this.client;\n }\n\n protected readonly start = $hook({\n on: \"start\",\n handler: () => this.connect(),\n });\n\n protected readonly stop = $hook({\n on: \"stop\",\n handler: () => this.close(),\n });\n\n /**\n * Connect to the Redis server.\n */\n public async connect(): Promise<void> {\n this.log.debug(\"Connecting...\");\n await this.client.connect();\n this.log.info(\"Connection OK\");\n }\n\n /**\n * Close the connection to the Redis server.\n */\n public async close(): Promise<void> {\n this.log.debug(\"Closing connection...\");\n await this.client.close();\n this.log.info(\"Connection closed\");\n }\n\n public duplicate(options?: Partial<RedisClientOptions>): RedisClient {\n return this.client\n .duplicate({\n ...options,\n RESP: 3,\n })\n .withTypeMapping({\n [RESP_TYPES.BLOB_STRING]: Buffer,\n });\n }\n\n public async get(key: string): Promise<Buffer | undefined> {\n this.log.trace(`Getting key ${key}`);\n const resp = await this.publisher.get(key);\n\n if (resp === null) {\n return undefined;\n }\n\n return Buffer.from(resp);\n }\n\n public async set(\n key: string,\n value: Buffer | string,\n options?: RedisSetOptions,\n ): Promise<Buffer> {\n const buf = Buffer.isBuffer(value) ? value : Buffer.from(value, \"utf-8\");\n const resp = await this.publisher.set(key, buf, options);\n\n if (resp === \"OK\" || !resp) {\n return buf;\n }\n\n return Buffer.from(resp);\n }\n\n public async has(key: string): Promise<boolean> {\n const resp = await this.publisher.exists(key);\n return resp > 0;\n }\n\n public async keys(pattern: string): Promise<string[]> {\n const keys = await this.publisher.keys(pattern);\n return keys.map((key) => key.toString());\n }\n\n public async del(keys: string[]): Promise<void> {\n if (keys.length === 0) {\n return;\n }\n\n await this.publisher.del(keys);\n }\n\n /**\n * Redis subscriber client factory method.\n */\n protected createClient(): RedisClient {\n const url = new URL(\"redis://127.0.0.1:6379\");\n\n if (this.env.REDIS_PASSWORD) {\n url.password = this.env.REDIS_PASSWORD;\n }\n\n if (this.env.REDIS_HOST) {\n url.hostname = this.env.REDIS_HOST;\n }\n\n if (this.env.REDIS_PORT) {\n url.port = String(this.env.REDIS_PORT);\n }\n\n const client = createClient({\n url: url.toString(),\n RESP: 3,\n }).withTypeMapping({\n [RESP_TYPES.BLOB_STRING]: Buffer,\n });\n\n client.on(\"error\", (error) => {\n if (this.alepha.isStarted()) {\n this.log.error(error);\n }\n });\n\n return client;\n }\n}\n","import { $hook, $inject, Alepha } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport type { RedisClient } from \"./RedisProvider.ts\";\nimport { RedisProvider } from \"./RedisProvider.ts\";\n\nexport class RedisSubscriberProvider {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n protected readonly redisProvider: RedisProvider = $inject(RedisProvider);\n protected readonly client: RedisClient = this.createClient();\n\n public get subscriber(): RedisClient {\n if (!this.client.isReady) {\n throw new Error(\"Redis client is not ready\");\n }\n\n return this.client;\n }\n\n protected readonly start = $hook({\n on: \"start\",\n handler: () => this.connect(),\n });\n\n protected readonly stop = $hook({\n on: \"stop\",\n handler: () => this.close(),\n });\n\n public async connect(): Promise<void> {\n this.log.debug(\"Connecting...\");\n await this.client.connect();\n this.log.info(\"Connection OK\");\n }\n\n public async close(): Promise<void> {\n this.log.debug(\"Closing connection...\");\n this.subscriber.close();\n this.log.info(\"Connection closed\");\n }\n\n /**\n * Redis subscriber client factory method.\n */\n protected createClient(): RedisClient {\n const client = this.redisProvider.duplicate();\n\n client.on(\"error\", (error) => {\n if (this.alepha.isStarted()) {\n this.log.error(error);\n }\n });\n\n return client;\n }\n}\n","import { $module, type Alepha } from \"alepha\";\nimport { RedisProvider } from \"./providers/RedisProvider.ts\";\nimport { RedisSubscriberProvider } from \"./providers/RedisSubscriberProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./providers/RedisProvider.ts\";\nexport * from \"./providers/RedisSubscriberProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Redis client provider for Alepha applications.\n *\n * @see {@link RedisProvider}\n * @module alepha.redis\n */\nexport const AlephaRedis = $module({\n name: \"alepha.redis\",\n services: [RedisProvider, RedisSubscriberProvider],\n register: (alepha: Alepha) => alepha.with(RedisProvider),\n});\n"],"mappings":"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"}
|
package/dist/redis/index.d.cts
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import * as alepha3 from "alepha";
|
|
2
|
-
import { Alepha, Static } from "alepha";
|
|
3
|
-
import * as alepha_logger0 from "alepha/logger";
|
|
4
|
-
import { RedisClientType, SetOptions, createClient } from "@redis/client";
|
|
5
|
-
|
|
6
|
-
//#region src/redis/providers/RedisProvider.d.ts
|
|
7
|
-
declare const envSchema: alepha3.TObject<{
|
|
8
|
-
REDIS_PORT: alepha3.TInteger;
|
|
9
|
-
REDIS_HOST: alepha3.TString;
|
|
10
|
-
REDIS_PASSWORD: alepha3.TOptional<alepha3.TString>;
|
|
11
|
-
}>;
|
|
12
|
-
declare module "alepha" {
|
|
13
|
-
interface Env extends Partial<Static<typeof envSchema>> {}
|
|
14
|
-
}
|
|
15
|
-
type RedisClient = RedisClientType<{}, {}, {}, 3, {
|
|
16
|
-
36: BufferConstructor;
|
|
17
|
-
}>;
|
|
18
|
-
type RedisClientOptions = Parameters<typeof createClient>[0];
|
|
19
|
-
type RedisSetOptions = SetOptions;
|
|
20
|
-
/**
|
|
21
|
-
* Redis client provider.
|
|
22
|
-
*/
|
|
23
|
-
declare class RedisProvider {
|
|
24
|
-
protected readonly log: alepha_logger0.Logger;
|
|
25
|
-
protected readonly alepha: Alepha;
|
|
26
|
-
protected readonly env: {
|
|
27
|
-
REDIS_PASSWORD?: string | undefined;
|
|
28
|
-
REDIS_PORT: number;
|
|
29
|
-
REDIS_HOST: string;
|
|
30
|
-
};
|
|
31
|
-
protected readonly client: RedisClient;
|
|
32
|
-
get publisher(): RedisClient;
|
|
33
|
-
protected readonly start: alepha3.HookDescriptor<"start">;
|
|
34
|
-
protected readonly stop: alepha3.HookDescriptor<"stop">;
|
|
35
|
-
/**
|
|
36
|
-
* Connect to the Redis server.
|
|
37
|
-
*/
|
|
38
|
-
connect(): Promise<void>;
|
|
39
|
-
/**
|
|
40
|
-
* Close the connection to the Redis server.
|
|
41
|
-
*/
|
|
42
|
-
close(): Promise<void>;
|
|
43
|
-
duplicate(options?: Partial<RedisClientOptions>): RedisClient;
|
|
44
|
-
get(key: string): Promise<Buffer | undefined>;
|
|
45
|
-
set(key: string, value: Buffer | string, options?: RedisSetOptions): Promise<Buffer>;
|
|
46
|
-
has(key: string): Promise<boolean>;
|
|
47
|
-
keys(pattern: string): Promise<string[]>;
|
|
48
|
-
del(keys: string[]): Promise<void>;
|
|
49
|
-
/**
|
|
50
|
-
* Redis subscriber client factory method.
|
|
51
|
-
*/
|
|
52
|
-
protected createClient(): RedisClient;
|
|
53
|
-
}
|
|
54
|
-
//#endregion
|
|
55
|
-
//#region src/redis/providers/RedisSubscriberProvider.d.ts
|
|
56
|
-
declare class RedisSubscriberProvider {
|
|
57
|
-
protected readonly log: alepha_logger0.Logger;
|
|
58
|
-
protected readonly alepha: Alepha;
|
|
59
|
-
protected readonly redisProvider: RedisProvider;
|
|
60
|
-
protected readonly client: RedisClient;
|
|
61
|
-
get subscriber(): RedisClient;
|
|
62
|
-
protected readonly start: alepha3.HookDescriptor<"start">;
|
|
63
|
-
protected readonly stop: alepha3.HookDescriptor<"stop">;
|
|
64
|
-
connect(): Promise<void>;
|
|
65
|
-
close(): Promise<void>;
|
|
66
|
-
/**
|
|
67
|
-
* Redis subscriber client factory method.
|
|
68
|
-
*/
|
|
69
|
-
protected createClient(): RedisClient;
|
|
70
|
-
}
|
|
71
|
-
//#endregion
|
|
72
|
-
//#region src/redis/index.d.ts
|
|
73
|
-
/**
|
|
74
|
-
* Redis client provider for Alepha applications.
|
|
75
|
-
*
|
|
76
|
-
* @see {@link RedisProvider}
|
|
77
|
-
* @module alepha.redis
|
|
78
|
-
*/
|
|
79
|
-
declare const AlephaRedis: alepha3.Service<alepha3.Module>;
|
|
80
|
-
//#endregion
|
|
81
|
-
export { AlephaRedis, RedisClient, RedisClientOptions, RedisProvider, RedisSetOptions, RedisSubscriberProvider };
|
|
82
|
-
//# sourceMappingURL=index.d.cts.map
|
package/dist/retry/index.cjs
DELETED
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
let alepha = require("alepha");
|
|
2
|
-
let alepha_datetime = require("alepha/datetime");
|
|
3
|
-
let alepha_logger = require("alepha/logger");
|
|
4
|
-
|
|
5
|
-
//#region src/retry/errors/RetryCancelError.ts
|
|
6
|
-
var RetryCancelError = class extends alepha.AlephaError {
|
|
7
|
-
constructor() {
|
|
8
|
-
super("Retry operation was cancelled.");
|
|
9
|
-
this.name = "RetryCancelError";
|
|
10
|
-
}
|
|
11
|
-
};
|
|
12
|
-
|
|
13
|
-
//#endregion
|
|
14
|
-
//#region src/retry/errors/RetryTimeoutError.ts
|
|
15
|
-
var RetryTimeoutError = class extends alepha.AlephaError {
|
|
16
|
-
constructor(duration) {
|
|
17
|
-
super(`Retry operation timed out after ${duration}ms.`);
|
|
18
|
-
this.name = "RetryTimeoutError";
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
//#endregion
|
|
23
|
-
//#region src/retry/providers/RetryProvider.ts
|
|
24
|
-
/**
|
|
25
|
-
* Service for executing functions with automatic retry logic.
|
|
26
|
-
* Supports exponential backoff, max duration, conditional retries, and cancellation.
|
|
27
|
-
*/
|
|
28
|
-
var RetryProvider = class {
|
|
29
|
-
log = (0, alepha_logger.$logger)();
|
|
30
|
-
dateTime = (0, alepha.$inject)(alepha_datetime.DateTimeProvider);
|
|
31
|
-
/**
|
|
32
|
-
* Execute a function with automatic retry logic.
|
|
33
|
-
*/
|
|
34
|
-
async retry(options, ...args) {
|
|
35
|
-
const maxAttempts = options.max ?? 3;
|
|
36
|
-
const when = options.when ?? (() => true);
|
|
37
|
-
const { handler, onError } = options;
|
|
38
|
-
let lastError;
|
|
39
|
-
const startTime = Date.now();
|
|
40
|
-
const maxDurationMs = options.maxDuration ? this.dateTime.duration(options.maxDuration).asMilliseconds() : Infinity;
|
|
41
|
-
const signals = [options.signal, options.additionalSignal].filter(Boolean);
|
|
42
|
-
const onAbort = () => {
|
|
43
|
-
lastError = new RetryCancelError();
|
|
44
|
-
};
|
|
45
|
-
for (const signal of signals) signal?.addEventListener("abort", onAbort);
|
|
46
|
-
const waitSignals = [options.signal, options.additionalSignal].filter(Boolean);
|
|
47
|
-
const combinedSignal = waitSignals.length > 0 ? AbortSignal.any(waitSignals) : void 0;
|
|
48
|
-
try {
|
|
49
|
-
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
50
|
-
if (signals.some((signal) => signal?.aborted)) throw new RetryCancelError();
|
|
51
|
-
if (Date.now() - startTime >= maxDurationMs) throw new RetryTimeoutError(maxDurationMs);
|
|
52
|
-
try {
|
|
53
|
-
const result = await handler(...args);
|
|
54
|
-
if (Date.now() - startTime >= maxDurationMs) throw new RetryTimeoutError(maxDurationMs);
|
|
55
|
-
return result;
|
|
56
|
-
} catch (err) {
|
|
57
|
-
lastError = err;
|
|
58
|
-
if (Date.now() - startTime >= maxDurationMs) throw new RetryTimeoutError(maxDurationMs);
|
|
59
|
-
this.log.warn("Retry attempt failed", {
|
|
60
|
-
attempt,
|
|
61
|
-
maxAttempts,
|
|
62
|
-
remainingAttempts: maxAttempts - attempt,
|
|
63
|
-
error: lastError.message,
|
|
64
|
-
errorName: lastError.name
|
|
65
|
-
});
|
|
66
|
-
if (!(err instanceof Error) || !when(err)) throw err;
|
|
67
|
-
if (onError) onError(err, attempt, ...args);
|
|
68
|
-
if (attempt >= maxAttempts) break;
|
|
69
|
-
const delay = this.calculateBackoff(attempt, options.backoff);
|
|
70
|
-
if (delay > 0) await this.dateTime.wait(delay, { signal: combinedSignal });
|
|
71
|
-
if (Date.now() - startTime >= maxDurationMs) throw new RetryTimeoutError(maxDurationMs);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
} finally {
|
|
75
|
-
for (const signal of signals) signal?.removeEventListener("abort", onAbort);
|
|
76
|
-
}
|
|
77
|
-
throw lastError;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Calculate the backoff delay for a given attempt.
|
|
81
|
-
*/
|
|
82
|
-
calculateBackoff(attempt, options) {
|
|
83
|
-
if (typeof options === "number") return options;
|
|
84
|
-
const initial = options?.initial ?? 200;
|
|
85
|
-
const factor = options?.factor ?? 2;
|
|
86
|
-
const max = options?.max ?? 1e4;
|
|
87
|
-
const useJitter = options?.jitter !== false;
|
|
88
|
-
const exponential = initial * factor ** (attempt - 1);
|
|
89
|
-
let delay = Math.min(exponential, max);
|
|
90
|
-
if (useJitter) delay = delay * (1 + Math.random() * .5);
|
|
91
|
-
return Math.floor(delay);
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
//#endregion
|
|
96
|
-
//#region src/retry/descriptors/$retry.ts
|
|
97
|
-
/**
|
|
98
|
-
* Creates a function that automatically retries a handler upon failure,
|
|
99
|
-
* with support for exponential backoff, max duration, and cancellation.
|
|
100
|
-
*/
|
|
101
|
-
const $retry = (options) => {
|
|
102
|
-
const instance = (0, alepha.createDescriptor)(RetryDescriptor, options);
|
|
103
|
-
const fn = (...args) => instance.run(...args);
|
|
104
|
-
return Object.setPrototypeOf(fn, instance);
|
|
105
|
-
};
|
|
106
|
-
var RetryDescriptor = class extends alepha.Descriptor {
|
|
107
|
-
retryProvider = (0, alepha.$inject)(RetryProvider);
|
|
108
|
-
appAbortController;
|
|
109
|
-
constructor(args) {
|
|
110
|
-
super(args);
|
|
111
|
-
this.appAbortController = new AbortController();
|
|
112
|
-
this.alepha.events.on("stop", () => {
|
|
113
|
-
this.appAbortController.abort();
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
async run(...args) {
|
|
117
|
-
return this.retryProvider.retry({
|
|
118
|
-
...this.options,
|
|
119
|
-
additionalSignal: this.appAbortController.signal
|
|
120
|
-
}, ...args);
|
|
121
|
-
}
|
|
122
|
-
};
|
|
123
|
-
$retry[alepha.KIND] = RetryDescriptor;
|
|
124
|
-
|
|
125
|
-
//#endregion
|
|
126
|
-
//#region src/retry/index.ts
|
|
127
|
-
/**
|
|
128
|
-
* Retry mechanism provider for Alepha applications.
|
|
129
|
-
*
|
|
130
|
-
* @see {@link RetryProvider}
|
|
131
|
-
* @module alepha.retry
|
|
132
|
-
*/
|
|
133
|
-
const AlephaRetry = (0, alepha.$module)({
|
|
134
|
-
name: "alepha.retry",
|
|
135
|
-
descriptors: [$retry],
|
|
136
|
-
services: [RetryProvider]
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
//#endregion
|
|
140
|
-
exports.$retry = $retry;
|
|
141
|
-
exports.AlephaRetry = AlephaRetry;
|
|
142
|
-
exports.RetryCancelError = RetryCancelError;
|
|
143
|
-
exports.RetryDescriptor = RetryDescriptor;
|
|
144
|
-
exports.RetryProvider = RetryProvider;
|
|
145
|
-
exports.RetryTimeoutError = RetryTimeoutError;
|
|
146
|
-
//# sourceMappingURL=index.cjs.map
|
package/dist/retry/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["AlephaError","AlephaError","DateTimeProvider","lastError: Error | undefined","Descriptor","KIND"],"sources":["../../src/retry/errors/RetryCancelError.ts","../../src/retry/errors/RetryTimeoutError.ts","../../src/retry/providers/RetryProvider.ts","../../src/retry/descriptors/$retry.ts","../../src/retry/index.ts"],"sourcesContent":["import { AlephaError } from \"alepha\";\n\nexport class RetryCancelError extends AlephaError {\n constructor() {\n super(\"Retry operation was cancelled.\");\n this.name = \"RetryCancelError\";\n }\n}\n","import { AlephaError } from \"alepha\";\n\nexport class RetryTimeoutError extends AlephaError {\n constructor(duration: number) {\n super(`Retry operation timed out after ${duration}ms.`);\n this.name = \"RetryTimeoutError\";\n }\n}\n","import { $inject } from \"alepha\";\nimport { DateTimeProvider, type DurationLike } from \"alepha/datetime\";\nimport { $logger } from \"alepha/logger\";\nimport { RetryCancelError } from \"../errors/RetryCancelError.ts\";\nimport { RetryTimeoutError } from \"../errors/RetryTimeoutError.ts\";\n\nexport interface RetryOptions<T extends (...args: any[]) => any> {\n /**\n * The function to retry.\n */\n handler: T;\n\n /**\n * The maximum number of attempts.\n *\n * @default 3\n */\n max?: number;\n\n /**\n * The backoff strategy for delays between retries.\n * Can be a fixed number (in ms) or a configuration object for exponential backoff.\n *\n * @default { initial: 200, factor: 2, jitter: true }\n */\n backoff?: number | RetryBackoffOptions;\n\n /**\n * An overall time limit for all retry attempts combined.\n *\n * e.g., `[5, 'seconds']`\n */\n maxDuration?: DurationLike;\n\n /**\n * A function that determines if a retry should be attempted based on the error.\n *\n * @default (error) => true (retries on any error)\n */\n when?: (error: Error) => boolean;\n\n /**\n * A custom callback for when a retry attempt fails.\n * This is called before the delay.\n */\n onError?: (error: Error, attempt: number, ...args: Parameters<T>) => void;\n\n /**\n * An AbortSignal to allow for external cancellation of the retry loop.\n */\n signal?: AbortSignal;\n\n /**\n * An additional AbortSignal to combine with the provided signal.\n * Used internally by $retry to handle app lifecycle.\n */\n additionalSignal?: AbortSignal;\n}\n\nexport interface RetryBackoffOptions {\n /**\n * Initial delay in milliseconds.\n *\n * @default 200\n */\n initial?: number;\n\n /**\n * Multiplier for each subsequent delay.\n *\n * @default 2\n */\n factor?: number;\n\n /**\n * Maximum delay in milliseconds.\n */\n max?: number;\n\n /**\n * If true, adds a random jitter to the delay to prevent thundering herd.\n *\n * @default true\n */\n jitter?: boolean;\n}\n\n/**\n * Service for executing functions with automatic retry logic.\n * Supports exponential backoff, max duration, conditional retries, and cancellation.\n */\nexport class RetryProvider {\n protected readonly log = $logger();\n protected readonly dateTime = $inject(DateTimeProvider);\n\n /**\n * Execute a function with automatic retry logic.\n */\n async retry<T extends (...args: any[]) => any>(\n options: RetryOptions<T>,\n ...args: Parameters<T>\n ): Promise<ReturnType<T>> {\n const maxAttempts = options.max ?? 3;\n const when = options.when ?? (() => true);\n const { handler, onError } = options;\n\n let lastError: Error | undefined;\n const startTime = Date.now();\n\n const maxDurationMs = options.maxDuration\n ? this.dateTime.duration(options.maxDuration).asMilliseconds()\n : Infinity;\n\n // Combine user-provided signal with additional signal (e.g., app lifecycle)\n const signals = [options.signal, options.additionalSignal].filter(Boolean);\n const onAbort = () => {\n // Always set RetryCancelError when aborted, even if another error exists\n // This ensures cancellation takes precedence over retry errors\n lastError = new RetryCancelError();\n };\n\n // Add abort listeners to all signals\n for (const signal of signals) {\n signal?.addEventListener(\"abort\", onAbort);\n }\n\n // FIX BUG #8: Create combined signal ONCE at the start instead of on each backoff\n // This prevents memory leak from creating multiple AbortSignal.any() instances\n const waitSignals = [options.signal, options.additionalSignal].filter(\n Boolean,\n ) as AbortSignal[];\n const combinedSignal =\n waitSignals.length > 0 ? AbortSignal.any(waitSignals) : undefined;\n\n try {\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n // Check for cancellation\n if (signals.some((signal) => signal?.aborted)) {\n throw new RetryCancelError();\n }\n\n // Check for timeout before attempting\n if (Date.now() - startTime >= maxDurationMs) {\n throw new RetryTimeoutError(maxDurationMs);\n }\n\n try {\n const result = await handler(...args);\n\n // Check for timeout after handler execution\n if (Date.now() - startTime >= maxDurationMs) {\n throw new RetryTimeoutError(maxDurationMs);\n }\n\n return result;\n } catch (err) {\n lastError = err as Error;\n\n // Check for timeout after error\n if (Date.now() - startTime >= maxDurationMs) {\n throw new RetryTimeoutError(maxDurationMs);\n }\n\n // Log the error with warning level\n this.log.warn(\"Retry attempt failed\", {\n attempt,\n maxAttempts,\n remainingAttempts: maxAttempts - attempt,\n error: lastError.message,\n errorName: lastError.name,\n });\n\n if (!(err instanceof Error) || !when(err)) {\n throw err; // don't retry if it's not an Error or `when` returns false\n }\n\n // FIX BUG #7: Call onError BEFORE checking if this is the final attempt\n // This ensures onError is called for ALL failed attempts, including the last one\n if (onError) {\n onError(err, attempt, ...args);\n }\n\n if (attempt >= maxAttempts) {\n break; // will throw lastError after the loop\n }\n\n // Calculate and wait for backoff delay\n const delay = this.calculateBackoff(attempt, options.backoff);\n if (delay > 0) {\n await this.dateTime.wait(delay, { signal: combinedSignal });\n }\n\n // Check for timeout after backoff wait before next attempt\n if (Date.now() - startTime >= maxDurationMs) {\n throw new RetryTimeoutError(maxDurationMs);\n }\n }\n }\n } finally {\n // Clean up listeners to prevent memory leaks\n for (const signal of signals) {\n signal?.removeEventListener(\"abort\", onAbort);\n }\n }\n\n throw lastError;\n }\n\n /**\n * Calculate the backoff delay for a given attempt.\n */\n protected calculateBackoff(\n attempt: number,\n options?: number | RetryBackoffOptions,\n ): number {\n if (typeof options === \"number\") {\n return options;\n }\n\n const initial = options?.initial ?? 200;\n const factor = options?.factor ?? 2;\n const max = options?.max ?? 10000;\n const useJitter = options?.jitter !== false;\n\n const exponential = initial * factor ** (attempt - 1);\n let delay = Math.min(exponential, max);\n\n if (useJitter) {\n // Add a random amount of jitter (e.g., up to 50% of the delay)\n delay = delay * (1 + Math.random() * 0.5);\n }\n\n return Math.floor(delay);\n }\n}\n","import {\n $inject,\n createDescriptor,\n Descriptor,\n type DescriptorArgs,\n KIND,\n} from \"alepha\";\nimport type { DurationLike } from \"alepha/datetime\";\nimport type { RetryBackoffOptions } from \"../providers/RetryProvider.ts\";\nimport { RetryProvider } from \"../providers/RetryProvider.ts\";\n\n/**\n * Creates a function that automatically retries a handler upon failure,\n * with support for exponential backoff, max duration, and cancellation.\n */\nexport const $retry = <T extends (...args: any[]) => any>(\n options: RetryDescriptorOptions<T>,\n): RetryDescriptorFn<T> => {\n const instance = createDescriptor(RetryDescriptor, options);\n const fn = (...args: Parameters<T>) => instance.run(...args);\n return Object.setPrototypeOf(fn, instance) as RetryDescriptorFn<T>;\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface RetryDescriptorOptions<T extends (...args: any[]) => any> {\n /**\n * The function to retry.\n */\n handler: T;\n\n /**\n * The maximum number of attempts.\n *\n * @default 3\n */\n max?: number;\n\n /**\n * The backoff strategy for delays between retries.\n * Can be a fixed number (in ms) or a configuration object for exponential backoff.\n *\n * @default { initial: 200, factor: 2, jitter: true }\n */\n backoff?: number | RetryBackoffOptions;\n\n /**\n * An overall time limit for all retry attempts combined.\n *\n * e.g., `[5, 'seconds']`\n */\n maxDuration?: DurationLike;\n\n /**\n * A function that determines if a retry should be attempted based on the error.\n *\n * @default (error) => true (retries on any error)\n */\n when?: (error: Error) => boolean;\n\n /**\n * A custom callback for when a retry attempt fails.\n * This is called before the delay.\n */\n onError?: (error: Error, attempt: number, ...args: Parameters<T>) => void;\n\n /**\n * An AbortSignal to allow for external cancellation of the retry loop.\n */\n signal?: AbortSignal;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class RetryDescriptor<\n T extends (...args: any[]) => any,\n> extends Descriptor<RetryDescriptorOptions<T>> {\n protected readonly retryProvider = $inject(RetryProvider);\n protected appAbortController: AbortController;\n\n constructor(args: DescriptorArgs<RetryDescriptorOptions<T>>) {\n super(args);\n\n this.appAbortController = new AbortController();\n this.alepha.events.on(\"stop\", () => {\n this.appAbortController.abort();\n });\n }\n\n async run(...args: Parameters<T>): Promise<ReturnType<T>> {\n return this.retryProvider.retry(\n {\n ...this.options,\n additionalSignal: this.appAbortController.signal,\n },\n ...args,\n );\n }\n}\n\nexport interface RetryDescriptorFn<T extends (...args: any[]) => any>\n extends RetryDescriptor<T> {\n (...args: Parameters<T>): Promise<ReturnType<T>>;\n}\n\n$retry[KIND] = RetryDescriptor;\n","import { $module } from \"alepha\";\nimport { $retry } from \"./descriptors/$retry.ts\";\nimport { RetryProvider } from \"./providers/RetryProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./descriptors/$retry.ts\";\nexport * from \"./errors/RetryCancelError.ts\";\nexport * from \"./errors/RetryTimeoutError.ts\";\nexport * from \"./providers/RetryProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Retry mechanism provider for Alepha applications.\n *\n * @see {@link RetryProvider}\n * @module alepha.retry\n */\nexport const AlephaRetry = $module({\n name: \"alepha.retry\",\n descriptors: [$retry],\n services: [RetryProvider],\n});\n"],"mappings":"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"}
|