next.js/packages/next/src/server/dev/messages.ts
messages.ts60 lines1.8 KB
import { InvariantError } from '../../shared/lib/invariant-error'
import {
  HMR_MESSAGE_SENT_TO_BROWSER,
  type BinaryHmrMessageSentToBrowser,
} from './hot-reloader-types'

export const FAST_REFRESH_RUNTIME_RELOAD =
  'Fast Refresh had to perform a full reload due to a runtime error.'

const textEncoder = new TextEncoder()

export function createBinaryHmrMessageData(
  message: BinaryHmrMessageSentToBrowser
): Uint8Array {
  switch (message.type) {
    case HMR_MESSAGE_SENT_TO_BROWSER.ERRORS_TO_SHOW_IN_BROWSER: {
      const { serializedErrors } = message
      const totalLength = 1 + serializedErrors.length
      const data = new Uint8Array(totalLength)
      const view = new DataView(data.buffer)

      view.setUint8(0, HMR_MESSAGE_SENT_TO_BROWSER.ERRORS_TO_SHOW_IN_BROWSER)
      data.set(serializedErrors, 1)

      return data
    }
    case HMR_MESSAGE_SENT_TO_BROWSER.REACT_DEBUG_CHUNK: {
      const { requestId, chunk } = message
      const requestIdBytes = textEncoder.encode(requestId)
      const requestIdLength = requestIdBytes.length

      if (requestIdLength > 255) {
        throw new InvariantError(
          'Request ID is too long for the binary HMR message.'
        )
      }

      const chunkLength = chunk ? chunk.length : 0
      const totalLength = 2 + requestIdLength + chunkLength
      const data = new Uint8Array(totalLength)
      const view = new DataView(data.buffer)

      view.setUint8(0, HMR_MESSAGE_SENT_TO_BROWSER.REACT_DEBUG_CHUNK)
      view.setUint8(1, requestIdLength)
      textEncoder.encodeInto(requestId, data.subarray(2, 2 + requestIdLength))

      if (chunk) {
        data.set(chunk, 2 + requestIdLength)
      }

      return data
    }
    default: {
      throw new InvariantError(
        `Invalid binary HMR message of type ${(message as any).type}`
      )
    }
  }
}
Quest for Codev2.0.0
/
SIGN IN