import {apiUrl} from '@fudge-ai/javascript/dist/config' import {fudgeLog} from '@fudge-ai/javascript/dist/utils/fudgeLog' import {FudgeContext, NodeEventPayload} from '@fudge-ai/utils' import {FudgeEventWithId} from '@fudge-ai/utils/dist/events' import {getContext} from './context' const pendingEvents: Promise[] = [] const _postEvent = async (event: FudgeEventWithId) => { const context = getContext() const fudgeContext: FudgeContext | undefined = context?.get('fudgeContext') if (!fudgeContext) { fudgeLog.info('onEvent called - no fudgeContext') return } const url = process.env.EVENT_POST_URL || apiUrl('/event') fudgeLog.info('POST EVENT') fudgeLog.info('URL:', url) fudgeLog.info('CONTEXT:', fudgeContext) fudgeLog.info('EVENT:', event) const body: NodeEventPayload = { event, ...fudgeContext, } await fetch(url, { method: 'POST', body: JSON.stringify(body), headers: { 'Content-Type': 'application/json', }, }).then((res) => res.text()) } export const postEvent = async (event: FudgeEventWithId) => { const timeStarted = Date.now() try { const promise = _postEvent(event) pendingEvents.push(promise) await promise.then((res) => { const duration = Date.now() - timeStarted fudgeLog.info('POST success', `(${duration}ms)`, res) }) pendingEvents.splice(pendingEvents.indexOf(promise), 1) } catch (error) { fudgeLog.error('Failed to send event', error) } } const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)) export const waitForPendingEvents = async () => { try { fudgeLog.info(`Waiting for ${pendingEvents.length} pending event(s)`) const result = await Promise.race([ Promise.allSettled(pendingEvents).then(() => 'Sent events'), sleep(process.env.NODE_ENV === 'development' ? 5000 : 1000).then(() => 'Timed out'), ]) fudgeLog.info(result) } catch (error) { fudgeLog.error(error) } }