본문으로 건너뛰기

함수 (Functions)

서버리스 함수 호출 API입니다. 함수 ID(fn_xxx)는 콘솔에서 함수를 만들면 발급됩니다.

invoke (전체 응답)

함수 실행 결과와 메타데이터를 모두 반환합니다.

typescript
// cb.functions.invoke(functionId, payload?, timeout?)
const response = await cb.functions.invoke('fn_send_email', {
  to: '[email protected]',
  subject: '안녕하세요',
  body: '메일 내용입니다.'
})

console.log(response.success)        // boolean
console.log(response.execution_id)   // 실행 ID
console.log(response.status)         // 'success' | 'error' | 'timeout'
console.log(response.result)         // 함수가 return 한 값 (Record<string, unknown>)
console.log(response.duration)       // 실행 시간 (밀리초)
console.log(response.error)          // 실패 시 에러 메시지 (선택)

call (결과만)

응답에서 result 만 추출하는 경량 래퍼입니다.

typescript
// 타입 지정 가능
interface EmailResult {
  message_id: string
  status: 'sent' | 'failed'
}

const data = await cb.functions.call<EmailResult>('fn_send_email', {
  to: '[email protected]',
  subject: '안녕하세요'
})

console.log(data.message_id, data.status)

타임아웃 설정

세 번째 인자에 초 단위 타임아웃을 전달합니다.

typescript
// 60초 타임아웃
const response = await cb.functions.invoke('fn_long_task', { id: 1 }, 60)

에러 처리

typescript
import { ApiError } from 'connectbase-client'

try {
  const data = await cb.functions.call('fn_xxx', { input: 'test' })
} catch (e) {
  if (e instanceof ApiError) {
    if (e.statusCode === 404) console.error('함수를 찾을 수 없음')
    else if (e.statusCode === 408) console.error('실행 타임아웃')
    else console.error('함수 에러:', e.statusCode, e.message)
  }
}

Cross-App 함수 호출 (invokeCrossApp, SDK 3.16+)

다른 앱(Provider)이 OAuth 로 노출한 함수를 자기 앱(Consumer) 에서 호출합니다. Consumer 가 oauth:authorize_consumer 흐름으로 발급받은 access_token 을 사용합니다.

typescript
// Provider 토큰 발급 (서버 측 / 또는 사용자 동의 흐름)
const { access_token } = await cb.functions.invokeCrossApp(
  'fn_provider_function_id',   // Provider 측 함수 ID
  { /* payload */ },
  {
    accessToken: providerToken, // Provider 가 발급한 토큰
    timeout: 60                 // 초 (선택)
  }
)

Provider 의 보호된 DB 데이터를 구독하려면 cb.database.connectRealtime({ accessToken: providerToken }) 패턴을 사용합니다.

📌 Cross-App 호출은 OAuth scope 검증을 거치므로, Provider 측에서 해당 함수가 oauth_provision_capability 로 노출되어 있어야 합니다. 자세한 흐름은 api/authentication 의 OAuth 2.0 섹션 참고.

실행 타임아웃 관리

함수 실행이 멈춘 채로 남는 stuck-running 상태를 방지하기 위해 ConnectBase 는 2-layer 안전망 을 운영합니다.

  • in-process defer 안전망: 함수 런타임이 정상 종료되면 자동으로 status: 'timeout' 으로 마무리
  • ExecutionTimeoutScheduler: 5분 주기로 sweep, 1시간 이상 status: 'running' 인 행은 강제 timeout 처리

따라서 invoke 응답이 빠르게 돌아왔더라도 status'running' 이면 비동기로 결과가 채워질 수 있습니다. 콘솔의 실행 로그 / SDK 의 get_execution 으로 최종 상태를 확인하세요.