@astrale-os/adapter-cloudflare 0.5.0-beta.1 → 0.5.0-beta.3
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/dist/worker/index.d.ts +14 -3
- package/dist/worker/index.d.ts.map +1 -1
- package/dist/worker/index.js +32 -9
- package/dist/worker/index.js.map +1 -1
- package/package.json +1 -1
- package/src/worker/index.ts +53 -19
package/dist/worker/index.d.ts
CHANGED
|
@@ -25,8 +25,7 @@ export interface CloudflareAdapterBindings {
|
|
|
25
25
|
get(name: string): Fetcher;
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
|
-
|
|
29
|
-
readonly definition: DomainDefinition<S, Environment, Deps>;
|
|
28
|
+
interface CloudflareWorkerSharedConfig<Bindings extends CloudflareAdapterBindings, Environment> {
|
|
30
29
|
readonly privateKey: RemoteIdentityInput['privateKey'] | ((bindings: Bindings) => RemoteIdentityInput['privateKey']);
|
|
31
30
|
/** Compose provider bindings into the exact Domain environment once per deployment generation. */
|
|
32
31
|
readonly resolveEnvironment?: (bindings: Bindings) => Environment | Promise<Environment>;
|
|
@@ -35,6 +34,17 @@ export interface CloudflareWorkerConfig<S extends schema.DomainSchema, Bindings
|
|
|
35
34
|
readonly selfBinding?: (bindings: Bindings) => Fetcher | null | undefined;
|
|
36
35
|
readonly routeSubrequest?: (url: URL, bindings: Bindings) => Fetcher | null | undefined;
|
|
37
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Resolve a Domain lazily when its module graph is too expensive for provider startup admission.
|
|
39
|
+
* The adapter resolves at most once concurrently and retries after a rejected resolution.
|
|
40
|
+
*/
|
|
41
|
+
export type CloudflareWorkerConfig<S extends schema.DomainSchema, Bindings extends CloudflareAdapterBindings, Environment> = CloudflareWorkerSharedConfig<Bindings, Environment> & ({
|
|
42
|
+
readonly definition: DomainDefinition<S>;
|
|
43
|
+
readonly resolveDefinition?: never;
|
|
44
|
+
} | {
|
|
45
|
+
readonly definition?: never;
|
|
46
|
+
readonly resolveDefinition: () => DomainDefinition<S> | Promise<DomainDefinition<S>>;
|
|
47
|
+
});
|
|
38
48
|
export interface CloudflareWorker<Environment> {
|
|
39
49
|
fetch(request: Request, environment: Environment, executionContext?: ExecutionContext): Response | Promise<Response>;
|
|
40
50
|
}
|
|
@@ -42,7 +52,8 @@ export interface CloudflareWorker<Environment> {
|
|
|
42
52
|
* Compose one Cloudflare module Worker without request-global mutation.
|
|
43
53
|
* Environment bindings are captured once per immutable serving URL/version generation.
|
|
44
54
|
*/
|
|
45
|
-
export declare function cloudflareWorkerEntry<Bindings extends CloudflareAdapterBindings, Environment = Bindings
|
|
55
|
+
export declare function cloudflareWorkerEntry<Bindings extends CloudflareAdapterBindings, Environment = Bindings>(): <const S extends schema.DomainSchema>(config: CloudflareWorkerConfig<S, Bindings, Environment>) => CloudflareWorker<Bindings>;
|
|
46
56
|
/** Close an evicted Application before its environment bindings leave the cache. */
|
|
47
57
|
export declare function closeEvictedApplication(application: Pick<Application, 'close'>, now?: () => number): Promise<void>;
|
|
58
|
+
export {};
|
|
48
59
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAiB,MAAM,iBAAiB,CAAA;AACtE,OAAO,KAAK,EACV,WAAW,EACX,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAE,gBAAgB,EAAQ,MAAM,MAAM,CAAA;AASlD,oFAAoF;AACpF,MAAM,MAAM,kBAAkB,GAAG,WAAW,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAA;AAE/E,MAAM,WAAW,OAAO;IACtB,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CACtD;AAED,yEAAyE;AACzE,MAAM,WAAW,yBAAyB;IACxC,2EAA2E;IAC3E,QAAQ,CAAC,wBAAwB,CAAC,EAAE;QAClC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;QACnB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;QACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAC3B,CAAA;IACD,iFAAiF;IACjF,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAA;IAC5C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,UAAU,CAAC,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAA;CACrD;AAED,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":"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"}
|
package/dist/worker/index.js
CHANGED
|
@@ -10,7 +10,29 @@ const APPLICATION_CLOSE_TIMEOUT_MS = 5_000;
|
|
|
10
10
|
export function cloudflareWorkerEntry() {
|
|
11
11
|
return function (config) {
|
|
12
12
|
const applications = new Map();
|
|
13
|
-
|
|
13
|
+
let resolvedDefinition = config.definition;
|
|
14
|
+
let pendingDefinition;
|
|
15
|
+
const definitionFor = async () => {
|
|
16
|
+
if (resolvedDefinition !== undefined)
|
|
17
|
+
return resolvedDefinition;
|
|
18
|
+
if (pendingDefinition !== undefined)
|
|
19
|
+
return pendingDefinition;
|
|
20
|
+
const resolve = config.resolveDefinition;
|
|
21
|
+
if (resolve === undefined)
|
|
22
|
+
throw new TypeError('Cloudflare Worker Domain definition is unavailable.');
|
|
23
|
+
const current = Promise.resolve().then(resolve);
|
|
24
|
+
pendingDefinition = current;
|
|
25
|
+
try {
|
|
26
|
+
const definition = await current;
|
|
27
|
+
resolvedDefinition = definition;
|
|
28
|
+
return definition;
|
|
29
|
+
}
|
|
30
|
+
finally {
|
|
31
|
+
if (pendingDefinition === current)
|
|
32
|
+
pendingDefinition = undefined;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
const applicationFor = async (url, bindings, definition) => {
|
|
14
36
|
const version = deploymentVersion(bindings);
|
|
15
37
|
const key = `${url}\u0000${version}`;
|
|
16
38
|
const cached = applications.get(key);
|
|
@@ -35,17 +57,17 @@ export function cloudflareWorkerEntry() {
|
|
|
35
57
|
const issuerId = issuer.accept(url);
|
|
36
58
|
const host = new HonoApplication();
|
|
37
59
|
host.get('/meta', (context) => context.json({
|
|
38
|
-
origin:
|
|
60
|
+
origin: definition.schema.origin,
|
|
39
61
|
issuer: issuerId,
|
|
40
|
-
schemaRevision:
|
|
62
|
+
schemaRevision: definition.domain.$.revision,
|
|
41
63
|
deploymentVersion: version,
|
|
42
64
|
}));
|
|
43
65
|
const serving = createRemoteApplication({
|
|
44
|
-
definition
|
|
66
|
+
definition,
|
|
45
67
|
environment,
|
|
46
68
|
identity: {
|
|
47
69
|
issuer: issuerId,
|
|
48
|
-
subject:
|
|
70
|
+
subject: definition.schema.origin,
|
|
49
71
|
privateKey: typeof config.privateKey === 'function'
|
|
50
72
|
? config.privateKey(bindings)
|
|
51
73
|
: config.privateKey,
|
|
@@ -55,7 +77,7 @@ export function cloudflareWorkerEntry() {
|
|
|
55
77
|
deployment: {
|
|
56
78
|
bundleHref: `${url}/.well-known/astrale/domain.bundle.json?${deploymentQuery}`,
|
|
57
79
|
endpoint: { http: `${url}/invoke` },
|
|
58
|
-
...(
|
|
80
|
+
...(definition.frontend === undefined
|
|
59
81
|
? {}
|
|
60
82
|
: { frontendBaseHref: url, frontendCacheKey: version }),
|
|
61
83
|
...(config.manifest === undefined ? {} : { manifest: config.manifest }),
|
|
@@ -107,15 +129,16 @@ export function cloudflareWorkerEntry() {
|
|
|
107
129
|
return Object.freeze({
|
|
108
130
|
async fetch(request, bindings, executionContext) {
|
|
109
131
|
const requestUrl = new URL(request.url);
|
|
110
|
-
|
|
111
|
-
|
|
132
|
+
const definition = await definitionFor();
|
|
133
|
+
if (definition.frontend !== undefined) {
|
|
134
|
+
const asset = await frontendAsset(definition, bindings, requestUrl, request);
|
|
112
135
|
if (asset !== undefined)
|
|
113
136
|
return asset;
|
|
114
137
|
}
|
|
115
138
|
const publicUrl = canonicalServingUrl(config.resolveUrl?.(bindings, requestOrigin(requestUrl, request)) ??
|
|
116
139
|
bindings.WORKER_URL ??
|
|
117
140
|
requestOrigin(requestUrl, request));
|
|
118
|
-
const serving = await applicationFor(publicUrl, bindings);
|
|
141
|
+
const serving = await applicationFor(publicUrl, bindings, definition);
|
|
119
142
|
return serving.application.app.fetch(request, serving.environment, executionContext);
|
|
120
143
|
},
|
|
121
144
|
});
|
package/dist/worker/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAA;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,IAAI,IAAI,eAAe,EAAE,MAAM,MAAM,CAAA;AAE9C,MAAM,2BAA2B,GAAG,CAAC,CAAA;AACrC,MAAM,4BAA4B,GAAG,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/worker/index.ts
CHANGED
|
@@ -38,13 +38,7 @@ export interface CloudflareAdapterBindings {
|
|
|
38
38
|
readonly DISPATCHER?: { get(name: string): Fetcher }
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
S extends schema.DomainSchema,
|
|
43
|
-
Bindings extends CloudflareAdapterBindings,
|
|
44
|
-
Environment,
|
|
45
|
-
Deps,
|
|
46
|
-
> {
|
|
47
|
-
readonly definition: DomainDefinition<S, Environment, Deps>
|
|
41
|
+
interface CloudflareWorkerSharedConfig<Bindings extends CloudflareAdapterBindings, Environment> {
|
|
48
42
|
readonly privateKey:
|
|
49
43
|
| RemoteIdentityInput['privateKey']
|
|
50
44
|
| ((bindings: Bindings) => RemoteIdentityInput['privateKey'])
|
|
@@ -56,6 +50,26 @@ export interface CloudflareWorkerConfig<
|
|
|
56
50
|
readonly routeSubrequest?: (url: URL, bindings: Bindings) => Fetcher | null | undefined
|
|
57
51
|
}
|
|
58
52
|
|
|
53
|
+
/**
|
|
54
|
+
* Resolve a Domain lazily when its module graph is too expensive for provider startup admission.
|
|
55
|
+
* The adapter resolves at most once concurrently and retries after a rejected resolution.
|
|
56
|
+
*/
|
|
57
|
+
export type CloudflareWorkerConfig<
|
|
58
|
+
S extends schema.DomainSchema,
|
|
59
|
+
Bindings extends CloudflareAdapterBindings,
|
|
60
|
+
Environment,
|
|
61
|
+
> = CloudflareWorkerSharedConfig<Bindings, Environment> &
|
|
62
|
+
(
|
|
63
|
+
| {
|
|
64
|
+
readonly definition: DomainDefinition<S>
|
|
65
|
+
readonly resolveDefinition?: never
|
|
66
|
+
}
|
|
67
|
+
| {
|
|
68
|
+
readonly definition?: never
|
|
69
|
+
readonly resolveDefinition: () => DomainDefinition<S> | Promise<DomainDefinition<S>>
|
|
70
|
+
}
|
|
71
|
+
)
|
|
72
|
+
|
|
59
73
|
export interface CloudflareWorker<Environment> {
|
|
60
74
|
fetch(
|
|
61
75
|
request: Request,
|
|
@@ -77,16 +91,35 @@ interface CachedApplication<Environment> {
|
|
|
77
91
|
export function cloudflareWorkerEntry<
|
|
78
92
|
Bindings extends CloudflareAdapterBindings,
|
|
79
93
|
Environment = Bindings,
|
|
80
|
-
Deps = Environment,
|
|
81
94
|
>() {
|
|
82
95
|
return function <const S extends schema.DomainSchema>(
|
|
83
|
-
config: CloudflareWorkerConfig<S, Bindings, Environment
|
|
96
|
+
config: CloudflareWorkerConfig<S, Bindings, Environment>,
|
|
84
97
|
): CloudflareWorker<Bindings> {
|
|
85
98
|
const applications = new Map<string, CachedApplication<Environment>>()
|
|
99
|
+
let resolvedDefinition: DomainDefinition<S> | undefined = config.definition
|
|
100
|
+
let pendingDefinition: Promise<DomainDefinition<S>> | undefined
|
|
101
|
+
|
|
102
|
+
const definitionFor = async (): Promise<DomainDefinition<S>> => {
|
|
103
|
+
if (resolvedDefinition !== undefined) return resolvedDefinition
|
|
104
|
+
if (pendingDefinition !== undefined) return pendingDefinition
|
|
105
|
+
const resolve = config.resolveDefinition
|
|
106
|
+
if (resolve === undefined)
|
|
107
|
+
throw new TypeError('Cloudflare Worker Domain definition is unavailable.')
|
|
108
|
+
const current = Promise.resolve().then(resolve)
|
|
109
|
+
pendingDefinition = current
|
|
110
|
+
try {
|
|
111
|
+
const definition = await current
|
|
112
|
+
resolvedDefinition = definition
|
|
113
|
+
return definition
|
|
114
|
+
} finally {
|
|
115
|
+
if (pendingDefinition === current) pendingDefinition = undefined
|
|
116
|
+
}
|
|
117
|
+
}
|
|
86
118
|
|
|
87
119
|
const applicationFor = async (
|
|
88
120
|
url: string,
|
|
89
121
|
bindings: Bindings,
|
|
122
|
+
definition: DomainDefinition<S>,
|
|
90
123
|
): Promise<CachedApplication<Environment>> => {
|
|
91
124
|
const version = deploymentVersion(bindings)
|
|
92
125
|
const key = `${url}\u0000${version}`
|
|
@@ -114,18 +147,18 @@ export function cloudflareWorkerEntry<
|
|
|
114
147
|
const host = new HonoApplication()
|
|
115
148
|
host.get('/meta', (context) =>
|
|
116
149
|
context.json({
|
|
117
|
-
origin:
|
|
150
|
+
origin: definition.schema.origin,
|
|
118
151
|
issuer: issuerId,
|
|
119
|
-
schemaRevision:
|
|
152
|
+
schemaRevision: definition.domain.$.revision,
|
|
120
153
|
deploymentVersion: version,
|
|
121
154
|
}),
|
|
122
155
|
)
|
|
123
156
|
const serving: Application<Hono> = createRemoteApplication({
|
|
124
|
-
definition
|
|
157
|
+
definition,
|
|
125
158
|
environment,
|
|
126
159
|
identity: {
|
|
127
160
|
issuer: issuerId,
|
|
128
|
-
subject:
|
|
161
|
+
subject: definition.schema.origin,
|
|
129
162
|
privateKey:
|
|
130
163
|
typeof config.privateKey === 'function'
|
|
131
164
|
? config.privateKey(bindings)
|
|
@@ -136,7 +169,7 @@ export function cloudflareWorkerEntry<
|
|
|
136
169
|
deployment: {
|
|
137
170
|
bundleHref: `${url}/.well-known/astrale/domain.bundle.json?${deploymentQuery}`,
|
|
138
171
|
endpoint: { http: `${url}/invoke` },
|
|
139
|
-
...(
|
|
172
|
+
...(definition.frontend === undefined
|
|
140
173
|
? {}
|
|
141
174
|
: { frontendBaseHref: url, frontendCacheKey: version }),
|
|
142
175
|
...(config.manifest === undefined ? {} : { manifest: config.manifest }),
|
|
@@ -188,8 +221,9 @@ export function cloudflareWorkerEntry<
|
|
|
188
221
|
return Object.freeze({
|
|
189
222
|
async fetch(request: Request, bindings: Bindings, executionContext?: ExecutionContext) {
|
|
190
223
|
const requestUrl = new URL(request.url)
|
|
191
|
-
|
|
192
|
-
|
|
224
|
+
const definition = await definitionFor()
|
|
225
|
+
if (definition.frontend !== undefined) {
|
|
226
|
+
const asset = await frontendAsset(definition, bindings, requestUrl, request)
|
|
193
227
|
if (asset !== undefined) return asset
|
|
194
228
|
}
|
|
195
229
|
const publicUrl = canonicalServingUrl(
|
|
@@ -197,7 +231,7 @@ export function cloudflareWorkerEntry<
|
|
|
197
231
|
bindings.WORKER_URL ??
|
|
198
232
|
requestOrigin(requestUrl, request),
|
|
199
233
|
)
|
|
200
|
-
const serving = await applicationFor(publicUrl, bindings)
|
|
234
|
+
const serving = await applicationFor(publicUrl, bindings, definition)
|
|
201
235
|
return serving.application.app.fetch(request, serving.environment, executionContext)
|
|
202
236
|
},
|
|
203
237
|
})
|
|
@@ -212,8 +246,8 @@ export function closeEvictedApplication(
|
|
|
212
246
|
return application.close({ deadline: now() + APPLICATION_CLOSE_TIMEOUT_MS })
|
|
213
247
|
}
|
|
214
248
|
|
|
215
|
-
async function frontendAsset<S extends schema.DomainSchema
|
|
216
|
-
definition: DomainDefinition<S
|
|
249
|
+
async function frontendAsset<S extends schema.DomainSchema>(
|
|
250
|
+
definition: DomainDefinition<S>,
|
|
217
251
|
environment: CloudflareAdapterBindings,
|
|
218
252
|
url: URL,
|
|
219
253
|
request: Request,
|