90 lines
1.9 KiB
Go
90 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"embed"
|
|
"fmt"
|
|
"io"
|
|
"io/fs"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"os"
|
|
|
|
"github.com/a-h/templ/storybook/example"
|
|
"github.com/aws/aws-lambda-go/events"
|
|
"github.com/aws/aws-lambda-go/lambda"
|
|
)
|
|
|
|
var s = example.Storybook()
|
|
|
|
func build() {
|
|
if err := s.Build(context.Background()); err != nil {
|
|
fmt.Println(err)
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
// Embed the build output into the Lambda.
|
|
// The build output is only 4MB, so there's plenty of space.
|
|
//
|
|
//go:embed storybook-server/storybook-static
|
|
var storybookStatic embed.FS
|
|
|
|
func run() {
|
|
// Replace the filesystem handler with the embedded data.
|
|
rooted, _ := fs.Sub(storybookStatic, "storybook-server/storybook-static")
|
|
s.StaticHandler = http.FileServer(http.FS(rooted))
|
|
// Start a Lambda handler.
|
|
lambda.Start(handler)
|
|
}
|
|
|
|
func handler(ctx context.Context, e events.APIGatewayV2HTTPRequest) (resp events.APIGatewayV2HTTPResponse, err error) {
|
|
// Record the result.
|
|
w := httptest.NewRecorder()
|
|
u := e.RawPath
|
|
if len(e.RawQueryString) > 0 {
|
|
u += "?" + e.RawQueryString
|
|
}
|
|
r := httptest.NewRequest(e.RequestContext.HTTP.Method, u, nil)
|
|
s.ServeHTTP(w, r)
|
|
|
|
// Convert it to an API Gateway response.
|
|
result := w.Result()
|
|
resp.StatusCode = result.StatusCode
|
|
bdy, err := io.ReadAll(w.Result().Body)
|
|
if err != nil {
|
|
return
|
|
}
|
|
resp.Body = string(bdy)
|
|
if len(result.Header) > 0 {
|
|
resp.Headers = make(map[string]string, len(result.Header))
|
|
for k := range result.Header {
|
|
v := result.Header.Get(k)
|
|
resp.Headers[k] = v
|
|
}
|
|
}
|
|
cookies := result.Cookies()
|
|
if len(cookies) > 0 {
|
|
resp.Cookies = make([]string, len(cookies))
|
|
for i := 0; i < len(cookies); i++ {
|
|
resp.Cookies[i] = cookies[i].String()
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func main() {
|
|
if len(os.Args) < 2 {
|
|
run()
|
|
}
|
|
switch os.Args[1] {
|
|
case "build":
|
|
build()
|
|
case "run":
|
|
run()
|
|
default:
|
|
fmt.Printf("unexpected command %q\n", os.Args[1])
|
|
os.Exit(1)
|
|
}
|
|
}
|