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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { $inject, Alepha, AlephaError, type Async, t } from "alepha";
|
|
2
2
|
import { $logger } from "alepha/logger";
|
|
3
3
|
import {
|
|
4
|
-
type
|
|
4
|
+
type ActionPrimitive,
|
|
5
5
|
type ClientRequestEntry,
|
|
6
6
|
type ClientRequestOptions,
|
|
7
7
|
type ClientRequestResponse,
|
|
@@ -79,7 +79,7 @@ export class LinkProvider {
|
|
|
79
79
|
|
|
80
80
|
public get links(): HttpClientLink[] {
|
|
81
81
|
// TODO: not performant at all, use a map instead for ServerLinks
|
|
82
|
-
const apiLinks = this.alepha.
|
|
82
|
+
const apiLinks = this.alepha.store.get(
|
|
83
83
|
"alepha.server.request.apiLinks",
|
|
84
84
|
)?.links;
|
|
85
85
|
if (apiLinks) {
|
|
@@ -114,7 +114,7 @@ export class LinkProvider {
|
|
|
114
114
|
},
|
|
115
115
|
);
|
|
116
116
|
|
|
117
|
-
this.alepha.
|
|
117
|
+
this.alepha.store.set("alepha.server.request.apiLinks", data);
|
|
118
118
|
|
|
119
119
|
return data.links;
|
|
120
120
|
}
|
|
@@ -277,7 +277,7 @@ export class LinkProvider {
|
|
|
277
277
|
): Promise<HttpClientLink> {
|
|
278
278
|
if (
|
|
279
279
|
this.alepha.isBrowser() &&
|
|
280
|
-
!this.alepha.
|
|
280
|
+
!this.alepha.store.get("alepha.server.request.apiLinks")
|
|
281
281
|
) {
|
|
282
282
|
await this.fetchLinks();
|
|
283
283
|
}
|
|
@@ -334,15 +334,15 @@ export interface ClientScope {
|
|
|
334
334
|
}
|
|
335
335
|
|
|
336
336
|
export type HttpVirtualClient<T> = {
|
|
337
|
-
[K in keyof T as T[K] extends
|
|
337
|
+
[K in keyof T as T[K] extends ActionPrimitive<RequestConfigSchema>
|
|
338
338
|
? K
|
|
339
|
-
: never]: T[K] extends
|
|
339
|
+
: never]: T[K] extends ActionPrimitive<infer Schema>
|
|
340
340
|
? VirtualAction<Schema>
|
|
341
341
|
: never;
|
|
342
342
|
};
|
|
343
343
|
|
|
344
344
|
export interface VirtualAction<T extends RequestConfigSchema>
|
|
345
|
-
extends Pick<
|
|
345
|
+
extends Pick<ActionPrimitive<T>, "name" | "run" | "fetch"> {
|
|
346
346
|
(
|
|
347
347
|
config?: ClientRequestEntry<T>,
|
|
348
348
|
opts?: ClientRequestOptions,
|
package/src/server-links/providers/{RemoteDescriptorProvider.ts → RemotePrimitiveProvider.ts}
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { $env, $hook, $inject, Alepha, t } from "alepha";
|
|
2
2
|
import { $logger } from "alepha/logger";
|
|
3
3
|
import { $retry } from "alepha/retry";
|
|
4
|
-
import type {
|
|
4
|
+
import type { ServiceAccountPrimitive } from "alepha/security";
|
|
5
5
|
import { ServerProxyProvider } from "alepha/server/proxy";
|
|
6
|
-
import { $remote, type
|
|
6
|
+
import { $remote, type RemotePrimitive } from "../primitives/$remote.ts";
|
|
7
7
|
import {
|
|
8
8
|
type ApiLinksResponse,
|
|
9
9
|
apiLinksResponseSchema,
|
|
@@ -17,7 +17,7 @@ const envSchema = t.object({
|
|
|
17
17
|
}),
|
|
18
18
|
});
|
|
19
19
|
|
|
20
|
-
export class
|
|
20
|
+
export class RemotePrimitiveProvider {
|
|
21
21
|
protected readonly env = $env(envSchema);
|
|
22
22
|
protected readonly alepha = $inject(Alepha);
|
|
23
23
|
protected readonly proxyProvider = $inject(ServerProxyProvider);
|
|
@@ -32,7 +32,7 @@ export class RemoteDescriptorProvider {
|
|
|
32
32
|
public readonly configure = $hook({
|
|
33
33
|
on: "configure",
|
|
34
34
|
handler: async () => {
|
|
35
|
-
const remotes = this.alepha.
|
|
35
|
+
const remotes = this.alepha.primitives($remote);
|
|
36
36
|
for (const remote of remotes) {
|
|
37
37
|
await this.registerRemote(remote);
|
|
38
38
|
}
|
|
@@ -78,7 +78,7 @@ export class RemoteDescriptorProvider {
|
|
|
78
78
|
},
|
|
79
79
|
});
|
|
80
80
|
|
|
81
|
-
public async registerRemote(value:
|
|
81
|
+
public async registerRemote(value: RemotePrimitive): Promise<void> {
|
|
82
82
|
const options = value.options;
|
|
83
83
|
const url = typeof options.url === "string" ? options.url : options.url();
|
|
84
84
|
const linkPath = LinkProvider.path.apiLinks;
|
|
@@ -225,7 +225,7 @@ export interface ServerRemote {
|
|
|
225
225
|
/**
|
|
226
226
|
* Force a default access token provider when not provided.
|
|
227
227
|
*/
|
|
228
|
-
serviceAccount?:
|
|
228
|
+
serviceAccount?: ServiceAccountPrimitive;
|
|
229
229
|
|
|
230
230
|
/**
|
|
231
231
|
* Prefix for the remote service links.
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
apiLinksResponseSchema,
|
|
19
19
|
} from "../schemas/apiLinksResponseSchema.ts";
|
|
20
20
|
import { LinkProvider } from "./LinkProvider.ts";
|
|
21
|
-
import {
|
|
21
|
+
import { RemotePrimitiveProvider } from "./RemotePrimitiveProvider.ts";
|
|
22
22
|
|
|
23
23
|
const envSchema = t.object({
|
|
24
24
|
SERVER_API_PREFIX: t.text({
|
|
@@ -31,7 +31,7 @@ export class ServerLinksProvider {
|
|
|
31
31
|
protected readonly env = $env(envSchema);
|
|
32
32
|
protected readonly alepha = $inject(Alepha);
|
|
33
33
|
protected readonly linkProvider = $inject(LinkProvider);
|
|
34
|
-
protected readonly remoteProvider = $inject(
|
|
34
|
+
protected readonly remoteProvider = $inject(RemotePrimitiveProvider);
|
|
35
35
|
protected readonly serverTimingProvider = $inject(ServerTimingProvider);
|
|
36
36
|
|
|
37
37
|
public get prefix() {
|
|
@@ -42,7 +42,7 @@ export class ServerLinksProvider {
|
|
|
42
42
|
on: "configure",
|
|
43
43
|
handler: () => {
|
|
44
44
|
// convert all $action to local links
|
|
45
|
-
for (const action of this.alepha.
|
|
45
|
+
for (const action of this.alepha.primitives($action)) {
|
|
46
46
|
this.linkProvider.registerLink({
|
|
47
47
|
name: action.name,
|
|
48
48
|
group: action.group,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { $module } from "alepha";
|
|
2
2
|
import { AlephaServer } from "alepha/server";
|
|
3
|
-
import { $proxy } from "./
|
|
3
|
+
import { $proxy } from "./primitives/$proxy.ts";
|
|
4
4
|
import { ServerProxyProvider } from "./providers/ServerProxyProvider.ts";
|
|
5
5
|
|
|
6
6
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
7
7
|
|
|
8
|
-
export * from "./
|
|
8
|
+
export * from "./primitives/$proxy.ts";
|
|
9
9
|
export * from "./providers/ServerProxyProvider.ts";
|
|
10
10
|
|
|
11
11
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
@@ -18,6 +18,6 @@ export * from "./providers/ServerProxyProvider.ts";
|
|
|
18
18
|
*/
|
|
19
19
|
export const AlephaServerProxy = $module({
|
|
20
20
|
name: "alepha.server.proxy",
|
|
21
|
-
|
|
21
|
+
primitives: [$proxy],
|
|
22
22
|
services: [AlephaServer, ServerProxyProvider],
|
|
23
23
|
});
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { type Async,
|
|
1
|
+
import { type Async, createPrimitive, KIND, Primitive } from "alepha";
|
|
2
2
|
import type { ServerRequest } from "alepha/server";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Creates a proxy
|
|
5
|
+
* Creates a proxy primitive to forward requests to another server.
|
|
6
6
|
*
|
|
7
|
-
* This
|
|
7
|
+
* This primitive enables you to create reverse proxy functionality, allowing your Alepha server
|
|
8
8
|
* to forward requests to other services while maintaining a unified API surface. It's particularly
|
|
9
9
|
* useful for microservice architectures, API gateways, or when you need to aggregate multiple
|
|
10
10
|
* services behind a single endpoint.
|
|
@@ -84,11 +84,11 @@ import type { ServerRequest } from "alepha/server";
|
|
|
84
84
|
* }
|
|
85
85
|
* ```
|
|
86
86
|
*/
|
|
87
|
-
export const $proxy = (options:
|
|
88
|
-
return
|
|
87
|
+
export const $proxy = (options: ProxyPrimitiveOptions): ProxyPrimitive => {
|
|
88
|
+
return createPrimitive(ProxyPrimitive, options);
|
|
89
89
|
};
|
|
90
90
|
|
|
91
|
-
export type
|
|
91
|
+
export type ProxyPrimitiveOptions = {
|
|
92
92
|
/**
|
|
93
93
|
* Path pattern to match for proxying requests.
|
|
94
94
|
*
|
|
@@ -219,6 +219,6 @@ export type ProxyDescriptorOptions = {
|
|
|
219
219
|
// retry?: RetryOptions;
|
|
220
220
|
};
|
|
221
221
|
|
|
222
|
-
export class
|
|
222
|
+
export class ProxyPrimitive extends Primitive<ProxyPrimitiveOptions> {}
|
|
223
223
|
|
|
224
|
-
$proxy[KIND] =
|
|
224
|
+
$proxy[KIND] = ProxyPrimitive;
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
type ServerRequest,
|
|
8
8
|
ServerRouterProvider,
|
|
9
9
|
} from "alepha/server";
|
|
10
|
-
import { $proxy, type
|
|
10
|
+
import { $proxy, type ProxyPrimitiveOptions } from "../primitives/$proxy.ts";
|
|
11
11
|
|
|
12
12
|
export class ServerProxyProvider {
|
|
13
13
|
protected readonly log = $logger();
|
|
@@ -17,13 +17,13 @@ export class ServerProxyProvider {
|
|
|
17
17
|
protected readonly configure = $hook({
|
|
18
18
|
on: "configure",
|
|
19
19
|
handler: () => {
|
|
20
|
-
for (const proxy of this.alepha.
|
|
20
|
+
for (const proxy of this.alepha.primitives($proxy)) {
|
|
21
21
|
this.createProxy(proxy.options);
|
|
22
22
|
}
|
|
23
23
|
},
|
|
24
24
|
});
|
|
25
25
|
|
|
26
|
-
public createProxy(options:
|
|
26
|
+
public createProxy(options: ProxyPrimitiveOptions): void {
|
|
27
27
|
if (options.disabled) {
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
@@ -52,7 +52,7 @@ export class ServerProxyProvider {
|
|
|
52
52
|
|
|
53
53
|
public createProxyHandler(
|
|
54
54
|
target: string,
|
|
55
|
-
options: Omit<
|
|
55
|
+
options: Omit<ProxyPrimitiveOptions, "path">,
|
|
56
56
|
): ServerHandler {
|
|
57
57
|
return async (request) => {
|
|
58
58
|
const url = new URL(target + request.url.pathname);
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { $module } from "alepha";
|
|
2
2
|
import { AlephaServer } from "alepha/server";
|
|
3
|
-
import { $rateLimit } from "./
|
|
3
|
+
import { $rateLimit } from "./primitives/$rateLimit.ts";
|
|
4
4
|
import { ServerRateLimitProvider } from "./providers/ServerRateLimitProvider.ts";
|
|
5
5
|
|
|
6
6
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
7
7
|
|
|
8
|
-
export * from "./
|
|
8
|
+
export * from "./primitives/$rateLimit.ts";
|
|
9
9
|
export * from "./providers/ServerRateLimitProvider.ts";
|
|
10
10
|
|
|
11
11
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
12
12
|
|
|
13
13
|
declare module "alepha/server" {
|
|
14
|
-
interface
|
|
14
|
+
interface ActionPrimitiveOptions<TConfig> {
|
|
15
15
|
/**
|
|
16
16
|
* Rate limiting configuration for this action.
|
|
17
17
|
* When specified, the action will be rate limited according to these settings.
|
|
@@ -47,8 +47,8 @@ export interface RateLimitOptions {
|
|
|
47
47
|
* Provides rate limiting capabilities for server routes and actions with configurable limits and windows.
|
|
48
48
|
*
|
|
49
49
|
* The server-rate-limit module enables per-route and per-action rate limiting using either:
|
|
50
|
-
* - The `$rateLimit`
|
|
51
|
-
* - The `rateLimit` option in action
|
|
50
|
+
* - The `$rateLimit` primitive with `paths` option for path-based rate limiting
|
|
51
|
+
* - The `rateLimit` option in action primitives for action-specific limiting
|
|
52
52
|
*
|
|
53
53
|
* It offers sliding window rate limiting, custom key generation, and seamless integration with server routes.
|
|
54
54
|
*
|
|
@@ -71,6 +71,6 @@ export interface RateLimitOptions {
|
|
|
71
71
|
*/
|
|
72
72
|
export const AlephaServerRateLimit = $module({
|
|
73
73
|
name: "alepha.server.rate-limit",
|
|
74
|
-
|
|
74
|
+
primitives: [$rateLimit],
|
|
75
75
|
services: [AlephaServer, ServerRateLimitProvider],
|
|
76
76
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $inject,
|
|
1
|
+
import { $inject, createPrimitive, KIND, Primitive } from "alepha";
|
|
2
2
|
import type { ServerRequest } from "alepha/server";
|
|
3
3
|
import type { RateLimitOptions } from "../index.ts";
|
|
4
4
|
import {
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Declares rate limiting for server routes or custom usage.
|
|
11
|
-
* This
|
|
11
|
+
* This primitive provides methods to check rate limits and configure behavior
|
|
12
12
|
* within the server request/response cycle.
|
|
13
13
|
*
|
|
14
14
|
* @example
|
|
@@ -33,32 +33,32 @@ import {
|
|
|
33
33
|
* ```
|
|
34
34
|
*/
|
|
35
35
|
export const $rateLimit = (
|
|
36
|
-
options:
|
|
37
|
-
):
|
|
38
|
-
return
|
|
36
|
+
options: RateLimitPrimitiveOptions = {},
|
|
37
|
+
): AbstractRateLimitPrimitive => {
|
|
38
|
+
return createPrimitive(RateLimitPrimitive, options);
|
|
39
39
|
};
|
|
40
40
|
|
|
41
41
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
42
42
|
|
|
43
|
-
export interface
|
|
43
|
+
export interface RateLimitPrimitiveOptions extends RateLimitOptions {
|
|
44
44
|
/** Name identifier for this rate limit (default: property key) */
|
|
45
45
|
name?: string;
|
|
46
46
|
/** Path patterns to match (supports wildcards like /api/*) */
|
|
47
47
|
paths?: string[];
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
export interface
|
|
50
|
+
export interface AbstractRateLimitPrimitive {
|
|
51
51
|
readonly name: string;
|
|
52
|
-
readonly options:
|
|
52
|
+
readonly options: RateLimitPrimitiveOptions;
|
|
53
53
|
check(
|
|
54
54
|
request: ServerRequest,
|
|
55
55
|
options?: RateLimitOptions,
|
|
56
56
|
): Promise<RateLimitResult>;
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
export class
|
|
60
|
-
extends
|
|
61
|
-
implements
|
|
59
|
+
export class RateLimitPrimitive
|
|
60
|
+
extends Primitive<RateLimitPrimitiveOptions>
|
|
61
|
+
implements AbstractRateLimitPrimitive
|
|
62
62
|
{
|
|
63
63
|
protected readonly serverRateLimitProvider = $inject(ServerRateLimitProvider);
|
|
64
64
|
|
|
@@ -72,7 +72,7 @@ export class RateLimitDescriptor
|
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
/**
|
|
75
|
-
* Checks rate limit for the given request using this
|
|
75
|
+
* Checks rate limit for the given request using this primitive's configuration.
|
|
76
76
|
*/
|
|
77
77
|
public async check(
|
|
78
78
|
request: ServerRequest,
|
|
@@ -83,4 +83,4 @@ export class RateLimitDescriptor
|
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
-
$rateLimit[KIND] =
|
|
86
|
+
$rateLimit[KIND] = RateLimitPrimitive;
|
|
@@ -6,8 +6,8 @@ import {
|
|
|
6
6
|
type ServerRequest,
|
|
7
7
|
ServerRouterProvider,
|
|
8
8
|
} from "alepha/server";
|
|
9
|
-
import type { RateLimitDescriptorOptions } from "../descriptors/$rateLimit.ts";
|
|
10
9
|
import type { RateLimitOptions } from "../index.ts";
|
|
10
|
+
import type { RateLimitPrimitiveOptions } from "../primitives/$rateLimit.ts";
|
|
11
11
|
|
|
12
12
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
13
13
|
|
|
@@ -85,12 +85,12 @@ export class ServerRateLimitProvider {
|
|
|
85
85
|
/**
|
|
86
86
|
* Registered rate limit configurations with their path patterns
|
|
87
87
|
*/
|
|
88
|
-
public readonly registeredConfigs:
|
|
88
|
+
public readonly registeredConfigs: RateLimitPrimitiveOptions[] = [];
|
|
89
89
|
|
|
90
90
|
/**
|
|
91
|
-
* Register a rate limit configuration (called by
|
|
91
|
+
* Register a rate limit configuration (called by primitives)
|
|
92
92
|
*/
|
|
93
|
-
public registerRateLimit(config:
|
|
93
|
+
public registerRateLimit(config: RateLimitPrimitiveOptions): void {
|
|
94
94
|
this.registeredConfigs.push(config);
|
|
95
95
|
}
|
|
96
96
|
|
|
@@ -168,7 +168,7 @@ export class ServerRateLimitProvider {
|
|
|
168
168
|
* Build complete rate limit options by merging with global defaults
|
|
169
169
|
*/
|
|
170
170
|
protected buildRateLimitOptions(
|
|
171
|
-
config:
|
|
171
|
+
config: RateLimitPrimitiveOptions,
|
|
172
172
|
): RateLimitOptions {
|
|
173
173
|
return {
|
|
174
174
|
max: config.max ?? this.globalOptions.max,
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
type UserAccountToken,
|
|
9
9
|
} from "alepha/security";
|
|
10
10
|
import { AlephaServer, type FetchOptions } from "alepha/server";
|
|
11
|
-
import { $basicAuth } from "./
|
|
11
|
+
import { $basicAuth } from "./primitives/$basicAuth.ts";
|
|
12
12
|
import { ServerBasicAuthProvider } from "./providers/ServerBasicAuthProvider.ts";
|
|
13
13
|
import {
|
|
14
14
|
type ServerRouteSecure,
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
|
|
18
18
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
19
19
|
|
|
20
|
-
export * from "./
|
|
20
|
+
export * from "./primitives/$basicAuth.ts";
|
|
21
21
|
export * from "./providers/ServerBasicAuthProvider.ts";
|
|
22
22
|
export * from "./providers/ServerSecurityProvider.ts";
|
|
23
23
|
|
|
@@ -84,7 +84,7 @@ declare module "alepha/server" {
|
|
|
84
84
|
*/
|
|
85
85
|
export const AlephaServerSecurity = $module({
|
|
86
86
|
name: "alepha.server.security",
|
|
87
|
-
|
|
87
|
+
primitives: [$realm, $role, $permission, $basicAuth],
|
|
88
88
|
services: [
|
|
89
89
|
AlephaServer,
|
|
90
90
|
AlephaSecurity,
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
import { $inject,
|
|
1
|
+
import { $inject, createPrimitive, KIND, Primitive } from "alepha";
|
|
2
2
|
import type { ServerRequest } from "alepha/server";
|
|
3
3
|
import type {
|
|
4
|
-
BasicAuthDescriptorConfig,
|
|
5
4
|
BasicAuthOptions,
|
|
5
|
+
BasicAuthPrimitiveConfig,
|
|
6
6
|
} from "../providers/ServerBasicAuthProvider.ts";
|
|
7
7
|
import { ServerBasicAuthProvider } from "../providers/ServerBasicAuthProvider.ts";
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Declares HTTP Basic Authentication for server routes.
|
|
11
|
-
* This
|
|
11
|
+
* This primitive provides methods to protect routes with username/password authentication.
|
|
12
12
|
*/
|
|
13
13
|
export const $basicAuth = (
|
|
14
|
-
options:
|
|
15
|
-
):
|
|
16
|
-
return
|
|
14
|
+
options: BasicAuthPrimitiveConfig,
|
|
15
|
+
): AbstractBasicAuthPrimitive => {
|
|
16
|
+
return createPrimitive(BasicAuthPrimitive, options);
|
|
17
17
|
};
|
|
18
18
|
|
|
19
19
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
20
20
|
|
|
21
|
-
export interface
|
|
21
|
+
export interface AbstractBasicAuthPrimitive {
|
|
22
22
|
readonly name: string;
|
|
23
|
-
readonly options:
|
|
23
|
+
readonly options: BasicAuthPrimitiveConfig;
|
|
24
24
|
check(request: ServerRequest, options?: BasicAuthOptions): void;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
export class
|
|
28
|
-
extends
|
|
29
|
-
implements
|
|
27
|
+
export class BasicAuthPrimitive
|
|
28
|
+
extends Primitive<BasicAuthPrimitiveConfig>
|
|
29
|
+
implements AbstractBasicAuthPrimitive
|
|
30
30
|
{
|
|
31
31
|
protected readonly serverBasicAuthProvider = $inject(ServerBasicAuthProvider);
|
|
32
32
|
|
|
@@ -40,7 +40,7 @@ export class BasicAuthDescriptor
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
/**
|
|
43
|
-
* Checks basic auth for the given request using this
|
|
43
|
+
* Checks basic auth for the given request using this primitive's configuration.
|
|
44
44
|
*/
|
|
45
45
|
public check(request: ServerRequest, options?: BasicAuthOptions): void {
|
|
46
46
|
const mergedOptions = { ...this.options, ...options };
|
|
@@ -48,4 +48,4 @@ export class BasicAuthDescriptor
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
$basicAuth[KIND] =
|
|
51
|
+
$basicAuth[KIND] = BasicAuthPrimitive;
|
|
@@ -14,7 +14,7 @@ export interface BasicAuthOptions {
|
|
|
14
14
|
password: string;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
export interface
|
|
17
|
+
export interface BasicAuthPrimitiveConfig extends BasicAuthOptions {
|
|
18
18
|
/** Name identifier for this basic auth (default: property key) */
|
|
19
19
|
name?: string;
|
|
20
20
|
/** Path patterns to match (supports wildcards like /devtools/*) */
|
|
@@ -30,14 +30,14 @@ export class ServerBasicAuthProvider {
|
|
|
30
30
|
protected readonly realm = "Secure Area";
|
|
31
31
|
|
|
32
32
|
/**
|
|
33
|
-
* Registered basic auth
|
|
33
|
+
* Registered basic auth primitives with their configurations
|
|
34
34
|
*/
|
|
35
|
-
public readonly registeredAuths:
|
|
35
|
+
public readonly registeredAuths: BasicAuthPrimitiveConfig[] = [];
|
|
36
36
|
|
|
37
37
|
/**
|
|
38
|
-
* Register a basic auth configuration (called by
|
|
38
|
+
* Register a basic auth configuration (called by primitives)
|
|
39
39
|
*/
|
|
40
|
-
public registerAuth(config:
|
|
40
|
+
public registerAuth(config: BasicAuthPrimitiveConfig): void {
|
|
41
41
|
this.registeredAuths.push(config);
|
|
42
42
|
}
|
|
43
43
|
|
|
@@ -28,7 +28,7 @@ export class ServerSecurityProvider {
|
|
|
28
28
|
protected readonly onConfigure = $hook({
|
|
29
29
|
on: "configure",
|
|
30
30
|
handler: async () => {
|
|
31
|
-
for (const action of this.alepha.
|
|
31
|
+
for (const action of this.alepha.primitives($action)) {
|
|
32
32
|
// -------------------------------------------------------------------------------------------------------------
|
|
33
33
|
// if the action is disabled or not secure, we do NOT create a permission for it
|
|
34
34
|
// -------------------------------------------------------------------------------------------------------------
|
|
@@ -87,7 +87,7 @@ export class ServerSecurityProvider {
|
|
|
87
87
|
this.check(request.user, route.secure);
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
this.alepha.
|
|
90
|
+
this.alepha.store.set(
|
|
91
91
|
"alepha.server.request.user",
|
|
92
92
|
this.alepha.codec.decode(userAccountInfoSchema, request.user),
|
|
93
93
|
);
|
|
@@ -139,7 +139,7 @@ export class ServerSecurityProvider {
|
|
|
139
139
|
this.check(request.user, route.secure);
|
|
140
140
|
}
|
|
141
141
|
|
|
142
|
-
this.alepha.
|
|
142
|
+
this.alepha.store.set(
|
|
143
143
|
"alepha.server.request.user",
|
|
144
144
|
// remove sensitive info
|
|
145
145
|
this.alepha.codec.decode(userAccountInfoSchema, request.user),
|
|
@@ -198,7 +198,7 @@ export class ServerSecurityProvider {
|
|
|
198
198
|
let user: UserAccountToken | undefined;
|
|
199
199
|
|
|
200
200
|
const fromContext = this.alepha.context.get<ServerRequest>("request")?.user;
|
|
201
|
-
const fromSystem = this.alepha.
|
|
201
|
+
const fromSystem = this.alepha.store.get(
|
|
202
202
|
"alepha.server.security.system.user",
|
|
203
203
|
);
|
|
204
204
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { $module } from "alepha";
|
|
2
2
|
import { AlephaServer } from "alepha/server";
|
|
3
|
-
import { $serve } from "./
|
|
3
|
+
import { $serve } from "./primitives/$serve.ts";
|
|
4
4
|
import { ServerStaticProvider } from "./providers/ServerStaticProvider.ts";
|
|
5
5
|
|
|
6
6
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
7
7
|
|
|
8
|
-
export * from "./
|
|
8
|
+
export * from "./primitives/$serve.ts";
|
|
9
9
|
export * from "./providers/ServerStaticProvider.ts";
|
|
10
10
|
|
|
11
11
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
@@ -18,6 +18,6 @@ export * from "./providers/ServerStaticProvider.ts";
|
|
|
18
18
|
*/
|
|
19
19
|
export const AlephaServerStatic = $module({
|
|
20
20
|
name: "alepha.server.static",
|
|
21
|
-
|
|
21
|
+
primitives: [$serve],
|
|
22
22
|
services: [AlephaServer, ServerStaticProvider],
|
|
23
23
|
});
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createPrimitive, KIND, Primitive } from "alepha";
|
|
2
2
|
import type { DurationLike } from "alepha/datetime";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Create a new static file handler.
|
|
6
6
|
*/
|
|
7
|
-
export const $serve = (
|
|
8
|
-
|
|
9
|
-
): ServeDescriptor => {
|
|
10
|
-
return createDescriptor(ServeDescriptor, options);
|
|
7
|
+
export const $serve = (options: ServePrimitiveOptions = {}): ServePrimitive => {
|
|
8
|
+
return createPrimitive(ServePrimitive, options);
|
|
11
9
|
};
|
|
12
10
|
|
|
13
|
-
export interface
|
|
11
|
+
export interface ServePrimitiveOptions {
|
|
14
12
|
/**
|
|
15
13
|
* Prefix for the served path.
|
|
16
14
|
*
|
|
@@ -26,7 +24,7 @@ export interface ServeDescriptorOptions {
|
|
|
26
24
|
root?: string;
|
|
27
25
|
|
|
28
26
|
/**
|
|
29
|
-
* If true,
|
|
27
|
+
* If true, primitive will be ignored.
|
|
30
28
|
*
|
|
31
29
|
* @default false
|
|
32
30
|
*/
|
|
@@ -53,7 +51,7 @@ export interface ServeDescriptorOptions {
|
|
|
53
51
|
historyApiFallback?: boolean;
|
|
54
52
|
|
|
55
53
|
/**
|
|
56
|
-
* Optional name of the
|
|
54
|
+
* Optional name of the primitive.
|
|
57
55
|
* This is used for logging and debugging purposes.
|
|
58
56
|
*
|
|
59
57
|
* @default Key name.
|
|
@@ -91,6 +89,6 @@ export interface CacheControlOptions {
|
|
|
91
89
|
immutable: boolean;
|
|
92
90
|
}
|
|
93
91
|
|
|
94
|
-
export class
|
|
92
|
+
export class ServePrimitive extends Primitive<ServePrimitiveOptions> {}
|
|
95
93
|
|
|
96
|
-
$serve[KIND] =
|
|
94
|
+
$serve[KIND] = ServePrimitive;
|
|
@@ -7,7 +7,7 @@ import { DateTimeProvider } from "alepha/datetime";
|
|
|
7
7
|
import { FileDetector } from "alepha/file";
|
|
8
8
|
import { $logger } from "alepha/logger";
|
|
9
9
|
import { type ServerHandler, ServerRouterProvider } from "alepha/server";
|
|
10
|
-
import { $serve, type
|
|
10
|
+
import { $serve, type ServePrimitiveOptions } from "../primitives/$serve.ts";
|
|
11
11
|
|
|
12
12
|
export class ServerStaticProvider {
|
|
13
13
|
protected readonly alepha = $inject(Alepha);
|
|
@@ -22,14 +22,14 @@ export class ServerStaticProvider {
|
|
|
22
22
|
handler: async () => {
|
|
23
23
|
await Promise.all(
|
|
24
24
|
this.alepha
|
|
25
|
-
.
|
|
25
|
+
.primitives($serve)
|
|
26
26
|
.map((it) => this.createStaticServer(it.options)),
|
|
27
27
|
);
|
|
28
28
|
},
|
|
29
29
|
});
|
|
30
30
|
|
|
31
31
|
public async createStaticServer(
|
|
32
|
-
options:
|
|
32
|
+
options: ServePrimitiveOptions,
|
|
33
33
|
): Promise<void> {
|
|
34
34
|
const prefix = options.path ?? "/";
|
|
35
35
|
|
|
@@ -107,7 +107,7 @@ export class ServerStaticProvider {
|
|
|
107
107
|
|
|
108
108
|
public async createFileHandler(
|
|
109
109
|
filepath: string,
|
|
110
|
-
options:
|
|
110
|
+
options: ServePrimitiveOptions,
|
|
111
111
|
): Promise<ServerHandler> {
|
|
112
112
|
const filename = basename(filepath);
|
|
113
113
|
|
|
@@ -184,7 +184,7 @@ export class ServerStaticProvider {
|
|
|
184
184
|
|
|
185
185
|
protected getCacheControl(
|
|
186
186
|
filename: string,
|
|
187
|
-
options:
|
|
187
|
+
options: ServePrimitiveOptions,
|
|
188
188
|
): { maxAge: number; immutable: boolean } | undefined {
|
|
189
189
|
if (!options.cacheControl) {
|
|
190
190
|
return;
|
|
@@ -228,6 +228,6 @@ export class ServerStaticProvider {
|
|
|
228
228
|
}
|
|
229
229
|
|
|
230
230
|
export interface ServeDirectory {
|
|
231
|
-
options:
|
|
231
|
+
options: ServePrimitiveOptions;
|
|
232
232
|
files: string[];
|
|
233
233
|
}
|