{"version":3,"sources":["../src/resolve.ts","../src/constants.ts","../src/errors.ts","../src/links/internal/transformer.ts","../src/utils/file.ts","../src/utils/http.ts","../src/utils/parse.ts","../src/http.ts","../src/links/internal/observable.ts","../src/links/internal/universal-requester.ts","../src/links/http-link.ts","../src/ws.ts"],"sourcesContent":["import type { AnyElysia } from 'elysia'\n\nimport type { EdenConfig } from './config'\nimport { DEMO_DOMAIN, IS_SERVER, LOOPBACK_ADDRESSES } from './constants'\nimport { EdenFetchError } from './errors'\nimport type { InferRouteBody, InferRouteOptions } from './infer'\nimport { getDataTransformer } from './links/internal/transformer'\nimport type { EdenRequestOptions, EdenResponse } from './request'\nimport { hasFile } from './utils/file'\nimport { isGetOrHeadMethod } from './utils/http'\nimport { parseStringifiedValue } from './utils/parse'\nimport { EdenWS } from './ws'\n\nfunction createNewFile(v: File) {\n  if (IS_SERVER) {\n    return v\n  }\n\n  return new Promise<File>((resolve) => {\n    const reader = new FileReader()\n\n    reader.onload = () => {\n      const filebits = reader.result != null ? [reader.result] : []\n      const name = v.name\n      const lastModified = v.lastModified\n      const type = v.type\n\n      const file = new File(filebits, name, { lastModified, type })\n\n      resolve(file)\n    }\n\n    reader.readAsArrayBuffer(v)\n  })\n}\n\nasync function processHeaders(\n  configHeaders: EdenConfig['headers'],\n  path: string,\n  options: RequestInit = {},\n  headers: Record<string, string> = {},\n): Promise<Record<string, string>> {\n  if (Array.isArray(configHeaders)) {\n    for (const value of configHeaders)\n      if (!Array.isArray(value)) {\n        headers = await processHeaders(value, path, options, headers)\n      } else {\n        const key = value[0]\n        if (typeof key === 'string') {\n          headers[key.toLowerCase()] = value[1] as string\n        } else {\n          for (const [k, value] of key) {\n            if (k) {\n              headers[k.toLowerCase()] = value as string\n            }\n          }\n        }\n      }\n\n    return headers\n  }\n\n  if (!configHeaders) {\n    return headers\n  }\n\n  switch (typeof configHeaders) {\n    case 'function': {\n      if (configHeaders instanceof Headers) {\n        return processHeaders(configHeaders, path, options, headers)\n      }\n\n      const customHeaders = await configHeaders(path, options)\n\n      if (customHeaders) {\n        return processHeaders(customHeaders, path, options, headers)\n      }\n\n      return headers\n    }\n\n    case 'object': {\n      if (configHeaders instanceof Headers) {\n        configHeaders.forEach((value, key) => {\n          headers[key.toLowerCase()] = value\n        })\n\n        return headers\n      }\n\n      for (const [key, value] of Object.entries(configHeaders)) {\n        headers[key.toLowerCase()] = value\n      }\n\n      return headers\n    }\n\n    default: {\n      return headers\n    }\n  }\n}\n\nexport async function* streamResponse(response: Response) {\n  const body = response.body\n\n  if (!body) return\n\n  const reader = body.getReader()\n  const decoder = new TextDecoder()\n\n  try {\n    while (true) {\n      const { done, value } = await reader.read()\n\n      if (done) break\n\n      const data = decoder.decode(value)\n\n      yield parseStringifiedValue(data)\n    }\n  } finally {\n    reader.releaseLock()\n  }\n}\n\nfunction buildQueryString(query?: any) {\n  let q = ''\n\n  if (!query) {\n    return q\n  }\n\n  for (const [key, value] of Object.entries(query)) {\n    if (Array.isArray(value)) {\n      for (const v of value) {\n        q += (q ? '&' : '?') + `${encodeURIComponent(key)}=${encodeURIComponent(v)}`\n      }\n    } else if (typeof value === 'object') {\n      const stringifiedValue = JSON.stringify(value)\n      q += (q ? '&' : '?') + `${encodeURIComponent(key)}=${encodeURIComponent(stringifiedValue)}`\n    } else if (value != null) {\n      q += (q ? '&' : '?') + `${encodeURIComponent(key)}=${encodeURIComponent(`${value}`)}`\n    }\n  }\n\n  return q\n}\n\nexport async function parseResponse<T extends AnyElysia = AnyElysia, TRaw extends boolean = false>(\n  response: Response,\n  params?: EdenRequestParams<T, TRaw>,\n) {\n  if (params?.onResponse != null) {\n    const onResponse = Array.isArray(params.onResponse) ? params.onResponse : [params.onResponse]\n\n    for (const value of onResponse) {\n      try {\n        const data = await value(response.clone())\n        if (data != null) {\n          return { data, error: null, status: response.status }\n        }\n      } catch (err) {\n        const error = err instanceof EdenFetchError ? err : new EdenFetchError(422, err)\n        return { data: null, error, status: response.status }\n      }\n    }\n  }\n\n  let data: any\n\n  switch (response.headers.get('Content-Type')?.split(';')[0]) {\n    case 'text/event-stream': {\n      data = streamResponse(response)\n      break\n    }\n\n    case 'application/json': {\n      data = await response.json()\n\n      const transformer = getDataTransformer(params?.transformer)\n\n      const deserialize = transformer?.output.deserialize\n\n      if (deserialize != null) {\n        data = deserialize(data)\n      }\n\n      break\n    }\n\n    case 'application/octet-stream': {\n      data = await response.arrayBuffer()\n      break\n    }\n\n    case 'multipart/form-data': {\n      const temp = await response.formData()\n\n      data = {}\n\n      temp.forEach((value, key) => {\n        data[key] = value\n      })\n\n      break\n    }\n\n    default: {\n      data = await response.text().then(parseStringifiedValue)\n    }\n  }\n\n  if (response.status >= 300 || response.status < 200) {\n    const error = new EdenFetchError(response.status, data)\n    return {\n      data: null,\n      error,\n      status: response.status,\n      statusText: response.statusText,\n    }\n  } else {\n    return {\n      data,\n      error: null,\n      status: response.status,\n      statusText: response.statusText,\n    }\n  }\n}\n\n/**\n * Parameters that control how an Eden request is resolved.\n */\nexport type EdenRequestParams<\n  T extends AnyElysia = AnyElysia,\n  TRaw extends boolean = false,\n> = EdenRequestOptions<T, TRaw> & {\n  /**\n   */\n  domain?: T | string\n\n  /**\n   * Fetch options for a \"query\" method, i.e. \"GET\", \"HEAD\", \"OPTIONS\".\n   */\n  options?: InferRouteOptions\n\n  /**\n   * The request body for \"POST\", \"PATCH\", etc. requests.\n   */\n  body?: InferRouteBody\n\n  /**\n   */\n  path?: string\n\n  /**\n   */\n  method?: string\n}\n\nexport async function resolveEdenRequest<\n  T extends AnyElysia = AnyElysia,\n  TRaw extends boolean = false,\n>(params: EdenRequestParams<T, TRaw>): Promise<EdenResponse<TRaw> | EdenWS> {\n  let path = params.path ?? ''\n\n  if (params.options?.params != null) {\n    Object.entries(params.options.params).forEach(([key, value]) => {\n      if (value != null) {\n        path = path.replace(`:${key}`, String(value))\n      }\n    })\n  }\n\n  const isGetOrHead = isGetOrHeadMethod(params.method)\n\n  const headers = await processHeaders(params.headers, path, params.options?.headers)\n\n  const q = buildQueryString(params.options?.query)\n\n  if (params.method === 'subscribe') {\n    const domain = typeof params.domain === 'string' ? params.domain : DEMO_DOMAIN\n\n    const protocol = domain.startsWith('https://')\n      ? 'wss://'\n      : domain.startsWith('http://')\n        ? 'ws://'\n        : LOOPBACK_ADDRESSES.find((address) => domain.includes(address))\n          ? 'ws://'\n          : 'wss://'\n\n    const origin = domain.replace(/^([^]+):\\/\\//, protocol)\n\n    const url = origin + path + q\n\n    return new EdenWS(url)\n  }\n\n  let fetchInit = {\n    method: params.method?.toUpperCase(),\n    body: params.body as any,\n    ...params.fetch,\n    headers,\n  } satisfies BunFetchRequestInit\n\n  fetchInit.headers = {\n    ...headers,\n    ...(await processHeaders(params.options?.headers, path, fetchInit)),\n  }\n\n  if (isGetOrHead) {\n    delete fetchInit.body\n  }\n\n  if (params.onRequest) {\n    const onRequest = Array.isArray(params.onRequest) ? params.onRequest : [params.onRequest]\n\n    for (const value of onRequest) {\n      const temp = await value(path, fetchInit)\n\n      if (typeof temp === 'object')\n        fetchInit = {\n          ...fetchInit,\n          ...temp,\n          headers: {\n            ...fetchInit.headers,\n            ...(await processHeaders(temp?.headers, path, fetchInit)),\n          },\n        }\n    }\n  }\n\n  // ? Duplicate because end-user might add a body in onRequest\n  if (isGetOrHead) {\n    delete fetchInit.body\n  }\n\n  // Don't handle raw FormData if given.\n  if (FormData != null && params.body instanceof FormData) {\n    // noop\n  } else if (hasFile(params.body as any)) {\n    const formData = new FormData()\n\n    // FormData is 1 level deep\n    for (const [key, field] of Object.entries(fetchInit.body)) {\n      if (IS_SERVER) {\n        formData.append(key, field as any)\n\n        continue\n      }\n\n      if (field instanceof File) {\n        formData.append(key, await createNewFile(field as any))\n\n        continue\n      }\n\n      if (field instanceof FileList) {\n        for (let i = 0; i < field.length; i++)\n          formData.append(key as any, await createNewFile((field as any)[i]))\n\n        continue\n      }\n\n      if (Array.isArray(field)) {\n        for (let i = 0; i < field.length; i++) {\n          const value = (field as any)[i]\n\n          formData.append(key as any, value instanceof File ? await createNewFile(value) : value)\n        }\n\n        continue\n      }\n\n      formData.append(key, field as string)\n    }\n\n    // We don't do this because we need to let the browser set the content type with the correct boundary\n    // fetchInit.headers['content-type'] = 'multipart/form-data'\n    fetchInit.body = formData\n  } else if (typeof params.body === 'object') {\n    fetchInit.headers['content-type'] = 'application/json'\n\n    const transformer = getDataTransformer(params.transformer)\n\n    const body = transformer ? transformer.input.serialize(params.body) : params.body\n\n    fetchInit.body = JSON.stringify(body)\n  } else if (params.body !== null) {\n    fetchInit.headers['content-type'] = 'text/plain'\n  }\n\n  if (isGetOrHead) {\n    delete fetchInit.body\n  }\n\n  if (params.onRequest) {\n    const onRequest = Array.isArray(params.onRequest) ? params.onRequest : [params.onRequest]\n\n    for (const value of onRequest) {\n      const temp = await value(path, fetchInit)\n\n      if (typeof temp === 'object')\n        fetchInit = {\n          ...fetchInit,\n          ...temp,\n          headers: {\n            ...fetchInit.headers,\n            ...(await processHeaders(temp?.headers, path, fetchInit)),\n          } as Record<string, string>,\n        }\n    }\n  }\n\n  const domain = typeof params.domain === 'string' ? params.domain : ''\n\n  const url = domain + path + q\n\n  const elysia = typeof params.domain === 'string' ? undefined : params.domain\n\n  const fetcher = params.fetcher ?? globalThis.fetch\n\n  const response = await (elysia?.handle(new Request(url, fetchInit)) ?? fetcher(url, fetchInit))\n\n  const edenResponse = await parseResponse(response, params)\n\n  if (edenResponse.data !== null) {\n    return {\n      ...edenResponse,\n      ...(params.raw && { response, headers: response.headers, statusText: response.statusText }),\n    } as EdenResponse\n  }\n\n  if (response.status >= 300 || response.status < 200) {\n    edenResponse.error = new EdenFetchError(response.status, edenResponse.data)\n    edenResponse.data = null\n  }\n\n  return {\n    ...edenResponse,\n    ...(params.raw && { response, headers: response.headers, statusText: response.statusText }),\n  } as EdenResponse\n}\n","export const GET_OR_HEAD_HTTP_METHODS = ['get', 'head', 'subscribe'] as const\n\nexport const HTTP_METHODS = [\n  ...GET_OR_HEAD_HTTP_METHODS,\n  'post',\n  'put',\n  'delete',\n  'patch',\n  'options',\n  'connect',\n] as const\n\nexport const LOOPBACK_ADDRESSES = ['localhost', '127.0.0.1', '0.0.0.0']\n\nexport const IS_SERVER = typeof FileList === 'undefined'\n\nexport const CLIENT_WARNING =\n  'Elysia instance server found on client side, this is not recommended for security reason. Use generic type instead.'\n\nexport const DEMO_DOMAIN = 'http://e.ly'\n\nexport const ISO8601_REGEX =\n  /(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))/\n\nexport const FORMAL_DATE_REGEX =\n  /(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)\\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s\\d{2}\\s\\d{4}\\s\\d{2}:\\d{2}:\\d{2}\\sGMT(?:\\+|-)\\d{4}\\s\\([^)]+\\)/\n\nexport const SHORTENED_DATE_REGEX =\n  /^(?:(?:(?:(?:0?[1-9]|[12][0-9]|3[01])[/\\s-](?:0?[1-9]|1[0-2])[/\\s-](?:19|20)\\d{2})|(?:(?:19|20)\\d{2}[/\\s-](?:0?[1-9]|1[0-2])[/\\s-](?:0?[1-9]|[12][0-9]|3[01]))))(?:\\s(?:1[012]|0?[1-9]):[0-5][0-9](?::[0-5][0-9])?(?:\\s[AP]M)?)?$/\n\nexport const BATCH_ENDPOINT = '/batch'\n","import type { AnyElysia } from 'elysia'\n\nimport type { Range } from './utils/types'\n\nexport class EdenFetchError<Status extends number = number, Value = unknown> extends Error {\n  constructor(\n    public status: Status,\n    public value: Value,\n  ) {\n    super(value + '')\n  }\n}\n\nexport class EdenFatalError extends Error {\n  static throw() {\n    return new EdenFatalError()\n  }\n\n  constructor() {\n    super(\n      'Something went wrong. Please submit an issue at https://github.com/aydee-app/eden-query/issues/new',\n    )\n  }\n}\n\nexport type MapError<T extends Record<number, unknown>> = [\n  {\n    [K in keyof T]-?: K extends ErrorRange ? K : never\n  }[keyof T],\n] extends [infer A extends number]\n  ? {\n      [K in A]: EdenFetchError<K, T[K]>\n    }[A]\n  : false\n\nexport type ErrorRange = Range<300, 599>\n\n/**\n * Type representing any error-like object that can be thrown by Eden client operations.\n * This includes EdenFetchError instances with any status code and value.\n *\n * @template _T - The Elysia app type (reserved for future use with route-specific error types)\n */\nexport type EdenClientErrorLike<_T extends AnyElysia = AnyElysia> = EdenFetchError<number, unknown> | Error\n\nexport const ERROR_SYMBOL = Symbol('TypeError')\n\nexport type TypeError<TMessage extends string> = TMessage & {\n  _: typeof ERROR_SYMBOL\n}\n","/**\n * @see https://github.com/trpc/trpc/blob/next/packages/server/src/unstable-core-do-not-import/transformer.ts\n */\n\n/**\n * Data-transformers share the same interface, but have different semantics depending\n * on where they are executed during a request.\n */\nexport type DataTransformer = {\n  /**\n   * Convert a raw value from the program into a JSON-serializable value.\n   *\n   * The raw JSON value needs to be a valid input into {@link JSON.stringify}.\n   */\n  serialize: (object: any) => any\n\n  /**\n   * Take a raw JSON value and convert it into the desired value to be used in the program.\n   *\n   * The raw JSON value can be anything returned from {@link JSON.parse}.\n   */\n  deserialize: (object: any) => any\n}\n\ninterface InputDataTransformer extends DataTransformer {\n  /**\n   * This function runs **on the client** before sending the data to the server.\n   *\n   * This should return a JSON-serializable value, e.g. a string.\n   */\n  serialize: (object: any) => any\n\n  /**\n   * This function runs **on the server** to transform the data before it is passed to the resolver\n   */\n  deserialize: (object: any) => any\n}\n\ninterface OutputDataTransformer extends DataTransformer {\n  /**\n   * This function runs **on the server** before sending the data to the client.\n   *\n   * This should return a JSON-serializable value, e.g. a string.\n   */\n  serialize: (object: any) => any\n\n  /**\n   * This function runs **only on the client** to transform the data sent from the server.\n   */\n  deserialize: (object: any) => any\n}\n\nexport interface CombinedDataTransformer {\n  /**\n   * Specify how the data sent from the client to the server should be transformed.\n   */\n  input: InputDataTransformer\n  /**\n   * Specify how the data sent from the server to the client should be transformed.\n   */\n  output: OutputDataTransformer\n}\n\nexport type DataTransformerOptions = CombinedDataTransformer | DataTransformer\n\nconst defaultTransformer: DataTransformer = {\n  serialize: (value) => value,\n  deserialize: (value) => value,\n}\n\nconst defaultDataTransformer: CombinedDataTransformer = {\n  input: defaultTransformer,\n  output: defaultTransformer,\n}\n\nexport function getDataTransformer(transformer?: DataTransformerOptions): CombinedDataTransformer {\n  if (transformer == null) {\n    return defaultDataTransformer\n  }\n\n  if ('serialize' in transformer) {\n    return { input: transformer, output: transformer }\n  }\n\n  return transformer\n}\n","import { IS_SERVER } from '../constants'\n\nexport function isFile(v: any) {\n  if (IS_SERVER) return v instanceof Blob\n\n  return v instanceof FileList || v instanceof File\n}\n\nexport function hasFile(object?: Record<string, any>): boolean {\n  if (!object) {\n    return false\n  }\n\n  for (const key in object) {\n    if (isFile(object[key])) return true\n\n    if (Array.isArray(object[key]) && (object[key] as unknown[]).find(isFile)) return true\n  }\n\n  return false\n}\n","import { GET_OR_HEAD_HTTP_METHODS, HTTP_METHODS } from '../constants'\n\nexport function isHttpMethod(value: unknown): boolean {\n  return HTTP_METHODS.includes(value as any)\n}\n\nexport function isGetOrHeadMethod(value: unknown): boolean {\n  return GET_OR_HEAD_HTTP_METHODS.includes(value as any)\n}\n","import { FORMAL_DATE_REGEX, ISO8601_REGEX, SHORTENED_DATE_REGEX } from '../constants'\n\nfunction isNumericString(message: string) {\n  return message.trim().length !== 0 && !Number.isNaN(Number(message))\n}\n\nfunction isStringifiedObject(value: string): boolean {\n  const start = value.charCodeAt(0)\n  const end = value.charCodeAt(value.length - 1)\n\n  return (start === 123 && end === 125) || (start === 91 && end === 93)\n}\n\nexport function parseStringifiedDate(value: unknown): Date | null {\n  if (typeof value !== 'string') {\n    return null\n  }\n\n  // Remove quote from stringified date\n  const temp = value.replace(/\"/g, '')\n\n  if (ISO8601_REGEX.test(temp) || FORMAL_DATE_REGEX.test(temp) || SHORTENED_DATE_REGEX.test(temp)) {\n    const date = new Date(temp)\n\n    if (!Number.isNaN(date.getTime())) {\n      return date\n    }\n  }\n\n  return null\n}\n\nexport function parseStringifiedObject(data: string) {\n  return JSON.parse(data, (_, value) => {\n    const date = parseStringifiedDate(value)\n\n    if (date) {\n      return date\n    }\n\n    return value\n  })\n}\n\nexport function parseStringifiedValue(value: string) {\n  if (!value) {\n    return value\n  }\n\n  if (isNumericString(value)) {\n    return +value\n  }\n\n  if (value === 'true') {\n    return true\n  }\n\n  if (value === 'false') {\n    return false\n  }\n\n  const date = parseStringifiedDate(value)\n\n  if (date) {\n    return date\n  }\n\n  if (isStringifiedObject(value)) {\n    try {\n      return parseStringifiedObject(value)\n    } catch {\n      // noop\n    }\n  }\n\n  return value\n}\n\nexport function parseMessageEvent(event: MessageEvent) {\n  const messageString = event.data.toString()\n\n  return messageString === 'null' ? null : parseStringifiedValue(messageString)\n}\n","import type { Nullish } from './utils/null'\n\nexport interface HeadersInitEsque {\n  [Symbol.iterator](): IterableIterator<[string, string]>\n}\n\nexport type HTTPHeaders = HeadersInitEsque | Record<string, string[] | string | undefined>\n\nexport type AbortControllerEsque = new () => AbortControllerInstanceEsque\n\n/**\n * Allows you to abort one or more requests.\n */\nexport interface AbortControllerInstanceEsque {\n  /**\n   * The AbortSignal object associated with this object.\n   */\n  readonly signal: AbortSignal\n\n  /**\n   * Sets this object's AbortSignal's aborted flag and signals to\n   * any observers that the associated activity is to be aborted.\n   */\n  abort(): void\n}\n\nexport type HTTPLinkBaseOptions = {\n  /**\n   * Define AbortController implementation.\n   */\n  AbortController?: AbortControllerEsque | null\n\n  /**\n   * Send all requests `as POST`s requests regardless of the procedure type.\n   * The HTTP handler must separately allow overriding the method.\n   *\n   * @see https://trpc.io/docs/rpc\n   */\n  methodOverride?: 'POST'\n}\n\nexport function getAbortController(\n  abortControllerPolyfill?: AbortControllerEsque | Nullish,\n): AbortControllerEsque | null {\n  if (abortControllerPolyfill) {\n    return abortControllerPolyfill\n  }\n\n  if (typeof window !== 'undefined' && window.AbortController) {\n    return window.AbortController\n  }\n\n  if (typeof globalThis !== 'undefined' && globalThis.AbortController) {\n    return globalThis.AbortController\n  }\n\n  return null\n}\n\nexport const httpQueryMethods = ['get', 'options', 'head'] as const\n\nexport const httpMutationMethods = ['post', 'put', 'patch', 'delete'] as const\n\nexport const httpSubscriptionMethods = ['connect', 'subscribe'] as const\n\nexport const httpMethods = [\n  ...httpQueryMethods,\n  ...httpMutationMethods,\n  ...httpSubscriptionMethods,\n] as const\n\n/**\n * Recognized HTTP methods for queries.\n */\nexport type HttpQueryMethod = (typeof httpQueryMethods)[number]\n\n/**\n * Recognized HTTP methods for mutations.\n */\nexport type HttpMutationMethod = (typeof httpMutationMethods)[number]\n\n/**\n * Recognized HTTP methods for subscriptions.\n */\nexport type HttpSubscriptionMethod = (typeof httpSubscriptionMethods)[number]\n\n/**\n * All recognized HTTP methods.\n */\nexport type HttMethod = (typeof httpMethods)[number]\n"," \n\nimport { type Noop, noop } from '../../utils/noop'\n\nexport type TeardownLogic = Unsubscribable | Noop | void\n\nexport type UnaryFunction<TSource = any, TReturn = any> = (source: TSource) => TReturn\n\nexport type MonoTypeOperatorFunction<TValue, TError> = OperatorFunction<\n  TValue,\n  TError,\n  TValue,\n  TError\n>\n\nexport type OperatorFunction<\n  TValueBefore = any,\n  TErrorBefore = any,\n  TValueAfter = any,\n  TErrorAfter = any,\n> = UnaryFunction<Subscribable<TValueBefore, TErrorBefore>, Subscribable<TValueAfter, TErrorAfter>>\n\nexport type Observer<TValue = any, TError = any> = {\n  next: (value: TValue) => void\n  error: (err: TError) => void\n  complete: () => void\n}\n\nexport type Unsubscribable = {\n  unsubscribe(): void\n}\n\nexport type InferObservableValue<TObservable> =\n  TObservable extends Observable<infer TValue, unknown> ? TValue : never\n\nexport function isObservable(x: unknown): x is Observable<unknown, unknown> {\n  return typeof x === 'object' && x !== null && 'subscribe' in x\n}\n\nexport function pipeReducer(previousValue: any, next: UnaryFunction) {\n  return next(previousValue)\n}\n\nexport function promisifyObservable<T>(observable: Observable<T>) {\n  let abort = noop\n\n  const promise = new Promise<T>((resolve, reject) => {\n    let isDone = false\n\n    const onDone = () => {\n      if (isDone) return\n      isDone = true\n      reject(new ObservableAbortError('This operation was aborted.'))\n      obs$.unsubscribe()\n    }\n\n    const obs$ = observable.subscribe({\n      next: (data) => {\n        isDone = true\n        resolve(data)\n        onDone()\n      },\n      error: (data) => {\n        isDone = true\n        reject(data)\n        onDone()\n      },\n      complete: () => {\n        isDone = true\n        onDone()\n      },\n    })\n\n    abort = onDone\n  })\n\n  return { promise, abort }\n}\n\nexport class ObservableAbortError extends Error {\n  constructor(message?: string) {\n    super(message)\n    this.name = 'ObservableAbortError'\n    Object.setPrototypeOf(this, ObservableAbortError.prototype)\n  }\n}\n\nexport class Subscribable<TValue = any, TError = any> {\n  constructor(public onSubscribe: (observer: Observer<TValue, TError>) => TeardownLogic) {}\n\n  subscribe(observer?: Partial<Observer<TValue, TError>>): Unsubscribable {\n    let teardownRef: TeardownLogic | null = null\n    let isDone = false\n    let unsubscribed = false\n    let teardownImmediately = false\n\n    const unsubscribe = () => {\n      if (unsubscribed) return\n\n      if (teardownRef === null) {\n        teardownImmediately = true\n        return\n      }\n\n      unsubscribed = true\n\n      if (typeof teardownRef === 'function') {\n        teardownRef()\n      } else if (teardownRef) {\n        teardownRef.unsubscribe()\n      }\n    }\n\n    teardownRef = this.onSubscribe({\n      next: (value) => {\n        if (isDone) return\n        observer?.next?.(value)\n      },\n      error: (err) => {\n        if (isDone) return\n        isDone = true\n        observer?.error?.(err)\n        unsubscribe()\n      },\n      complete: () => {\n        if (isDone) return\n        isDone = true\n        observer?.complete?.()\n        unsubscribe()\n      },\n    })\n\n    if (teardownImmediately) {\n      unsubscribe()\n    }\n\n    return {\n      unsubscribe,\n    }\n  }\n}\n\nexport class Observable<TValue = any, TError = any> extends Subscribable<TValue, TError> {\n  constructor(onSubscribe: (observer: Observer<TValue, TError>) => TeardownLogic) {\n    super(onSubscribe)\n  }\n\n  pipe(): Observable<TValue, TError>\n\n  pipe<TValue1, TError1>(\n    op1: OperatorFunction<TValue, TError, TValue1, TError1>,\n  ): Observable<TValue1, TError1>\n\n  pipe<TValue1, TError1, TValue2, TError2>(\n    op1: OperatorFunction<TValue, TError, TValue1, TError1>,\n    op2: OperatorFunction<TValue1, TError1, TValue2, TError2>,\n  ): Observable<TValue2, TError2>\n\n  pipe<TValue1, TError1, TValue2, TError2, TValue3, TError3>(\n    op1: OperatorFunction<TValue, TError, TValue1, TError1>,\n    op2: OperatorFunction<TValue1, TError1, TValue2, TError2>,\n    op3: OperatorFunction<TValue2, TError2, TValue3, TError3>,\n  ): Observable<TValue3, TError3>\n\n  pipe<TValue1, TError1, TValue2, TError2, TValue3, TError3, TValue4, TError4>(\n    op1: OperatorFunction<TValue, TError, TValue1, TError1>,\n    op2: OperatorFunction<TValue1, TError1, TValue2, TError2>,\n    op3: OperatorFunction<TValue2, TError2, TValue3, TError3>,\n    op4: OperatorFunction<TValue3, TError3, TValue4, TError4>,\n  ): Observable<TValue4, TError4>\n\n  pipe<TValue1, TError1, TValue2, TError2, TValue3, TError3, TValue4, TError4, TValue5, TError5>(\n    op1: OperatorFunction<TValue, TError, TValue1, TError1>,\n    op2: OperatorFunction<TValue1, TError1, TValue2, TError2>,\n    op3: OperatorFunction<TValue2, TError2, TValue3, TError3>,\n    op4: OperatorFunction<TValue3, TError3, TValue4, TError4>,\n    op5: OperatorFunction<TValue4, TError4, TValue5, TError5>,\n  ): Observable<TValue5, TError5>\n\n  pipe(...operations: OperatorFunction[]): Observable {\n    return operations.reduce(pipeReducer, this)\n  }\n}\n","import type { EdenConfig as EdenRequestOptions } from '../../config'\nimport type { HTTPLinkBaseOptions } from '../../http'\nimport type { EdenResponse } from '../../request'\nimport { type EdenRequestParams, resolveEdenRequest } from '../../resolve'\nimport type { Noop } from '../../utils/noop'\nimport type { Operation } from './operation'\n\nexport type Requester = (options: RequesterOptions) => PromiseAndCancel<EdenResponse>\n\nexport type RequesterOptions = Operation & HTTPLinkBaseOptions & EdenRequestOptions\n\nexport type PromiseAndCancel<T> = {\n  promise: Promise<T>\n  cancel: Noop\n}\n\n/**\n * Default eden HTTP requester normalizes operation options to params.\n */\nexport const universalRequester: Requester = (options) => {\n  const {\n    id: _id,\n    type: _type,\n    AbortController,\n    methodOverride,\n    params,\n    ...defaultParams\n  } = options\n\n  const abortController = AbortController ? new AbortController() : null\n\n  let done = false\n\n  const cancel = () => {\n    if (!done) {\n      abortController?.abort()\n    }\n  }\n\n  /**\n   * @TODO\n   *\n   * Deep merge fetch, headers, onRequest, onResponse ?\n   */\n  const resolvedParams: EdenRequestParams = { ...defaultParams, ...params }\n\n  if (options.params.fetch?.signal) {\n    options.params.fetch.signal.addEventListener('abort', cancel)\n    resolvedParams.fetch = { ...resolvedParams.fetch, signal: abortController?.signal }\n  }\n\n  if (methodOverride != null) {\n    resolvedParams.method = methodOverride\n  }\n\n  const promise = new Promise<EdenResponse>((resolve, reject) => {\n    resolveEdenRequest(resolvedParams)\n      .then((response) => {\n        done = true\n        resolve(response as EdenResponse)\n      })\n      .catch((err) => {\n        done = true\n        reject(err)\n      })\n  })\n\n  return { promise, cancel }\n}\n","import type { AnyElysia } from 'elysia'\n\nimport type { EdenQueryStoreKey } from '../constraints'\nimport { getAbortController, type HTTPHeaders, type HTTPLinkBaseOptions } from '../http'\nimport type { EdenRequestOptions } from '../request'\nimport type { NonEmptyArray } from '../utils/types'\nimport { Observable, type Observer } from './internal/observable'\nimport type { EdenLink, Operation, OperationLink } from './internal/operation'\nimport type { DataTransformerOptions } from './internal/transformer'\nimport { type Requester, universalRequester } from './internal/universal-requester'\n\nexport type HTTPLinkFactoryOptions = {\n  requester: Requester\n}\n\nexport type HTTPLinkOptions<\n  T extends AnyElysia = AnyElysia,\n  /**\n   * @todo Maybe check if T['store'][EdenQueryStoreKey] matches a certain interface?\n   */\n  TTransformer = T['store'][typeof EdenQueryStoreKey]['transformer'],\n> = HTTPLinkBaseOptions &\n  Omit<EdenRequestOptions<T>, 'headers' | 'transformer'> & {\n    /**\n     * @todo: Merge this headers type into {@link EdenRequestOptions}\n     */\n    headers?:\n      | HTTPHeaders\n      | ((operations: NonEmptyArray<Operation>) => HTTPHeaders | Promise<HTTPHeaders>)\n  } & (TTransformer extends DataTransformerOptions\n    ? { transformer: TTransformer }\n    : {\n        transformer?: DataTransformerOptions\n      })\n\nexport type HTTPLinkFactory = <T extends AnyElysia>(options?: HTTPLinkOptions<T>) => EdenLink<T>\n\nexport function httpLinkFactory(factoryOptions: HTTPLinkFactoryOptions): HTTPLinkFactory {\n  const factory: HTTPLinkFactory = (linkOptions = {} as any) => {\n    const link: EdenLink = (_runtime) => {\n      const resolveOperation = (operation: Operation, observer: Observer<any, any>) => {\n        const { fetch, domain, AbortController, methodOverride, ...defaultParams } = linkOptions\n\n        const { id, context, type, params } = operation\n\n        const options = {\n          fetch,\n          AbortController: getAbortController(AbortController),\n          methodOverride,\n          id,\n          context,\n          type,\n          params: { ...defaultParams, domain, ...params },\n        }\n\n        const { promise, cancel } = factoryOptions.requester(options)\n\n        promise\n          .then((result) => {\n            observer.next(result)\n            observer.complete()\n          })\n          .catch((cause) => {\n            observer.error(cause)\n          })\n\n        return cancel\n      }\n\n      const operationLink: OperationLink = ({ operation }) => {\n        const observable = new Observable(resolveOperation.bind(undefined, operation))\n        return observable\n      }\n\n      return operationLink\n    }\n\n    return link\n  }\n\n  return factory\n}\n\n/**\n * @see https://trpc.io/docs/v11/client/links/httpLink\n */\nexport const safeHttpLink = httpLinkFactory({ requester: universalRequester })\n\n/**\n * @see https://trpc.io/docs/v11/client/links/httpLink\n */\nexport function httpLink<T extends AnyElysia>(options?: HTTPLinkOptions<T, true>): EdenLink<T> {\n  return safeHttpLink(options as any)\n}\n","/**\n * Eden WS implementation.\n *\n * @see https://github.com/elysiajs/eden/blob/7b982cf6469d809cd561dd0ad59e83178ad56489/src/treaty2/ws.ts#L5\n */\nimport type { InputSchema, MaybeArray } from 'elysia'\n\nimport {\n  type CombinedDataTransformer,\n  type DataTransformerOptions,\n  getDataTransformer,\n} from './links'\nimport { parseMessageEvent } from './utils/parse'\n\n/**\n * Configuration for EdenWS.\n */\nexport type EdenWsOptions = {\n  /**\n   * Custom transformer for messages.\n   */\n  transformer?: DataTransformerOptions\n}\n\n/**\n * Strongly-typed websocket event.\n *\n * Messages will be formatted, all other events will not be transformed.\n */\nexport type WSEvent<K extends keyof WebSocketEventMap, Data = unknown> = K extends 'message'\n  ? OnMessage<Data>\n  : WebSocketEventMap[K]\n\n/**\n * Attempt to parse the message, in addition to providing the original raw value (string).\n */\nexport interface OnMessage<Data = unknown> extends MessageEvent {\n  data: Data\n  rawData: MessageEvent['data']\n}\n\n/**\n * Custom implementation of the EdenWS class.\n *\n * Some properties are auto-bound methods so you can pass them as callbacks without \"this is undefined\" errors.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions#cannot_be_used_as_methods\n *\n * @example\n * ```ts\n * import { EdenWs } from '@aydee-app/eden'\n *\n * const edenWs = new EdenWS()\n *\n * ['a', 'b', 'c'].forEach(edenWs.send)\n * ```\n */\nexport class EdenWS<T extends InputSchema<any> = {}> {\n  ws: WebSocket\n\n  transformer?: CombinedDataTransformer\n\n  constructor(\n    public url: string,\n    public options?: EdenWsOptions,\n  ) {\n    this.ws = new WebSocket(url)\n    this.transformer = options?.transformer ? getDataTransformer(options?.transformer) : undefined\n  }\n\n  /**\n   * Close the websocket connection.\n   */\n  close() {\n    this.ws.close()\n    return this\n  }\n\n  /**\n   * Send (strongly-typed) message(s) over the websocket connection.\n   */\n  send = async (data: MaybeArray<T['body']>) => {\n    if (Array.isArray(data)) {\n      await this.sendMany(data)\n    } else {\n      await this.sendSingle(data)\n    }\n    return this\n  }\n\n  /**\n   * Send a single (strongly-typed) message.\n   */\n  sendMany = async (data: T['body'][]) => {\n    await Promise.allSettled(data.map(this.sendSingle))\n    return this\n  }\n\n  /**\n   * Send a single (strongly-typed) message.\n   */\n  sendSingle = async (data: T['body']) => {\n    const message = await this.transformSent(data)\n    this.ws.send(message)\n    return this\n  }\n\n  /**\n   * Register a callback function that is called when a message is received.\n   */\n  subscribe(\n    onMessage: (event: WSEvent<'message', T['response']>) => void,\n    options?: boolean | AddEventListenerOptions,\n  ) {\n    return this.on('message', onMessage, options)\n  }\n\n  /**\n   * Register a strongly typed callback function to be called on the specified websocket event.\n   *\n   * Alias for {@link addEventListener}.\n   */\n  on<K extends keyof WebSocketEventMap>(\n    type: K,\n    listener: (event: WSEvent<K, T['response']>) => void,\n    options?: boolean | AddEventListenerOptions,\n  ) {\n    return this.addEventListener(type, listener, options)\n  }\n\n  /**\n   * Remove a registered event-listener.\n   *\n   * Alias for {@link removeEventListener}.\n   */\n  off<K extends keyof WebSocketEventMap>(\n    type: K,\n    listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any,\n    options?: boolean | EventListenerOptions,\n  ) {\n    this.removeEventListener(type, listener, options)\n    return this\n  }\n\n  /**\n   * Register a strongly typed callback function to be called on the specified websocket event.\n   */\n  addEventListener<K extends keyof WebSocketEventMap>(\n    type: K,\n    listener: (event: WSEvent<K, T['response']>) => void,\n    options?: boolean | AddEventListenerOptions,\n  ) {\n    const resolvedEventListener = async (ws: WebSocketEventMap[K]) => {\n      let event: any = ws\n\n      if (type === 'message') {\n        const data = (await this.transformReceived(event)) ?? parseMessageEvent(event)\n        event = { ...ws, data }\n      }\n\n      listener(event)\n    }\n\n    this.ws.addEventListener(type, resolvedEventListener, options)\n    return this\n  }\n\n  /**\n   * Remove a registered event-listener.\n   */\n  removeEventListener<K extends keyof WebSocketEventMap>(\n    type: K,\n    listener: (this: WebSocket, ev: WebSocketEventMap[K]) => any,\n    options?: boolean | EventListenerOptions,\n  ) {\n    this.ws.removeEventListener(type, listener, options)\n    return this\n  }\n\n  /**\n   * Transform outgoing messages sent from the client to the server.\n   *\n   * @internal\n   */\n  transformSent = async (data: T['body']) => {\n    const serialize = this.transformer?.input.serialize\n\n    let transformed: any\n\n    try {\n      transformed = await serialize?.(data)\n    } catch (_err) {\n      // noop\n    }\n\n    if (transformed == null) {\n      transformed ??= typeof data === 'object' ? JSON.stringify(data) : data.toString()\n    }\n\n    return transformed\n  }\n\n  /**\n   * Transform incoming messages received from the server.\n   *\n   * @internal\n   */\n  transformReceived = async (event: MessageEvent) => {\n    const deserialize = this.transformer?.output.deserialize\n\n    if (deserialize == null) return\n\n    try {\n      let messageString = event.data\n\n      if (typeof messageString !== 'string') {\n        messageString = event.data.toString()\n      }\n\n      const transformed = await deserialize(messageString)\n      return transformed\n    } catch (_err) {\n      return\n    }\n  }\n}\n"],"mappings":"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","names":["AbortController","AbortController","value","data","domain","url"]}