@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.
Files changed (194) hide show
  1. package/README.md +13 -0
  2. package/lib/adapters/h3.d.ts +51 -0
  3. package/lib/adapters/h3.d.ts.map +1 -0
  4. package/lib/adapters/h3.js +1120 -0
  5. package/lib/adapters/h3.js.map +1 -0
  6. package/lib/codegen/cli.d.ts +3 -0
  7. package/lib/codegen/cli.d.ts.map +1 -0
  8. package/lib/codegen/cli.js +82 -0
  9. package/lib/codegen/cli.js.map +1 -0
  10. package/lib/codegen/emitter.d.ts +7 -0
  11. package/lib/codegen/emitter.d.ts.map +1 -0
  12. package/lib/codegen/emitter.js +453 -0
  13. package/lib/codegen/emitter.js.map +1 -0
  14. package/lib/codegen/init.d.ts +3 -0
  15. package/lib/codegen/init.d.ts.map +1 -0
  16. package/lib/codegen/init.js +90 -0
  17. package/lib/codegen/init.js.map +1 -0
  18. package/lib/codegen/scanner.d.ts +56 -0
  19. package/lib/codegen/scanner.d.ts.map +1 -0
  20. package/lib/codegen/scanner.js +484 -0
  21. package/lib/codegen/scanner.js.map +1 -0
  22. package/lib/codegen/validate.d.ts +14 -0
  23. package/lib/codegen/validate.d.ts.map +1 -0
  24. package/lib/codegen/validate.js +166 -0
  25. package/lib/codegen/validate.js.map +1 -0
  26. package/lib/contracts/auth.d.ts +160 -0
  27. package/lib/contracts/auth.d.ts.map +1 -0
  28. package/lib/contracts/auth.js +123 -0
  29. package/lib/contracts/auth.js.map +1 -0
  30. package/lib/contracts/binding.d.ts +169 -0
  31. package/lib/contracts/binding.d.ts.map +1 -0
  32. package/lib/contracts/binding.js +69 -0
  33. package/lib/contracts/binding.js.map +1 -0
  34. package/lib/contracts/common.d.ts +23 -0
  35. package/lib/contracts/common.d.ts.map +1 -0
  36. package/lib/contracts/common.js +18 -0
  37. package/lib/contracts/common.js.map +1 -0
  38. package/lib/contracts/config.d.ts +93 -0
  39. package/lib/contracts/config.d.ts.map +1 -0
  40. package/lib/contracts/config.js +62 -0
  41. package/lib/contracts/config.js.map +1 -0
  42. package/lib/contracts/controlPlane.d.ts +63 -0
  43. package/lib/contracts/controlPlane.d.ts.map +1 -0
  44. package/lib/contracts/controlPlane.js +2 -0
  45. package/lib/contracts/controlPlane.js.map +1 -0
  46. package/lib/contracts/json.d.ts +9 -0
  47. package/lib/contracts/json.d.ts.map +1 -0
  48. package/lib/contracts/json.js +6 -0
  49. package/lib/contracts/json.js.map +1 -0
  50. package/lib/contracts/manifest.d.ts +158 -0
  51. package/lib/contracts/manifest.d.ts.map +1 -0
  52. package/lib/contracts/manifest.js +40 -0
  53. package/lib/contracts/manifest.js.map +1 -0
  54. package/lib/contracts/observability.d.ts +77 -0
  55. package/lib/contracts/observability.d.ts.map +1 -0
  56. package/lib/contracts/observability.js +99 -0
  57. package/lib/contracts/observability.js.map +1 -0
  58. package/lib/contracts/platformConfig.d.ts +635 -0
  59. package/lib/contracts/platformConfig.d.ts.map +1 -0
  60. package/lib/contracts/platformConfig.js +256 -0
  61. package/lib/contracts/platformConfig.js.map +1 -0
  62. package/lib/contracts/registry.d.ts +104 -0
  63. package/lib/contracts/registry.d.ts.map +1 -0
  64. package/lib/contracts/registry.js +2 -0
  65. package/lib/contracts/registry.js.map +1 -0
  66. package/lib/contracts/route.d.ts +199 -0
  67. package/lib/contracts/route.d.ts.map +1 -0
  68. package/lib/contracts/route.js +26 -0
  69. package/lib/contracts/route.js.map +1 -0
  70. package/lib/contracts/serviceConfig.d.ts +88 -0
  71. package/lib/contracts/serviceConfig.d.ts.map +1 -0
  72. package/lib/contracts/serviceConfig.js +45 -0
  73. package/lib/contracts/serviceConfig.js.map +1 -0
  74. package/lib/contracts/streaming.d.ts +76 -0
  75. package/lib/contracts/streaming.d.ts.map +1 -0
  76. package/lib/contracts/streaming.js +31 -0
  77. package/lib/contracts/streaming.js.map +1 -0
  78. package/lib/contracts/view.d.ts +149 -0
  79. package/lib/contracts/view.d.ts.map +1 -0
  80. package/lib/contracts/view.js +82 -0
  81. package/lib/contracts/view.js.map +1 -0
  82. package/lib/controlPlane/store.d.ts +24 -0
  83. package/lib/controlPlane/store.d.ts.map +1 -0
  84. package/lib/controlPlane/store.js +70 -0
  85. package/lib/controlPlane/store.js.map +1 -0
  86. package/lib/controlPlane/sync.d.ts +8 -0
  87. package/lib/controlPlane/sync.d.ts.map +1 -0
  88. package/lib/controlPlane/sync.js +24 -0
  89. package/lib/controlPlane/sync.js.map +1 -0
  90. package/lib/controlPlane/types.d.ts +15 -0
  91. package/lib/controlPlane/types.d.ts.map +1 -0
  92. package/lib/controlPlane/types.js +2 -0
  93. package/lib/controlPlane/types.js.map +1 -0
  94. package/lib/index.d.ts +40 -0
  95. package/lib/index.d.ts.map +1 -0
  96. package/lib/index.js +40 -0
  97. package/lib/index.js.map +1 -0
  98. package/lib/runtime/auth/envelope.d.ts +32 -0
  99. package/lib/runtime/auth/envelope.d.ts.map +1 -0
  100. package/lib/runtime/auth/envelope.js +123 -0
  101. package/lib/runtime/auth/envelope.js.map +1 -0
  102. package/lib/runtime/auth/issuer.d.ts +44 -0
  103. package/lib/runtime/auth/issuer.d.ts.map +1 -0
  104. package/lib/runtime/auth/issuer.js +82 -0
  105. package/lib/runtime/auth/issuer.js.map +1 -0
  106. package/lib/runtime/auth/jwks.d.ts +7 -0
  107. package/lib/runtime/auth/jwks.d.ts.map +1 -0
  108. package/lib/runtime/auth/jwks.js +69 -0
  109. package/lib/runtime/auth/jwks.js.map +1 -0
  110. package/lib/runtime/auth/keypair.d.ts +21 -0
  111. package/lib/runtime/auth/keypair.d.ts.map +1 -0
  112. package/lib/runtime/auth/keypair.js +50 -0
  113. package/lib/runtime/auth/keypair.js.map +1 -0
  114. package/lib/runtime/auth/tokens.d.ts +25 -0
  115. package/lib/runtime/auth/tokens.d.ts.map +1 -0
  116. package/lib/runtime/auth/tokens.js +137 -0
  117. package/lib/runtime/auth/tokens.js.map +1 -0
  118. package/lib/runtime/auth/verifier.d.ts +45 -0
  119. package/lib/runtime/auth/verifier.d.ts.map +1 -0
  120. package/lib/runtime/auth/verifier.js +76 -0
  121. package/lib/runtime/auth/verifier.js.map +1 -0
  122. package/lib/runtime/bpHeaders.d.ts +10 -0
  123. package/lib/runtime/bpHeaders.d.ts.map +1 -0
  124. package/lib/runtime/bpHeaders.js +53 -0
  125. package/lib/runtime/bpHeaders.js.map +1 -0
  126. package/lib/runtime/configProvider.d.ts +41 -0
  127. package/lib/runtime/configProvider.d.ts.map +1 -0
  128. package/lib/runtime/configProvider.js +232 -0
  129. package/lib/runtime/configProvider.js.map +1 -0
  130. package/lib/runtime/configStore.d.ts +34 -0
  131. package/lib/runtime/configStore.d.ts.map +1 -0
  132. package/lib/runtime/configStore.js +197 -0
  133. package/lib/runtime/configStore.js.map +1 -0
  134. package/lib/runtime/configTicket.d.ts +49 -0
  135. package/lib/runtime/configTicket.d.ts.map +1 -0
  136. package/lib/runtime/configTicket.js +168 -0
  137. package/lib/runtime/configTicket.js.map +1 -0
  138. package/lib/runtime/h3.d.ts +28 -0
  139. package/lib/runtime/h3.d.ts.map +1 -0
  140. package/lib/runtime/h3.js +199 -0
  141. package/lib/runtime/h3.js.map +1 -0
  142. package/lib/runtime/handler.d.ts +55 -0
  143. package/lib/runtime/handler.d.ts.map +1 -0
  144. package/lib/runtime/handler.js +51 -0
  145. package/lib/runtime/handler.js.map +1 -0
  146. package/lib/runtime/http.d.ts +13 -0
  147. package/lib/runtime/http.d.ts.map +1 -0
  148. package/lib/runtime/http.js +114 -0
  149. package/lib/runtime/http.js.map +1 -0
  150. package/lib/runtime/jsonSchema.d.ts +4 -0
  151. package/lib/runtime/jsonSchema.d.ts.map +1 -0
  152. package/lib/runtime/jsonSchema.js +28 -0
  153. package/lib/runtime/jsonSchema.js.map +1 -0
  154. package/lib/runtime/manifest.d.ts +3 -0
  155. package/lib/runtime/manifest.d.ts.map +1 -0
  156. package/lib/runtime/manifest.js +5 -0
  157. package/lib/runtime/manifest.js.map +1 -0
  158. package/lib/runtime/media.d.ts +20 -0
  159. package/lib/runtime/media.d.ts.map +1 -0
  160. package/lib/runtime/media.js +70 -0
  161. package/lib/runtime/media.js.map +1 -0
  162. package/lib/runtime/registry.d.ts +67 -0
  163. package/lib/runtime/registry.d.ts.map +1 -0
  164. package/lib/runtime/registry.js +290 -0
  165. package/lib/runtime/registry.js.map +1 -0
  166. package/lib/runtime/serviceConfig.d.ts +38 -0
  167. package/lib/runtime/serviceConfig.d.ts.map +1 -0
  168. package/lib/runtime/serviceConfig.js +152 -0
  169. package/lib/runtime/serviceConfig.js.map +1 -0
  170. package/lib/runtime/statusViews.d.ts +23 -0
  171. package/lib/runtime/statusViews.d.ts.map +1 -0
  172. package/lib/runtime/statusViews.js +48 -0
  173. package/lib/runtime/statusViews.js.map +1 -0
  174. package/lib/runtime/stream.d.ts +41 -0
  175. package/lib/runtime/stream.d.ts.map +1 -0
  176. package/lib/runtime/stream.js +92 -0
  177. package/lib/runtime/stream.js.map +1 -0
  178. package/lib/runtime/streamHandler.d.ts +48 -0
  179. package/lib/runtime/streamHandler.d.ts.map +1 -0
  180. package/lib/runtime/streamHandler.js +49 -0
  181. package/lib/runtime/streamHandler.js.map +1 -0
  182. package/lib/runtime/tenantResolution.d.ts +4 -0
  183. package/lib/runtime/tenantResolution.d.ts.map +1 -0
  184. package/lib/runtime/tenantResolution.js +19 -0
  185. package/lib/runtime/tenantResolution.js.map +1 -0
  186. package/lib/runtime/uuid.d.ts +6 -0
  187. package/lib/runtime/uuid.d.ts.map +1 -0
  188. package/lib/runtime/uuid.js +27 -0
  189. package/lib/runtime/uuid.js.map +1 -0
  190. package/lib/runtime/view.d.ts +48 -0
  191. package/lib/runtime/view.d.ts.map +1 -0
  192. package/lib/runtime/view.js +111 -0
  193. package/lib/runtime/view.js.map +1 -0
  194. 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":"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"}
@@ -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,4 @@
1
+ import { App } from "../contracts/binding.js";
2
+ import { type HeaderMap } from "./http.js";
3
+ export declare function resolveAppFromHeaders(headers: HeaderMap, apps: readonly App[]): App | null;
4
+ //# sourceMappingURL=tenantResolution.d.ts.map
@@ -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,6 @@
1
+ /**
2
+ * Generate a UUIDv7 (RFC 9562) - timestamp-sortable, globally unique.
3
+ * Layout: 48-bit unix_ts_ms | 4-bit version(7) | 12-bit rand_a | 2-bit variant(10) | 62-bit rand_b
4
+ */
5
+ export declare function uuidv7(): string;
6
+ //# sourceMappingURL=uuid.d.ts.map
@@ -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"}