@astrale-os/adapter-cloudflare 0.5.0-beta.3 → 0.5.0-beta.5
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/fetch.d.ts +12 -0
- package/dist/worker/fetch.d.ts.map +1 -0
- package/dist/worker/fetch.js +32 -0
- package/dist/worker/fetch.js.map +1 -0
- package/dist/worker/index.d.ts +1 -1
- package/dist/worker/index.d.ts.map +1 -1
- package/dist/worker/index.js +13 -10
- package/dist/worker/index.js.map +1 -1
- package/package.json +4 -4
- package/src/worker/fetch.ts +46 -0
- package/src/worker/index.ts +21 -10
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type RequestDispatcher = (request: Request) => Response | Promise<Response>;
|
|
2
|
+
export interface CloudflareRequest {
|
|
3
|
+
readonly request: Request;
|
|
4
|
+
readonly rejectRedirect: boolean;
|
|
5
|
+
}
|
|
6
|
+
/** Construct a Cloudflare-compatible transport request without weakening redirect:error. */
|
|
7
|
+
export declare function prepareCloudflareRequest(input: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]): CloudflareRequest;
|
|
8
|
+
/** Preserve Fetch redirect:error semantics on Cloudflare, whose transport rejects that mode. */
|
|
9
|
+
export declare function dispatchCloudflareRequest(request: Request, rejectRedirect: boolean, dispatch: RequestDispatcher): Promise<Response>;
|
|
10
|
+
/** Restore the requested URL omitted by Cloudflare service-binding Responses. */
|
|
11
|
+
export declare function adaptCloudflareResponse(request: Request, response: Response): Response;
|
|
12
|
+
//# sourceMappingURL=fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/worker/fetch.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;AAElF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;CACjC;AAED,4FAA4F;AAC5F,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAClC,IAAI,CAAC,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,GACjC,iBAAiB,CAMnB;AAED,gGAAgG;AAChG,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,OAAO,EACvB,QAAQ,EAAE,iBAAiB,GAC1B,OAAO,CAAC,QAAQ,CAAC,CAOnB;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAStF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
|
|
2
|
+
/** Construct a Cloudflare-compatible transport request without weakening redirect:error. */
|
|
3
|
+
export function prepareCloudflareRequest(input, init) {
|
|
4
|
+
const rejectRedirect = init?.redirect === 'error' ||
|
|
5
|
+
(init?.redirect === undefined && input instanceof Request && input.redirect === 'error');
|
|
6
|
+
const request = new Request(input, rejectRedirect ? { ...init, redirect: 'manual' } : init);
|
|
7
|
+
return Object.freeze({ request, rejectRedirect });
|
|
8
|
+
}
|
|
9
|
+
/** Preserve Fetch redirect:error semantics on Cloudflare, whose transport rejects that mode. */
|
|
10
|
+
export async function dispatchCloudflareRequest(request, rejectRedirect, dispatch) {
|
|
11
|
+
const response = adaptCloudflareResponse(request, await dispatch(request));
|
|
12
|
+
if (!rejectRedirect)
|
|
13
|
+
return response;
|
|
14
|
+
if (!response.redirected && !REDIRECT_STATUSES.has(response.status))
|
|
15
|
+
return response;
|
|
16
|
+
await response.body?.cancel();
|
|
17
|
+
throw new TypeError('Redirects are not allowed for this request.');
|
|
18
|
+
}
|
|
19
|
+
/** Restore the requested URL omitted by Cloudflare service-binding Responses. */
|
|
20
|
+
export function adaptCloudflareResponse(request, response) {
|
|
21
|
+
if (response.url !== '')
|
|
22
|
+
return response;
|
|
23
|
+
return new Proxy(response, {
|
|
24
|
+
get(target, property) {
|
|
25
|
+
if (property === 'url')
|
|
26
|
+
return request.url;
|
|
27
|
+
const value = Reflect.get(target, property, target);
|
|
28
|
+
return typeof value === 'function' ? value.bind(target) : value;
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/worker/fetch.ts"],"names":[],"mappings":"AAAA,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAA;AAS5D,4FAA4F;AAC5F,MAAM,UAAU,wBAAwB,CACtC,KAAkC,EAClC,IAAkC;IAElC,MAAM,cAAc,GAClB,IAAI,EAAE,QAAQ,KAAK,OAAO;QAC1B,CAAC,IAAI,EAAE,QAAQ,KAAK,SAAS,IAAI,KAAK,YAAY,OAAO,IAAI,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAA;IAC1F,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAC3F,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAA;AACnD,CAAC;AAED,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,OAAgB,EAChB,cAAuB,EACvB,QAA2B;IAE3B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;IAC1E,IAAI,CAAC,cAAc;QAAE,OAAO,QAAQ,CAAA;IACpC,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,QAAQ,CAAA;IAEpF,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAA;IAC7B,MAAM,IAAI,SAAS,CAAC,6CAA6C,CAAC,CAAA;AACpE,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,uBAAuB,CAAC,OAAgB,EAAE,QAAkB;IAC1E,IAAI,QAAQ,CAAC,GAAG,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAA;IACxC,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE;QACzB,GAAG,CAAC,MAAM,EAAE,QAAQ;YAClB,IAAI,QAAQ,KAAK,KAAK;gBAAE,OAAO,OAAO,CAAC,GAAG,CAAA;YAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAY,CAAA;YAC9D,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QACjE,CAAC;KACF,CAAC,CAAA;AACJ,CAAC"}
|
package/dist/worker/index.d.ts
CHANGED
|
@@ -43,7 +43,7 @@ export type CloudflareWorkerConfig<S extends schema.DomainSchema, Bindings exten
|
|
|
43
43
|
readonly resolveDefinition?: never;
|
|
44
44
|
} | {
|
|
45
45
|
readonly definition?: never;
|
|
46
|
-
readonly resolveDefinition: () => DomainDefinition<S> | Promise<DomainDefinition<S>>;
|
|
46
|
+
readonly resolveDefinition: (bindings: Bindings) => DomainDefinition<S> | Promise<DomainDefinition<S>>;
|
|
47
47
|
});
|
|
48
48
|
export interface CloudflareWorker<Environment> {
|
|
49
49
|
fetch(request: Request, environment: Environment, executionContext?: ExecutionContext): Response | Promise<Response>;
|
|
@@ -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;
|
|
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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { issuer } from '@astrale-os/kernel-core/auth';
|
|
2
2
|
import { createRemoteApplication } from '@astrale-os/sdk/server';
|
|
3
3
|
import { Hono as HonoApplication } from 'hono';
|
|
4
|
+
import { dispatchCloudflareRequest, prepareCloudflareRequest } from './fetch.js';
|
|
4
5
|
const MAXIMUM_CACHED_APPLICATIONS = 4;
|
|
5
6
|
const APPLICATION_CLOSE_TIMEOUT_MS = 5_000;
|
|
6
7
|
/**
|
|
@@ -12,7 +13,7 @@ export function cloudflareWorkerEntry() {
|
|
|
12
13
|
const applications = new Map();
|
|
13
14
|
let resolvedDefinition = config.definition;
|
|
14
15
|
let pendingDefinition;
|
|
15
|
-
const definitionFor = async () => {
|
|
16
|
+
const definitionFor = async (bindings) => {
|
|
16
17
|
if (resolvedDefinition !== undefined)
|
|
17
18
|
return resolvedDefinition;
|
|
18
19
|
if (pendingDefinition !== undefined)
|
|
@@ -20,7 +21,7 @@ export function cloudflareWorkerEntry() {
|
|
|
20
21
|
const resolve = config.resolveDefinition;
|
|
21
22
|
if (resolve === undefined)
|
|
22
23
|
throw new TypeError('Cloudflare Worker Domain definition is unavailable.');
|
|
23
|
-
const current = Promise.resolve().then(resolve);
|
|
24
|
+
const current = Promise.resolve().then(() => resolve(bindings));
|
|
24
25
|
pendingDefinition = current;
|
|
25
26
|
try {
|
|
26
27
|
const definition = await current;
|
|
@@ -42,16 +43,18 @@ export function cloudflareWorkerEntry() {
|
|
|
42
43
|
? bindings
|
|
43
44
|
: await config.resolveEnvironment(bindings);
|
|
44
45
|
const routedFetch = async (input, init) => {
|
|
45
|
-
const request =
|
|
46
|
+
const { request, rejectRedirect } = prepareCloudflareRequest(input, init);
|
|
46
47
|
const destination = new URL(request.url);
|
|
47
48
|
if (destination.origin === new URL(url).origin) {
|
|
48
49
|
const self = config.selfBinding?.(bindings);
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
return dispatchCloudflareRequest(request, rejectRedirect, (transportRequest) => self !== null && self !== undefined
|
|
51
|
+
? self.fetch(transportRequest)
|
|
52
|
+
: serving.app.fetch(transportRequest, environment));
|
|
52
53
|
}
|
|
53
54
|
const route = config.routeSubrequest?.(destination, bindings);
|
|
54
|
-
return route === null || route === undefined
|
|
55
|
+
return dispatchCloudflareRequest(request, rejectRedirect, (transportRequest) => route === null || route === undefined
|
|
56
|
+
? fetch(transportRequest)
|
|
57
|
+
: route.fetch(transportRequest));
|
|
55
58
|
};
|
|
56
59
|
const deploymentQuery = `deployment=${encodeURIComponent(version)}`;
|
|
57
60
|
const issuerId = issuer.accept(url);
|
|
@@ -81,7 +84,7 @@ export function cloudflareWorkerEntry() {
|
|
|
81
84
|
? {}
|
|
82
85
|
: { frontendBaseHref: url, frontendCacheKey: version }),
|
|
83
86
|
...(config.manifest === undefined ? {} : { manifest: config.manifest }),
|
|
84
|
-
|
|
87
|
+
delivery: {
|
|
85
88
|
href: `${url}/install`,
|
|
86
89
|
method: 'POST',
|
|
87
90
|
authentication: { kind: 'public' },
|
|
@@ -95,7 +98,7 @@ export function cloudflareWorkerEntry() {
|
|
|
95
98
|
maximumRequestBytes: 1024 * 1024,
|
|
96
99
|
maximumPublicationBytes: 1024 * 1024,
|
|
97
100
|
maximumBundleBytes: 8 * 1024 * 1024,
|
|
98
|
-
|
|
101
|
+
maximumDeliveryBytes: 8 * 1024 * 1024,
|
|
99
102
|
invocationTimeoutMs: 30_000,
|
|
100
103
|
},
|
|
101
104
|
},
|
|
@@ -129,7 +132,7 @@ export function cloudflareWorkerEntry() {
|
|
|
129
132
|
return Object.freeze({
|
|
130
133
|
async fetch(request, bindings, executionContext) {
|
|
131
134
|
const requestUrl = new URL(request.url);
|
|
132
|
-
const definition = await definitionFor();
|
|
135
|
+
const definition = await definitionFor(bindings);
|
|
133
136
|
if (definition.frontend !== undefined) {
|
|
134
137
|
const asset = await frontendAsset(definition, bindings, requestUrl, request);
|
|
135
138
|
if (asset !== undefined)
|
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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@astrale-os/adapter-cloudflare",
|
|
3
|
-
"version": "0.5.0-beta.
|
|
3
|
+
"version": "0.5.0-beta.5",
|
|
4
4
|
"description": "Deploy an Astrale domain as a standalone Cloudflare Worker",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"adapter",
|
|
@@ -37,11 +37,11 @@
|
|
|
37
37
|
"./package.json": "./package.json"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@astrale-os/kernel-core": "0.9.0-beta.
|
|
41
|
-
"@astrale-os/kernel-dsl": "0.2.0-beta.
|
|
40
|
+
"@astrale-os/kernel-core": "0.9.0-beta.2",
|
|
41
|
+
"@astrale-os/kernel-dsl": "0.2.0-beta.2",
|
|
42
42
|
"hono": "^4.6.20",
|
|
43
43
|
"jose": "^6.1.3",
|
|
44
|
-
"@astrale-os/sdk": "^0.5.0-beta.
|
|
44
|
+
"@astrale-os/sdk": "^0.5.0-beta.2"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@astrale-os/ox": ">=0.1.0 <1.0.0",
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308])
|
|
2
|
+
|
|
3
|
+
export type RequestDispatcher = (request: Request) => Response | Promise<Response>
|
|
4
|
+
|
|
5
|
+
export interface CloudflareRequest {
|
|
6
|
+
readonly request: Request
|
|
7
|
+
readonly rejectRedirect: boolean
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/** Construct a Cloudflare-compatible transport request without weakening redirect:error. */
|
|
11
|
+
export function prepareCloudflareRequest(
|
|
12
|
+
input: Parameters<typeof fetch>[0],
|
|
13
|
+
init?: Parameters<typeof fetch>[1],
|
|
14
|
+
): CloudflareRequest {
|
|
15
|
+
const rejectRedirect =
|
|
16
|
+
init?.redirect === 'error' ||
|
|
17
|
+
(init?.redirect === undefined && input instanceof Request && input.redirect === 'error')
|
|
18
|
+
const request = new Request(input, rejectRedirect ? { ...init, redirect: 'manual' } : init)
|
|
19
|
+
return Object.freeze({ request, rejectRedirect })
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Preserve Fetch redirect:error semantics on Cloudflare, whose transport rejects that mode. */
|
|
23
|
+
export async function dispatchCloudflareRequest(
|
|
24
|
+
request: Request,
|
|
25
|
+
rejectRedirect: boolean,
|
|
26
|
+
dispatch: RequestDispatcher,
|
|
27
|
+
): Promise<Response> {
|
|
28
|
+
const response = adaptCloudflareResponse(request, await dispatch(request))
|
|
29
|
+
if (!rejectRedirect) return response
|
|
30
|
+
if (!response.redirected && !REDIRECT_STATUSES.has(response.status)) return response
|
|
31
|
+
|
|
32
|
+
await response.body?.cancel()
|
|
33
|
+
throw new TypeError('Redirects are not allowed for this request.')
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Restore the requested URL omitted by Cloudflare service-binding Responses. */
|
|
37
|
+
export function adaptCloudflareResponse(request: Request, response: Response): Response {
|
|
38
|
+
if (response.url !== '') return response
|
|
39
|
+
return new Proxy(response, {
|
|
40
|
+
get(target, property) {
|
|
41
|
+
if (property === 'url') return request.url
|
|
42
|
+
const value = Reflect.get(target, property, target) as unknown
|
|
43
|
+
return typeof value === 'function' ? value.bind(target) : value
|
|
44
|
+
},
|
|
45
|
+
})
|
|
46
|
+
}
|
package/src/worker/index.ts
CHANGED
|
@@ -11,6 +11,8 @@ import { issuer } from '@astrale-os/kernel-core/auth'
|
|
|
11
11
|
import { createRemoteApplication } from '@astrale-os/sdk/server'
|
|
12
12
|
import { Hono as HonoApplication } from 'hono'
|
|
13
13
|
|
|
14
|
+
import { dispatchCloudflareRequest, prepareCloudflareRequest } from './fetch.js'
|
|
15
|
+
|
|
14
16
|
const MAXIMUM_CACHED_APPLICATIONS = 4
|
|
15
17
|
const APPLICATION_CLOSE_TIMEOUT_MS = 5_000
|
|
16
18
|
|
|
@@ -66,7 +68,9 @@ export type CloudflareWorkerConfig<
|
|
|
66
68
|
}
|
|
67
69
|
| {
|
|
68
70
|
readonly definition?: never
|
|
69
|
-
readonly resolveDefinition: (
|
|
71
|
+
readonly resolveDefinition: (
|
|
72
|
+
bindings: Bindings,
|
|
73
|
+
) => DomainDefinition<S> | Promise<DomainDefinition<S>>
|
|
70
74
|
}
|
|
71
75
|
)
|
|
72
76
|
|
|
@@ -99,13 +103,13 @@ export function cloudflareWorkerEntry<
|
|
|
99
103
|
let resolvedDefinition: DomainDefinition<S> | undefined = config.definition
|
|
100
104
|
let pendingDefinition: Promise<DomainDefinition<S>> | undefined
|
|
101
105
|
|
|
102
|
-
const definitionFor = async (): Promise<DomainDefinition<S>> => {
|
|
106
|
+
const definitionFor = async (bindings: Bindings): Promise<DomainDefinition<S>> => {
|
|
103
107
|
if (resolvedDefinition !== undefined) return resolvedDefinition
|
|
104
108
|
if (pendingDefinition !== undefined) return pendingDefinition
|
|
105
109
|
const resolve = config.resolveDefinition
|
|
106
110
|
if (resolve === undefined)
|
|
107
111
|
throw new TypeError('Cloudflare Worker Domain definition is unavailable.')
|
|
108
|
-
const current = Promise.resolve().then(resolve)
|
|
112
|
+
const current = Promise.resolve().then(() => resolve(bindings))
|
|
109
113
|
pendingDefinition = current
|
|
110
114
|
try {
|
|
111
115
|
const definition = await current
|
|
@@ -131,15 +135,22 @@ export function cloudflareWorkerEntry<
|
|
|
131
135
|
: await config.resolveEnvironment(bindings)
|
|
132
136
|
|
|
133
137
|
const routedFetch: typeof fetch = async (input, init) => {
|
|
134
|
-
const request =
|
|
138
|
+
const { request, rejectRedirect } = prepareCloudflareRequest(input, init)
|
|
135
139
|
const destination = new URL(request.url)
|
|
136
140
|
if (destination.origin === new URL(url).origin) {
|
|
137
141
|
const self = config.selfBinding?.(bindings)
|
|
138
|
-
|
|
139
|
-
|
|
142
|
+
return dispatchCloudflareRequest(request, rejectRedirect, (transportRequest) =>
|
|
143
|
+
self !== null && self !== undefined
|
|
144
|
+
? self.fetch(transportRequest)
|
|
145
|
+
: serving.app.fetch(transportRequest, environment),
|
|
146
|
+
)
|
|
140
147
|
}
|
|
141
148
|
const route = config.routeSubrequest?.(destination, bindings)
|
|
142
|
-
return
|
|
149
|
+
return dispatchCloudflareRequest(request, rejectRedirect, (transportRequest) =>
|
|
150
|
+
route === null || route === undefined
|
|
151
|
+
? fetch(transportRequest)
|
|
152
|
+
: route.fetch(transportRequest),
|
|
153
|
+
)
|
|
143
154
|
}
|
|
144
155
|
|
|
145
156
|
const deploymentQuery = `deployment=${encodeURIComponent(version)}`
|
|
@@ -173,7 +184,7 @@ export function cloudflareWorkerEntry<
|
|
|
173
184
|
? {}
|
|
174
185
|
: { frontendBaseHref: url, frontendCacheKey: version }),
|
|
175
186
|
...(config.manifest === undefined ? {} : { manifest: config.manifest }),
|
|
176
|
-
|
|
187
|
+
delivery: {
|
|
177
188
|
href: `${url}/install`,
|
|
178
189
|
method: 'POST',
|
|
179
190
|
authentication: { kind: 'public' },
|
|
@@ -187,7 +198,7 @@ export function cloudflareWorkerEntry<
|
|
|
187
198
|
maximumRequestBytes: 1024 * 1024,
|
|
188
199
|
maximumPublicationBytes: 1024 * 1024,
|
|
189
200
|
maximumBundleBytes: 8 * 1024 * 1024,
|
|
190
|
-
|
|
201
|
+
maximumDeliveryBytes: 8 * 1024 * 1024,
|
|
191
202
|
invocationTimeoutMs: 30_000,
|
|
192
203
|
},
|
|
193
204
|
},
|
|
@@ -221,7 +232,7 @@ export function cloudflareWorkerEntry<
|
|
|
221
232
|
return Object.freeze({
|
|
222
233
|
async fetch(request: Request, bindings: Bindings, executionContext?: ExecutionContext) {
|
|
223
234
|
const requestUrl = new URL(request.url)
|
|
224
|
-
const definition = await definitionFor()
|
|
235
|
+
const definition = await definitionFor(bindings)
|
|
225
236
|
if (definition.frontend !== undefined) {
|
|
226
237
|
const asset = await frontendAsset(definition, bindings, requestUrl, request)
|
|
227
238
|
if (asset !== undefined) return asset
|