Skip to content

Commit

Permalink
Add location to serverStore
Browse files Browse the repository at this point in the history
  • Loading branch information
dac09 committed May 29, 2024
1 parent 71b1199 commit 703a9b4
Show file tree
Hide file tree
Showing 8 changed files with 38 additions and 4 deletions.
11 changes: 9 additions & 2 deletions packages/vite/src/devFeServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,11 @@ import { createRscRequestHandler } from './rsc/rscRequestHandler.js'
import { createPerRequestMap, createServerStorage } from './serverStore.js'
import { collectCssPaths, componentsModules } from './streaming/collectCss.js'
import { createReactStreamingHandler } from './streaming/createReactStreamingHandler.js'
import { convertExpressHeaders, ensureProcessDirWeb } from './utils.js'
import {
convertExpressHeaders,
ensureProcessDirWeb,
getFullUrl,
} from './utils.js'

// TODO (STREAMING) Just so it doesn't error out. Not sure how to handle this.
globalThis.__REDWOOD__PRERENDER_PAGES = {}
Expand Down Expand Up @@ -100,9 +104,12 @@ async function createServer() {
app.use(vite.middlewares)

app.use('*', (req, _res, next) => {
// Convert express headers to fetch headers
const fullUrl = getFullUrl(req)

const perReqStore = createPerRequestMap({
// Convert express headers to fetch header
headers: convertExpressHeaders(req.headersDistinct),
fullUrl,
})

// By wrapping next, we ensure that all of the other handlers will use this same perReqStore
Expand Down
4 changes: 4 additions & 0 deletions packages/vite/src/rsc/rscRequestHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { hasStatusCode } from '../lib/StatusError.js'
import type { Middleware } from '../middleware'
import { invoke } from '../middleware/invokeMiddleware'
import { getAuthState, getRequestHeaders } from '../serverStore'
import { getFullUrl } from '../utils'

import { sendRscFlightToStudio } from './rscStudioHandlers.js'
import { renderRsc } from './rscWorkerCommunication.js'
Expand Down Expand Up @@ -183,6 +184,8 @@ export function createRscRequestHandler(
}

try {
const fullUrl = getFullUrl(req)

const pipeable = await renderRsc({
rscId,
props,
Expand All @@ -193,6 +196,7 @@ export function createRscRequestHandler(
serverState: {
headersInit: Object.fromEntries(getRequestHeaders().entries()),
serverAuthState: getAuthState(),
urlHref: fullUrl,
},
})

Expand Down
3 changes: 3 additions & 0 deletions packages/vite/src/rsc/rscStudioHandlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import type { Request } from 'express'
import { getRawConfig, getConfig } from '@redwoodjs/project-config'

import { getAuthState, getRequestHeaders } from '../serverStore.js'
import { getFullUrl } from '../utils.js'

import { renderRsc } from './rscWorkerCommunication.js'
import type { RenderInput } from './rscWorkerCommunication.js'
Expand Down Expand Up @@ -134,6 +135,7 @@ export const sendRscFlightToStudio = async (input: StudioRenderInput) => {
// surround renderRsc with performance metrics
const startedAt = Date.now()
const start = performance.now()
const fullUrl = getFullUrl(req)

const pipeable = await renderRsc({
rscId,
Expand All @@ -143,6 +145,7 @@ export const sendRscFlightToStudio = async (input: StudioRenderInput) => {
serverState: {
headersInit: Object.fromEntries(getRequestHeaders().entries()),
serverAuthState: getAuthState(),
urlHref: fullUrl,
},
})
const endedAt = Date.now()
Expand Down
1 change: 1 addition & 0 deletions packages/vite/src/rsc/rscWorker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ const handleRender = async ({ id, input }: MessageReq & { type: 'render' }) => {
// Assumes that handleRender is only called once per request!
const reqMap = createPerRequestMap({
headers: input.serverState.headersInit,
fullUrl: input.serverState.urlHref,
serverAuthState: input.serverState.serverAuthState,
})

Expand Down
1 change: 1 addition & 0 deletions packages/vite/src/rsc/rscWorkerCommunication.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export type RenderInput<
args?: unknown[] | undefined
serverState: {
headersInit: Record<string, string>
urlHref: string
serverAuthState: ServerAuthState
}
}
Expand Down
7 changes: 5 additions & 2 deletions packages/vite/src/runFeServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import { setClientEntries } from './rsc/rscWorkerCommunication.js'
import { createPerRequestMap, createServerStorage } from './serverStore.js'
import { createReactStreamingHandler } from './streaming/createReactStreamingHandler.js'
import type { RWRouteManifest } from './types.js'
import { convertExpressHeaders } from './utils.js'
import { convertExpressHeaders, getFullUrl } from './utils.js'

/**
* TODO (STREAMING)
Expand Down Expand Up @@ -123,9 +123,12 @@ export async function runFeServer() {
)

app.use('*', (req, _res, next) => {
const fullUrl = getFullUrl(req)
const headers = convertExpressHeaders(req.headersDistinct)
// Convert express headers to fetch headers
const perReqStore = createPerRequestMap({
headers: convertExpressHeaders(req.headersDistinct),
headers,
fullUrl: fullUrl,
})

// By wrapping next, we ensure that all of the other handlers will use this same perReqStore
Expand Down
11 changes: 11 additions & 0 deletions packages/vite/src/serverStore.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ let PER_REQ_STORAGE: AsyncLocalStorage<ServerStore>

type InitPerReqMapParams = {
headers: Headers | Record<string, string>
fullUrl: string
serverAuthState?: ServerAuthState
}

Expand All @@ -26,13 +27,19 @@ export const createServerStorage = () => {
*/
export const createPerRequestMap = ({
headers,
fullUrl: urlHref,
serverAuthState,
}: InitPerReqMapParams) => {
const reqStore = new Map()

const headersObj = new Headers(headers)
reqStore.set('headers', headersObj)

reqStore.set('fullUrl', urlHref)

// const location = new URL(headersObj.get('url') as string)
// reqStore.set('location', location)

if (serverAuthState) {
reqStore.set('serverAuthState', serverAuthState)
}
Expand Down Expand Up @@ -66,6 +73,10 @@ export const getAuthState = (): ServerAuthState => {
return getStore()?.get('serverAuthState')
}

export const getLocation = (): URL => {
return new URL(getStore()?.get('fullUrl'))
}

export const setServerAuthState = (authState: ServerAuthState) => {
const store = getStore()
store?.set('serverAuthState', authState)
Expand Down
4 changes: 4 additions & 0 deletions packages/vite/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,7 @@ export function convertExpressHeaders(

return headers
}

export const getFullUrl = (req: ExpressRequest) => {
return req.protocol + '://' + req.get('host') + req.originalUrl
}

0 comments on commit 703a9b4

Please sign in to comment.