summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.changeset/cool-bulldogs-change.md7
-rw-r--r--packages/astro/src/runtime/server/render/page.ts6
-rw-r--r--packages/astro/src/runtime/server/render/util.ts2
3 files changed, 13 insertions, 2 deletions
diff --git a/.changeset/cool-bulldogs-change.md b/.changeset/cool-bulldogs-change.md
new file mode 100644
index 000000000..fce9c1a21
--- /dev/null
+++ b/.changeset/cool-bulldogs-change.md
@@ -0,0 +1,7 @@
+---
+"astro": patch
+---
+
+This patch allows astro to run in node-compat mode in Deno. Deno doesn't support
+construction of response from async iterables in node-compat mode so we need to
+use ReadableStream.
diff --git a/packages/astro/src/runtime/server/render/page.ts b/packages/astro/src/runtime/server/render/page.ts
index c27c11e6d..e6852fa2a 100644
--- a/packages/astro/src/runtime/server/render/page.ts
+++ b/packages/astro/src/runtime/server/render/page.ts
@@ -5,7 +5,7 @@ import type { AstroComponentFactory } from './index.js';
import { isAstroComponentFactory } from './astro/index.js';
import { renderToAsyncIterable, renderToReadableStream, renderToString } from './astro/render.js';
import { encoder } from './common.js';
-import { isNode } from './util.js';
+import { isNode, isDeno } from './util.js';
export async function renderPage(
result: SSRResult,
@@ -48,7 +48,9 @@ export async function renderPage(
let body: BodyInit | Response;
if (streaming) {
- if (isNode) {
+ // isNode is true in Deno node-compat mode but response construction from
+ // async iterables is not supported, so we fallback to ReadableStream if isDeno is true.
+ if (isNode && !isDeno) {
const nodeBody = await renderToAsyncIterable(
result,
componentFactory,
diff --git a/packages/astro/src/runtime/server/render/util.ts b/packages/astro/src/runtime/server/render/util.ts
index 484a8bbbb..61caff6cc 100644
--- a/packages/astro/src/runtime/server/render/util.ts
+++ b/packages/astro/src/runtime/server/render/util.ts
@@ -207,6 +207,8 @@ export function renderToBufferDestination(bufferRenderFunction: RenderFunction):
export const isNode =
typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]';
+// @ts-expect-error: Deno is not part of the types.
+export const isDeno = typeof Deno !== 'undefined';
// We can get rid of this when Promise.withResolvers() is ready
export type PromiseWithResolvers<T> = {