alepha 0.13.1 → 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 +46 -46
- 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 +223 -2000
- 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/index.d.ts +28 -26
- package/dist/cli/index.js +50 -13
- 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.native.js +2113 -0
- 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 +9 -9
- 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 +218 -218
- package/dist/orm/index.js +46 -46
- package/dist/orm/index.js.map +1 -1
- package/dist/queue/index.d.ts +29 -29
- 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 +19 -19
- package/dist/retry/index.js +7 -7
- package/dist/retry/index.js.map +1 -1
- package/dist/scheduler/index.d.ts +16 -16
- package/dist/scheduler/index.js +9 -9
- package/dist/scheduler/index.js.map +1 -1
- package/dist/security/index.d.ts +80 -80
- 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 +16 -16
- 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 +19 -19
- 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-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 +22 -22
- 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 +8 -8
- 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 +58 -58
- package/dist/websocket/index.js +13 -13
- package/dist/websocket/index.js.map +1 -1
- package/package.json +113 -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 +24 -2
- package/src/cli/commands/DrizzleCommands.ts +6 -6
- package/src/cli/commands/VerifyCommands.ts +1 -1
- package/src/cli/commands/ViteCommands.ts +6 -1
- package/src/cli/services/ProjectUtils.ts +34 -3
- 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/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 +14 -14
- 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 +1 -1
- 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/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/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
|
@@ -6,9 +6,9 @@ import { DbVersionMismatchError } from "../errors/DbVersionMismatchError.ts";
|
|
|
6
6
|
import { DatabaseProvider } from "../providers/drivers/DatabaseProvider.ts";
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
|
-
* Creates a transaction
|
|
9
|
+
* Creates a transaction primitive for database operations requiring atomicity and consistency.
|
|
10
10
|
*
|
|
11
|
-
* This
|
|
11
|
+
* This primitive provides a convenient way to wrap database operations in PostgreSQL
|
|
12
12
|
* transactions, ensuring ACID properties and automatic retry logic for version conflicts.
|
|
13
13
|
* It integrates seamlessly with the repository pattern and provides built-in handling
|
|
14
14
|
* for optimistic locking scenarios with automatic retry on version mismatches.
|
|
@@ -21,7 +21,7 @@ import { DatabaseProvider } from "../providers/drivers/DatabaseProvider.ts";
|
|
|
21
21
|
* - Use appropriate isolation levels based on your consistency requirements
|
|
22
22
|
*/
|
|
23
23
|
export const $transaction = <T extends any[], R>(
|
|
24
|
-
opts:
|
|
24
|
+
opts: TransactionPrimitiveOptions<T, R>,
|
|
25
25
|
) => {
|
|
26
26
|
const { alepha } = $context();
|
|
27
27
|
const provider = alepha.inject(DatabaseProvider);
|
|
@@ -38,7 +38,7 @@ export const $transaction = <T extends any[], R>(
|
|
|
38
38
|
|
|
39
39
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
40
40
|
|
|
41
|
-
export interface
|
|
41
|
+
export interface TransactionPrimitiveOptions<T extends any[], R> {
|
|
42
42
|
/**
|
|
43
43
|
* Transaction handler function that contains all database operations to be executed atomically.
|
|
44
44
|
*
|
|
@@ -159,9 +159,9 @@ export class PostgresTypeProvider {
|
|
|
159
159
|
*
|
|
160
160
|
* This is used to track the version of a row in the database.
|
|
161
161
|
*
|
|
162
|
-
* You can use it for optimistic concurrency control (OCC) with {@link
|
|
162
|
+
* You can use it for optimistic concurrency control (OCC) with {@link RepositoryPrimitive#save}.
|
|
163
163
|
*
|
|
164
|
-
* @see {@link
|
|
164
|
+
* @see {@link RepositoryPrimitive#save}
|
|
165
165
|
* @see {@link PgVersionMismatchError}
|
|
166
166
|
*/
|
|
167
167
|
public readonly version = (options: TNumberOptions = {}) =>
|
|
@@ -239,7 +239,7 @@ export class PostgresTypeProvider {
|
|
|
239
239
|
|
|
240
240
|
/**
|
|
241
241
|
* Creates a page schema for a given object schema.
|
|
242
|
-
* It's used by {@link
|
|
242
|
+
* It's used by {@link RepositoryPrimitive#paginate} method.
|
|
243
243
|
*/
|
|
244
244
|
public readonly page = <T extends TObject>(
|
|
245
245
|
resource: T,
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { $inject, Alepha, type Service, type TObject } from "alepha";
|
|
2
|
-
import type {
|
|
2
|
+
import type { EntityPrimitive } from "../primitives/$entity.ts";
|
|
3
3
|
import { Repository } from "../services/Repository.ts";
|
|
4
4
|
import type { DatabaseProvider } from "./drivers/DatabaseProvider.ts";
|
|
5
5
|
|
|
6
6
|
export class RepositoryProvider {
|
|
7
7
|
protected readonly alepha = $inject(Alepha);
|
|
8
8
|
protected readonly registry = new Map<
|
|
9
|
-
|
|
9
|
+
EntityPrimitive<any>,
|
|
10
10
|
Service<Repository<any>>
|
|
11
11
|
>();
|
|
12
12
|
|
|
@@ -21,14 +21,14 @@ export class RepositoryProvider {
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
public getRepository<T extends TObject>(
|
|
24
|
-
entity:
|
|
24
|
+
entity: EntityPrimitive<T>,
|
|
25
25
|
): Repository<T> {
|
|
26
26
|
const RepositoryClass = this.createClassRepository(entity);
|
|
27
27
|
return this.alepha.inject(RepositoryClass);
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
public createClassRepository<T extends TObject>(
|
|
31
|
-
entity:
|
|
31
|
+
entity: EntityPrimitive<T>,
|
|
32
32
|
): Service<Repository<T>> {
|
|
33
33
|
let name = entity.name.charAt(0).toUpperCase() + entity.name.slice(1);
|
|
34
34
|
if (name.endsWith("s")) {
|
|
@@ -13,12 +13,12 @@ import {
|
|
|
13
13
|
type PgDatabase,
|
|
14
14
|
type PgTableWithColumns,
|
|
15
15
|
} from "drizzle-orm/pg-core";
|
|
16
|
+
import { DbError } from "../../errors/DbError.ts";
|
|
16
17
|
import type {
|
|
17
|
-
|
|
18
|
+
EntityPrimitive,
|
|
18
19
|
SchemaToTableConfig,
|
|
19
|
-
} from "../../
|
|
20
|
-
import type {
|
|
21
|
-
import { DbError } from "../../errors/DbError.ts";
|
|
20
|
+
} from "../../primitives/$entity.ts";
|
|
21
|
+
import type { SequencePrimitive } from "../../primitives/$sequence.ts";
|
|
22
22
|
import type { ModelBuilder } from "../../services/ModelBuilder.ts";
|
|
23
23
|
import type { DrizzleKitProvider } from "../DrizzleKitProvider.ts";
|
|
24
24
|
|
|
@@ -46,7 +46,7 @@ export abstract class DatabaseProvider {
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
public table<T extends TObject>(
|
|
49
|
-
entity:
|
|
49
|
+
entity: EntityPrimitive<T>,
|
|
50
50
|
): PgTableWithColumns<SchemaToTableConfig<T>> {
|
|
51
51
|
const table = this.tables.get(entity.name);
|
|
52
52
|
if (!table) {
|
|
@@ -65,11 +65,11 @@ export abstract class DatabaseProvider {
|
|
|
65
65
|
return table as PgTableWithColumns<SchemaToTableConfig<T>>;
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
public registerEntity(entity:
|
|
68
|
+
public registerEntity(entity: EntityPrimitive) {
|
|
69
69
|
this.builder.buildTable(entity, this);
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
public registerSequence(sequence:
|
|
72
|
+
public registerSequence(sequence: SequencePrimitive) {
|
|
73
73
|
this.builder.buildSequence(sequence, this);
|
|
74
74
|
}
|
|
75
75
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { SQL } from "drizzle-orm";
|
|
2
|
-
import type {
|
|
3
|
-
import type {
|
|
2
|
+
import type { EntityPrimitive } from "../primitives/$entity.ts";
|
|
3
|
+
import type { SequencePrimitive } from "../primitives/$sequence.ts";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Database-specific table configuration functions
|
|
@@ -24,15 +24,15 @@ export interface TableConfigBuilders<TConfig> {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
|
-
* Abstract base class for transforming Alepha
|
|
27
|
+
* Abstract base class for transforming Alepha Primitives (Entity, Sequence, etc...)
|
|
28
28
|
* into drizzle models (tables, enums, sequences, etc...).
|
|
29
29
|
*/
|
|
30
30
|
export abstract class ModelBuilder {
|
|
31
31
|
/**
|
|
32
|
-
* Build a table from an entity
|
|
32
|
+
* Build a table from an entity primitive.
|
|
33
33
|
*/
|
|
34
34
|
abstract buildTable(
|
|
35
|
-
entity:
|
|
35
|
+
entity: EntityPrimitive,
|
|
36
36
|
options: {
|
|
37
37
|
tables: Map<string, unknown>;
|
|
38
38
|
enums: Map<string, unknown>;
|
|
@@ -41,10 +41,10 @@ export abstract class ModelBuilder {
|
|
|
41
41
|
): void;
|
|
42
42
|
|
|
43
43
|
/**
|
|
44
|
-
* Build a sequence from a sequence
|
|
44
|
+
* Build a sequence from a sequence primitive.
|
|
45
45
|
*/
|
|
46
46
|
abstract buildSequence(
|
|
47
|
-
sequence:
|
|
47
|
+
sequence: SequencePrimitive,
|
|
48
48
|
options: {
|
|
49
49
|
sequences: Map<string, unknown>;
|
|
50
50
|
schema: string;
|
|
@@ -65,13 +65,13 @@ export abstract class ModelBuilder {
|
|
|
65
65
|
* Build the table configuration function for any database.
|
|
66
66
|
* This includes indexes, foreign keys, constraints, and custom config.
|
|
67
67
|
*
|
|
68
|
-
* @param entity - The entity
|
|
68
|
+
* @param entity - The entity primitive
|
|
69
69
|
* @param builders - Database-specific builder functions
|
|
70
70
|
* @param tableResolver - Function to resolve entity references to table columns
|
|
71
71
|
* @param customConfigHandler - Optional handler for custom config
|
|
72
72
|
*/
|
|
73
73
|
protected buildTableConfig<TConfig, TSelf>(
|
|
74
|
-
entity:
|
|
74
|
+
entity: EntityPrimitive,
|
|
75
75
|
builders: TableConfigBuilders<TConfig>,
|
|
76
76
|
tableResolver?: (entityName: string) => any,
|
|
77
77
|
customConfigHandler?: (config: any, self: TSelf) => TConfig[],
|
|
@@ -2,8 +2,8 @@ import { type TObject, TypeBoxValue, t } from "alepha";
|
|
|
2
2
|
import { getTableName, type SQL, sql } from "drizzle-orm";
|
|
3
3
|
import type { PgSelectBase, PgTableWithColumns } from "drizzle-orm/pg-core";
|
|
4
4
|
import { isSQLWrapper } from "drizzle-orm/sql/sql";
|
|
5
|
-
import type { EntityDescriptor } from "../descriptors/$entity.ts";
|
|
6
5
|
import type { PgRelationMap } from "../interfaces/PgQuery.ts";
|
|
6
|
+
import type { EntityPrimitive } from "../primitives/$entity.ts";
|
|
7
7
|
import type { DatabaseProvider } from "../providers/drivers/DatabaseProvider.ts";
|
|
8
8
|
import type { PgJoin } from "./QueryManager.ts";
|
|
9
9
|
|
|
@@ -20,7 +20,7 @@ export class PgRelationManager {
|
|
|
20
20
|
parentKey?: string,
|
|
21
21
|
) {
|
|
22
22
|
for (const [key, join] of Object.entries(withRelations)) {
|
|
23
|
-
const from = provider.table(join.join as
|
|
23
|
+
const from = provider.table(join.join as EntityPrimitive);
|
|
24
24
|
const on = isSQLWrapper(join.on)
|
|
25
25
|
? (join.on as SQL)
|
|
26
26
|
: sql`${table[join.on[0] as string]} = ${from[join.on[1].name]}`;
|
|
@@ -27,8 +27,8 @@ import {
|
|
|
27
27
|
type PgIdentityOptions,
|
|
28
28
|
type PgRefOptions,
|
|
29
29
|
} from "../constants/PG_SYMBOLS.ts";
|
|
30
|
-
import type {
|
|
31
|
-
import type {
|
|
30
|
+
import type { EntityPrimitive, FromSchema } from "../primitives/$entity.ts";
|
|
31
|
+
import type { SequencePrimitive } from "../primitives/$sequence.ts";
|
|
32
32
|
import { byte } from "../types/byte.ts";
|
|
33
33
|
import { schema } from "../types/schema.ts";
|
|
34
34
|
import { ModelBuilder } from "./ModelBuilder.ts";
|
|
@@ -57,7 +57,7 @@ export class PostgresModelBuilder extends ModelBuilder {
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
public buildTable(
|
|
60
|
-
entity:
|
|
60
|
+
entity: EntityPrimitive<any>,
|
|
61
61
|
options: {
|
|
62
62
|
tables: Map<string, unknown>;
|
|
63
63
|
enums: Map<string, unknown>;
|
|
@@ -88,7 +88,7 @@ export class PostgresModelBuilder extends ModelBuilder {
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
public buildSequence(
|
|
91
|
-
sequence:
|
|
91
|
+
sequence: SequencePrimitive,
|
|
92
92
|
options: {
|
|
93
93
|
sequences: Map<string, unknown>;
|
|
94
94
|
schema: string;
|
|
@@ -113,7 +113,7 @@ export class PostgresModelBuilder extends ModelBuilder {
|
|
|
113
113
|
* Get PostgreSQL-specific config builder for the table.
|
|
114
114
|
*/
|
|
115
115
|
protected getTableConfig(
|
|
116
|
-
entity:
|
|
116
|
+
entity: EntityPrimitive,
|
|
117
117
|
tables: Map<string, unknown>,
|
|
118
118
|
):
|
|
119
119
|
| ((
|
|
@@ -30,10 +30,6 @@ import {
|
|
|
30
30
|
PG_UPDATED_AT,
|
|
31
31
|
PG_VERSION,
|
|
32
32
|
} from "../constants/PG_SYMBOLS.ts";
|
|
33
|
-
import type {
|
|
34
|
-
EntityDescriptor,
|
|
35
|
-
SchemaToTableConfig,
|
|
36
|
-
} from "../descriptors/$entity.ts";
|
|
37
33
|
import { DbConflictError } from "../errors/DbConflictError.ts";
|
|
38
34
|
import { DbEntityNotFoundError } from "../errors/DbEntityNotFoundError.ts";
|
|
39
35
|
import { DbError } from "../errors/DbError.ts";
|
|
@@ -49,6 +45,10 @@ import type {
|
|
|
49
45
|
PgQueryWhere,
|
|
50
46
|
PgQueryWhereOrSQL,
|
|
51
47
|
} from "../interfaces/PgQueryWhere.ts";
|
|
48
|
+
import type {
|
|
49
|
+
EntityPrimitive,
|
|
50
|
+
SchemaToTableConfig,
|
|
51
|
+
} from "../primitives/$entity.ts";
|
|
52
52
|
import {
|
|
53
53
|
DatabaseProvider,
|
|
54
54
|
type SQLLike,
|
|
@@ -59,7 +59,7 @@ import { PgRelationManager } from "./PgRelationManager.ts";
|
|
|
59
59
|
import { type PgJoin, QueryManager } from "./QueryManager.ts";
|
|
60
60
|
|
|
61
61
|
export abstract class Repository<T extends TObject> {
|
|
62
|
-
public readonly entity:
|
|
62
|
+
public readonly entity: EntityPrimitive<T>;
|
|
63
63
|
public readonly provider: DatabaseProvider;
|
|
64
64
|
|
|
65
65
|
protected readonly relationManager = $inject(PgRelationManager);
|
|
@@ -67,10 +67,10 @@ export abstract class Repository<T extends TObject> {
|
|
|
67
67
|
protected readonly dateTimeProvider = $inject(DateTimeProvider);
|
|
68
68
|
protected readonly alepha = $inject(Alepha);
|
|
69
69
|
|
|
70
|
-
constructor(entity:
|
|
70
|
+
constructor(entity: EntityPrimitive<T>, provider = DatabaseProvider) {
|
|
71
71
|
this.entity = entity;
|
|
72
72
|
this.provider = this.alepha.inject(provider);
|
|
73
|
-
this.provider.registerEntity(entity as
|
|
73
|
+
this.provider.registerEntity(entity as EntityPrimitive);
|
|
74
74
|
}
|
|
75
75
|
|
|
76
76
|
/**
|
|
@@ -28,13 +28,13 @@ import {
|
|
|
28
28
|
PG_UPDATED_AT,
|
|
29
29
|
type PgRefOptions,
|
|
30
30
|
} from "../constants/PG_SYMBOLS.ts";
|
|
31
|
-
import type {
|
|
32
|
-
import type {
|
|
31
|
+
import type { EntityPrimitive } from "../primitives/$entity.ts";
|
|
32
|
+
import type { SequencePrimitive } from "../primitives/$sequence.ts";
|
|
33
33
|
import { ModelBuilder } from "./ModelBuilder.ts";
|
|
34
34
|
|
|
35
35
|
export class SqliteModelBuilder extends ModelBuilder {
|
|
36
36
|
public buildTable(
|
|
37
|
-
entity:
|
|
37
|
+
entity: EntityPrimitive<any>,
|
|
38
38
|
options: {
|
|
39
39
|
tables: Map<string, unknown>;
|
|
40
40
|
enums: Map<string, unknown>;
|
|
@@ -62,7 +62,7 @@ export class SqliteModelBuilder extends ModelBuilder {
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
public buildSequence(
|
|
65
|
-
sequence:
|
|
65
|
+
sequence: SequencePrimitive,
|
|
66
66
|
options: {
|
|
67
67
|
sequences: Map<string, unknown>;
|
|
68
68
|
schema: string;
|
|
@@ -75,7 +75,7 @@ export class SqliteModelBuilder extends ModelBuilder {
|
|
|
75
75
|
* Get SQLite-specific config builder for the table.
|
|
76
76
|
*/
|
|
77
77
|
protected getTableConfig(
|
|
78
|
-
entity:
|
|
78
|
+
entity: EntityPrimitive,
|
|
79
79
|
tables: Map<string, unknown>,
|
|
80
80
|
): ((self: BuildColumns<string, any, "sqlite">) => any) | undefined {
|
|
81
81
|
// SQLite-specific builders
|
package/src/queue/index.ts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { $module, type Alepha } from "alepha";
|
|
2
|
-
import { $consumer } from "./
|
|
3
|
-
import { $queue } from "./
|
|
2
|
+
import { $consumer } from "./primitives/$consumer.ts";
|
|
3
|
+
import { $queue } from "./primitives/$queue.ts";
|
|
4
4
|
import { MemoryQueueProvider } from "./providers/MemoryQueueProvider.ts";
|
|
5
5
|
import { QueueProvider } from "./providers/QueueProvider.ts";
|
|
6
6
|
import { WorkerProvider } from "./providers/WorkerProvider.ts";
|
|
7
7
|
|
|
8
8
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
9
9
|
|
|
10
|
-
export * from "./descriptors/$consumer.ts";
|
|
11
|
-
export * from "./descriptors/$queue.ts";
|
|
12
10
|
export * from "./interfaces/QueueJob.ts";
|
|
11
|
+
export * from "./primitives/$consumer.ts";
|
|
12
|
+
export * from "./primitives/$queue.ts";
|
|
13
13
|
export * from "./providers/MemoryQueueProvider.ts";
|
|
14
14
|
export * from "./providers/QueueProvider.ts";
|
|
15
15
|
export * from "./providers/WorkerProvider.ts";
|
|
@@ -17,9 +17,9 @@ export * from "./providers/WorkerProvider.ts";
|
|
|
17
17
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
|
-
* Provides asynchronous message queuing and processing capabilities through declarative queue
|
|
20
|
+
* Provides asynchronous message queuing and processing capabilities through declarative queue primitives.
|
|
21
21
|
*
|
|
22
|
-
* The queue module enables reliable background job processing and message passing using the `$queue`
|
|
22
|
+
* The queue module enables reliable background job processing and message passing using the `$queue` primitive
|
|
23
23
|
* on class properties. It supports schema validation, automatic retries, and multiple queue backends for
|
|
24
24
|
* building scalable, decoupled applications with robust error handling.
|
|
25
25
|
*
|
|
@@ -29,7 +29,7 @@ export * from "./providers/WorkerProvider.ts";
|
|
|
29
29
|
*/
|
|
30
30
|
export const AlephaQueue = $module({
|
|
31
31
|
name: "alepha.queue",
|
|
32
|
-
|
|
32
|
+
primitives: [$queue, $consumer],
|
|
33
33
|
services: [QueueProvider, MemoryQueueProvider, WorkerProvider],
|
|
34
34
|
register: (alepha: Alepha) =>
|
|
35
35
|
alepha
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
Descriptor,
|
|
2
|
+
createPrimitive,
|
|
4
3
|
KIND,
|
|
4
|
+
Primitive,
|
|
5
5
|
type Static,
|
|
6
6
|
type TSchema,
|
|
7
7
|
} from "alepha";
|
|
8
|
-
import type {
|
|
8
|
+
import type { QueuePrimitive } from "./$queue.ts";
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
|
-
* Creates a consumer
|
|
11
|
+
* Creates a consumer primitive to process messages from a specific queue.
|
|
12
12
|
*
|
|
13
13
|
* Provides a dedicated message consumer that connects to a queue and processes messages
|
|
14
14
|
* with custom handler logic, enabling scalable architectures where multiple consumers
|
|
15
15
|
* can process messages from the same queue.
|
|
16
16
|
*
|
|
17
17
|
* **Key Features**
|
|
18
|
-
* - Seamless integration with any $queue
|
|
18
|
+
* - Seamless integration with any $queue primitive
|
|
19
19
|
* - Full type safety inherited from queue schema
|
|
20
20
|
* - Automatic worker management for background processing
|
|
21
21
|
* - Built-in error handling and retry mechanisms
|
|
@@ -57,16 +57,16 @@ import type { QueueDescriptor } from "./$queue.ts";
|
|
|
57
57
|
* ```
|
|
58
58
|
*/
|
|
59
59
|
export const $consumer = <T extends TSchema>(
|
|
60
|
-
options:
|
|
61
|
-
):
|
|
62
|
-
return
|
|
60
|
+
options: ConsumerPrimitiveOptions<T>,
|
|
61
|
+
): ConsumerPrimitive<T> => {
|
|
62
|
+
return createPrimitive(ConsumerPrimitive<T>, options);
|
|
63
63
|
};
|
|
64
64
|
|
|
65
65
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
66
66
|
|
|
67
|
-
export interface
|
|
67
|
+
export interface ConsumerPrimitiveOptions<T extends TSchema> {
|
|
68
68
|
/**
|
|
69
|
-
* The queue
|
|
69
|
+
* The queue primitive that this consumer will process messages from.
|
|
70
70
|
*
|
|
71
71
|
* This establishes the connection between the consumer and its source queue:
|
|
72
72
|
* - The consumer inherits the queue's message schema for type safety
|
|
@@ -90,12 +90,12 @@ export interface ConsumerDescriptorOptions<T extends TSchema> {
|
|
|
90
90
|
*
|
|
91
91
|
* // Then, create a consumer for that queue
|
|
92
92
|
* emailConsumer = $consumer({
|
|
93
|
-
* queue: this.emailQueue, // Reference the queue
|
|
93
|
+
* queue: this.emailQueue, // Reference the queue primitive
|
|
94
94
|
* handler: async (message) => { } // process email
|
|
95
95
|
* });
|
|
96
96
|
* ```
|
|
97
97
|
*/
|
|
98
|
-
queue:
|
|
98
|
+
queue: QueuePrimitive<T>;
|
|
99
99
|
|
|
100
100
|
/**
|
|
101
101
|
* Message handler function that processes individual messages from the queue.
|
|
@@ -175,8 +175,8 @@ export interface ConsumerDescriptorOptions<T extends TSchema> {
|
|
|
175
175
|
|
|
176
176
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
177
177
|
|
|
178
|
-
export class
|
|
179
|
-
|
|
178
|
+
export class ConsumerPrimitive<T extends TSchema> extends Primitive<
|
|
179
|
+
ConsumerPrimitiveOptions<T>
|
|
180
180
|
> {}
|
|
181
181
|
|
|
182
|
-
$consumer[KIND] =
|
|
182
|
+
$consumer[KIND] = ConsumerPrimitive;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
Descriptor,
|
|
2
|
+
createPrimitive,
|
|
4
3
|
KIND,
|
|
4
|
+
Primitive,
|
|
5
5
|
type Service,
|
|
6
6
|
type Static,
|
|
7
7
|
type TSchema,
|
|
@@ -15,9 +15,9 @@ import { MemoryQueueProvider } from "../providers/MemoryQueueProvider.ts";
|
|
|
15
15
|
import { QueueProvider } from "../providers/QueueProvider.ts";
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
|
-
* Creates a queue
|
|
18
|
+
* Creates a queue primitive for asynchronous message processing with background workers.
|
|
19
19
|
*
|
|
20
|
-
* The $queue
|
|
20
|
+
* The $queue primitive enables powerful asynchronous communication patterns in your application.
|
|
21
21
|
* It provides type-safe message queuing with automatic worker processing, making it perfect for
|
|
22
22
|
* decoupling components and handling background tasks efficiently.
|
|
23
23
|
*
|
|
@@ -126,14 +126,14 @@ import { QueueProvider } from "../providers/QueueProvider.ts";
|
|
|
126
126
|
* ```
|
|
127
127
|
*/
|
|
128
128
|
export const $queue = <T extends TSchema>(
|
|
129
|
-
options:
|
|
130
|
-
):
|
|
131
|
-
return
|
|
129
|
+
options: QueuePrimitiveOptions<T>,
|
|
130
|
+
): QueuePrimitive<T> => {
|
|
131
|
+
return createPrimitive(QueuePrimitive<T>, options);
|
|
132
132
|
};
|
|
133
133
|
|
|
134
134
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
135
135
|
|
|
136
|
-
export interface
|
|
136
|
+
export interface QueuePrimitiveOptions<T extends TSchema> {
|
|
137
137
|
/**
|
|
138
138
|
* Unique name for the queue.
|
|
139
139
|
*
|
|
@@ -337,8 +337,8 @@ export interface QueueDescriptorOptions<T extends TSchema> {
|
|
|
337
337
|
|
|
338
338
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
339
339
|
|
|
340
|
-
export class
|
|
341
|
-
|
|
340
|
+
export class QueuePrimitive<T extends TSchema> extends Primitive<
|
|
341
|
+
QueuePrimitiveOptions<T>
|
|
342
342
|
> {
|
|
343
343
|
protected readonly log = $logger();
|
|
344
344
|
public readonly provider = this.$provider();
|
|
@@ -415,7 +415,7 @@ export class QueueDescriptor<T extends TSchema> extends Descriptor<
|
|
|
415
415
|
}
|
|
416
416
|
|
|
417
417
|
/**
|
|
418
|
-
* Get default job options from
|
|
418
|
+
* Get default job options from primitive configuration.
|
|
419
419
|
*/
|
|
420
420
|
protected getDefaultJobOptions() {
|
|
421
421
|
return {
|
|
@@ -442,7 +442,7 @@ export class QueueDescriptor<T extends TSchema> extends Descriptor<
|
|
|
442
442
|
}
|
|
443
443
|
}
|
|
444
444
|
|
|
445
|
-
$queue[KIND] =
|
|
445
|
+
$queue[KIND] = QueuePrimitive;
|
|
446
446
|
|
|
447
447
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
448
448
|
|
|
@@ -9,13 +9,13 @@ import {
|
|
|
9
9
|
} from "alepha";
|
|
10
10
|
import { DateTimeProvider } from "alepha/datetime";
|
|
11
11
|
import { $logger } from "alepha/logger";
|
|
12
|
-
import {
|
|
12
|
+
import type { QueueAcquiredJob } from "../interfaces/QueueJob.ts";
|
|
13
|
+
import { $consumer } from "../primitives/$consumer.ts";
|
|
13
14
|
import {
|
|
14
15
|
$queue,
|
|
15
|
-
type QueueDescriptor,
|
|
16
16
|
type QueueMessage,
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
type QueuePrimitive,
|
|
18
|
+
} from "../primitives/$queue.ts";
|
|
19
19
|
import { QueueProvider } from "./QueueProvider.ts";
|
|
20
20
|
|
|
21
21
|
const envSchema = t.object({
|
|
@@ -83,7 +83,7 @@ export class WorkerProvider {
|
|
|
83
83
|
on: "start",
|
|
84
84
|
priority: "last",
|
|
85
85
|
handler: () => {
|
|
86
|
-
for (const queue of this.alepha.
|
|
86
|
+
for (const queue of this.alepha.primitives($queue)) {
|
|
87
87
|
const handler = queue.options.handler;
|
|
88
88
|
if (handler) {
|
|
89
89
|
this.consumers.push({
|
|
@@ -93,7 +93,7 @@ export class WorkerProvider {
|
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
for (const consumer of this.alepha.
|
|
96
|
+
for (const consumer of this.alepha.primitives($consumer)) {
|
|
97
97
|
this.consumers.push(consumer.options);
|
|
98
98
|
}
|
|
99
99
|
|
|
@@ -333,7 +333,7 @@ export class WorkerProvider {
|
|
|
333
333
|
}
|
|
334
334
|
|
|
335
335
|
export interface Consumer<T extends TSchema = TSchema> {
|
|
336
|
-
queue:
|
|
336
|
+
queue: QueuePrimitive<T>;
|
|
337
337
|
handler: (message: QueueMessage<T>) => Promise<void>;
|
|
338
338
|
}
|
|
339
339
|
|
package/src/retry/index.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { $module } from "alepha";
|
|
2
|
-
import { $retry } from "./
|
|
2
|
+
import { $retry } from "./primitives/$retry.ts";
|
|
3
3
|
import { RetryProvider } from "./providers/RetryProvider.ts";
|
|
4
4
|
|
|
5
5
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
6
6
|
|
|
7
|
-
export * from "./descriptors/$retry.ts";
|
|
8
7
|
export * from "./errors/RetryCancelError.ts";
|
|
9
8
|
export * from "./errors/RetryTimeoutError.ts";
|
|
9
|
+
export * from "./primitives/$retry.ts";
|
|
10
10
|
export * from "./providers/RetryProvider.ts";
|
|
11
11
|
|
|
12
12
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
@@ -19,6 +19,6 @@ export * from "./providers/RetryProvider.ts";
|
|
|
19
19
|
*/
|
|
20
20
|
export const AlephaRetry = $module({
|
|
21
21
|
name: "alepha.retry",
|
|
22
|
-
|
|
22
|
+
primitives: [$retry],
|
|
23
23
|
services: [RetryProvider],
|
|
24
24
|
});
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
$inject,
|
|
3
|
-
|
|
4
|
-
Descriptor,
|
|
5
|
-
type DescriptorArgs,
|
|
3
|
+
createPrimitive,
|
|
6
4
|
KIND,
|
|
5
|
+
Primitive,
|
|
6
|
+
type PrimitiveArgs,
|
|
7
7
|
} from "alepha";
|
|
8
8
|
import type { DurationLike } from "alepha/datetime";
|
|
9
9
|
import type { RetryBackoffOptions } from "../providers/RetryProvider.ts";
|
|
@@ -14,16 +14,16 @@ import { RetryProvider } from "../providers/RetryProvider.ts";
|
|
|
14
14
|
* with support for exponential backoff, max duration, and cancellation.
|
|
15
15
|
*/
|
|
16
16
|
export const $retry = <T extends (...args: any[]) => any>(
|
|
17
|
-
options:
|
|
18
|
-
):
|
|
19
|
-
const instance =
|
|
17
|
+
options: RetryPrimitiveOptions<T>,
|
|
18
|
+
): RetryPrimitiveFn<T> => {
|
|
19
|
+
const instance = createPrimitive(RetryPrimitive, options);
|
|
20
20
|
const fn = (...args: Parameters<T>) => instance.run(...args);
|
|
21
|
-
return Object.setPrototypeOf(fn, instance) as
|
|
21
|
+
return Object.setPrototypeOf(fn, instance) as RetryPrimitiveFn<T>;
|
|
22
22
|
};
|
|
23
23
|
|
|
24
24
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
25
25
|
|
|
26
|
-
export interface
|
|
26
|
+
export interface RetryPrimitiveOptions<T extends (...args: any[]) => any> {
|
|
27
27
|
/**
|
|
28
28
|
* The function to retry.
|
|
29
29
|
*/
|
|
@@ -72,13 +72,13 @@ export interface RetryDescriptorOptions<T extends (...args: any[]) => any> {
|
|
|
72
72
|
|
|
73
73
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
74
74
|
|
|
75
|
-
export class
|
|
75
|
+
export class RetryPrimitive<
|
|
76
76
|
T extends (...args: any[]) => any,
|
|
77
|
-
> extends
|
|
77
|
+
> extends Primitive<RetryPrimitiveOptions<T>> {
|
|
78
78
|
protected readonly retryProvider = $inject(RetryProvider);
|
|
79
79
|
protected appAbortController?: AbortController;
|
|
80
80
|
|
|
81
|
-
constructor(args:
|
|
81
|
+
constructor(args: PrimitiveArgs<RetryPrimitiveOptions<T>>) {
|
|
82
82
|
super(args);
|
|
83
83
|
|
|
84
84
|
this.alepha.events.on("stop", () => {
|
|
@@ -100,9 +100,9 @@ export class RetryDescriptor<
|
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
102
|
|
|
103
|
-
export interface
|
|
104
|
-
extends
|
|
103
|
+
export interface RetryPrimitiveFn<T extends (...args: any[]) => any>
|
|
104
|
+
extends RetryPrimitive<T> {
|
|
105
105
|
(...args: Parameters<T>): Promise<ReturnType<T>>;
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
-
$retry[KIND] =
|
|
108
|
+
$retry[KIND] = RetryPrimitive;
|
package/src/scheduler/index.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { $module } from "alepha";
|
|
2
2
|
import type { DateTime } from "alepha/datetime";
|
|
3
3
|
import { AlephaLock } from "alepha/lock";
|
|
4
|
-
import { $scheduler } from "./
|
|
4
|
+
import { $scheduler } from "./primitives/$scheduler.ts";
|
|
5
5
|
import { CronProvider } from "./providers/CronProvider.ts";
|
|
6
6
|
|
|
7
7
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
8
8
|
|
|
9
9
|
export * from "./constants/CRON.ts";
|
|
10
|
-
export * from "./
|
|
10
|
+
export * from "./primitives/$scheduler.ts";
|
|
11
11
|
export * from "./providers/CronProvider.ts";
|
|
12
12
|
|
|
13
13
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
@@ -42,6 +42,6 @@ declare module "alepha" {
|
|
|
42
42
|
*/
|
|
43
43
|
export const AlephaScheduler = $module({
|
|
44
44
|
name: "alepha.scheduler",
|
|
45
|
-
|
|
45
|
+
primitives: [$scheduler],
|
|
46
46
|
services: [AlephaLock, CronProvider],
|
|
47
47
|
});
|