@betterportal/framework 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/README.md +13 -0
- package/lib/adapters/h3.d.ts +51 -0
- package/lib/adapters/h3.d.ts.map +1 -0
- package/lib/adapters/h3.js +1120 -0
- package/lib/adapters/h3.js.map +1 -0
- package/lib/codegen/cli.d.ts +3 -0
- package/lib/codegen/cli.d.ts.map +1 -0
- package/lib/codegen/cli.js +82 -0
- package/lib/codegen/cli.js.map +1 -0
- package/lib/codegen/emitter.d.ts +7 -0
- package/lib/codegen/emitter.d.ts.map +1 -0
- package/lib/codegen/emitter.js +453 -0
- package/lib/codegen/emitter.js.map +1 -0
- package/lib/codegen/init.d.ts +3 -0
- package/lib/codegen/init.d.ts.map +1 -0
- package/lib/codegen/init.js +90 -0
- package/lib/codegen/init.js.map +1 -0
- package/lib/codegen/scanner.d.ts +56 -0
- package/lib/codegen/scanner.d.ts.map +1 -0
- package/lib/codegen/scanner.js +484 -0
- package/lib/codegen/scanner.js.map +1 -0
- package/lib/codegen/validate.d.ts +14 -0
- package/lib/codegen/validate.d.ts.map +1 -0
- package/lib/codegen/validate.js +166 -0
- package/lib/codegen/validate.js.map +1 -0
- package/lib/contracts/auth.d.ts +160 -0
- package/lib/contracts/auth.d.ts.map +1 -0
- package/lib/contracts/auth.js +123 -0
- package/lib/contracts/auth.js.map +1 -0
- package/lib/contracts/binding.d.ts +169 -0
- package/lib/contracts/binding.d.ts.map +1 -0
- package/lib/contracts/binding.js +69 -0
- package/lib/contracts/binding.js.map +1 -0
- package/lib/contracts/common.d.ts +23 -0
- package/lib/contracts/common.d.ts.map +1 -0
- package/lib/contracts/common.js +18 -0
- package/lib/contracts/common.js.map +1 -0
- package/lib/contracts/config.d.ts +93 -0
- package/lib/contracts/config.d.ts.map +1 -0
- package/lib/contracts/config.js +62 -0
- package/lib/contracts/config.js.map +1 -0
- package/lib/contracts/controlPlane.d.ts +63 -0
- package/lib/contracts/controlPlane.d.ts.map +1 -0
- package/lib/contracts/controlPlane.js +2 -0
- package/lib/contracts/controlPlane.js.map +1 -0
- package/lib/contracts/json.d.ts +9 -0
- package/lib/contracts/json.d.ts.map +1 -0
- package/lib/contracts/json.js +6 -0
- package/lib/contracts/json.js.map +1 -0
- package/lib/contracts/manifest.d.ts +158 -0
- package/lib/contracts/manifest.d.ts.map +1 -0
- package/lib/contracts/manifest.js +40 -0
- package/lib/contracts/manifest.js.map +1 -0
- package/lib/contracts/observability.d.ts +77 -0
- package/lib/contracts/observability.d.ts.map +1 -0
- package/lib/contracts/observability.js +99 -0
- package/lib/contracts/observability.js.map +1 -0
- package/lib/contracts/platformConfig.d.ts +635 -0
- package/lib/contracts/platformConfig.d.ts.map +1 -0
- package/lib/contracts/platformConfig.js +256 -0
- package/lib/contracts/platformConfig.js.map +1 -0
- package/lib/contracts/registry.d.ts +104 -0
- package/lib/contracts/registry.d.ts.map +1 -0
- package/lib/contracts/registry.js +2 -0
- package/lib/contracts/registry.js.map +1 -0
- package/lib/contracts/route.d.ts +199 -0
- package/lib/contracts/route.d.ts.map +1 -0
- package/lib/contracts/route.js +26 -0
- package/lib/contracts/route.js.map +1 -0
- package/lib/contracts/serviceConfig.d.ts +88 -0
- package/lib/contracts/serviceConfig.d.ts.map +1 -0
- package/lib/contracts/serviceConfig.js +45 -0
- package/lib/contracts/serviceConfig.js.map +1 -0
- package/lib/contracts/streaming.d.ts +76 -0
- package/lib/contracts/streaming.d.ts.map +1 -0
- package/lib/contracts/streaming.js +31 -0
- package/lib/contracts/streaming.js.map +1 -0
- package/lib/contracts/view.d.ts +149 -0
- package/lib/contracts/view.d.ts.map +1 -0
- package/lib/contracts/view.js +82 -0
- package/lib/contracts/view.js.map +1 -0
- package/lib/controlPlane/store.d.ts +24 -0
- package/lib/controlPlane/store.d.ts.map +1 -0
- package/lib/controlPlane/store.js +70 -0
- package/lib/controlPlane/store.js.map +1 -0
- package/lib/controlPlane/sync.d.ts +8 -0
- package/lib/controlPlane/sync.d.ts.map +1 -0
- package/lib/controlPlane/sync.js +24 -0
- package/lib/controlPlane/sync.js.map +1 -0
- package/lib/controlPlane/types.d.ts +15 -0
- package/lib/controlPlane/types.d.ts.map +1 -0
- package/lib/controlPlane/types.js +2 -0
- package/lib/controlPlane/types.js.map +1 -0
- package/lib/index.d.ts +40 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +40 -0
- package/lib/index.js.map +1 -0
- package/lib/runtime/auth/envelope.d.ts +32 -0
- package/lib/runtime/auth/envelope.d.ts.map +1 -0
- package/lib/runtime/auth/envelope.js +123 -0
- package/lib/runtime/auth/envelope.js.map +1 -0
- package/lib/runtime/auth/issuer.d.ts +44 -0
- package/lib/runtime/auth/issuer.d.ts.map +1 -0
- package/lib/runtime/auth/issuer.js +82 -0
- package/lib/runtime/auth/issuer.js.map +1 -0
- package/lib/runtime/auth/jwks.d.ts +7 -0
- package/lib/runtime/auth/jwks.d.ts.map +1 -0
- package/lib/runtime/auth/jwks.js +69 -0
- package/lib/runtime/auth/jwks.js.map +1 -0
- package/lib/runtime/auth/keypair.d.ts +21 -0
- package/lib/runtime/auth/keypair.d.ts.map +1 -0
- package/lib/runtime/auth/keypair.js +50 -0
- package/lib/runtime/auth/keypair.js.map +1 -0
- package/lib/runtime/auth/tokens.d.ts +25 -0
- package/lib/runtime/auth/tokens.d.ts.map +1 -0
- package/lib/runtime/auth/tokens.js +137 -0
- package/lib/runtime/auth/tokens.js.map +1 -0
- package/lib/runtime/auth/verifier.d.ts +45 -0
- package/lib/runtime/auth/verifier.d.ts.map +1 -0
- package/lib/runtime/auth/verifier.js +76 -0
- package/lib/runtime/auth/verifier.js.map +1 -0
- package/lib/runtime/bpHeaders.d.ts +10 -0
- package/lib/runtime/bpHeaders.d.ts.map +1 -0
- package/lib/runtime/bpHeaders.js +53 -0
- package/lib/runtime/bpHeaders.js.map +1 -0
- package/lib/runtime/configProvider.d.ts +41 -0
- package/lib/runtime/configProvider.d.ts.map +1 -0
- package/lib/runtime/configProvider.js +232 -0
- package/lib/runtime/configProvider.js.map +1 -0
- package/lib/runtime/configStore.d.ts +34 -0
- package/lib/runtime/configStore.d.ts.map +1 -0
- package/lib/runtime/configStore.js +197 -0
- package/lib/runtime/configStore.js.map +1 -0
- package/lib/runtime/configTicket.d.ts +49 -0
- package/lib/runtime/configTicket.d.ts.map +1 -0
- package/lib/runtime/configTicket.js +168 -0
- package/lib/runtime/configTicket.js.map +1 -0
- package/lib/runtime/h3.d.ts +28 -0
- package/lib/runtime/h3.d.ts.map +1 -0
- package/lib/runtime/h3.js +199 -0
- package/lib/runtime/h3.js.map +1 -0
- package/lib/runtime/handler.d.ts +55 -0
- package/lib/runtime/handler.d.ts.map +1 -0
- package/lib/runtime/handler.js +51 -0
- package/lib/runtime/handler.js.map +1 -0
- package/lib/runtime/http.d.ts +13 -0
- package/lib/runtime/http.d.ts.map +1 -0
- package/lib/runtime/http.js +114 -0
- package/lib/runtime/http.js.map +1 -0
- package/lib/runtime/jsonSchema.d.ts +4 -0
- package/lib/runtime/jsonSchema.d.ts.map +1 -0
- package/lib/runtime/jsonSchema.js +28 -0
- package/lib/runtime/jsonSchema.js.map +1 -0
- package/lib/runtime/manifest.d.ts +3 -0
- package/lib/runtime/manifest.d.ts.map +1 -0
- package/lib/runtime/manifest.js +5 -0
- package/lib/runtime/manifest.js.map +1 -0
- package/lib/runtime/media.d.ts +20 -0
- package/lib/runtime/media.d.ts.map +1 -0
- package/lib/runtime/media.js +70 -0
- package/lib/runtime/media.js.map +1 -0
- package/lib/runtime/registry.d.ts +67 -0
- package/lib/runtime/registry.d.ts.map +1 -0
- package/lib/runtime/registry.js +290 -0
- package/lib/runtime/registry.js.map +1 -0
- package/lib/runtime/serviceConfig.d.ts +38 -0
- package/lib/runtime/serviceConfig.d.ts.map +1 -0
- package/lib/runtime/serviceConfig.js +152 -0
- package/lib/runtime/serviceConfig.js.map +1 -0
- package/lib/runtime/statusViews.d.ts +23 -0
- package/lib/runtime/statusViews.d.ts.map +1 -0
- package/lib/runtime/statusViews.js +48 -0
- package/lib/runtime/statusViews.js.map +1 -0
- package/lib/runtime/stream.d.ts +41 -0
- package/lib/runtime/stream.d.ts.map +1 -0
- package/lib/runtime/stream.js +92 -0
- package/lib/runtime/stream.js.map +1 -0
- package/lib/runtime/streamHandler.d.ts +48 -0
- package/lib/runtime/streamHandler.d.ts.map +1 -0
- package/lib/runtime/streamHandler.js +49 -0
- package/lib/runtime/streamHandler.js.map +1 -0
- package/lib/runtime/tenantResolution.d.ts +4 -0
- package/lib/runtime/tenantResolution.d.ts.map +1 -0
- package/lib/runtime/tenantResolution.js +19 -0
- package/lib/runtime/tenantResolution.js.map +1 -0
- package/lib/runtime/uuid.d.ts +6 -0
- package/lib/runtime/uuid.d.ts.map +1 -0
- package/lib/runtime/uuid.js +27 -0
- package/lib/runtime/uuid.js.map +1 -0
- package/lib/runtime/view.d.ts +48 -0
- package/lib/runtime/view.d.ts.map +1 -0
- package/lib/runtime/view.js +111 -0
- package/lib/runtime/view.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/runtime/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ConfigSchemaDescriptor } from "../contracts/config.js";
|
|
2
|
+
import { type ServiceConfigAction, type ServiceConfigManagementMode, type ServiceConfigState, type ServiceConfigTicketClaims } from "../contracts/serviceConfig.js";
|
|
3
|
+
import { type BetterPortalEvent, type BetterPortalH3App } from "./h3.js";
|
|
4
|
+
export interface ServiceConfigAccessContext {
|
|
5
|
+
ticket: ServiceConfigTicketClaims;
|
|
6
|
+
action: ServiceConfigAction;
|
|
7
|
+
}
|
|
8
|
+
export interface ServiceConfigRouteOptions {
|
|
9
|
+
app: BetterPortalH3App;
|
|
10
|
+
serviceId: string;
|
|
11
|
+
configSchemas: ConfigSchemaDescriptor[];
|
|
12
|
+
mode: ServiceConfigManagementMode;
|
|
13
|
+
supportsCustomUi?: boolean;
|
|
14
|
+
customUiPath?: string;
|
|
15
|
+
basePath?: string;
|
|
16
|
+
validateTicket?: (ticketValue: string | null, event: BetterPortalEvent, action: ServiceConfigAction) => Promise<ServiceConfigTicketClaims | null> | ServiceConfigTicketClaims | null;
|
|
17
|
+
validateScope?: (scope: {
|
|
18
|
+
tenantId: string;
|
|
19
|
+
appId?: string;
|
|
20
|
+
action: ServiceConfigAction;
|
|
21
|
+
ticket: ServiceConfigTicketClaims;
|
|
22
|
+
}, event: BetterPortalEvent) => Promise<boolean> | boolean;
|
|
23
|
+
readConfig?: (context: ServiceConfigAccessContext, event: BetterPortalEvent) => Promise<ServiceConfigState | null> | ServiceConfigState | null;
|
|
24
|
+
writeConfig?: (values: {
|
|
25
|
+
tenantId: string;
|
|
26
|
+
appId?: string;
|
|
27
|
+
values: Record<string, unknown>;
|
|
28
|
+
}, context: ServiceConfigAccessContext, event: BetterPortalEvent) => Promise<ServiceConfigState | null> | ServiceConfigState | null;
|
|
29
|
+
clearConfigKey?: (values: {
|
|
30
|
+
tenantId: string;
|
|
31
|
+
appId?: string;
|
|
32
|
+
key: string;
|
|
33
|
+
}, context: ServiceConfigAccessContext, event: BetterPortalEvent) => Promise<ServiceConfigState | null> | ServiceConfigState | null;
|
|
34
|
+
/** Extra response headers added to successful write responses (e.g., HX-Trigger). */
|
|
35
|
+
writeSuccessHeaders?: Record<string, string>;
|
|
36
|
+
}
|
|
37
|
+
export declare function registerServiceConfigRoutes(options: ServiceConfigRouteOptions): void;
|
|
38
|
+
//# sourceMappingURL=serviceConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceConfig.d.ts","sourceRoot":"","sources":["../../src/runtime/serviceConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAErE,OAAO,EAML,KAAK,mBAAmB,EACxB,KAAK,2BAA2B,EAChC,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC/B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAgB,KAAK,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEvF,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,yBAAyB,CAAC;IAClC,MAAM,EAAE,mBAAmB,CAAC;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACxC,GAAG,EAAE,iBAAiB,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,sBAAsB,EAAE,CAAC;IACxC,IAAI,EAAE,2BAA2B,CAAC;IAClC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,mBAAmB,KAAK,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,GAAG,yBAAyB,GAAG,IAAI,CAAC;IACrL,aAAa,CAAC,EAAE,CACd,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,mBAAmB,CAAC;QAAC,MAAM,EAAE,yBAAyB,CAAA;KAAE,EAC3G,KAAK,EAAE,iBAAiB,KACrB,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAChC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,0BAA0B,EAAE,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,kBAAkB,GAAG,IAAI,CAAC;IAC/I,WAAW,CAAC,EAAE,CACZ,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAC7E,OAAO,EAAE,0BAA0B,EACnC,KAAK,EAAE,iBAAiB,KACrB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,kBAAkB,GAAG,IAAI,CAAC;IACpE,cAAc,CAAC,EAAE,CACf,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EACzD,OAAO,EAAE,0BAA0B,EACnC,KAAK,EAAE,iBAAiB,KACrB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,kBAAkB,GAAG,IAAI,CAAC;IACpE,qFAAqF;IACrF,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9C;AAkDD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI,CA6IpF"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import { ServiceConfigReadResponseSchema, ServiceConfigSchemaResponseSchema, ServiceConfigStateSchema, ServiceConfigTicketClaimsSchema, ServiceConfigWriteRequestSchema } from "../contracts/serviceConfig.js";
|
|
2
|
+
import { jsonResponse } from "./h3.js";
|
|
3
|
+
const DEFAULT_BASE_PATH = "/.well-known/bp/config";
|
|
4
|
+
async function resolveTicket(options, event, action) {
|
|
5
|
+
if (!options.validateTicket) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
const bearerValue = event.req.headers.get("authorization");
|
|
9
|
+
const ticketValue = bearerValue?.startsWith("Bearer ") ? bearerValue.slice("Bearer ".length) : null;
|
|
10
|
+
const resolved = await options.validateTicket(ticketValue, event, action);
|
|
11
|
+
if (!resolved) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
const parsed = ServiceConfigTicketClaimsSchema.parse(resolved);
|
|
15
|
+
const now = Math.floor(Date.now() / 1000);
|
|
16
|
+
if (parsed.exp <= now) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
if (parsed.serviceId !== options.serviceId || !parsed.actions.includes(action)) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
return parsed;
|
|
23
|
+
}
|
|
24
|
+
function redactSecretValues(configSchemas, input) {
|
|
25
|
+
const secretKeys = new Set(configSchemas.flatMap((schema) => schema.fields
|
|
26
|
+
.filter((field) => field.visibility === "secret")
|
|
27
|
+
.map((field) => field.key)));
|
|
28
|
+
return Object.fromEntries(Object.entries(input).map(([key, value]) => [key, secretKeys.has(key) ? "__redacted__" : value]));
|
|
29
|
+
}
|
|
30
|
+
export function registerServiceConfigRoutes(options) {
|
|
31
|
+
const basePath = options.basePath ?? DEFAULT_BASE_PATH;
|
|
32
|
+
options.app.get(`${basePath}/schema`, async () => {
|
|
33
|
+
const response = ServiceConfigSchemaResponseSchema.parse({
|
|
34
|
+
serviceId: options.serviceId,
|
|
35
|
+
mode: options.mode,
|
|
36
|
+
configSchemas: options.configSchemas,
|
|
37
|
+
supportsCustomUi: options.supportsCustomUi ?? Boolean(options.customUiPath),
|
|
38
|
+
...(options.customUiPath ? { customUiPath: options.customUiPath } : {}),
|
|
39
|
+
supportsWrite: Boolean(options.writeConfig)
|
|
40
|
+
});
|
|
41
|
+
return jsonResponse(response);
|
|
42
|
+
});
|
|
43
|
+
options.app.get(basePath, async (event) => {
|
|
44
|
+
const ticket = await resolveTicket(options, event, "config.read");
|
|
45
|
+
if (!ticket) {
|
|
46
|
+
return jsonResponse({
|
|
47
|
+
error: "A valid BetterPortal config ticket is required for config.read"
|
|
48
|
+
}, 401);
|
|
49
|
+
}
|
|
50
|
+
if (!options.readConfig) {
|
|
51
|
+
return jsonResponse({
|
|
52
|
+
error: "This service does not expose dynamic config reads"
|
|
53
|
+
}, 501);
|
|
54
|
+
}
|
|
55
|
+
const requestedAppId = event.req.headers.get("x-bp-app-id") ?? undefined;
|
|
56
|
+
if (options.validateScope && !(await options.validateScope({
|
|
57
|
+
tenantId: ticket.tenantId,
|
|
58
|
+
...(requestedAppId ? { appId: requestedAppId } : {}),
|
|
59
|
+
action: "config.read",
|
|
60
|
+
ticket
|
|
61
|
+
}, event))) {
|
|
62
|
+
return jsonResponse({
|
|
63
|
+
error: "Config read scope is not allowed for this ticket"
|
|
64
|
+
}, 403);
|
|
65
|
+
}
|
|
66
|
+
const state = await options.readConfig({
|
|
67
|
+
ticket,
|
|
68
|
+
action: "config.read"
|
|
69
|
+
}, event);
|
|
70
|
+
const parsedState = ServiceConfigStateSchema.parse(state ?? { tenant: {}, app: {} });
|
|
71
|
+
const rawValues = requestedAppId
|
|
72
|
+
? parsedState.app[requestedAppId] ?? {}
|
|
73
|
+
: parsedState.tenant;
|
|
74
|
+
const response = ServiceConfigReadResponseSchema.parse({
|
|
75
|
+
serviceId: options.serviceId,
|
|
76
|
+
tenantId: ticket.tenantId,
|
|
77
|
+
...(requestedAppId ? { appId: requestedAppId } : {}),
|
|
78
|
+
values: redactSecretValues(options.configSchemas, rawValues)
|
|
79
|
+
});
|
|
80
|
+
return jsonResponse(response);
|
|
81
|
+
});
|
|
82
|
+
options.app.post(basePath, async (event) => {
|
|
83
|
+
const ticket = await resolveTicket(options, event, "config.write");
|
|
84
|
+
if (!ticket) {
|
|
85
|
+
return jsonResponse({
|
|
86
|
+
error: "A valid BetterPortal config ticket is required for config.write"
|
|
87
|
+
}, 401);
|
|
88
|
+
}
|
|
89
|
+
if (!options.writeConfig) {
|
|
90
|
+
return jsonResponse({
|
|
91
|
+
error: "This service does not expose dynamic config writes"
|
|
92
|
+
}, 501);
|
|
93
|
+
}
|
|
94
|
+
const body = await event.req.json().catch(() => null);
|
|
95
|
+
const parsedWrite = ServiceConfigWriteRequestSchema.safeParse(body);
|
|
96
|
+
if (!parsedWrite.success) {
|
|
97
|
+
return jsonResponse({
|
|
98
|
+
error: "Invalid config write payload",
|
|
99
|
+
issues: parsedWrite.issues.map((issue) => ({
|
|
100
|
+
code: issue.code,
|
|
101
|
+
path: issue.path.join("."),
|
|
102
|
+
message: issue.message
|
|
103
|
+
}))
|
|
104
|
+
}, 400);
|
|
105
|
+
}
|
|
106
|
+
if (parsedWrite.data.tenantId !== ticket.tenantId) {
|
|
107
|
+
return jsonResponse({
|
|
108
|
+
error: "Config write tenant does not match the ticket tenant"
|
|
109
|
+
}, 403);
|
|
110
|
+
}
|
|
111
|
+
if (options.validateScope && !(await options.validateScope({
|
|
112
|
+
tenantId: parsedWrite.data.tenantId,
|
|
113
|
+
...(parsedWrite.data.appId ? { appId: parsedWrite.data.appId } : {}),
|
|
114
|
+
action: "config.write",
|
|
115
|
+
ticket
|
|
116
|
+
}, event))) {
|
|
117
|
+
return jsonResponse({
|
|
118
|
+
error: "Config write scope is not allowed for this ticket"
|
|
119
|
+
}, 403);
|
|
120
|
+
}
|
|
121
|
+
let state = null;
|
|
122
|
+
for (const key of parsedWrite.data.clearKeys) {
|
|
123
|
+
state = options.clearConfigKey
|
|
124
|
+
? await options.clearConfigKey({
|
|
125
|
+
tenantId: parsedWrite.data.tenantId,
|
|
126
|
+
appId: parsedWrite.data.appId,
|
|
127
|
+
key
|
|
128
|
+
}, {
|
|
129
|
+
ticket,
|
|
130
|
+
action: "config.write"
|
|
131
|
+
}, event)
|
|
132
|
+
: state;
|
|
133
|
+
}
|
|
134
|
+
state = await options.writeConfig({
|
|
135
|
+
tenantId: parsedWrite.data.tenantId,
|
|
136
|
+
appId: parsedWrite.data.appId,
|
|
137
|
+
values: parsedWrite.data.values
|
|
138
|
+
}, {
|
|
139
|
+
ticket,
|
|
140
|
+
action: "config.write"
|
|
141
|
+
}, event);
|
|
142
|
+
const parsedState = ServiceConfigStateSchema.parse(state ?? { tenant: {}, app: {} });
|
|
143
|
+
return jsonResponse({
|
|
144
|
+
ok: true,
|
|
145
|
+
serviceId: options.serviceId,
|
|
146
|
+
tenantId: ticket.tenantId,
|
|
147
|
+
...(parsedWrite.data.appId ? { appId: parsedWrite.data.appId } : {}),
|
|
148
|
+
values: redactSecretValues(options.configSchemas, parsedWrite.data.appId ? parsedState.app[parsedWrite.data.appId] ?? {} : parsedState.tenant)
|
|
149
|
+
}, 200, options.writeSuccessHeaders);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=serviceConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serviceConfig.js","sourceRoot":"","sources":["../../src/runtime/serviceConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RegisteredRoute, RegisteredThemeRenderer } from "../contracts/registry.js";
|
|
2
|
+
export type StatusRendererKind = "page" | "component" | "fragment";
|
|
3
|
+
/**
|
|
4
|
+
* Resolve a renderer for an HTTP status code on a route.
|
|
5
|
+
*
|
|
6
|
+
* Resolution order:
|
|
7
|
+
* 1. route.statusRenderers[themeId][code] matching the requested kind and id
|
|
8
|
+
* 2. (caller falls back to default renderer or no-body response)
|
|
9
|
+
*
|
|
10
|
+
* For 2xx success codes the caller may choose to fall back to the default
|
|
11
|
+
* success renderer. For 4xx/5xx the caller may return no body.
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolveStatusRenderer(route: RegisteredRoute, themeId: string, statusCode: number, kind: StatusRendererKind, rendererKey?: string): RegisteredThemeRenderer | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Status code policy:
|
|
16
|
+
* - 200, 201, 202 (and other 2xx): success - fall back to default renderer if no specific one.
|
|
17
|
+
* - 204, 205, 206: no body (HTTP forbids body or strongly discourages).
|
|
18
|
+
* - 1xx, 3xx: no body emitted by framework.
|
|
19
|
+
* - 4xx, 5xx: try specific renderer; if absent, return status with empty body.
|
|
20
|
+
*/
|
|
21
|
+
export declare function shouldFallThroughToDefaultRenderer(statusCode: number): boolean;
|
|
22
|
+
export declare function statusForbidsBody(statusCode: number): boolean;
|
|
23
|
+
//# sourceMappingURL=statusViews.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statusViews.d.ts","sourceRoot":"","sources":["../../src/runtime/statusViews.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EAExB,MAAM,0BAA0B,CAAC;AAElC,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,CAAC;AAEnE;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,kBAAkB,EACxB,WAAW,CAAC,EAAE,MAAM,GACnB,uBAAuB,GAAG,SAAS,CAYrC;AAED;;;;;;GAMG;AACH,wBAAgB,kCAAkC,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAK9E;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAK7D"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a renderer for an HTTP status code on a route.
|
|
3
|
+
*
|
|
4
|
+
* Resolution order:
|
|
5
|
+
* 1. route.statusRenderers[themeId][code] matching the requested kind and id
|
|
6
|
+
* 2. (caller falls back to default renderer or no-body response)
|
|
7
|
+
*
|
|
8
|
+
* For 2xx success codes the caller may choose to fall back to the default
|
|
9
|
+
* success renderer. For 4xx/5xx the caller may return no body.
|
|
10
|
+
*/
|
|
11
|
+
export function resolveStatusRenderer(route, themeId, statusCode, kind, rendererKey) {
|
|
12
|
+
const bucket = route.statusRenderers?.[themeId]?.[statusCode];
|
|
13
|
+
if (!bucket)
|
|
14
|
+
return undefined;
|
|
15
|
+
switch (kind) {
|
|
16
|
+
case "page":
|
|
17
|
+
return bucket.page;
|
|
18
|
+
case "component":
|
|
19
|
+
return rendererKey ? bucket.components?.[rendererKey] : undefined;
|
|
20
|
+
case "fragment":
|
|
21
|
+
return rendererKey ? bucket.fragments?.[rendererKey] : undefined;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Status code policy:
|
|
26
|
+
* - 200, 201, 202 (and other 2xx): success - fall back to default renderer if no specific one.
|
|
27
|
+
* - 204, 205, 206: no body (HTTP forbids body or strongly discourages).
|
|
28
|
+
* - 1xx, 3xx: no body emitted by framework.
|
|
29
|
+
* - 4xx, 5xx: try specific renderer; if absent, return status with empty body.
|
|
30
|
+
*/
|
|
31
|
+
export function shouldFallThroughToDefaultRenderer(statusCode) {
|
|
32
|
+
if (statusCode === 200 || statusCode === 201 || statusCode === 202)
|
|
33
|
+
return true;
|
|
34
|
+
// Other 2xx that allow a body (203, 207, 208, 226) - fall through too.
|
|
35
|
+
if (statusCode >= 200 && statusCode <= 299 && ![204, 205, 206].includes(statusCode))
|
|
36
|
+
return true;
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
export function statusForbidsBody(statusCode) {
|
|
40
|
+
if (statusCode === 204 || statusCode === 205 || statusCode === 206)
|
|
41
|
+
return true;
|
|
42
|
+
if (statusCode >= 100 && statusCode <= 199)
|
|
43
|
+
return true;
|
|
44
|
+
if (statusCode >= 300 && statusCode <= 399)
|
|
45
|
+
return true;
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=statusViews.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statusViews.js","sourceRoot":"","sources":["../../src/runtime/statusViews.ts"],"names":[],"mappings":"AAQA;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAsB,EACtB,OAAe,EACf,UAAkB,EAClB,IAAwB,EACxB,WAAoB;IAEpB,MAAM,MAAM,GAAsC,KAAK,CAAC,eAAe,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IACjG,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE9B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,MAAM;YACT,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,KAAK,WAAW;YACd,OAAO,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,KAAK,UAAU;YACb,OAAO,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kCAAkC,CAAC,UAAkB;IACnE,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAChF,uEAAuE;IACvE,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACjG,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAChF,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC;IACxD,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC;IACxD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { RouteHandlerContext } from "../contracts/route.js";
|
|
2
|
+
import type { BpStreamHandler, StreamErrorFrame } from "../contracts/streaming.js";
|
|
3
|
+
/**
|
|
4
|
+
* Stream driving helpers (spec/streaming.md).
|
|
5
|
+
*
|
|
6
|
+
* The producer-side validation gate lives here: every yielded item is parsed
|
|
7
|
+
* against the handler's itemSchema (and the generator return value against
|
|
8
|
+
* summarySchema) BEFORE leaving the process, in every representation.
|
|
9
|
+
*/
|
|
10
|
+
type AnyStreamHandler = BpStreamHandler<any, any, any, any, any>;
|
|
11
|
+
type AnyCtx = RouteHandlerContext<any, any, any, any>;
|
|
12
|
+
export interface BufferedStreamResult {
|
|
13
|
+
items: unknown[];
|
|
14
|
+
summary?: unknown;
|
|
15
|
+
}
|
|
16
|
+
/** Events surfaced to a frame consumer while driving the generator. */
|
|
17
|
+
export interface StreamDriverSink {
|
|
18
|
+
onItem(item: unknown): Promise<void> | void;
|
|
19
|
+
onSummary(summary: unknown): Promise<void> | void;
|
|
20
|
+
/** Terminal - exactly one of onError / onEnd fires, then nothing. */
|
|
21
|
+
onError(frame: StreamErrorFrame): Promise<void> | void;
|
|
22
|
+
onEnd(count: number): Promise<void> | void;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Drive the generator, validating each frame payload, and report frames to
|
|
26
|
+
* the sink in legal order: items -> summary? -> exactly one terminal.
|
|
27
|
+
*/
|
|
28
|
+
export declare function driveStream(handler: AnyStreamHandler, ctx: AnyCtx, sink: StreamDriverSink): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Run the stream to completion and assemble the derived buffered shape
|
|
31
|
+
* `{ items, summary? }` (spec/streaming.md section 2.1). Throws on any failure so
|
|
32
|
+
* buffered representations surface real HTTP status codes.
|
|
33
|
+
*/
|
|
34
|
+
export declare function driveStreamBuffered(handler: AnyStreamHandler, ctx: AnyCtx): Promise<BufferedStreamResult>;
|
|
35
|
+
/**
|
|
36
|
+
* NDJSON representation (spec/streaming.md section 2.2): one frame per line,
|
|
37
|
+
* flushed per frame, in-band terminal frame.
|
|
38
|
+
*/
|
|
39
|
+
export declare function ndjsonStreamResponse(handler: AnyStreamHandler, ctx: AnyCtx): Response;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/runtime/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAEnF;;;;;;GAMG;AAGH,KAAK,gBAAgB,GAAG,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEjE,KAAK,MAAM,GAAG,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAEtD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,uEAAuE;AACvE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5C,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAClD,qEAAqE;IACrE,OAAO,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACvD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC5C;AAWD;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,oBAAoB,CAAC,CAmB/B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,gBAAgB,EACzB,GAAG,EAAE,MAAM,GACV,QAAQ,CA2BV"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
function toErrorFrame(error) {
|
|
2
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
3
|
+
return {
|
|
4
|
+
kind: "error",
|
|
5
|
+
error: err.name === "ValidationError" ? "item_validation_failed" : "stream_failed",
|
|
6
|
+
message: err.message || "stream failed"
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Drive the generator, validating each frame payload, and report frames to
|
|
11
|
+
* the sink in legal order: items -> summary? -> exactly one terminal.
|
|
12
|
+
*/
|
|
13
|
+
export async function driveStream(handler, ctx, sink) {
|
|
14
|
+
const gen = handler.run(ctx);
|
|
15
|
+
let count = 0;
|
|
16
|
+
try {
|
|
17
|
+
let result = await gen.next();
|
|
18
|
+
while (!result.done) {
|
|
19
|
+
const item = handler.itemSchema.parse(result.value);
|
|
20
|
+
count++;
|
|
21
|
+
await sink.onItem(item);
|
|
22
|
+
result = await gen.next();
|
|
23
|
+
}
|
|
24
|
+
if (result.value !== undefined && handler.summarySchema) {
|
|
25
|
+
const summary = handler.summarySchema.parse(result.value);
|
|
26
|
+
await sink.onSummary(summary);
|
|
27
|
+
}
|
|
28
|
+
await sink.onEnd(count);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
try {
|
|
32
|
+
await gen.return?.(undefined);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// generator cleanup failure is not reportable past this point
|
|
36
|
+
}
|
|
37
|
+
await sink.onError(toErrorFrame(error));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Run the stream to completion and assemble the derived buffered shape
|
|
42
|
+
* `{ items, summary? }` (spec/streaming.md section 2.1). Throws on any failure so
|
|
43
|
+
* buffered representations surface real HTTP status codes.
|
|
44
|
+
*/
|
|
45
|
+
export async function driveStreamBuffered(handler, ctx) {
|
|
46
|
+
const items = [];
|
|
47
|
+
let summary;
|
|
48
|
+
let failure;
|
|
49
|
+
await driveStream(handler, ctx, {
|
|
50
|
+
onItem: (item) => { items.push(item); },
|
|
51
|
+
onSummary: (s) => { summary = s; },
|
|
52
|
+
onError: (frame) => { failure = frame; },
|
|
53
|
+
onEnd: () => { }
|
|
54
|
+
});
|
|
55
|
+
if (failure) {
|
|
56
|
+
const err = new Error(failure.message);
|
|
57
|
+
err.name = failure.error;
|
|
58
|
+
throw err;
|
|
59
|
+
}
|
|
60
|
+
return summary !== undefined ? { items, summary } : { items };
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* NDJSON representation (spec/streaming.md section 2.2): one frame per line,
|
|
64
|
+
* flushed per frame, in-band terminal frame.
|
|
65
|
+
*/
|
|
66
|
+
export function ndjsonStreamResponse(handler, ctx) {
|
|
67
|
+
const encoder = new TextEncoder();
|
|
68
|
+
const body = new ReadableStream({
|
|
69
|
+
async start(controller) {
|
|
70
|
+
const push = (frame) => {
|
|
71
|
+
controller.enqueue(encoder.encode(`${JSON.stringify(frame)}\n`));
|
|
72
|
+
};
|
|
73
|
+
await driveStream(handler, ctx, {
|
|
74
|
+
onItem: (item) => push({ kind: "item", data: item }),
|
|
75
|
+
onSummary: (summary) => push({ kind: "summary", data: summary }),
|
|
76
|
+
onError: (frame) => push(frame),
|
|
77
|
+
onEnd: (count) => push({ kind: "end", count })
|
|
78
|
+
});
|
|
79
|
+
controller.close();
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
return new Response(body, {
|
|
83
|
+
status: 200,
|
|
84
|
+
headers: {
|
|
85
|
+
"content-type": "application/x-ndjson; charset=utf-8",
|
|
86
|
+
"cache-control": "no-cache",
|
|
87
|
+
// disable proxy buffering so frames actually flush incrementally
|
|
88
|
+
"x-accel-buffering": "no"
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/runtime/stream.ts"],"names":[],"mappings":"AA8BA,SAAS,YAAY,CAAC,KAAc;IAClC,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,OAAO;QACL,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,GAAG,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,eAAe;QAClF,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,eAAe;KACxC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAyB,EACzB,GAAW,EACX,IAAsB;IAEtB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,CAAC;QACH,IAAI,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACpD,KAAK,EAAE,CAAC;YACR,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACxB,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YACxD,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1D,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QACD,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,8DAA8D;QAChE,CAAC;QACD,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAyB,EACzB,GAAW;IAEX,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,IAAI,OAAgB,CAAC;IACrB,IAAI,OAAqC,CAAC;IAE1C,MAAM,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE;QAC9B,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;QAClC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC;QACxC,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;KAChB,CAAC,CAAC;IAEH,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvC,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC;QACzB,MAAM,GAAG,CAAC;IACZ,CAAC;IAED,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAyB,EACzB,GAAW;IAEX,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAElC,MAAM,IAAI,GAAG,IAAI,cAAc,CAAa;QAC1C,KAAK,CAAC,KAAK,CAAC,UAAU;YACpB,MAAM,IAAI,GAAG,CAAC,KAA8B,EAAE,EAAE;gBAC9C,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACnE,CAAC,CAAC;YACF,MAAM,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE;gBAC9B,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBACpD,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBAChE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAA2C,CAAC;gBACrE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;aAC/C,CAAC,CAAC;YACH,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;KACF,CAAC,CAAC;IAEH,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACxB,MAAM,EAAE,GAAG;QACX,OAAO,EAAE;YACP,cAAc,EAAE,qCAAqC;YACrD,eAAe,EAAE,UAAU;YAC3B,iEAAiE;YACjE,mBAAmB,EAAE,IAAI;SAC1B;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { BaseSchema, Infer } from "anyvali";
|
|
2
|
+
import type { RouteHandlerContext } from "../contracts/route.js";
|
|
3
|
+
import { type BpStreamHandler } from "../contracts/streaming.js";
|
|
4
|
+
/**
|
|
5
|
+
* Schema configuration for a streaming route handler.
|
|
6
|
+
* `item` is required (the canonical per-frame payload); `summary` is the
|
|
7
|
+
* optional end-of-stream aggregate. Cross-item invariants belong in `summary`,
|
|
8
|
+
* not `item` - see spec/streaming.md section 3.
|
|
9
|
+
*/
|
|
10
|
+
export interface StreamHandlerSchemas<TItem extends BaseSchema<unknown, unknown>, TSummary extends BaseSchema<unknown, unknown> | undefined = undefined, TQuery extends BaseSchema<unknown, unknown> | undefined = undefined, THeaders extends BaseSchema<unknown, unknown> | undefined = undefined> {
|
|
11
|
+
readonly item: TItem;
|
|
12
|
+
readonly summary?: TSummary;
|
|
13
|
+
readonly query?: TQuery;
|
|
14
|
+
readonly headers?: THeaders;
|
|
15
|
+
}
|
|
16
|
+
type SchemaOutput<T extends BaseSchema<unknown, unknown> | undefined, TDefault> = T extends BaseSchema<unknown, unknown> ? Infer<T> : TDefault;
|
|
17
|
+
/** Generator return type: summary value when a summary schema is declared, else void. */
|
|
18
|
+
type SummaryReturn<TSummary extends BaseSchema<unknown, unknown> | undefined> = TSummary extends BaseSchema<unknown, unknown> ? Infer<TSummary> : void;
|
|
19
|
+
/**
|
|
20
|
+
* Create a streaming route handler. Mirrors `createHandler` but the handler is
|
|
21
|
+
* an async generator yielding items; the generator's `return` value is the
|
|
22
|
+
* summary frame (when a `summary` schema is declared).
|
|
23
|
+
*
|
|
24
|
+
* The adapter - not this factory - drives the stream: it validates every
|
|
25
|
+
* yielded item against `schemas.item` before emission and negotiates the
|
|
26
|
+
* representation (buffered JSON / NDJSON frames / themed HTML over SSE).
|
|
27
|
+
*
|
|
28
|
+
* The buffered JSON response schema (`{ items, summary? }`) is derived here so
|
|
29
|
+
* codegen and the manifest never need a hand-written ResponseSchema for
|
|
30
|
+
* streaming views.
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* export const handleGet = createStreamHandler(
|
|
35
|
+
* { item: ItemSchema, summary: SummarySchema, query: QuerySchema },
|
|
36
|
+
* async function* (ctx) {
|
|
37
|
+
* for (const row of await loadRows(ctx.query.q)) yield row;
|
|
38
|
+
* return { total: 12 };
|
|
39
|
+
* }
|
|
40
|
+
* );
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare function createStreamHandler<TItem extends BaseSchema<unknown, unknown>, TSummary extends BaseSchema<unknown, unknown> | undefined = undefined, TQuery extends BaseSchema<unknown, unknown> | undefined = undefined, THeaders extends BaseSchema<unknown, unknown> | undefined = undefined, TParams = Record<string, string>, TPlugin = unknown, TServiceConfig = Record<string, unknown>>(schemas: StreamHandlerSchemas<TItem, TSummary, TQuery, THeaders>, handler: (ctx: RouteHandlerContext<TParams, SchemaOutput<TQuery, Record<string, unknown>>, SchemaOutput<THeaders, Record<string, string>>, Record<string, unknown>, TPlugin, TServiceConfig>) => AsyncGenerator<Infer<TItem>, SummaryReturn<TSummary>, void>): BpStreamHandler<Infer<TItem>, SummaryReturn<TSummary>, TParams, SchemaOutput<TQuery, Record<string, unknown>>, SchemaOutput<THeaders, Record<string, string>>>;
|
|
44
|
+
export declare namespace createStreamHandler {
|
|
45
|
+
function forContext<TPlugin = unknown, TServiceConfig = Record<string, unknown>>(): <TItem extends BaseSchema<unknown, unknown>, TSummary extends BaseSchema<unknown, unknown> | undefined = undefined, TQuery extends BaseSchema<unknown, unknown> | undefined = undefined, THeaders extends BaseSchema<unknown, unknown> | undefined = undefined, TParams = Record<string, string>>(schemas: StreamHandlerSchemas<TItem, TSummary, TQuery, THeaders>, handler: (ctx: RouteHandlerContext<TParams, SchemaOutput<TQuery, Record<string, unknown>>, SchemaOutput<THeaders, Record<string, string>>, Record<string, unknown>, TPlugin, TServiceConfig>) => AsyncGenerator<Infer<TItem>, SummaryReturn<TSummary>, void>) => BpStreamHandler<Infer<TItem>, SummaryReturn<TSummary>, TParams, SchemaOutput<TQuery, Record<string, unknown>>, SchemaOutput<THeaders, Record<string, string>>>;
|
|
46
|
+
}
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=streamHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamHandler.d.ts","sourceRoot":"","sources":["../../src/runtime/streamHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import * as av from "anyvali";
|
|
2
|
+
import { BP_STREAM_HANDLER } from "../contracts/streaming.js";
|
|
3
|
+
// -- Factory ----------------------------------------------------------
|
|
4
|
+
/**
|
|
5
|
+
* Create a streaming route handler. Mirrors `createHandler` but the handler is
|
|
6
|
+
* an async generator yielding items; the generator's `return` value is the
|
|
7
|
+
* summary frame (when a `summary` schema is declared).
|
|
8
|
+
*
|
|
9
|
+
* The adapter - not this factory - drives the stream: it validates every
|
|
10
|
+
* yielded item against `schemas.item` before emission and negotiates the
|
|
11
|
+
* representation (buffered JSON / NDJSON frames / themed HTML over SSE).
|
|
12
|
+
*
|
|
13
|
+
* The buffered JSON response schema (`{ items, summary? }`) is derived here so
|
|
14
|
+
* codegen and the manifest never need a hand-written ResponseSchema for
|
|
15
|
+
* streaming views.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* export const handleGet = createStreamHandler(
|
|
20
|
+
* { item: ItemSchema, summary: SummarySchema, query: QuerySchema },
|
|
21
|
+
* async function* (ctx) {
|
|
22
|
+
* for (const row of await loadRows(ctx.query.q)) yield row;
|
|
23
|
+
* return { total: 12 };
|
|
24
|
+
* }
|
|
25
|
+
* );
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export function createStreamHandler(schemas, handler) {
|
|
29
|
+
const responseShape = {
|
|
30
|
+
items: av.array(schemas.item).default([])
|
|
31
|
+
};
|
|
32
|
+
if (schemas.summary) {
|
|
33
|
+
responseShape.summary = av.optional(schemas.summary);
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
[BP_STREAM_HANDLER]: true,
|
|
37
|
+
itemSchema: schemas.item,
|
|
38
|
+
...(schemas.summary ? { summarySchema: schemas.summary } : {}),
|
|
39
|
+
responseSchema: av.object(responseShape, { unknownKeys: "strip" }),
|
|
40
|
+
run: handler
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
(function (createStreamHandler) {
|
|
44
|
+
function forContext() {
|
|
45
|
+
return createStreamHandler;
|
|
46
|
+
}
|
|
47
|
+
createStreamHandler.forContext = forContext;
|
|
48
|
+
})(createStreamHandler || (createStreamHandler = {}));
|
|
49
|
+
//# sourceMappingURL=streamHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamHandler.js","sourceRoot":"","sources":["../../src/runtime/streamHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAG9B,OAAO,EAAE,iBAAiB,EAAwB,MAAM,2BAA2B,CAAC;AA+BpF,wEAAwE;AAExE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,mBAAmB,CASjC,OAAgE,EAChE,OASgE;IAQhE,MAAM,aAAa,GAAiD;QAClE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;KAC1C,CAAC;IACF,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,aAAa,CAAC,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,OAAO;QACL,CAAC,iBAAiB,CAAC,EAAE,IAAI;QACzB,UAAU,EAAE,OAAO,CAAC,IAAI;QACxB,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,cAAc,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;QAClE,GAAG,EAAE,OAMG;KACT,CAAC;AACJ,CAAC;AAED,WAAiB,mBAAmB;IAClC,SAAgB,UAAU;QACxB,OAAO,mBAwBN,CAAC;IACJ,CAAC;IA1Be,8BAAU,aA0BzB,CAAA;AACH,CAAC,EA5BgB,mBAAmB,KAAnB,mBAAmB,QA4BnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenantResolution.d.ts","sourceRoot":"","sources":["../../src/runtime/tenantResolution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,KAAK,SAAS,EAAiD,MAAM,WAAW,CAAC;AAE1F,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI,CAmB1F"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { resolveEmbeddedHostname, resolveThemeHostname } from "./http.js";
|
|
2
|
+
export function resolveAppFromHeaders(headers, apps) {
|
|
3
|
+
const refererHostname = resolveEmbeddedHostname(headers);
|
|
4
|
+
const originHostname = resolveThemeHostname(headers);
|
|
5
|
+
if (refererHostname) {
|
|
6
|
+
const refererMatch = apps.find((app) => app.hostname === refererHostname);
|
|
7
|
+
if (refererMatch) {
|
|
8
|
+
return refererMatch;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
if (originHostname) {
|
|
12
|
+
const originMatch = apps.find((app) => app.hostname === originHostname);
|
|
13
|
+
if (originMatch) {
|
|
14
|
+
return originMatch;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=tenantResolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenantResolution.js","sourceRoot":"","sources":["../../src/runtime/tenantResolution.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,uBAAuB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAE1F,MAAM,UAAU,qBAAqB,CAAC,OAAkB,EAAE,IAAoB;IAC5E,MAAM,eAAe,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,cAAc,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAErD,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,eAAe,CAAC,CAAC;QAC1E,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,YAAY,CAAC;QACtB,CAAC;IACH,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,KAAK,cAAc,CAAC,CAAC;QACxE,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,WAAW,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid.d.ts","sourceRoot":"","sources":["../../src/runtime/uuid.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,MAAM,IAAI,MAAM,CA0B/B"}
|