@beignet/core 0.0.1
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/CHANGELOG.md +5 -0
- package/README.md +288 -0
- package/dist/application/index.d.ts +260 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +324 -0
- package/dist/application/index.js.map +1 -0
- package/dist/client/client.d.ts +241 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +531 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/index.d.ts +10 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +8 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/types.d.ts +139 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/config/index.d.ts +122 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +216 -0
- package/dist/config/index.js.map +1 -0
- package/dist/contracts/contract-builder.d.ts +121 -0
- package/dist/contracts/contract-builder.d.ts.map +1 -0
- package/dist/contracts/contract-builder.js +346 -0
- package/dist/contracts/contract-builder.js.map +1 -0
- package/dist/contracts/contract-group.d.ts +106 -0
- package/dist/contracts/contract-group.d.ts.map +1 -0
- package/dist/contracts/contract-group.js +240 -0
- package/dist/contracts/contract-group.js.map +1 -0
- package/dist/contracts/contract-like.d.ts +21 -0
- package/dist/contracts/contract-like.d.ts.map +1 -0
- package/dist/contracts/contract-like.js +9 -0
- package/dist/contracts/contract-like.js.map +1 -0
- package/dist/contracts/index.d.ts +15 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +11 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/openapi-meta.d.ts +23 -0
- package/dist/contracts/openapi-meta.d.ts.map +1 -0
- package/dist/contracts/openapi-meta.js +2 -0
- package/dist/contracts/openapi-meta.js.map +1 -0
- package/dist/contracts/path-template.d.ts +17 -0
- package/dist/contracts/path-template.d.ts.map +1 -0
- package/dist/contracts/path-template.js +50 -0
- package/dist/contracts/path-template.js.map +1 -0
- package/dist/contracts/rate-limit.d.ts +50 -0
- package/dist/contracts/rate-limit.d.ts.map +1 -0
- package/dist/contracts/rate-limit.js +2 -0
- package/dist/contracts/rate-limit.js.map +1 -0
- package/dist/contracts/types.d.ts +97 -0
- package/dist/contracts/types.d.ts.map +1 -0
- package/dist/contracts/types.js +54 -0
- package/dist/contracts/types.js.map +1 -0
- package/dist/contracts/utils.d.ts +3 -0
- package/dist/contracts/utils.d.ts.map +1 -0
- package/dist/contracts/utils.js +44 -0
- package/dist/contracts/utils.js.map +1 -0
- package/dist/domain/entity.d.ts +87 -0
- package/dist/domain/entity.d.ts.map +1 -0
- package/dist/domain/entity.js +155 -0
- package/dist/domain/entity.js.map +1 -0
- package/dist/domain/events.d.ts +41 -0
- package/dist/domain/events.d.ts.map +1 -0
- package/dist/domain/events.js +21 -0
- package/dist/domain/events.js.map +1 -0
- package/dist/domain/index.d.ts +14 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +14 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/value-object.d.ts +60 -0
- package/dist/domain/value-object.d.ts.map +1 -0
- package/dist/domain/value-object.js +87 -0
- package/dist/domain/value-object.js.map +1 -0
- package/dist/errors/catalog.d.ts +71 -0
- package/dist/errors/catalog.d.ts.map +1 -0
- package/dist/errors/catalog.js +71 -0
- package/dist/errors/catalog.js.map +1 -0
- package/dist/errors/http.d.ts +77 -0
- package/dist/errors/http.d.ts.map +1 -0
- package/dist/errors/http.js +74 -0
- package/dist/errors/http.js.map +1 -0
- package/dist/errors/index.d.ts +10 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +14 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/response.d.ts +26 -0
- package/dist/errors/response.d.ts.map +1 -0
- package/dist/errors/response.js +34 -0
- package/dist/errors/response.js.map +1 -0
- package/dist/errors/validation.d.ts +18 -0
- package/dist/errors/validation.d.ts.map +1 -0
- package/dist/errors/validation.js +21 -0
- package/dist/errors/validation.js.map +1 -0
- package/dist/events/index.d.ts +58 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +102 -0
- package/dist/events/index.js.map +1 -0
- package/dist/jobs/index.d.ts +56 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +89 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/mail/index.d.ts +75 -0
- package/dist/mail/index.d.ts.map +1 -0
- package/dist/mail/index.js +84 -0
- package/dist/mail/index.js.map +1 -0
- package/dist/openapi/index.d.ts +207 -0
- package/dist/openapi/index.d.ts.map +1 -0
- package/dist/openapi/index.js +449 -0
- package/dist/openapi/index.js.map +1 -0
- package/dist/openapi/schema-introspector.d.ts +38 -0
- package/dist/openapi/schema-introspector.d.ts.map +1 -0
- package/dist/openapi/schema-introspector.js +67 -0
- package/dist/openapi/schema-introspector.js.map +1 -0
- package/dist/ports/audit.d.ts +58 -0
- package/dist/ports/audit.d.ts.map +1 -0
- package/dist/ports/audit.js +74 -0
- package/dist/ports/audit.js.map +1 -0
- package/dist/ports/auth.d.ts +23 -0
- package/dist/ports/auth.d.ts.map +1 -0
- package/dist/ports/auth.js +31 -0
- package/dist/ports/auth.js.map +1 -0
- package/dist/ports/builder.d.ts +61 -0
- package/dist/ports/builder.d.ts.map +1 -0
- package/dist/ports/builder.js +48 -0
- package/dist/ports/builder.js.map +1 -0
- package/dist/ports/cache.d.ts +15 -0
- package/dist/ports/cache.d.ts.map +1 -0
- package/dist/ports/cache.js +57 -0
- package/dist/ports/cache.js.map +1 -0
- package/dist/ports/clock.d.ts +10 -0
- package/dist/ports/clock.d.ts.map +1 -0
- package/dist/ports/clock.js +21 -0
- package/dist/ports/clock.js.map +1 -0
- package/dist/ports/events.d.ts +71 -0
- package/dist/ports/events.d.ts.map +1 -0
- package/dist/ports/events.js +2 -0
- package/dist/ports/events.js.map +1 -0
- package/dist/ports/id-generator.d.ts +12 -0
- package/dist/ports/id-generator.d.ts.map +1 -0
- package/dist/ports/id-generator.js +22 -0
- package/dist/ports/id-generator.js.map +1 -0
- package/dist/ports/index.d.ts +98 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +67 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/ports/logger.d.ts +22 -0
- package/dist/ports/logger.d.ts.map +1 -0
- package/dist/ports/logger.js +34 -0
- package/dist/ports/logger.js.map +1 -0
- package/dist/ports/mailer.d.ts +6 -0
- package/dist/ports/mailer.d.ts.map +1 -0
- package/dist/ports/mailer.js +2 -0
- package/dist/ports/mailer.js.map +1 -0
- package/dist/ports/policy.d.ts +53 -0
- package/dist/ports/policy.d.ts.map +1 -0
- package/dist/ports/policy.js +81 -0
- package/dist/ports/policy.js.map +1 -0
- package/dist/ports/rate-limit.d.ts +41 -0
- package/dist/ports/rate-limit.d.ts.map +1 -0
- package/dist/ports/rate-limit.js +37 -0
- package/dist/ports/rate-limit.js.map +1 -0
- package/dist/ports/redaction.d.ts +26 -0
- package/dist/ports/redaction.d.ts.map +1 -0
- package/dist/ports/redaction.js +126 -0
- package/dist/ports/redaction.js.map +1 -0
- package/dist/ports/schedules.d.ts +9 -0
- package/dist/ports/schedules.d.ts.map +1 -0
- package/dist/ports/schedules.js +2 -0
- package/dist/ports/schedules.js.map +1 -0
- package/dist/ports/storage.d.ts +47 -0
- package/dist/ports/storage.d.ts.map +1 -0
- package/dist/ports/storage.js +185 -0
- package/dist/ports/storage.js.map +1 -0
- package/dist/ports/testing.d.ts +73 -0
- package/dist/ports/testing.d.ts.map +1 -0
- package/dist/ports/testing.js +105 -0
- package/dist/ports/testing.js.map +1 -0
- package/dist/ports/unit-of-work.d.ts +56 -0
- package/dist/ports/unit-of-work.d.ts.map +1 -0
- package/dist/ports/unit-of-work.js +64 -0
- package/dist/ports/unit-of-work.js.map +1 -0
- package/dist/providers/index.d.ts +8 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +8 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/instrumentation.d.ts +91 -0
- package/dist/providers/instrumentation.d.ts.map +1 -0
- package/dist/providers/instrumentation.js +93 -0
- package/dist/providers/instrumentation.js.map +1 -0
- package/dist/providers/provider.d.ts +146 -0
- package/dist/providers/provider.d.ts.map +1 -0
- package/dist/providers/provider.js +31 -0
- package/dist/providers/provider.js.map +1 -0
- package/dist/schedules/index.d.ts +105 -0
- package/dist/schedules/index.d.ts.map +1 -0
- package/dist/schedules/index.js +178 -0
- package/dist/schedules/index.js.map +1 -0
- package/dist/server/contract-like.d.ts +5 -0
- package/dist/server/contract-like.d.ts.map +1 -0
- package/dist/server/contract-like.js +5 -0
- package/dist/server/contract-like.js.map +1 -0
- package/dist/server/health.d.ts +41 -0
- package/dist/server/health.d.ts.map +1 -0
- package/dist/server/health.js +46 -0
- package/dist/server/health.js.map +1 -0
- package/dist/server/hooks/auth.d.ts +42 -0
- package/dist/server/hooks/auth.d.ts.map +1 -0
- package/dist/server/hooks/auth.js +61 -0
- package/dist/server/hooks/auth.js.map +1 -0
- package/dist/server/hooks/cors.d.ts +13 -0
- package/dist/server/hooks/cors.d.ts.map +1 -0
- package/dist/server/hooks/cors.js +70 -0
- package/dist/server/hooks/cors.js.map +1 -0
- package/dist/server/hooks/errors.d.ts +66 -0
- package/dist/server/hooks/errors.d.ts.map +1 -0
- package/dist/server/hooks/errors.js +83 -0
- package/dist/server/hooks/errors.js.map +1 -0
- package/dist/server/hooks/index.d.ts +12 -0
- package/dist/server/hooks/index.d.ts.map +1 -0
- package/dist/server/hooks/index.js +12 -0
- package/dist/server/hooks/index.js.map +1 -0
- package/dist/server/hooks/logging.d.ts +33 -0
- package/dist/server/hooks/logging.d.ts.map +1 -0
- package/dist/server/hooks/logging.js +90 -0
- package/dist/server/hooks/logging.js.map +1 -0
- package/dist/server/hooks/rate-limit.d.ts +29 -0
- package/dist/server/hooks/rate-limit.d.ts.map +1 -0
- package/dist/server/hooks/rate-limit.js +93 -0
- package/dist/server/hooks/rate-limit.js.map +1 -0
- package/dist/server/hooks/utils.d.ts +9 -0
- package/dist/server/hooks/utils.d.ts.map +1 -0
- package/dist/server/hooks/utils.js +16 -0
- package/dist/server/hooks/utils.js.map +1 -0
- package/dist/server/hooks.d.ts +2 -0
- package/dist/server/hooks.d.ts.map +1 -0
- package/dist/server/hooks.js +2 -0
- package/dist/server/hooks.js.map +1 -0
- package/dist/server/http.d.ts +124 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +2 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/index.d.ts +19 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +15 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/openapi.d.ts +32 -0
- package/dist/server/openapi.d.ts.map +1 -0
- package/dist/server/openapi.js +43 -0
- package/dist/server/openapi.js.map +1 -0
- package/dist/server/providers/index.d.ts +4 -0
- package/dist/server/providers/index.d.ts.map +1 -0
- package/dist/server/providers/index.js +4 -0
- package/dist/server/providers/index.js.map +1 -0
- package/dist/server/providers/loadProviderConfig.d.ts +7 -0
- package/dist/server/providers/loadProviderConfig.d.ts.map +1 -0
- package/dist/server/providers/loadProviderConfig.js +42 -0
- package/dist/server/providers/loadProviderConfig.js.map +1 -0
- package/dist/server/server.d.ts +86 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +1031 -0
- package/dist/server/server.js.map +1 -0
- package/dist/server/types.d.ts +3 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +3 -0
- package/dist/server/types.js.map +1 -0
- package/package.json +129 -0
- package/src/application/index.ts +747 -0
- package/src/client/client.ts +1105 -0
- package/src/client/index.ts +45 -0
- package/src/client/types.ts +305 -0
- package/src/config/index.ts +497 -0
- package/src/contracts/contract-builder.ts +583 -0
- package/src/contracts/contract-group.ts +502 -0
- package/src/contracts/contract-like.ts +29 -0
- package/src/contracts/index.ts +53 -0
- package/src/contracts/openapi-meta.ts +22 -0
- package/src/contracts/path-template.ts +91 -0
- package/src/contracts/rate-limit.ts +50 -0
- package/src/contracts/types.ts +207 -0
- package/src/contracts/utils.ts +56 -0
- package/src/domain/entity.ts +256 -0
- package/src/domain/events.ts +52 -0
- package/src/domain/index.ts +18 -0
- package/src/domain/value-object.ts +135 -0
- package/src/errors/catalog.ts +149 -0
- package/src/errors/http.ts +80 -0
- package/src/errors/index.ts +28 -0
- package/src/errors/response.ts +54 -0
- package/src/errors/validation.ts +35 -0
- package/src/events/index.ts +246 -0
- package/src/jobs/index.ts +211 -0
- package/src/mail/index.ts +177 -0
- package/src/openapi/index.ts +865 -0
- package/src/openapi/schema-introspector.ts +107 -0
- package/src/ports/audit.ts +176 -0
- package/src/ports/auth.ts +76 -0
- package/src/ports/builder.ts +97 -0
- package/src/ports/cache.ts +94 -0
- package/src/ports/clock.ts +34 -0
- package/src/ports/events.ts +100 -0
- package/src/ports/id-generator.ts +36 -0
- package/src/ports/index.ts +221 -0
- package/src/ports/logger.ts +67 -0
- package/src/ports/policy.ts +242 -0
- package/src/ports/rate-limit.ts +91 -0
- package/src/ports/redaction.ts +199 -0
- package/src/ports/storage.ts +282 -0
- package/src/ports/testing.ts +234 -0
- package/src/ports/unit-of-work.ts +134 -0
- package/src/providers/index.ts +40 -0
- package/src/providers/instrumentation.ts +248 -0
- package/src/providers/provider.ts +191 -0
- package/src/schedules/index.ts +442 -0
- package/src/server/contract-like.ts +8 -0
- package/src/server/health.ts +82 -0
- package/src/server/hooks/auth.ts +147 -0
- package/src/server/hooks/cors.ts +87 -0
- package/src/server/hooks/errors.ts +126 -0
- package/src/server/hooks/index.ts +43 -0
- package/src/server/hooks/logging.ts +121 -0
- package/src/server/hooks/rate-limit.ts +171 -0
- package/src/server/hooks/utils.ts +16 -0
- package/src/server/hooks.ts +1 -0
- package/src/server/http.ts +189 -0
- package/src/server/index.ts +35 -0
- package/src/server/openapi.ts +72 -0
- package/src/server/providers/index.ts +3 -0
- package/src/server/providers/loadProviderConfig.ts +72 -0
- package/src/server/server.ts +1521 -0
- package/src/server/types.ts +2 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate limit hooks for @beignet/core/server
|
|
3
|
+
*/
|
|
4
|
+
import { AppError, httpErrors } from "../../errors";
|
|
5
|
+
function defaultGetClientIp(req) {
|
|
6
|
+
const xfwd = req.headers.get("x-forwarded-for") ?? "";
|
|
7
|
+
return xfwd.split(",")[0].trim() || undefined;
|
|
8
|
+
}
|
|
9
|
+
function emitUserKey(userId) {
|
|
10
|
+
return `user:${userId}`;
|
|
11
|
+
}
|
|
12
|
+
function emitIpKey(ip) {
|
|
13
|
+
return `ip:${ip}`;
|
|
14
|
+
}
|
|
15
|
+
function defaultRateLimitKey(args, getClientIp) {
|
|
16
|
+
const { ctx, req, scope } = args;
|
|
17
|
+
if (scope === "user" && ctx.actor?.type === "user" && ctx.actor.id) {
|
|
18
|
+
return emitUserKey(ctx.actor.id);
|
|
19
|
+
}
|
|
20
|
+
if (scope === "ip") {
|
|
21
|
+
const ip = getClientIp(req) || "unknown";
|
|
22
|
+
return emitIpKey(ip);
|
|
23
|
+
}
|
|
24
|
+
return "global";
|
|
25
|
+
}
|
|
26
|
+
function defaultEarlyRateLimitKey(args, getClientIp) {
|
|
27
|
+
if (args.scope === "ip") {
|
|
28
|
+
const ip = getClientIp(args.req) || "unknown";
|
|
29
|
+
return emitIpKey(ip);
|
|
30
|
+
}
|
|
31
|
+
return "global";
|
|
32
|
+
}
|
|
33
|
+
async function enforceRateLimit(rateLimit, args) {
|
|
34
|
+
const result = await rateLimit.hit({
|
|
35
|
+
key: args.key,
|
|
36
|
+
limit: args.limit,
|
|
37
|
+
windowSec: args.windowSec,
|
|
38
|
+
});
|
|
39
|
+
if (result.allowed) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
throw new AppError(httpErrors.TooManyRequests, {
|
|
43
|
+
key: args.key,
|
|
44
|
+
scope: args.scope,
|
|
45
|
+
retryAfterSeconds: result.retryAfterSeconds,
|
|
46
|
+
resetAt: result.resetAt?.toISOString() ?? null,
|
|
47
|
+
}, "Rate limit exceeded");
|
|
48
|
+
}
|
|
49
|
+
export function createRateLimitHooks(options = {}) {
|
|
50
|
+
const getClientIp = options.getClientIp ?? defaultGetClientIp;
|
|
51
|
+
return {
|
|
52
|
+
name: "rate-limit",
|
|
53
|
+
onRequest: async ({ contract, ports, req }) => {
|
|
54
|
+
const rlMeta = contract.metadata?.rateLimit;
|
|
55
|
+
if (!rlMeta) {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
const scope = rlMeta.scope ?? "global";
|
|
59
|
+
if (scope === "user") {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
const key = options.earlyKey?.({ req, scope }) ??
|
|
63
|
+
defaultEarlyRateLimitKey({ req, scope }, getClientIp);
|
|
64
|
+
await enforceRateLimit(ports.rateLimit, {
|
|
65
|
+
key,
|
|
66
|
+
limit: rlMeta.max,
|
|
67
|
+
windowSec: rlMeta.windowSec,
|
|
68
|
+
scope,
|
|
69
|
+
});
|
|
70
|
+
return undefined;
|
|
71
|
+
},
|
|
72
|
+
beforeHandle: async ({ ctx, contract, req }) => {
|
|
73
|
+
const rlMeta = contract.metadata?.rateLimit;
|
|
74
|
+
if (!rlMeta) {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
const scope = rlMeta.scope ?? "global";
|
|
78
|
+
if (scope !== "user") {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
const key = options.key?.({ ctx, req, scope }) ??
|
|
82
|
+
defaultRateLimitKey({ ctx, req, scope }, getClientIp);
|
|
83
|
+
await enforceRateLimit(ctx.ports.rateLimit, {
|
|
84
|
+
key,
|
|
85
|
+
limit: rlMeta.max,
|
|
86
|
+
windowSec: rlMeta.windowSec,
|
|
87
|
+
scope,
|
|
88
|
+
});
|
|
89
|
+
return undefined;
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=rate-limit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../src/server/hooks/rate-limit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for server hooks.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Extract requestId from context object if it exists.
|
|
6
|
+
* This helper reduces type casting duplication throughout the codebase.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getRequestIdFromContext(ctx: unknown): string | undefined;
|
|
9
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/server/hooks/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAOxE"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utilities for server hooks.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Extract requestId from context object if it exists.
|
|
6
|
+
* This helper reduces type casting duplication throughout the codebase.
|
|
7
|
+
*/
|
|
8
|
+
export function getRequestIdFromContext(ctx) {
|
|
9
|
+
if (ctx !== null && ctx !== undefined && typeof ctx === "object") {
|
|
10
|
+
const ctxRecord = ctx;
|
|
11
|
+
const requestId = ctxRecord.requestId;
|
|
12
|
+
return typeof requestId === "string" ? requestId : undefined;
|
|
13
|
+
}
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/server/hooks/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAY;IAClD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACjE,MAAM,SAAS,GAAG,GAA8B,CAAC;QACjD,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;QACtC,OAAO,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/D,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/server/hooks.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/server/hooks.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import type { HttpContractConfig, InferHeaderSchemaOutput, InferOutput, StandardSchema } from "../contracts";
|
|
2
|
+
import type { AnyPorts } from "../ports";
|
|
3
|
+
export interface HttpRequestLike {
|
|
4
|
+
method: string;
|
|
5
|
+
url: string;
|
|
6
|
+
headers: Headers;
|
|
7
|
+
/**
|
|
8
|
+
* The platform request when an adapter has one available.
|
|
9
|
+
*
|
|
10
|
+
* Use this as an escape hatch for platform-specific APIs. Prefer the
|
|
11
|
+
* framework-agnostic methods below when possible.
|
|
12
|
+
*/
|
|
13
|
+
raw?: Request;
|
|
14
|
+
json(): Promise<unknown>;
|
|
15
|
+
text(): Promise<string>;
|
|
16
|
+
arrayBuffer?(): Promise<ArrayBuffer>;
|
|
17
|
+
blob?(): Promise<Blob>;
|
|
18
|
+
formData?(): Promise<FormData>;
|
|
19
|
+
clone?(): HttpRequestLike;
|
|
20
|
+
}
|
|
21
|
+
export interface HttpResponseLike {
|
|
22
|
+
status: number;
|
|
23
|
+
headers?: Record<string, string>;
|
|
24
|
+
body?: unknown;
|
|
25
|
+
}
|
|
26
|
+
export type HttpResponse = HttpResponseLike | Response;
|
|
27
|
+
type InferSchemaOrFallback<T extends StandardSchema | null, Fallback> = T extends StandardSchema ? InferOutput<T> : Fallback;
|
|
28
|
+
export type InferPath<C extends HttpContractConfig> = InferSchemaOrFallback<C["pathParams"], Record<string, string>>;
|
|
29
|
+
export type InferQuery<C extends HttpContractConfig> = InferSchemaOrFallback<C["query"], Record<string, string | string[]>>;
|
|
30
|
+
export type InferBody<C extends HttpContractConfig> = InferSchemaOrFallback<C["body"], unknown>;
|
|
31
|
+
export type InferHeaders<C extends HttpContractConfig> = InferHeaderSchemaOutput<Exclude<C["headers"], undefined>> extends undefined ? Record<string, string> : InferHeaderSchemaOutput<Exclude<C["headers"], undefined>>;
|
|
32
|
+
export interface HandlerArgs<Ctx, C extends HttpContractConfig> {
|
|
33
|
+
req: HttpRequestLike;
|
|
34
|
+
ctx: Ctx;
|
|
35
|
+
contract: C;
|
|
36
|
+
path: InferPath<C>;
|
|
37
|
+
query: InferQuery<C>;
|
|
38
|
+
headers: InferHeaders<C>;
|
|
39
|
+
body: InferBody<C>;
|
|
40
|
+
}
|
|
41
|
+
export type Handler<Ctx, C extends HttpContractConfig> = (args: HandlerArgs<Ctx, C>) => Promise<HttpResponse> | HttpResponse;
|
|
42
|
+
export type MaybePromise<T> = T | Promise<T>;
|
|
43
|
+
export type OnRequestHook<Ports extends AnyPorts = AnyPorts, C extends HttpContractConfig = HttpContractConfig> = (args: {
|
|
44
|
+
req: HttpRequestLike;
|
|
45
|
+
ports: Ports;
|
|
46
|
+
contract: C;
|
|
47
|
+
params: Record<string, string>;
|
|
48
|
+
}) => MaybePromise<HttpResponse | undefined>;
|
|
49
|
+
export type BeforeHandleResult<Ctx> = undefined | HttpResponse | {
|
|
50
|
+
ctx?: Ctx;
|
|
51
|
+
response?: HttpResponse;
|
|
52
|
+
};
|
|
53
|
+
export type BeforeHandleHook<Ctx, C extends HttpContractConfig = HttpContractConfig> = (args: {
|
|
54
|
+
req: HttpRequestLike;
|
|
55
|
+
ctx: Ctx;
|
|
56
|
+
contract: C;
|
|
57
|
+
path: InferPath<C>;
|
|
58
|
+
query: InferQuery<C>;
|
|
59
|
+
headers: InferHeaders<C>;
|
|
60
|
+
body: InferBody<C>;
|
|
61
|
+
}) => MaybePromise<BeforeHandleResult<Ctx>>;
|
|
62
|
+
export type BeforeSendHook<Ctx, C extends HttpContractConfig = HttpContractConfig> = (args: {
|
|
63
|
+
req: HttpRequestLike;
|
|
64
|
+
ctx?: Ctx;
|
|
65
|
+
contract: C;
|
|
66
|
+
path?: InferPath<C>;
|
|
67
|
+
query?: InferQuery<C>;
|
|
68
|
+
headers?: InferHeaders<C>;
|
|
69
|
+
body?: InferBody<C>;
|
|
70
|
+
response: HttpResponseLike;
|
|
71
|
+
error?: unknown;
|
|
72
|
+
}) => MaybePromise<HttpResponseLike | undefined>;
|
|
73
|
+
export type AfterSendHook<Ctx, C extends HttpContractConfig = HttpContractConfig> = (args: {
|
|
74
|
+
req: HttpRequestLike;
|
|
75
|
+
ctx?: Ctx;
|
|
76
|
+
contract: C;
|
|
77
|
+
path?: InferPath<C>;
|
|
78
|
+
query?: InferQuery<C>;
|
|
79
|
+
headers?: InferHeaders<C>;
|
|
80
|
+
body?: InferBody<C>;
|
|
81
|
+
response: HttpResponseLike;
|
|
82
|
+
error?: unknown;
|
|
83
|
+
durationMs: number;
|
|
84
|
+
}) => MaybePromise<void>;
|
|
85
|
+
export type ServerCaughtErrorHook<Ctx, C extends HttpContractConfig = HttpContractConfig> = (args: {
|
|
86
|
+
err: unknown;
|
|
87
|
+
req: HttpRequestLike;
|
|
88
|
+
ctx?: Ctx;
|
|
89
|
+
contract: C;
|
|
90
|
+
path?: InferPath<C>;
|
|
91
|
+
query?: InferQuery<C>;
|
|
92
|
+
headers?: InferHeaders<C>;
|
|
93
|
+
body?: InferBody<C>;
|
|
94
|
+
}) => MaybePromise<void>;
|
|
95
|
+
export type ServerUnhandledErrorMapper<Ctx, C extends HttpContractConfig = HttpContractConfig> = (args: {
|
|
96
|
+
err: unknown;
|
|
97
|
+
req: HttpRequestLike;
|
|
98
|
+
ctx?: Ctx;
|
|
99
|
+
contract: C;
|
|
100
|
+
path?: InferPath<C>;
|
|
101
|
+
query?: InferQuery<C>;
|
|
102
|
+
headers?: InferHeaders<C>;
|
|
103
|
+
body?: InferBody<C>;
|
|
104
|
+
}) => MaybePromise<HttpResponse | undefined>;
|
|
105
|
+
export interface ServerHook<Ctx, Ports extends AnyPorts = AnyPorts> {
|
|
106
|
+
name?: string;
|
|
107
|
+
onRequest?: OnRequestHook<Ports>;
|
|
108
|
+
beforeHandle?: BeforeHandleHook<Ctx>;
|
|
109
|
+
beforeSend?: BeforeSendHook<Ctx>;
|
|
110
|
+
afterSend?: AfterSendHook<Ctx>;
|
|
111
|
+
onCaughtError?: ServerCaughtErrorHook<Ctx>;
|
|
112
|
+
mapUnhandledError?: ServerUnhandledErrorMapper<Ctx>;
|
|
113
|
+
}
|
|
114
|
+
export type ResolvedRoute<_Ctx, C extends HttpContractConfig> = {
|
|
115
|
+
contract: C;
|
|
116
|
+
handler: (req: HttpRequestLike, params?: Record<string, string>) => Promise<HttpResponse>;
|
|
117
|
+
match: (method: string, pathname: string) => {
|
|
118
|
+
matched: true;
|
|
119
|
+
} | {
|
|
120
|
+
matched: false;
|
|
121
|
+
};
|
|
122
|
+
};
|
|
123
|
+
export {};
|
|
124
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @beignet/core/server
|
|
3
|
+
*
|
|
4
|
+
* Framework-agnostic HTTP server runtime for Beignet.
|
|
5
|
+
* Shared by Beignet server adapters.
|
|
6
|
+
*/
|
|
7
|
+
export type { HttpContractConfig, InferOutput, StandardSchema, StandardSchemaV1, } from "../contracts";
|
|
8
|
+
export { AppError } from "../errors";
|
|
9
|
+
export type { AnyPorts } from "../ports";
|
|
10
|
+
export type { ServiceProvider } from "../providers";
|
|
11
|
+
export * from "./health";
|
|
12
|
+
export * from "./hooks";
|
|
13
|
+
export * from "./http";
|
|
14
|
+
export * from "./openapi";
|
|
15
|
+
export * from "./providers";
|
|
16
|
+
export type { CreateServerOptions, RouteDef, RouteGroup, ServerInstance, } from "./server";
|
|
17
|
+
export { contractsFromRoutes, createServer, defineRouteGroup, defineRoutes, } from "./server";
|
|
18
|
+
export * from "./types";
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,gBAAgB,GACjB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,YAAY,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,YAAY,EACV,mBAAmB,EACnB,QAAQ,EACR,UAAU,EACV,cAAc,GACf,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,YAAY,GACb,MAAM,UAAU,CAAC;AAClB,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @beignet/core/server
|
|
3
|
+
*
|
|
4
|
+
* Framework-agnostic HTTP server runtime for Beignet.
|
|
5
|
+
* Shared by Beignet server adapters.
|
|
6
|
+
*/
|
|
7
|
+
export { AppError } from "../errors";
|
|
8
|
+
export * from "./health";
|
|
9
|
+
export * from "./hooks";
|
|
10
|
+
export * from "./http";
|
|
11
|
+
export * from "./openapi";
|
|
12
|
+
export * from "./providers";
|
|
13
|
+
export { contractsFromRoutes, createServer, defineRouteGroup, defineRoutes, } from "./server";
|
|
14
|
+
export * from "./types";
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGrC,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAO5B,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,YAAY,GACb,MAAM,UAAU,CAAC;AAClB,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAPI generation handler
|
|
3
|
+
* OpenAPI helpers for the Beignet server runtime.
|
|
4
|
+
*/
|
|
5
|
+
import type { HttpContractConfig } from "../contracts";
|
|
6
|
+
import type { AppEnvironment } from "./health";
|
|
7
|
+
import type { HttpRequestLike, HttpResponseLike } from "./types";
|
|
8
|
+
/**
|
|
9
|
+
* OpenAPI configuration
|
|
10
|
+
*/
|
|
11
|
+
export interface OpenAPIConfig {
|
|
12
|
+
/** Enable OpenAPI endpoint (default: false) */
|
|
13
|
+
enabled?: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Suggested path for the OpenAPI endpoint (e.g., "/api/openapi.json").
|
|
16
|
+
* NOTE: This field is for documentation/metadata only and does not control routing.
|
|
17
|
+
* You must manually wire the openapiHandler to your desired route.
|
|
18
|
+
*/
|
|
19
|
+
suggestedPath?: string;
|
|
20
|
+
/** API title */
|
|
21
|
+
title?: string;
|
|
22
|
+
/** API version */
|
|
23
|
+
version?: string;
|
|
24
|
+
/** API description */
|
|
25
|
+
description?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Create an OpenAPI handler
|
|
29
|
+
* Returns a function that can be called with an HttpRequestLike to get an HttpResponseLike
|
|
30
|
+
*/
|
|
31
|
+
export declare function createOpenAPIHandler(contracts: readonly HttpContractConfig[], openapiConfig: OpenAPIConfig | undefined, _env: AppEnvironment): (req: HttpRequestLike) => Promise<HttpResponseLike>;
|
|
32
|
+
//# sourceMappingURL=openapi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/server/openapi.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,SAAS,kBAAkB,EAAE,EACxC,aAAa,EAAE,aAAa,GAAG,SAAS,EACxC,IAAI,EAAE,cAAc,GACnB,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAkCrD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAPI generation handler
|
|
3
|
+
* OpenAPI helpers for the Beignet server runtime.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Create an OpenAPI handler
|
|
7
|
+
* Returns a function that can be called with an HttpRequestLike to get an HttpResponseLike
|
|
8
|
+
*/
|
|
9
|
+
export function createOpenAPIHandler(contracts, openapiConfig, _env) {
|
|
10
|
+
// Lazily generate OpenAPI spec on first request
|
|
11
|
+
let cachedSpec = null;
|
|
12
|
+
return async (_req) => {
|
|
13
|
+
// Generate spec if not cached
|
|
14
|
+
if (!cachedSpec) {
|
|
15
|
+
try {
|
|
16
|
+
// Dynamic import to avoid hard dependency
|
|
17
|
+
const { contractsToOpenAPI } = await import("../openapi");
|
|
18
|
+
cachedSpec = contractsToOpenAPI(contracts, {
|
|
19
|
+
title: openapiConfig?.title ?? "Beignet API",
|
|
20
|
+
version: openapiConfig?.version ?? "1.0.0",
|
|
21
|
+
description: openapiConfig?.description,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
// OpenAPI generation failed
|
|
26
|
+
return {
|
|
27
|
+
status: 500,
|
|
28
|
+
body: {
|
|
29
|
+
error: "OpenAPI generation failed",
|
|
30
|
+
message: error instanceof Error ? error.message : "Unknown error",
|
|
31
|
+
},
|
|
32
|
+
headers: { "Content-Type": "application/json" },
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
status: 200,
|
|
38
|
+
body: cachedSpec,
|
|
39
|
+
headers: { "Content-Type": "application/json" },
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=openapi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../src/server/openapi.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA0BH;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAAwC,EACxC,aAAwC,EACxC,IAAoB;IAEpB,gDAAgD;IAChD,IAAI,UAAU,GAAkB,IAAI,CAAC;IAErC,OAAO,KAAK,EAAE,IAAqB,EAA6B,EAAE;QAChE,8BAA8B;QAC9B,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,0CAA0C;gBAC1C,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;gBAC1D,UAAU,GAAG,kBAAkB,CAAC,SAAS,EAAE;oBACzC,KAAK,EAAE,aAAa,EAAE,KAAK,IAAI,aAAa;oBAC5C,OAAO,EAAE,aAAa,EAAE,OAAO,IAAI,OAAO;oBAC1C,WAAW,EAAE,aAAa,EAAE,WAAW;iBACxC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,4BAA4B;gBAC5B,OAAO;oBACL,MAAM,EAAE,GAAG;oBACX,IAAI,EAAE;wBACJ,KAAK,EAAE,2BAA2B;wBAClC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;qBAClE;oBACD,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAChD,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO;YACL,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;SAChD,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { StandardSchemaV1 } from "@standard-schema/spec";
|
|
2
|
+
import type { AnyPorts } from "../../ports";
|
|
3
|
+
import type { ServiceProvider } from "../../providers";
|
|
4
|
+
declare function parseStandardSchema<Schema extends StandardSchemaV1<unknown, unknown>>(schema: Schema, input: unknown): Promise<StandardSchemaV1.InferOutput<Schema>>;
|
|
5
|
+
export declare function loadProviderConfig<Ports extends AnyPorts, Schema extends StandardSchemaV1<unknown, unknown>>(provider: ServiceProvider<Ports, Schema>, env: Record<string, string | undefined>, overrides: Record<string, unknown>): Promise<StandardSchemaV1.InferOutput<Schema> | undefined>;
|
|
6
|
+
export { parseStandardSchema };
|
|
7
|
+
//# sourceMappingURL=loadProviderConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadProviderConfig.d.ts","sourceRoot":"","sources":["../../../src/server/providers/loadProviderConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAO9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAOvD,iBAAe,mBAAmB,CAChC,MAAM,SAAS,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,EAEjD,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,gBAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAU/C;AAED,wBAAsB,kBAAkB,CACtC,KAAK,SAAS,QAAQ,EACtB,MAAM,SAAS,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,EAEjD,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,EACxC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,gBAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,CA8B3D;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ConfigValidationError, parseStandardSchemaAsync, readEnv, } from "../../config";
|
|
2
|
+
import { SchemaValidationError } from "../../errors";
|
|
3
|
+
async function parseStandardSchema(schema, input) {
|
|
4
|
+
try {
|
|
5
|
+
return await parseStandardSchemaAsync(schema, input);
|
|
6
|
+
}
|
|
7
|
+
catch (error) {
|
|
8
|
+
if (error instanceof ConfigValidationError) {
|
|
9
|
+
throw new SchemaValidationError(error.issues);
|
|
10
|
+
}
|
|
11
|
+
throw error;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export async function loadProviderConfig(provider, env, overrides) {
|
|
15
|
+
const configDef = provider.config;
|
|
16
|
+
if (!configDef)
|
|
17
|
+
return undefined;
|
|
18
|
+
const { schema, envPrefix } = configDef;
|
|
19
|
+
const hasOverride = Object.hasOwn(overrides, provider.name);
|
|
20
|
+
const input = hasOverride
|
|
21
|
+
? overrides[provider.name]
|
|
22
|
+
: envPrefix
|
|
23
|
+
? readEnv({ env, prefix: envPrefix })
|
|
24
|
+
: {};
|
|
25
|
+
try {
|
|
26
|
+
return await parseStandardSchema(schema, input);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
const suffix = envPrefix ? ` (envPrefix=${envPrefix})` : "";
|
|
30
|
+
const found = envPrefix
|
|
31
|
+
? Object.keys(env).filter((k) => k.startsWith(envPrefix) && env[k] !== undefined)
|
|
32
|
+
: [];
|
|
33
|
+
const hint = envPrefix
|
|
34
|
+
? found.length
|
|
35
|
+
? `\n Env vars found with prefix "${envPrefix}": ${found.join(", ")}`
|
|
36
|
+
: `\n No env vars found with prefix "${envPrefix}"`
|
|
37
|
+
: "";
|
|
38
|
+
throw new Error(`Failed to load config for provider "${provider.name}"${suffix}: ${error.message}${hint}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export { parseStandardSchema };
|
|
42
|
+
//# sourceMappingURL=loadProviderConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loadProviderConfig.js","sourceRoot":"","sources":["../../../src/server/providers/loadProviderConfig.ts"],"names":[],"mappings":"AACA,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,OAAO,GACR,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AASrD,KAAK,UAAU,mBAAmB,CAGhC,MAAc,EACd,KAAc;IAEd,IAAI,CAAC;QACH,OAAO,MAAM,wBAAwB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,qBAAqB,EAAE,CAAC;YAC3C,MAAM,IAAI,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAItC,QAAwC,EACxC,GAAuC,EACvC,SAAkC;IAElC,MAAM,SAAS,GAAG,QAAQ,CAAC,MAA+C,CAAC;IAC3E,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAEjC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;IACxC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,WAAW;QACvB,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC1B,CAAC,CAAC,SAAS;YACT,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;YACrC,CAAC,CAAC,EAAE,CAAC;IAET,IAAI,CAAC;QACH,OAAO,MAAM,mBAAmB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,eAAe,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,SAAS;YACrB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CACrB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,CACvD;YACH,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,GAAG,SAAS;YACpB,CAAC,CAAC,KAAK,CAAC,MAAM;gBACZ,CAAC,CAAC,mCAAmC,SAAS,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACtE,CAAC,CAAC,sCAAsC,SAAS,GAAG;YACtD,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CACb,uCAAuC,QAAQ,CAAC,IAAI,IAAI,MAAM,KAAM,KAAe,CAAC,OAAO,GAAG,IAAI,EAAE,CACrG,CAAC;IACJ,CAAC;AACH,CAAC;AAED,OAAO,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { StandardSchemaV1 } from "@standard-schema/spec";
|
|
2
|
+
import { type HttpContractConfig } from "../contracts";
|
|
3
|
+
import type { AnyPorts } from "../ports";
|
|
4
|
+
import type { ProvidedPortsOfList, ServiceProvider } from "../providers";
|
|
5
|
+
import type { ContractLike, ResolveContract } from "./contract-like";
|
|
6
|
+
import type { Handler, HttpRequestLike, HttpResponse, ServerCaughtErrorHook, ServerHook, ServerUnhandledErrorMapper } from "./http";
|
|
7
|
+
/**
|
|
8
|
+
* Route definition
|
|
9
|
+
*/
|
|
10
|
+
export type RouteDef<Ctx, CLike extends ContractLike = ContractLike> = {
|
|
11
|
+
contract: CLike;
|
|
12
|
+
handle: Handler<Ctx, ResolveContract<CLike>>;
|
|
13
|
+
};
|
|
14
|
+
declare const ROUTE_GROUP_KIND = "beignet.route-group";
|
|
15
|
+
export type RouteGroup<Ctx, Routes extends readonly RouteDef<Ctx, any>[] = readonly RouteDef<Ctx, any>[]> = {
|
|
16
|
+
kind: typeof ROUTE_GROUP_KIND;
|
|
17
|
+
name: string;
|
|
18
|
+
routes: Routes;
|
|
19
|
+
};
|
|
20
|
+
type RouteInput<Ctx> = RouteDef<Ctx, any> | RouteGroup<Ctx, readonly RouteDef<Ctx, any>[]>;
|
|
21
|
+
type RoutesFromInput<Input> = Input extends RouteGroup<any, infer Routes> ? Routes : Input extends RouteDef<any, any> ? readonly [Input] : readonly [];
|
|
22
|
+
type FlattenRouteInputs<Inputs extends readonly unknown[]> = number extends Inputs["length"] ? readonly RouteDef<any, any>[] : Inputs extends readonly [infer First, ...infer Rest] ? readonly [...RoutesFromInput<First>, ...FlattenRouteInputs<Rest>] : readonly [];
|
|
23
|
+
type ContractsFromRouteList<Routes extends readonly RouteDef<any, any>[]> = {
|
|
24
|
+
readonly [Index in keyof Routes]: Routes[Index] extends RouteDef<any, infer CLike> ? ResolveContract<CLike> : never;
|
|
25
|
+
};
|
|
26
|
+
export type CreateServerOptions<Ctx, Ports extends AnyPorts, Routes extends readonly RouteDef<Ctx, any>[] = readonly RouteDef<Ctx, any>[], Providers extends readonly ServiceProvider<unknown, StandardSchemaV1<any, any>, AnyPorts>[] = readonly []> = {
|
|
27
|
+
ports: Ports;
|
|
28
|
+
providers?: Providers;
|
|
29
|
+
providerEnv?: Record<string, string | undefined>;
|
|
30
|
+
providerConfig?: Record<string, unknown>;
|
|
31
|
+
createContext: (args: {
|
|
32
|
+
req: HttpRequestLike;
|
|
33
|
+
ports: Ports & ProvidedPortsOfList<Providers>;
|
|
34
|
+
contract?: HttpContractConfig;
|
|
35
|
+
}) => Ctx | Promise<Ctx>;
|
|
36
|
+
hooks?: ServerHook<Ctx, Ports & ProvidedPortsOfList<Providers>>[];
|
|
37
|
+
routes?: Routes;
|
|
38
|
+
onCaughtError?: ServerCaughtErrorHook<Ctx>;
|
|
39
|
+
mapUnhandledError?: ServerUnhandledErrorMapper<Ctx>;
|
|
40
|
+
};
|
|
41
|
+
interface RouteBuilder<Ctx, C extends HttpContractConfig> {
|
|
42
|
+
handle: (fn: Handler<Ctx, C>) => (req: HttpRequestLike) => Promise<HttpResponse>;
|
|
43
|
+
}
|
|
44
|
+
export interface ServerInstance<Ctx, Ports extends AnyPorts = AnyPorts> {
|
|
45
|
+
api: (req: HttpRequestLike) => Promise<HttpResponse>;
|
|
46
|
+
route: <CLike extends ContractLike>(contractLike: CLike) => RouteBuilder<Ctx, ResolveContract<CLike>>;
|
|
47
|
+
contracts: readonly HttpContractConfig[];
|
|
48
|
+
stop: () => Promise<void>;
|
|
49
|
+
ports: Ports;
|
|
50
|
+
}
|
|
51
|
+
export declare function createServer<Ctx, Ports extends AnyPorts, Routes extends readonly RouteDef<Ctx, any>[] = readonly RouteDef<Ctx, any>[], Providers extends readonly ServiceProvider<unknown, StandardSchemaV1<any, any>, AnyPorts>[] = readonly []>(options: CreateServerOptions<Ctx, Ports, Routes, Providers>): Promise<ServerInstance<Ctx, Ports & ProvidedPortsOfList<Providers>>>;
|
|
52
|
+
/**
|
|
53
|
+
* Helper function to define routes with proper type inference.
|
|
54
|
+
* Eliminates the need for type assertions when passing routes to createServer.
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* const routes = defineRoutes<AppContext>([
|
|
58
|
+
* { contract: myContract, handle: async ({ query }) => { ... } }
|
|
59
|
+
* ]);
|
|
60
|
+
*/
|
|
61
|
+
export declare function defineRoutes<Ctx, const R extends readonly RouteInput<Ctx>[] = readonly RouteInput<Ctx>[]>(routes: R): FlattenRouteInputs<R>;
|
|
62
|
+
/**
|
|
63
|
+
* Extract contract configs from a route list. Use this to drive OpenAPI from
|
|
64
|
+
* the same route registration list that createServer receives.
|
|
65
|
+
*/
|
|
66
|
+
export declare function contractsFromRoutes<const R extends readonly RouteDef<any, any>[]>(routes: R): ContractsFromRouteList<R>;
|
|
67
|
+
/**
|
|
68
|
+
* Helper function to group related route registrations.
|
|
69
|
+
*
|
|
70
|
+
* Route groups are flattened by defineRoutes, so createServer still receives
|
|
71
|
+
* a regular route list while app code can keep feature route wiring colocated.
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* const todoRoutes = defineRouteGroup<AppContext>({
|
|
75
|
+
* name: "todos",
|
|
76
|
+
* routes: [
|
|
77
|
+
* { contract: listTodos, handle: async ({ ctx }) => { ... } }
|
|
78
|
+
* ]
|
|
79
|
+
* });
|
|
80
|
+
*/
|
|
81
|
+
export declare function defineRouteGroup<Ctx, const R extends readonly RouteDef<Ctx, any>[] = readonly RouteDef<Ctx, any>[]>(group: {
|
|
82
|
+
name: string;
|
|
83
|
+
routes: R;
|
|
84
|
+
}): RouteGroup<Ctx, R>;
|
|
85
|
+
export {};
|
|
86
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"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"}
|