Skip to content

Commit

Permalink
fix: Remix serverless entry not found
Browse files Browse the repository at this point in the history
  • Loading branch information
Yuanlin Lin committed Jan 18, 2024
1 parent 768fa2e commit a13f75b
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 4 deletions.
76 changes: 76 additions & 0 deletions internal/nodejs/remix/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import {
createRequestHandler as createRemixRequestHandler,
writeReadableStreamToWritable,
installGlobals,
} from '@remix-run/node';

installGlobals();

import * as build from './build/index.js';

const handleRequest = createRemixRequestHandler(
build.default || build,
process.env.NODE_ENV
);

function createRemixHeaders(requestHeaders) {
const headers = new Headers();

for (const key in requestHeaders) {
const header = requestHeaders[key];
// set-cookie is an array (maybe others)
if (Array.isArray(header)) {
for (const value of header) {
headers.append(key, value);
}
} else {
headers.append(key, header);
}
}

return headers;
}

function createRemixRequest(req, res) {
const host = req.headers['x-forwarded-host'] || req.headers['host'];
const protocol = req.headers['x-forwarded-proto'] || 'https';
const url = new URL(req.url, `${protocol}://${host}`);

// Abort action/loaders once we can no longer write a response
const controller = new AbortController();
res.on('close', () => controller.abort());

const init = {
method: req.method,
headers: createRemixHeaders(req.headers),
signal: controller.signal,
};

if (req.method !== 'GET' && req.method !== 'HEAD') {
init.body = req;
}

return new Request(url.href, init);
}

async function sendRemixResponse(res, nodeResponse) {
res.statusMessage = nodeResponse.statusText;
let multiValueHeaders = nodeResponse.headers.raw();
res.writeHead(
nodeResponse.status,
nodeResponse.statusText,
multiValueHeaders
);

if (nodeResponse.body) {
await writeReadableStreamToWritable(nodeResponse.body, res);
} else {
res.end();
}
}

export default async (req, res) => {
const request = createRemixRequest(req, res);
const response = await handleRequest(request);
await sendRemixResponse(res, response);
};
9 changes: 5 additions & 4 deletions internal/nodejs/remix/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
package remix

import (
_ "embed"
"encoding/json"
"fmt"
"log"
Expand All @@ -13,6 +14,9 @@ import (
"github.com/zeabur/zbpack/pkg/types"
)

//go:embed index.js
var indexJs string

// TransformServerless will transform the build output of Remix app to the serverless build output format of Zeabur
func TransformServerless(workdir string) error {

Expand Down Expand Up @@ -91,10 +95,7 @@ func TransformServerless(workdir string) error {
return fmt.Errorf("copy package.json: %w", err)
}

indexjs := `import entry from './build/server-build-nodejs-eyJydW50aW1lIjoibm9kZWpzIn0.mjs';
export default entry;`

err = os.WriteFile(path.Join(zeaburOutputDir, "functions/index.func/index.mjs"), []byte(indexjs), 0644)
err = os.WriteFile(path.Join(zeaburOutputDir, "functions/index.func/index.mjs"), []byte(indexJs), 0644)
if err != nil {
return fmt.Errorf("write index.mjs: %w", err)
}
Expand Down

0 comments on commit a13f75b

Please sign in to comment.