Skip to content

Commit

Permalink
feat(server): support Timing-Allow-Origin in CORSPlugin (#124)
Browse files Browse the repository at this point in the history
* feat(server): support Timing-Allow-Origin in CORSPlugin

* Update packages/server/src/plugins/cors.ts

Co-authored-by: Alexander Niebuhr <alexander@nbhr.io>

* improve

* improve

---------

Co-authored-by: Alexander Niebuhr <alexander@nbhr.io>
  • Loading branch information
unnoq and alexanderniebuhr authored Feb 6, 2025
1 parent caefe3a commit b825e0c
Showing 1 changed file with 22 additions and 5 deletions.
27 changes: 22 additions & 5 deletions packages/server/src/plugins/cors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ import type { Plugin } from './base'
import { value, type Value } from '@orpc/shared'

export interface CORSOptions<TContext extends Context> {
origin: Value<string | string[] | null | undefined, [origin: string, options: StandardHandlerInterceptorOptions<TContext>]>
origin?: Value<string | string[] | null | undefined, [origin: string, options: StandardHandlerInterceptorOptions<TContext>]>
timingOrigin?: Value<string | string[] | null | undefined, [origin: string, options: StandardHandlerInterceptorOptions<TContext>]>
allowMethods?: string[]
allowHeaders?: string[]
maxAge?: number
Expand All @@ -21,6 +22,10 @@ export class CORSPlugin<TContext extends Context> implements Plugin<TContext> {
allowMethods: ['GET', 'HEAD', 'PUT', 'POST', 'DELETE', 'PATCH'],
}

if (options?.credentials) {
defaults.origin = origin => origin
}

this.options = {
...defaults,
...options,
Expand Down Expand Up @@ -76,17 +81,29 @@ export class CORSPlugin<TContext extends Context> implements Plugin<TContext> {
: interceptorOptions.request.headers.origin || ''

const allowedOrigin = await value(this.options.origin, origin, interceptorOptions)

const allowedOriginArr = Array.isArray(allowedOrigin) ? allowedOrigin : [allowedOrigin]

if (allowedOriginArr.includes(origin) || allowedOriginArr.includes('*')) {
result.response.headers['access-control-allow-origin'] = origin
if (allowedOriginArr.includes('*')) {
result.response.headers['access-control-allow-origin'] = '*'
}
else {
if (allowedOriginArr.includes(origin)) {
result.response.headers['access-control-allow-origin'] = origin
}

if (!allowedOriginArr.includes('*')) {
result.response.headers.vary = interceptorOptions.request.headers.vary ?? 'origin'
}

const allowedTimingOrigin = await value(this.options.timingOrigin, origin, interceptorOptions)
const allowedTimingOriginArr = Array.isArray(allowedTimingOrigin) ? allowedTimingOrigin : [allowedTimingOrigin]

if (allowedTimingOriginArr.includes('*')) {
result.response.headers['timing-allow-origin'] = '*'
}
else if (allowedTimingOriginArr.includes(origin)) {
result.response.headers['timing-allow-origin'] = origin
}

if (this.options.credentials) {
result.response.headers['access-control-allow-credentials'] = 'true'
}
Expand Down

0 comments on commit b825e0c

Please sign in to comment.