@astrale-os/adapter-cloudflare 0.5.0-beta.2 → 0.5.0-beta.4
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 +13 -2
- 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 +52 -14
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>;
|
|
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: (bindings: Bindings) => 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
|
}
|
|
@@ -45,4 +55,5 @@ export interface CloudflareWorker<Environment> {
|
|
|
45
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 (bindings) => {
|
|
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(bindings));
|
|
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(bindings);
|
|
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,12 +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
|
-
> {
|
|
46
|
-
readonly definition: DomainDefinition<S>
|
|
41
|
+
interface CloudflareWorkerSharedConfig<Bindings extends CloudflareAdapterBindings, Environment> {
|
|
47
42
|
readonly privateKey:
|
|
48
43
|
| RemoteIdentityInput['privateKey']
|
|
49
44
|
| ((bindings: Bindings) => RemoteIdentityInput['privateKey'])
|
|
@@ -55,6 +50,28 @@ export interface CloudflareWorkerConfig<
|
|
|
55
50
|
readonly routeSubrequest?: (url: URL, bindings: Bindings) => Fetcher | null | undefined
|
|
56
51
|
}
|
|
57
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: (
|
|
70
|
+
bindings: Bindings,
|
|
71
|
+
) => DomainDefinition<S> | Promise<DomainDefinition<S>>
|
|
72
|
+
}
|
|
73
|
+
)
|
|
74
|
+
|
|
58
75
|
export interface CloudflareWorker<Environment> {
|
|
59
76
|
fetch(
|
|
60
77
|
request: Request,
|
|
@@ -81,10 +98,30 @@ export function cloudflareWorkerEntry<
|
|
|
81
98
|
config: CloudflareWorkerConfig<S, Bindings, Environment>,
|
|
82
99
|
): CloudflareWorker<Bindings> {
|
|
83
100
|
const applications = new Map<string, CachedApplication<Environment>>()
|
|
101
|
+
let resolvedDefinition: DomainDefinition<S> | undefined = config.definition
|
|
102
|
+
let pendingDefinition: Promise<DomainDefinition<S>> | undefined
|
|
103
|
+
|
|
104
|
+
const definitionFor = async (bindings: Bindings): Promise<DomainDefinition<S>> => {
|
|
105
|
+
if (resolvedDefinition !== undefined) return resolvedDefinition
|
|
106
|
+
if (pendingDefinition !== undefined) return pendingDefinition
|
|
107
|
+
const resolve = config.resolveDefinition
|
|
108
|
+
if (resolve === undefined)
|
|
109
|
+
throw new TypeError('Cloudflare Worker Domain definition is unavailable.')
|
|
110
|
+
const current = Promise.resolve().then(() => resolve(bindings))
|
|
111
|
+
pendingDefinition = current
|
|
112
|
+
try {
|
|
113
|
+
const definition = await current
|
|
114
|
+
resolvedDefinition = definition
|
|
115
|
+
return definition
|
|
116
|
+
} finally {
|
|
117
|
+
if (pendingDefinition === current) pendingDefinition = undefined
|
|
118
|
+
}
|
|
119
|
+
}
|
|
84
120
|
|
|
85
121
|
const applicationFor = async (
|
|
86
122
|
url: string,
|
|
87
123
|
bindings: Bindings,
|
|
124
|
+
definition: DomainDefinition<S>,
|
|
88
125
|
): Promise<CachedApplication<Environment>> => {
|
|
89
126
|
const version = deploymentVersion(bindings)
|
|
90
127
|
const key = `${url}\u0000${version}`
|
|
@@ -112,18 +149,18 @@ export function cloudflareWorkerEntry<
|
|
|
112
149
|
const host = new HonoApplication()
|
|
113
150
|
host.get('/meta', (context) =>
|
|
114
151
|
context.json({
|
|
115
|
-
origin:
|
|
152
|
+
origin: definition.schema.origin,
|
|
116
153
|
issuer: issuerId,
|
|
117
|
-
schemaRevision:
|
|
154
|
+
schemaRevision: definition.domain.$.revision,
|
|
118
155
|
deploymentVersion: version,
|
|
119
156
|
}),
|
|
120
157
|
)
|
|
121
158
|
const serving: Application<Hono> = createRemoteApplication({
|
|
122
|
-
definition
|
|
159
|
+
definition,
|
|
123
160
|
environment,
|
|
124
161
|
identity: {
|
|
125
162
|
issuer: issuerId,
|
|
126
|
-
subject:
|
|
163
|
+
subject: definition.schema.origin,
|
|
127
164
|
privateKey:
|
|
128
165
|
typeof config.privateKey === 'function'
|
|
129
166
|
? config.privateKey(bindings)
|
|
@@ -134,7 +171,7 @@ export function cloudflareWorkerEntry<
|
|
|
134
171
|
deployment: {
|
|
135
172
|
bundleHref: `${url}/.well-known/astrale/domain.bundle.json?${deploymentQuery}`,
|
|
136
173
|
endpoint: { http: `${url}/invoke` },
|
|
137
|
-
...(
|
|
174
|
+
...(definition.frontend === undefined
|
|
138
175
|
? {}
|
|
139
176
|
: { frontendBaseHref: url, frontendCacheKey: version }),
|
|
140
177
|
...(config.manifest === undefined ? {} : { manifest: config.manifest }),
|
|
@@ -186,8 +223,9 @@ export function cloudflareWorkerEntry<
|
|
|
186
223
|
return Object.freeze({
|
|
187
224
|
async fetch(request: Request, bindings: Bindings, executionContext?: ExecutionContext) {
|
|
188
225
|
const requestUrl = new URL(request.url)
|
|
189
|
-
|
|
190
|
-
|
|
226
|
+
const definition = await definitionFor(bindings)
|
|
227
|
+
if (definition.frontend !== undefined) {
|
|
228
|
+
const asset = await frontendAsset(definition, bindings, requestUrl, request)
|
|
191
229
|
if (asset !== undefined) return asset
|
|
192
230
|
}
|
|
193
231
|
const publicUrl = canonicalServingUrl(
|
|
@@ -195,7 +233,7 @@ export function cloudflareWorkerEntry<
|
|
|
195
233
|
bindings.WORKER_URL ??
|
|
196
234
|
requestOrigin(requestUrl, request),
|
|
197
235
|
)
|
|
198
|
-
const serving = await applicationFor(publicUrl, bindings)
|
|
236
|
+
const serving = await applicationFor(publicUrl, bindings, definition)
|
|
199
237
|
return serving.application.app.fetch(request, serving.environment, executionContext)
|
|
200
238
|
},
|
|
201
239
|
})
|