Config
Eden Treaty는 2개의 매개변수를 받습니다:
- urlOrInstance - URL 엔드포인트 또는 Elysia 인스턴스
- options (선택 사항) - fetch 동작 커스터마이징
urlOrInstance
URL 엔드포인트를 문자열로 받거나 리터럴 Elysia 인스턴스를 받습니다.
Eden은 타입에 따라 다음과 같이 동작을 변경합니다:
URL 엔드포인트 (문자열)
URL 엔드포인트가 전달되면, Eden Treaty는 fetch 또는 config.fetcher를 사용하여 Elysia 인스턴스에 네트워크 요청을 생성합니다.
import { treaty } from '@elysiajs/eden'
import type { App } from './server'
const api = treaty<App>('localhost:3000')URL 엔드포인트에 프로토콜을 지정할 수도 있고 지정하지 않을 수도 있습니다.
Elysia는 다음과 같이 엔드포인트를 자동으로 추가합니다:
- 프로토콜이 지정되면 URL을 직접 사용
- URL이 localhost이고 ENV가 production이 아니면 http 사용
- 그렇지 않으면 https 사용
이는 ws:// 또는 wss://를 결정하는 Web Socket에도 적용됩니다.
Elysia 인스턴스
Elysia 인스턴스가 전달되면, Eden Treaty는 Request 클래스를 생성하고 네트워크 요청을 생성하지 않고 직접 Elysia.handle에 전달합니다.
이를 통해 요청 오버헤드 없이 또는 서버를 시작할 필요 없이 Elysia 서버와 직접 상호 작용할 수 있습니다.
import { Elysia } from 'elysia'
import { treaty } from '@elysiajs/eden'
const app = new Elysia()
.get('/hi', 'Hi Elysia')
.listen(3000)
const api = treaty(app)인스턴스가 전달되면, Eden Treaty가 매개변수에서 직접 타입을 추론할 수 있으므로 제네릭을 전달할 필요가 없습니다.
이 패턴은 단위 테스트를 수행하거나 타입 안전한 리버스 프록시 서버 또는 마이크로서비스를 생성하는 데 권장됩니다.
Options
fetch 동작을 커스터마이징하기 위한 Eden Treaty의 2번째 선택적 매개변수로, 다음 매개변수를 받습니다:
- fetch - fetch 초기화에 기본 매개변수 추가 (RequestInit)
- headers - 기본 헤더 정의
- fetcher - 커스텀 fetch 함수 예: Axios, unfetch
- onRequest - 실행 전에 fetch 요청 가로채기 및 수정
- onResponse - fetch의 응답 가로채기 및 수정
Fetch
fetch의 2번째 매개변수에 추가되는 기본 매개변수로 Fetch.RequestInit 타입을 확장합니다.
export type App = typeof app
import { treaty } from '@elysiajs/eden'
// ---cut---
treaty<App>('localhost:3000', {
fetch: {
credentials: 'include'
}
})fetch에 전달되는 모든 매개변수는 fetcher에 전달되며, 다음과 같습니다:
fetch('http://localhost:3000', {
credentials: 'include'
})Headers
fetch에 추가 기본 헤더를 제공하며, options.fetch.headers의 단축형입니다.
treaty<App>('localhost:3000', {
headers: {
'X-Custom': 'Griseo'
}
})fetch에 전달되는 모든 매개변수는 fetcher에 전달되며, 다음과 같습니다:
fetch('localhost:3000', {
headers: {
'X-Custom': 'Griseo'
}
})headers는 다음을 매개변수로 받을 수 있습니다:
- Object
- Function
Headers Object
객체가 전달되면 fetch에 직접 전달됩니다
treaty<App>('localhost:3000', {
headers: {
'X-Custom': 'Griseo'
}
})Function
조건에 따라 커스텀 헤더를 반환하도록 헤더를 함수로 지정할 수 있습니다
treaty<App>('localhost:3000', {
headers(path, options) {
if(path.startsWith('user'))
return {
authorization: 'Bearer 12345'
}
}
})객체를 반환하여 fetch 헤더에 값을 추가할 수 있습니다.
headers 함수는 2개의 매개변수를 받습니다:
- path
string- 매개변수로 전송될 경로- 참고: 호스트명은 제외됩니다 예: (/user/griseo)
- options
RequestInit: fetch의 2번째 매개변수를 통해 전달되는 매개변수
Array
여러 조건이 필요한 경우 headers 함수를 배열로 정의할 수 있습니다.
treaty<App>('localhost:3000', {
headers: [
(path, options) => {
if(path.startsWith('user'))
return {
authorization: 'Bearer 12345'
}
}
]
})Eden Treaty는 값이 이미 반환되었더라도 모든 함수를 실행합니다.
Headers 우선순위
중복되는 경우 Eden Treaty는 다음과 같이 헤더의 순서를 우선시합니다:
- 인라인 메서드 - 메서드 함수에 직접 전달
- headers -
config.headers에 전달
config.headers가 배열이면 나중에 오는 매개변수가 우선됨
- fetch -
config.fetch.headers에 전달
예를 들어, 다음 예제의 경우:
const api = treaty<App>('localhost:3000', {
headers: {
authorization: 'Bearer Aponia'
}
})
api.profile.get({
headers: {
authorization: 'Bearer Griseo'
}
})결과는 다음과 같습니다:
fetch('http://localhost:3000', {
headers: {
authorization: 'Bearer Griseo'
}
})인라인 함수가 헤더를 지정하지 않으면 결과는 "Bearer Aponia"가 됩니다.
Fetcher
환경의 기본 fetch 대신 커스텀 fetcher 함수를 제공합니다.
treaty<App>('localhost:3000', {
fetcher(url, options) {
return fetch(url, options)
}
})fetch 대신 Axios, unfetch와 같은 다른 클라이언트를 사용하려는 경우 fetch를 교체하는 것이 좋습니다.
OnRequest
실행 전에 fetch 요청을 가로채고 수정합니다.
객체를 반환하여 RequestInit에 값을 추가할 수 있습니다.
treaty<App>('localhost:3000', {
onRequest(path, options) {
if(path.startsWith('user'))
return {
headers: {
authorization: 'Bearer 12345'
}
}
}
})값이 반환되면 Eden Treaty는 반환된 값과 value.headers에 대해 얕은 병합을 수행합니다.
onRequest는 2개의 매개변수를 받습니다:
- path
string- 매개변수로 전송될 경로- 참고: 호스트명은 제외됩니다 예: (/user/griseo)
- options
RequestInit: fetch의 2번째 매개변수를 통해 전달되는 매개변수
Array
여러 조건이 필요한 경우 onRequest 함수를 배열로 정의할 수 있습니다.
treaty<App>('localhost:3000', {
onRequest: [
(path, options) => {
if(path.startsWith('user'))
return {
headers: {
authorization: 'Bearer 12345'
}
}
}
]
})Eden Treaty는 값이 이미 반환되었더라도 모든 함수를 실행합니다.
onResponse
fetch의 응답을 가로채고 수정하거나 새 값을 반환합니다.
treaty<App>('localhost:3000', {
onResponse(response) {
if(response.ok)
return response.json()
}
})onRequest는 1개의 매개변수를 받습니다:
- response
Response-fetch에서 일반적으로 반환되는 Web Standard Response
Array
여러 조건이 필요한 경우 onResponse 함수를 배열로 정의할 수 있습니다.
treaty<App>('localhost:3000', {
onResponse: [
(response) => {
if(response.ok)
return response.json()
}
]
})headers와 onRequest와 달리, Eden Treaty는 반환된 값을 찾거나 에러가 발생할 때까지 함수를 반복하며, 반환된 값은 새 응답으로 사용됩니다.
