Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/aws-lambda/src/response.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ describe('sendStandardResponse', () => {
it('buffered (empty)', async () => {
const responseStream = createResponseStream()

const options = { eventStream: { keepAlive: { enabled: true } } }
const options = { eventStream: { keepAlive: true } }
await sendStandardResponse(
responseStream,
{
Expand Down
16 changes: 8 additions & 8 deletions packages/aws-lambda/src/response.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import type { StandardResponse } from '@standard-server/core'
import type { ToNodeHttpBodyOptions } from '@standard-server/node'
import {
canWriteToNodeResponse,
canWriteNodeHttpResponse,
destroyNodeHttpBody,
getNodeResponseError,
isNodeResponseDisconnectError,
getNodeHttpResponseError,
isNodeHttpResponseDisconnectError,
toNodeHttpBody,
} from '@standard-server/node'

Expand Down Expand Up @@ -36,12 +36,12 @@ export async function sendStandardResponse(
)

return new Promise((resolve, reject) => {
if (!canWriteToNodeResponse(responseStream)) {
const error = getNodeResponseError(responseStream)
if (!canWriteNodeHttpResponse(responseStream)) {
const error = getNodeHttpResponseError(responseStream)

destroyNodeHttpBody(resBody, error, reject)

if (error && !isNodeResponseDisconnectError(error)) {
if (error && !isNodeHttpResponseDisconnectError(error)) {
reject(error)
} else {
resolve()
Expand All @@ -51,7 +51,7 @@ export async function sendStandardResponse(
}

responseStream.once('error', (error) => {
if (!isNodeResponseDisconnectError(error)) {
if (!isNodeHttpResponseDisconnectError(error)) {
reject(error)
}
})
Expand Down Expand Up @@ -80,7 +80,7 @@ export async function sendStandardResponse(
} else {
res.once('close', () => {
if (!resBody.closed) {
resBody.destroy(getNodeResponseError(res) ?? undefined)
resBody.destroy(getNodeHttpResponseError(res) ?? undefined)
}
})

Expand Down
12 changes: 6 additions & 6 deletions packages/core/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ Standard Server uses [AsyncIteratorObject](https://developer.mozilla.org/en-US/d

```ts
import type { StandardResponse } from '@standard-server/core'
import { ErrorEvent, withEventMeta } from '@standard-server/core'
import { EventStreamErrorEvent, withEventMeta } from '@standard-server/core'

const response: StandardResponse = {
status: 200,
Expand All @@ -175,7 +175,7 @@ const response: StandardResponse = {
{ id: '1', retry: 3000, comments: ['hidden'] },
)

throw new ErrorEvent({ message: 'Something went wrong' })
throw new EventStreamErrorEvent({ message: 'Something went wrong' })

return { message: 'This is the end of the stream' }
})(),
Expand Down Expand Up @@ -463,13 +463,13 @@ The package also exports:

- `EventStreamEncoderError` for invalid outbound SSE messages
- `EventStreamDecoderError` for incomplete or invalid inbound stream decoding
- `ErrorEvent` for wrapping structured event-stream error payloads in an `Error`
- `assertEventStreamMessageId()`, `assertEventStreamMessageName()`, `assertEventStreamMessageRetry()`, and `assertEventStreamMessageComment()` for low-level validation when building custom SSE tooling
- `EventStreamErrorEvent` for wrapping structured event-stream error payloads in an `Error`
- `assertEventStreamMessageId()`, `assertEventStreamMessageEvent()`, `assertEventStreamMessageRetry()`, and `assertEventStreamMessageComment()` for low-level validation when building custom SSE tooling

```ts
import { ErrorEvent } from '@standard-server/core'
import { EventStreamErrorEvent } from '@standard-server/core'

const error = new ErrorEvent(
const error = new EventStreamErrorEvent(
{ code: 'E_STREAM', detail: 'Connection lost' },
{ message: 'stream error' },
)
Expand Down
6 changes: 3 additions & 3 deletions packages/core/src/event-stream/encoder.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { decodeEventStreamMessage } from './decoder.ts'
import {
assertEventStreamMessageComment,
assertEventStreamMessageId,
assertEventStreamMessageName,
assertEventStreamMessageEvent,
assertEventStreamMessageRetry,
encodeEventStreamMessage,
encodeEventStreamMessageComments,
Expand Down Expand Up @@ -51,7 +51,7 @@ describe('predicates', () => {
describe('assertions', () => {
it('accept values without line breaks', () => {
expect(() => assertEventStreamMessageId('123')).not.toThrow()
expect(() => assertEventStreamMessageName('message')).not.toThrow()
expect(() => assertEventStreamMessageEvent('message')).not.toThrow()
expect(() => assertEventStreamMessageComment('hi')).not.toThrow()
expect(() => assertEventStreamMessageRetry(0)).not.toThrow()
expect(() => assertEventStreamMessageRetry(10000)).not.toThrow()
Expand All @@ -67,7 +67,7 @@ describe('assertions', () => {

it('reject event names containing line breaks', () => {
for (const lineBreak of ['\n', '\r', '\r\n']) {
expect(() => assertEventStreamMessageName(`hi${lineBreak}`)).toThrow(
expect(() => assertEventStreamMessageEvent(`hi${lineBreak}`)).toThrow(
"Event's event must not contain a carriage return or newline character",
)
}
Expand Down
4 changes: 2 additions & 2 deletions packages/core/src/event-stream/encoder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ export function assertEventStreamMessageId(id: string): void {
}
}

export function assertEventStreamMessageName(event: string): void {
export function assertEventStreamMessageEvent(event: string): void {
if (containsEventStreamLineBreak(event)) {
throw new EventStreamEncoderError(
"Event's event must not contain a carriage return or newline character",
Expand Down Expand Up @@ -81,7 +81,7 @@ export function encodeEventStreamMessage(message: EventStreamMessage): string {
// 'message' is the default for a message with data. Without data, keep it
// so the message is not mistaken for a comment.
if (message.event !== undefined && (message.event !== 'message' || message.data === undefined)) {
assertEventStreamMessageName(message.event)
assertEventStreamMessageEvent(message.event)

output += `event: ${message.event}\n`
}
Expand Down
8 changes: 5 additions & 3 deletions packages/core/src/event-stream/error.test.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import { ErrorEvent } from './error.ts'
import { EventStreamErrorEvent } from './error.ts'

it('errorEvent', () => {
const errorEvent = new ErrorEvent('data', { cause: 'cause' })
const errorEvent = new EventStreamErrorEvent('data', { cause: 'cause' })

expect(errorEvent.message).toBe('Error Event')
expect(errorEvent.cause).toBe('cause')
expect(errorEvent.data).toBe('data')

const errorEventWithCustomMessage = new ErrorEvent('data', { message: 'custom message' })
const errorEventWithCustomMessage = new EventStreamErrorEvent('data', {
message: 'custom message',
})
expect(errorEventWithCustomMessage.message).toBe('custom message')
})
10 changes: 5 additions & 5 deletions packages/core/src/event-stream/error.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
export class EventStreamEncoderError extends TypeError {}
export class EventStreamDecoderError extends TypeError {}

export interface ErrorEventOptions extends ErrorOptions {
message?: string
export interface EventStreamErrorEventOptions extends ErrorOptions {
message?: string | undefined
}

export class ErrorEvent extends Error {
export class EventStreamErrorEvent extends Error {
constructor(
public data: unknown,
options: ErrorEventOptions = {},
options: EventStreamErrorEventOptions = {},
) {
super(options?.message ?? 'Error Event', options)
super(options.message ?? 'Error Event', options)
}
}
6 changes: 3 additions & 3 deletions packages/core/src/event-stream/meta.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { getOrBind, isTypescriptObject } from '@standard-server/shared'
import { getOrBind, isNonPrimitive } from '@standard-server/shared'

import {
assertEventStreamMessageComment,
Expand Down Expand Up @@ -59,7 +59,7 @@ export function withEventMeta<T extends object>(container: T, meta: EventMeta):
* Unwraps an iterator event value and extracts its associated metadata.
*/
export function unwrapEvent<T>(container: T): [data: T, meta: EventMeta | undefined] {
if (!isTypescriptObject(container)) {
if (!isNonPrimitive(container)) {
return [container, undefined]
}

Expand All @@ -74,7 +74,7 @@ export function unwrapEvent<T>(container: T): [data: T, meta: EventMeta | undefi
* Retrieves metadata attached to a single iterator event value.
*/
export function getEventMeta(container: unknown): EventMeta | undefined {
if (!isTypescriptObject(container)) {
if (!isNonPrimitive(container)) {
return undefined
}

Expand Down
8 changes: 4 additions & 4 deletions packages/core/src/validators.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { isTypescriptObject } from '@standard-server/shared'
import { isNonPrimitive } from '@standard-server/shared'

import type {
StandardHeaders,
Expand All @@ -17,7 +17,7 @@ export function isStandardUrl(maybe: unknown): maybe is StandardUrl {
}

export function isStandardHeaders(maybe: unknown): maybe is StandardHeaders {
if (!isTypescriptObject(maybe)) {
if (!isNonPrimitive(maybe)) {
return false
}

Expand All @@ -34,7 +34,7 @@ export function isStandardStatus(maybe: unknown): maybe is number {
}

export function isStandardRequest(maybe: unknown): maybe is StandardRequest {
if (!isTypescriptObject(maybe)) {
if (!isNonPrimitive(maybe)) {
return false
}

Expand All @@ -48,7 +48,7 @@ export function isStandardRequest(maybe: unknown): maybe is StandardRequest {
}

export function isStandardResponse(maybe: unknown): maybe is StandardResponse {
if (!isTypescriptObject(maybe)) {
if (!isNonPrimitive(maybe)) {
return false
}

Expand Down
8 changes: 4 additions & 4 deletions packages/fastify/src/response.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ describe('sendStandardResponse', () => {
const fastify = Fastify()
onTestFinished(() => fastify.close())

const options = { eventStream: { keepAlive: { enabled: true } } }
const options = { eventStream: { keepAlive: true } }
fastify.get('/', async (req, reply) => {
sendSpy = vi.spyOn(reply, 'send')

Expand Down Expand Up @@ -67,7 +67,7 @@ describe('sendStandardResponse', () => {
const fastify = Fastify()
onTestFinished(() => fastify.close())

const options = { eventStream: { keepAlive: { enabled: true } } }
const options = { eventStream: { keepAlive: true } }
fastify.get('/', async (req, reply) => {
sendSpy = vi.spyOn(reply, 'send')

Expand Down Expand Up @@ -140,7 +140,7 @@ describe('sendStandardResponse', () => {
const fastify = Fastify()
onTestFinished(() => fastify.close())

const options = { eventStream: { keepAlive: { enabled: true } } }
const options = { eventStream: { keepAlive: true } }
fastify.get('/', async (req, reply) => {
sendSpy = vi.spyOn(reply, 'send')

Expand Down Expand Up @@ -198,7 +198,7 @@ describe('sendStandardResponse', () => {
const fastify = Fastify()
onTestFinished(() => fastify.close())

const options = { eventStream: { keepAlive: { enabled: true } } }
const options = { eventStream: { keepAlive: true } }
fastify.get('/', async (req, reply) => {
sendSpy = vi.spyOn(reply, 'send')

Expand Down
14 changes: 7 additions & 7 deletions packages/fastify/src/response.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import type { StandardResponse } from '@standard-server/core'
import type { ToNodeHttpBodyOptions } from '@standard-server/node'
import {
canWriteToNodeResponse,
canWriteNodeHttpResponse,
destroyNodeHttpBody,
getNodeResponseError,
isNodeResponseDisconnectError,
getNodeHttpResponseError,
isNodeHttpResponseDisconnectError,
toNodeHttpBody,
} from '@standard-server/node'

Expand All @@ -24,12 +24,12 @@ export async function sendStandardResponse(
)

return new Promise((resolve, reject) => {
if (!canWriteToNodeResponse(reply.raw)) {
const error = getNodeResponseError(reply.raw)
if (!canWriteNodeHttpResponse(reply.raw)) {
const error = getNodeHttpResponseError(reply.raw)

destroyNodeHttpBody(resBody, error, reject)

if (error && !isNodeResponseDisconnectError(error)) {
if (error && !isNodeHttpResponseDisconnectError(error)) {
reject(error)
} else {
resolve()
Expand All @@ -41,7 +41,7 @@ export async function sendStandardResponse(
const connection = 'stream' in reply.raw ? reply.raw.stream : reply.raw

connection.once('error', (error) => {
if (!isNodeResponseDisconnectError(error)) {
if (!isNodeHttpResponseDisconnectError(error)) {
reject(error)
}
})
Expand Down
2 changes: 1 addition & 1 deletion packages/fetch/src/body.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -502,7 +502,7 @@ describe('toFetchBody', () => {
yield 123
return 456
}
const options = { eventStream: { keepAlive: { enabled: false } } }
const options = { eventStream: { keepAlive: false } }
const [body, headers] = toFetchBody(gen(), baseHeaders, options)

expect(toEventStreamSpy).toHaveBeenCalledWith(gen(), options.eventStream)
Expand Down
6 changes: 3 additions & 3 deletions packages/fetch/src/body.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ export interface ToStandardBodyOptions {
*/
export async function toStandardBody(
re: Request | Response,
options?: ToStandardBodyOptions,
options: ToStandardBodyOptions = {},
): Promise<StandardBody> {
const hint =
options?.hint ??
options.hint ??
resolveStandardBodyHint({
'standard-server': re.headers.get('standard-server') ?? undefined,
'content-type': re.headers.get('content-type') ?? undefined,
Expand Down Expand Up @@ -87,7 +87,7 @@ export interface ToFetchBodyOptions {
/**
* Options for the event stream, like keep-alive settings, initial comment, etc.
*/
eventStream?: ToEventStreamOptions
eventStream?: ToEventStreamOptions | undefined
}

/**
Expand Down
Loading
Loading