@astrale-os/adapter-cloudflare 0.4.10 → 0.5.0-beta.11

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 (134) hide show
  1. package/README.md +11 -0
  2. package/dist/build/codegen/identity.d.ts.map +1 -0
  3. package/dist/build/codegen/identity.js.map +1 -0
  4. package/dist/build/codegen/merge.d.ts.map +1 -0
  5. package/dist/build/codegen/merge.js.map +1 -0
  6. package/dist/build/codegen/worker.d.ts +12 -0
  7. package/dist/build/codegen/worker.d.ts.map +1 -0
  8. package/dist/build/codegen/worker.js +40 -0
  9. package/dist/build/codegen/worker.js.map +1 -0
  10. package/dist/{codegen → build/codegen}/wrangler.d.ts +6 -3
  11. package/dist/build/codegen/wrangler.d.ts.map +1 -0
  12. package/dist/{codegen → build/codegen}/wrangler.js +29 -10
  13. package/dist/build/codegen/wrangler.js.map +1 -0
  14. package/dist/build/frontend.d.ts +26 -0
  15. package/dist/build/frontend.d.ts.map +1 -0
  16. package/dist/build/frontend.js +263 -0
  17. package/dist/build/frontend.js.map +1 -0
  18. package/dist/{build.js → build/index.d.ts} +5 -4
  19. package/dist/build/index.d.ts.map +1 -0
  20. package/dist/{build.d.ts → build/index.js} +5 -5
  21. package/dist/build/index.js.map +1 -0
  22. package/dist/{parse-output.d.ts → build/parse-output.d.ts} +2 -0
  23. package/dist/build/parse-output.d.ts.map +1 -0
  24. package/dist/{parse-output.js → build/parse-output.js} +5 -0
  25. package/dist/build/parse-output.js.map +1 -0
  26. package/dist/build/prepare.d.ts +18 -0
  27. package/dist/build/prepare.d.ts.map +1 -0
  28. package/dist/build/prepare.js +117 -0
  29. package/dist/build/prepare.js.map +1 -0
  30. package/dist/build/worker.d.ts +15 -0
  31. package/dist/build/worker.d.ts.map +1 -0
  32. package/dist/build/worker.js +21 -0
  33. package/dist/build/worker.js.map +1 -0
  34. package/dist/{wrangler-cli.d.ts → build/wrangler-cli.d.ts} +10 -0
  35. package/dist/build/wrangler-cli.d.ts.map +1 -0
  36. package/dist/{wrangler-cli.js → build/wrangler-cli.js} +38 -6
  37. package/dist/build/wrangler-cli.js.map +1 -0
  38. package/dist/cloudflare.d.ts +21 -24
  39. package/dist/cloudflare.d.ts.map +1 -1
  40. package/dist/cloudflare.js +125 -191
  41. package/dist/cloudflare.js.map +1 -1
  42. package/dist/index.d.ts +4 -4
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +3 -3
  45. package/dist/index.js.map +1 -1
  46. package/dist/params.d.ts +13 -16
  47. package/dist/params.d.ts.map +1 -1
  48. package/dist/worker/fetch.d.ts +12 -0
  49. package/dist/worker/fetch.d.ts.map +1 -0
  50. package/dist/worker/fetch.js +32 -0
  51. package/dist/worker/fetch.js.map +1 -0
  52. package/dist/worker/index.d.ts +61 -0
  53. package/dist/worker/index.d.ts.map +1 -0
  54. package/dist/worker/index.js +212 -0
  55. package/dist/worker/index.js.map +1 -0
  56. package/package.json +13 -5
  57. package/src/build/codegen/worker.ts +53 -0
  58. package/src/{codegen → build/codegen}/wrangler.ts +34 -12
  59. package/src/build/frontend.ts +324 -0
  60. package/src/{build.ts → build/index.ts} +17 -4
  61. package/src/{parse-output.ts → build/parse-output.ts} +6 -0
  62. package/src/build/prepare.ts +161 -0
  63. package/src/build/worker.ts +37 -0
  64. package/src/{wrangler-cli.ts → build/wrangler-cli.ts} +56 -8
  65. package/src/cloudflare.ts +153 -223
  66. package/src/index.ts +4 -4
  67. package/src/params.ts +13 -17
  68. package/src/worker/fetch.ts +46 -0
  69. package/src/worker/index.ts +325 -0
  70. package/src/worker/tsconfig.json +10 -0
  71. package/template/astrale.config.ts +7 -7
  72. package/dist/assets-pack.d.ts +0 -8
  73. package/dist/assets-pack.d.ts.map +0 -1
  74. package/dist/assets-pack.js +0 -30
  75. package/dist/assets-pack.js.map +0 -1
  76. package/dist/build.d.ts.map +0 -1
  77. package/dist/build.js.map +0 -1
  78. package/dist/client.d.ts +0 -17
  79. package/dist/client.d.ts.map +0 -1
  80. package/dist/client.js +0 -59
  81. package/dist/client.js.map +0 -1
  82. package/dist/codegen/identity.d.ts.map +0 -1
  83. package/dist/codegen/identity.js.map +0 -1
  84. package/dist/codegen/merge.d.ts.map +0 -1
  85. package/dist/codegen/merge.js.map +0 -1
  86. package/dist/codegen/worker.d.ts +0 -51
  87. package/dist/codegen/worker.d.ts.map +0 -1
  88. package/dist/codegen/worker.js +0 -120
  89. package/dist/codegen/worker.js.map +0 -1
  90. package/dist/codegen/wrangler.d.ts.map +0 -1
  91. package/dist/codegen/wrangler.js.map +0 -1
  92. package/dist/parse-output.d.ts.map +0 -1
  93. package/dist/parse-output.js.map +0 -1
  94. package/dist/wrangler-cli.d.ts.map +0 -1
  95. package/dist/wrangler-cli.js.map +0 -1
  96. package/src/assets-pack.ts +0 -32
  97. package/src/client.ts +0 -89
  98. package/src/codegen/worker.ts +0 -136
  99. package/template/.env.example +0 -9
  100. package/template/.gitignore.template +0 -16
  101. package/template/CLAUDE.md +0 -13
  102. package/template/README.md +0 -47
  103. package/template/client/.gitignore.template +0 -4
  104. package/template/client/__tests__/app.test.tsx +0 -15
  105. package/template/client/components.json +0 -25
  106. package/template/client/index.html +0 -12
  107. package/template/client/package.json +0 -35
  108. package/template/client/src/app.tsx +0 -52
  109. package/template/client/src/components/ui/cn.ts +0 -6
  110. package/template/client/src/main.tsx +0 -9
  111. package/template/client/src/styles.css +0 -78
  112. package/template/client/tsconfig.json +0 -26
  113. package/template/client/vite.config.ts +0 -22
  114. package/template/client/vitest.config.ts +0 -13
  115. package/template/core/README.md +0 -7
  116. package/template/deps.ts +0 -9
  117. package/template/domain.ts +0 -11
  118. package/template/env.ts +0 -8
  119. package/template/icons.ts +0 -4
  120. package/template/integrations/README.md +0 -7
  121. package/template/oxlint.config.ts +0 -1
  122. package/template/package.json +0 -58
  123. package/template/pnpm-workspace.yaml +0 -31
  124. package/template/runtime/index.ts +0 -8
  125. package/template/schema/index.ts +0 -10
  126. package/template/simulation/README.md +0 -12
  127. package/template/tsconfig.json +0 -28
  128. package/template/vitest.config.ts +0 -7
  129. /package/dist/{codegen → build/codegen}/identity.d.ts +0 -0
  130. /package/dist/{codegen → build/codegen}/identity.js +0 -0
  131. /package/dist/{codegen → build/codegen}/merge.d.ts +0 -0
  132. /package/dist/{codegen → build/codegen}/merge.js +0 -0
  133. /package/src/{codegen → build/codegen}/identity.ts +0 -0
  134. /package/src/{codegen → build/codegen}/merge.ts +0 -0
@@ -0,0 +1,61 @@
1
+ import type { schema } from '@astrale-os/kernel-dsl/v1';
2
+ import type { DomainDefinition } from '@astrale-os/sdk';
3
+ import type { Application, RemoteDeploymentInput, RemoteIdentityInput } from '@astrale-os/sdk/server';
4
+ import type { ExecutionContext } from 'hono';
5
+ /** SDK-owned Publication manifest passed through without adapter interpretation. */
6
+ export type CloudflareManifest = NonNullable<RemoteDeploymentInput['manifest']>;
7
+ export interface Fetcher {
8
+ fetch(request: Request): Response | Promise<Response>;
9
+ }
10
+ /** Adapter-owned bindings generated into every Cloudflare deployment. */
11
+ export interface CloudflareAdapterBindings {
12
+ /** Native Cloudflare deployment metadata (direct Wrangler deployments). */
13
+ readonly ASTRALE_VERSION_METADATA?: {
14
+ readonly id: string;
15
+ readonly tag: string;
16
+ readonly timestamp: string;
17
+ };
18
+ /** Content-derived generation supplied by providers without version metadata. */
19
+ readonly ASTRALE_DEPLOYMENT_VERSION?: string;
20
+ readonly WORKER_URL?: string;
21
+ readonly ASSETS?: Fetcher;
22
+ readonly SELF?: Fetcher;
23
+ readonly FRONTEND_DEV_URL?: string;
24
+ readonly DISPATCHER?: {
25
+ get(name: string): Fetcher;
26
+ };
27
+ }
28
+ interface CloudflareWorkerSharedConfig<Bindings extends CloudflareAdapterBindings, Environment> {
29
+ readonly privateKey: RemoteIdentityInput['privateKey'] | ((bindings: Bindings) => RemoteIdentityInput['privateKey']);
30
+ /** Compose provider bindings into the exact Domain environment once per deployment generation. */
31
+ readonly resolveEnvironment?: (bindings: Bindings) => Environment | Promise<Environment>;
32
+ readonly manifest?: CloudflareManifest;
33
+ /** Maximum time allowed for one Domain invocation. Defaults to 30 seconds. */
34
+ readonly invocationTimeoutMs?: number;
35
+ readonly resolveUrl?: (bindings: Bindings, requestOrigin: string) => string;
36
+ readonly selfBinding?: (bindings: Bindings) => Fetcher | null | undefined;
37
+ readonly routeSubrequest?: (url: URL, bindings: Bindings) => Fetcher | null | undefined;
38
+ }
39
+ /**
40
+ * Resolve a Domain lazily when its module graph is too expensive for provider startup admission.
41
+ * The adapter resolves at most once concurrently and retries after a rejected resolution.
42
+ */
43
+ export type CloudflareWorkerConfig<S extends schema.DomainSchema, Bindings extends CloudflareAdapterBindings, Environment> = CloudflareWorkerSharedConfig<Bindings, Environment> & ({
44
+ readonly definition: DomainDefinition<S>;
45
+ readonly resolveDefinition?: never;
46
+ } | {
47
+ readonly definition?: never;
48
+ readonly resolveDefinition: (bindings: Bindings) => DomainDefinition<S> | Promise<DomainDefinition<S>>;
49
+ });
50
+ export interface CloudflareWorker<Environment> {
51
+ fetch(request: Request, environment: Environment, executionContext?: ExecutionContext): Response | Promise<Response>;
52
+ }
53
+ /**
54
+ * Compose one Cloudflare module Worker without request-global mutation.
55
+ * Environment bindings are captured once per immutable serving URL/version generation.
56
+ */
57
+ export declare function cloudflareWorkerEntry<Bindings extends CloudflareAdapterBindings, Environment = Bindings>(): <const S extends schema.DomainSchema>(config: CloudflareWorkerConfig<S, Bindings, Environment>) => CloudflareWorker<Bindings>;
58
+ /** Close an evicted Application before its environment bindings leave the cache. */
59
+ export declare function closeEvictedApplication(application: Pick<Application, 'close'>, now?: () => number): Promise<void>;
60
+ export {};
61
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,212 @@
1
+ import { issuer } from '@astrale-os/kernel-core/auth';
2
+ import { createRemoteApplication } from '@astrale-os/sdk/server';
3
+ import { Hono as HonoApplication } from 'hono';
4
+ import { dispatchCloudflareRequest, prepareCloudflareRequest } from './fetch.js';
5
+ const MAXIMUM_CACHED_APPLICATIONS = 4;
6
+ const APPLICATION_CLOSE_TIMEOUT_MS = 5_000;
7
+ /**
8
+ * Compose one Cloudflare module Worker without request-global mutation.
9
+ * Environment bindings are captured once per immutable serving URL/version generation.
10
+ */
11
+ export function cloudflareWorkerEntry() {
12
+ return function (config) {
13
+ const applications = new Map();
14
+ let resolvedDefinition = config.definition;
15
+ let pendingDefinition;
16
+ const definitionFor = async (bindings) => {
17
+ if (resolvedDefinition !== undefined)
18
+ return resolvedDefinition;
19
+ if (pendingDefinition !== undefined)
20
+ return pendingDefinition;
21
+ const resolve = config.resolveDefinition;
22
+ if (resolve === undefined)
23
+ throw new TypeError('Cloudflare Worker Domain definition is unavailable.');
24
+ const current = Promise.resolve().then(() => resolve(bindings));
25
+ pendingDefinition = current;
26
+ try {
27
+ const definition = await current;
28
+ resolvedDefinition = definition;
29
+ return definition;
30
+ }
31
+ finally {
32
+ if (pendingDefinition === current)
33
+ pendingDefinition = undefined;
34
+ }
35
+ };
36
+ const applicationFor = async (url, bindings, definition) => {
37
+ const version = deploymentVersion(bindings);
38
+ const key = `${url}\u0000${version}`;
39
+ const cached = applications.get(key);
40
+ if (cached !== undefined)
41
+ return cached;
42
+ const environment = config.resolveEnvironment === undefined
43
+ ? bindings
44
+ : await config.resolveEnvironment(bindings);
45
+ const routedFetch = async (input, init) => {
46
+ const { request, rejectRedirect } = prepareCloudflareRequest(input, init);
47
+ const destination = new URL(request.url);
48
+ if (destination.origin === new URL(url).origin) {
49
+ const self = config.selfBinding?.(bindings);
50
+ return dispatchCloudflareRequest(request, rejectRedirect, (transportRequest) => self !== null && self !== undefined
51
+ ? self.fetch(transportRequest)
52
+ : serving.app.fetch(transportRequest, environment));
53
+ }
54
+ const route = config.routeSubrequest?.(destination, bindings);
55
+ return dispatchCloudflareRequest(request, rejectRedirect, (transportRequest) => route === null || route === undefined
56
+ ? fetch(transportRequest)
57
+ : route.fetch(transportRequest));
58
+ };
59
+ const deploymentQuery = `deployment=${encodeURIComponent(version)}`;
60
+ const issuerId = issuer.accept(url);
61
+ const host = new HonoApplication();
62
+ host.get('/meta', (context) => context.json({
63
+ origin: definition.schema.origin,
64
+ issuer: issuerId,
65
+ schemaRevision: definition.domain.$.revision,
66
+ deploymentVersion: version,
67
+ }));
68
+ const serving = createRemoteApplication({
69
+ definition,
70
+ environment,
71
+ identity: {
72
+ issuer: issuerId,
73
+ subject: definition.schema.origin,
74
+ privateKey: typeof config.privateKey === 'function'
75
+ ? config.privateKey(bindings)
76
+ : config.privateKey,
77
+ fetch: routedFetch,
78
+ ...(new URL(url).protocol === 'http:' ? { allowInsecureHttp: true } : {}),
79
+ },
80
+ deployment: {
81
+ bundleHref: `${url}/.well-known/astrale/domain.bundle.json?${deploymentQuery}`,
82
+ endpoint: { http: `${url}/invoke` },
83
+ ...(definition.frontend === undefined
84
+ ? {}
85
+ : { frontendBaseHref: url, frontendCacheKey: version }),
86
+ ...(config.manifest === undefined ? {} : { manifest: config.manifest }),
87
+ delivery: {
88
+ href: `${url}/install`,
89
+ method: 'POST',
90
+ authentication: { kind: 'public' },
91
+ },
92
+ },
93
+ app: host,
94
+ server: {
95
+ path: '/invoke',
96
+ health: { probe: { check: () => true } },
97
+ limits: {
98
+ maximumRequestBytes: 1024 * 1024,
99
+ maximumPublicationBytes: 1024 * 1024,
100
+ maximumBundleBytes: 8 * 1024 * 1024,
101
+ maximumDeliveryBytes: 8 * 1024 * 1024,
102
+ invocationTimeoutMs: config.invocationTimeoutMs ?? 30_000,
103
+ },
104
+ },
105
+ });
106
+ const created = Object.freeze({
107
+ origin: new URL(url).origin,
108
+ application: serving,
109
+ environment,
110
+ });
111
+ if (applications.size >= MAXIMUM_CACHED_APPLICATIONS) {
112
+ const oldest = applications.keys().next().value;
113
+ if (oldest !== undefined) {
114
+ const evicted = applications.get(oldest);
115
+ applications.delete(oldest);
116
+ if (evicted !== undefined) {
117
+ try {
118
+ await closeEvictedApplication(evicted.application);
119
+ }
120
+ catch (cause) {
121
+ await serving
122
+ .close({ deadline: Date.now() + APPLICATION_CLOSE_TIMEOUT_MS })
123
+ .catch(() => undefined);
124
+ throw cause;
125
+ }
126
+ }
127
+ }
128
+ }
129
+ applications.set(key, created);
130
+ return created;
131
+ };
132
+ return Object.freeze({
133
+ async fetch(request, bindings, executionContext) {
134
+ const requestUrl = new URL(request.url);
135
+ const definition = await definitionFor(bindings);
136
+ if (definition.frontend !== undefined) {
137
+ const asset = await frontendAsset(definition, bindings, requestUrl, request);
138
+ if (asset !== undefined)
139
+ return asset;
140
+ }
141
+ const publicUrl = canonicalServingUrl(config.resolveUrl?.(bindings, requestOrigin(requestUrl, request)) ??
142
+ bindings.WORKER_URL ??
143
+ requestOrigin(requestUrl, request));
144
+ const serving = await applicationFor(publicUrl, bindings, definition);
145
+ return serving.application.app.fetch(request, serving.environment, executionContext);
146
+ },
147
+ });
148
+ };
149
+ }
150
+ /** Close an evicted Application before its environment bindings leave the cache. */
151
+ export function closeEvictedApplication(application, now = Date.now) {
152
+ return application.close({ deadline: now() + APPLICATION_CLOSE_TIMEOUT_MS });
153
+ }
154
+ async function frontendAsset(definition, environment, url, request) {
155
+ const frontend = definition.frontend;
156
+ if (frontend === undefined || frontend.source.kind === 'external')
157
+ return undefined;
158
+ const routes = frontend.routes;
159
+ const route = Object.values(routes).find((candidate) => candidate.path === url.pathname);
160
+ const staticAsset = url.pathname.startsWith('/assets/');
161
+ if (route === undefined && !staticAsset)
162
+ return undefined;
163
+ if (request.method !== 'GET' && request.method !== 'HEAD')
164
+ return undefined;
165
+ const binding = environment.ASSETS;
166
+ if (binding === undefined)
167
+ return undefined;
168
+ const dev = environment.FRONTEND_DEV_URL?.replace(/\/+$/u, '');
169
+ if (dev !== undefined && dev.length > 0) {
170
+ return fetch(new Request(`${dev}${url.pathname}${url.search}`, request));
171
+ }
172
+ const path = route === undefined ? `${url.pathname}${url.search}` : `/${route.document}${url.search}`;
173
+ return binding.fetch(new Request(new URL(path, url.origin), request));
174
+ }
175
+ function requestOrigin(url, request) {
176
+ if (url.protocol !== 'http:')
177
+ return url.origin;
178
+ const forwarded = request.headers.get('x-forwarded-proto')?.split(',')[0]?.trim().toLowerCase();
179
+ return forwarded === 'https' ? `https://${url.host}` : url.origin;
180
+ }
181
+ function canonicalServingUrl(input) {
182
+ let url;
183
+ try {
184
+ url = new URL(input);
185
+ }
186
+ catch (cause) {
187
+ throw new TypeError('Cloudflare Worker serving URL is invalid.', { cause });
188
+ }
189
+ if ((url.protocol !== 'https:' && url.protocol !== 'http:') ||
190
+ url.username !== '' ||
191
+ url.password !== '' ||
192
+ url.pathname !== '/' ||
193
+ url.search !== '' ||
194
+ url.hash !== '') {
195
+ throw new TypeError('Cloudflare Worker serving URL must be one HTTP(S) origin.');
196
+ }
197
+ return url.origin;
198
+ }
199
+ function deploymentVersion(environment) {
200
+ const input = environment.ASTRALE_VERSION_METADATA;
201
+ if (input !== null &&
202
+ typeof input === 'object' &&
203
+ typeof input.id === 'string' &&
204
+ input.id.length > 0) {
205
+ return input.id;
206
+ }
207
+ const fallback = environment.ASTRALE_DEPLOYMENT_VERSION;
208
+ if (typeof fallback === 'string' && fallback.length > 0)
209
+ return fallback;
210
+ throw new TypeError('Cloudflare Worker deployment version is unavailable.');
211
+ }
212
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astrale-os/adapter-cloudflare",
3
- "version": "0.4.10",
3
+ "version": "0.5.0-beta.11",
4
4
  "description": "Deploy an Astrale domain as a standalone Cloudflare Worker",
5
5
  "keywords": [
6
6
  "adapter",
@@ -15,6 +15,7 @@
15
15
  "dist",
16
16
  "src",
17
17
  "template",
18
+ "!template/node_modules",
18
19
  "!template/pnpm-lock.yaml"
19
20
  ],
20
21
  "type": "module",
@@ -26,14 +27,21 @@
26
27
  "import": "./dist/index.js"
27
28
  },
28
29
  "./build": {
29
- "types": "./dist/build.d.ts",
30
- "import": "./dist/build.js"
30
+ "types": "./dist/build/index.d.ts",
31
+ "import": "./dist/build/index.js"
32
+ },
33
+ "./worker": {
34
+ "types": "./dist/worker/index.d.ts",
35
+ "import": "./dist/worker/index.js"
31
36
  },
32
37
  "./package.json": "./package.json"
33
38
  },
34
39
  "dependencies": {
40
+ "@astrale-os/kernel-core": ">=0.9.0-beta.3 <1.0.0",
41
+ "@astrale-os/kernel-dsl": ">=0.2.0-beta.2 <1.0.0",
42
+ "hono": "^4.6.20",
35
43
  "jose": "^6.1.3",
36
- "@astrale-os/sdk": "^0.4.19"
44
+ "@astrale-os/sdk": "^0.5.0-beta.8"
37
45
  },
38
46
  "devDependencies": {
39
47
  "@astrale-os/ox": ">=0.1.0 <1.0.0",
@@ -43,7 +51,7 @@
43
51
  "oxlint": "latest",
44
52
  "typescript": "~6.0.1-rc",
45
53
  "vitest": "^3.0.0",
46
- "wrangler": "4.106.0"
54
+ "wrangler": "4.121.0"
47
55
  },
48
56
  "engines": {
49
57
  "node": ">=22"
@@ -0,0 +1,53 @@
1
+ /** Codegen for the Cloudflare module entry owned by the adapter. */
2
+
3
+ export interface WorkerCodegenOptions {
4
+ readonly origin: string
5
+ /** Optional same-zone routing service selected by the adapter environment. */
6
+ readonly router?: {
7
+ readonly binding: string
8
+ readonly hostSuffix: string
9
+ readonly minLabels: number
10
+ }
11
+ }
12
+
13
+ export function generateWorkerEntry(options: WorkerCodegenOptions): string {
14
+ const router = options.router
15
+ const routerPredicate =
16
+ router === undefined
17
+ ? ''
18
+ : `
19
+ function isInstanceHost(host: string): boolean {
20
+ return host.endsWith('${router.hostSuffix}') && host.split('.').length >= ${router.minLabels}
21
+ }
22
+ `
23
+ const routeSubrequest =
24
+ router === undefined
25
+ ? ''
26
+ : `
27
+ routeSubrequest: (url, env) => {
28
+ const labels = url.hostname.split('.')
29
+ if (env.DISPATCHER && labels[1] === 'svc') return env.DISPATCHER.get(labels[0]!)
30
+ if (env.${router.binding} && isInstanceHost(url.hostname)) return env.${router.binding}
31
+ return null
32
+ },`
33
+
34
+ return `// AUTO-GENERATED by @astrale-os/adapter-cloudflare — do not edit.
35
+ // Regenerated by every Astrale Domain build, dev, and deploy operation.
36
+ // Domain origin: ${options.origin}
37
+ import type { CloudflareAdapterBindings } from '@astrale-os/adapter-cloudflare/worker'
38
+ import type { ApplicationEnvironment } from '../implementation.js'
39
+
40
+ import { cloudflareWorkerEntry } from '@astrale-os/adapter-cloudflare/worker'
41
+ import { domain } from '../implementation.js'
42
+ import { PRIVATE_JWK } from './identity.js'
43
+
44
+ type WorkerEnv = CloudflareEnv & ApplicationEnvironment & CloudflareAdapterBindings
45
+ ${routerPredicate}
46
+ export default cloudflareWorkerEntry<WorkerEnv>()({
47
+ definition: domain,
48
+ privateKey: PRIVATE_JWK,
49
+ resolveUrl: (env, requestOrigin) => env.WORKER_URL ?? requestOrigin,
50
+ selfBinding: (env) => env.SELF,${routeSubrequest}
51
+ })
52
+ `
53
+ }
@@ -4,7 +4,7 @@
4
4
  * internal adapter detail the dev never sees.
5
5
  *
6
6
  * `main` is `./worker.gen.ts` (same dir). `assets.directory` points at the
7
- * project's Vite build (`CLIENT_DIST_DIR`). A `SELF` service binding enables autobinding
7
+ * adapter's materialized frontend stage. A `SELF` service binding enables autobinding
8
8
  * (a handler calling back into its own domain). Custom-domain deploys attach a
9
9
  * `custom_domain` route; otherwise the Worker ships to `*.workers.dev`.
10
10
  *
@@ -12,15 +12,17 @@
12
12
  * (extra bindings: KV, R2, D1, queues, …) — see `mergeUserConfig`.
13
13
  */
14
14
 
15
- import { CLIENT_DIST_DIR } from '../client'
16
- import { deepMergeConfig } from './merge'
15
+ import { deepMergeConfig } from './merge.js'
17
16
 
18
17
  export interface WranglerCodegenOptions {
19
18
  workerName: string
20
19
  /** Full custom hostname for a routed deploy (e.g. 'crm.acme.dev'). */
21
20
  route?: string
22
- /** Whether the project has a built client SPA to serve under /ui/*. */
23
- hasClient: boolean
21
+ /** Exact materialized local frontend; absence means no ASSETS binding. */
22
+ frontend?: {
23
+ readonly directory: string
24
+ readonly routes: readonly string[]
25
+ }
24
26
  /** Plain (non-secret) vars to bake in. */
25
27
  vars?: Record<string, string>
26
28
  /** Add the SELF service binding (autobinding). */
@@ -41,15 +43,17 @@ export interface WranglerCodegenOptions {
41
43
  wrangler?: Record<string, unknown>
42
44
  }
43
45
 
44
- const COMPATIBILITY_DATE = '2026-07-07'
46
+ // Wrangler 4.121.0's pinned workerd accepts dates through 2026-08-11.
47
+ const COMPATIBILITY_DATE = '2026-08-11'
45
48
 
46
49
  export function generateWranglerConfig(opts: WranglerCodegenOptions): string {
47
50
  const config: Record<string, unknown> = {
48
51
  name: opts.workerName,
49
52
  main: './worker.gen.ts',
50
53
  compatibility_date: COMPATIBILITY_DATE,
51
- compatibility_flags: ['nodejs_compat', 'nodejs_compat_populate_process_env'],
54
+ compatibility_flags: ['nodejs_compat'],
52
55
  workers_dev: true,
56
+ version_metadata: { binding: 'ASTRALE_VERSION_METADATA' },
53
57
  observability: { enabled: true },
54
58
  }
55
59
 
@@ -57,12 +61,23 @@ export function generateWranglerConfig(opts: WranglerCodegenOptions): string {
57
61
  config.routes = [{ pattern: opts.route, custom_domain: true }]
58
62
  }
59
63
 
60
- if (opts.hasClient) {
64
+ if (opts.frontend !== undefined) {
61
65
  config.assets = {
62
- directory: `../${CLIENT_DIST_DIR}`,
66
+ directory: opts.frontend.directory,
63
67
  binding: 'ASSETS',
64
- not_found_handling: 'single-page-application',
65
- run_worker_first: true,
68
+ run_worker_first: [
69
+ '/invoke',
70
+ '/invoke/*',
71
+ '/install',
72
+ '/install/*',
73
+ '/health',
74
+ '/health/*',
75
+ '/meta',
76
+ '/meta/*',
77
+ '/.well-known',
78
+ '/.well-known/*',
79
+ ...opts.frontend.routes,
80
+ ],
66
81
  }
67
82
  }
68
83
 
@@ -82,7 +97,14 @@ export function generateWranglerConfig(opts: WranglerCodegenOptions): string {
82
97
  }
83
98
 
84
99
  /** Keys the adapter owns and won't let `params.wrangler` clobber. */
85
- const ADAPTER_OWNED_KEYS = ['name', 'main', 'assets', 'routes']
100
+ const ADAPTER_OWNED_KEYS = [
101
+ 'name',
102
+ 'main',
103
+ 'assets',
104
+ 'routes',
105
+ 'compatibility_date',
106
+ 'version_metadata',
107
+ ]
86
108
 
87
109
  /**
88
110
  * Deep-merge the dev's raw wrangler overlay over the generated config, after