{"version":3,"sources":["../src/http-core/ndjson.ts","../src/http-core/types.ts","../src/http-core/utils.ts","../src/http-core/client.ts","../src/http-core/headers.ts","../src/http-core/csr-cache.ts","../src/http-core/plugins/session-auth.ts"],"names":["Observable","defer","from","concatMap","fromFetch","switchMap","throwError","catchError","shareReplay","BehaviorSubject","take","map","tap","of","finalize"],"mappings":"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","file":"index.cjs","sourcesContent":["import { Observable } from \"rxjs\";\r\n\r\nexport function ndjsonStream<T>(\r\n\tbody: ReadableStream<Uint8Array>,\r\n): Observable<T> {\r\n\treturn new Observable<T>((subscriber) => {\r\n\t\tconst reader = body.getReader();\r\n\t\tconst decoder = new TextDecoder();\r\n\t\tlet buffer = \"\";\r\n\r\n\t\tconst read = () => {\r\n\t\t\treader\r\n\t\t\t\t.read()\r\n\t\t\t\t.then(({ done, value }) => {\r\n\t\t\t\t\tif (done) {\r\n\t\t\t\t\t\t// 마지막 버퍼 처리\r\n\t\t\t\t\t\tif (buffer.trim().length > 0) {\r\n\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\tsubscriber.next(JSON.parse(buffer) as T);\r\n\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\tsubscriber.error(e);\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tsubscriber.complete();\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tbuffer += decoder.decode(value, { stream: true });\r\n\r\n\t\t\t\t\tconst lines = buffer.split(/\\r?\\n/);\r\n\t\t\t\t\tbuffer = lines.pop() ?? \"\"; // 마지막은 미완성 조각일 수 있음\r\n\r\n\t\t\t\t\tfor (const line of lines) {\r\n\t\t\t\t\t\tif (!line.trim()) continue;\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tsubscriber.next(JSON.parse(line) as T);\r\n\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\tsubscriber.error(e);\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tread();\r\n\t\t\t\t})\r\n\t\t\t\t.catch((err) => subscriber.error(err));\r\n\t\t};\r\n\r\n\t\tread();\r\n\r\n\t\treturn () => {\r\n\t\t\treader.cancel().catch(() => {});\r\n\t\t};\r\n\t});\r\n}\r\n","// http-core/@types/types.ts\r\nexport type OpenApiPathsLike = object;\r\n\r\nexport interface ServiceArguments<\r\n\tPaths extends OpenApiPathsLike,\r\n\tTPath extends keyof Paths,\r\n\tTMethod extends keyof Paths[TPath] & string,\r\n\tR,\r\n> {\r\n\turl: TPath;\r\n\tmethod: TMethod;\r\n\r\n\tpathVariable?: Paths[TPath][TMethod] extends {\r\n\t\tparameters: { path: infer P };\r\n\t}\r\n\t\t? P | undefined\r\n\t\t: Record<string, unknown> | undefined;\r\n\r\n\tqueryString?: Paths[TPath][TMethod] extends {\r\n\t\tparameters: { query: infer Q };\r\n\t}\r\n\t\t? Q | undefined\r\n\t\t: Record<string, unknown> | undefined;\r\n\r\n\tbody?: Paths[TPath][TMethod] extends {\r\n\t\trequestBody: { content: { \"application/json\": infer B } };\r\n\t}\r\n\t\t? B | undefined\r\n\t\t: unknown;\r\n\r\n\t/** response.ok 여부와 상관없이 Response를 직접 파싱하고 싶을 때 */\r\n\tresultInterceptor?: (response: Response) => Promise<R>;\r\n\r\n\t/** per-request headers */\r\n\theaders?: Readonly<Record<string, string>>;\r\n}\r\n\r\nexport interface CacheForService<CacheName extends string = string> {\r\n\tcacheTime: number;\r\n\tcacheSize?: number;\r\n\tcacheName: CacheName;\r\n}\r\n\r\n/** 코어가 던지는 표준 에러 (401 포함) */\r\nexport class HttpResponseError<Args = unknown> extends Error {\r\n\tpublic readonly name = \"HttpResponseError\";\r\n\tconstructor(\r\n\t\tpublic readonly response: Response,\r\n\t\tpublic readonly args: Args,\r\n\t\tpublic readonly data?: unknown,\r\n\t\tmessage?: string,\r\n\t) {\r\n\t\tsuper(message ?? `HTTP ${response.status} / ${response.statusText}`);\r\n\t}\r\n\r\n\tget status() {\r\n\t\treturn this.response.status;\r\n\t}\r\n}\r\n\r\nexport const isHttpResponseError = (e: unknown): e is HttpResponseError<any> =>\r\n\te instanceof HttpResponseError;\r\n","// http-core/utils.ts\r\nexport const replacePathVariable = (\r\n\ttemplate: string,\r\n\trecord: Record<string, string | number | boolean | null | undefined>,\r\n): string => {\r\n\treturn template.replace(/\\{(.*?)\\}/g, (_, key) => {\r\n\t\tconst value = record[key];\r\n\t\treturn value != null ? String(encodeURIComponent(value)) : `{${key}}`;\r\n\t});\r\n};\r\n\r\nexport const toQueryString = (\r\n\trecord: Record<\r\n\t\tstring,\r\n\t\t| string\r\n\t\t| string[]\r\n\t\t| number\r\n\t\t| number[]\r\n\t\t| boolean\r\n\t\t| boolean[]\r\n\t\t| null\r\n\t\t| undefined\r\n\t>,\r\n): string => {\r\n\tconst qs = Object.entries(record).reduce((query, [key, value]) => {\r\n\t\tif (value == null) return query;\r\n\t\tlet pair = \"\";\r\n\t\tif (Array.isArray(value)) {\r\n\t\t\tpair = value\r\n\t\t\t\t.map(\r\n\t\t\t\t\t(item) =>\r\n\t\t\t\t\t\t`${encodeURIComponent(key)}=${encodeURIComponent(String(item))}`,\r\n\t\t\t\t)\r\n\t\t\t\t.join(\"&\");\r\n\t\t} else {\r\n\t\t\tpair = `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`;\r\n\t\t}\r\n\t\treturn query ? `${query}&${pair}` : pair;\r\n\t}, \"\");\r\n\r\n\treturn `?${qs}`;\r\n};\r\n\r\nexport const stableStringify = (obj: any) => {\r\n\tif (!obj) return \"{}\";\r\n\tif (typeof obj !== \"object\") return JSON.stringify(obj);\r\n\tconst allKeys = new Set<string>();\r\n\tJSON.stringify(obj, (k, v) => (allKeys.add(k), v));\r\n\tconst keys = Array.from(allKeys).sort();\r\n\treturn JSON.stringify(obj, keys);\r\n};\r\n\r\nexport const joinUrl = (baseUrl: string, path: string) => {\r\n\tconst b = baseUrl.replace(/\\/+$/, \"\");\r\n\tconst p = path.replace(/^\\/+/, \"\");\r\n\treturn `${b}/${p}`;\r\n};\r\n","// http-core/client.ts\r\nimport {\r\n\tObservable,\r\n\tSubscriber,\r\n\tcatchError,\r\n\tconcatMap,\r\n\tdefer,\r\n\tfrom,\r\n\tswitchMap,\r\n\tthrowError,\r\n} from \"rxjs\";\r\nimport { fromFetch } from \"rxjs/fetch\";\r\n\r\nimport type { HeaderStore } from \"./headers\";\r\nimport { ndjsonStream } from \"./ndjson\";\r\nimport type { OpenApiPathsLike, ServiceArguments } from \"./types\";\r\nimport { HttpResponseError } from \"./types\";\r\nimport { joinUrl, replacePathVariable, toQueryString } from \"./utils\";\r\n\r\nexport type HeadersProvider =\r\n\t| (() => Record<string, string> | Promise<Record<string, string>>)\r\n\t| undefined;\r\n\r\nexport type DefaultErrorMessageResolver = (args: {\r\n\tstatus?: number;\r\n\tres: Response;\r\n\tdata: unknown;\r\n}) => string;\r\n\r\nexport interface HttpClientOptions {\r\n\tbaseUrl: string;\r\n\t/** CSR에서 defaultHeaders를 쓰고 싶으면 store를 주면 됨(선택) */\r\n\theaderStore?: HeaderStore;\r\n\t/**\r\n\t * SSR/멀티테넌트 등 “요청마다 헤더 계산”이 필요하면 provider로 처리(선택)\r\n\t * - Next 쿠키 기반 Authorization도 여기에 넣을 수 있음\r\n\t */\r\n\theadersProvider?: HeadersProvider;\r\n\r\n\t/**\r\n\t * Cache-Control이 있으면 Authorization 제거하는 기존 동작 유지 여부\r\n\t * (Next Data Cache/공유 캐시 사고 방지용으로 쓰던 로직)\r\n\t */\r\n\tdropAuthWhenCacheControl?: boolean;\r\n\r\n\t/**\r\n\t * SSR에서 401을 redirect 처리하고 싶으면 여기로 주입 (Next adapter에서 제공)\r\n\t */\r\n\tonServer401?: () => void | Promise<void>;\r\n\r\n\tdefaultErrorMessage?: DefaultErrorMessageResolver;\r\n}\r\n\r\nconst parseErrorBody = async (res: Response) => {\r\n\ttry {\r\n\t\treturn await res.json();\r\n\t} catch {\r\n\t\ttry {\r\n\t\t\treturn await res.text();\r\n\t\t} catch {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst normalizeBodyAndHeaders = (\r\n\tbody: any,\r\n\theaders: Record<string, string>,\r\n) => {\r\n\t// FormData면 Content-Type 제거(브라우저 boundary 자동)\r\n\tif (typeof FormData !== \"undefined\" && body instanceof FormData) {\r\n\t\tconst next = { ...headers };\r\n\t\tdelete next[\"Content-Type\"];\r\n\t\treturn { body, headers: next };\r\n\t}\r\n\r\n\tif (body != null) {\r\n\t\treturn { body: JSON.stringify(body), headers };\r\n\t}\r\n\treturn { body, headers };\r\n};\r\n\r\nexport const createHttpClient = <Paths extends OpenApiPathsLike>(\r\n\topts: HttpClientOptions,\r\n) => {\r\n\tconst {\r\n\t\tbaseUrl,\r\n\t\theaderStore,\r\n\t\theadersProvider,\r\n\t\tdropAuthWhenCacheControl = true,\r\n\t\tonServer401,\r\n\t\tdefaultErrorMessage: defaultErrorMessageResolver,\r\n\t} = opts;\r\n\r\n\tconst getBaseHeaders$ = () =>\r\n\t\tdefer(() => {\r\n\t\t\tif (headersProvider) {\r\n\t\t\t\treturn from(Promise.resolve(headersProvider()));\r\n\t\t\t}\r\n\t\t\tif (headerStore) {\r\n\t\t\t\treturn from(Promise.resolve(headerStore.get()));\r\n\t\t\t}\r\n\t\t\treturn from(Promise.resolve({}));\r\n\t\t});\r\n\r\n\tconst resolveErrorMessage = (res: Response, data: unknown) => {\r\n\t\tconst apiMsg = (data as any)?.message;\r\n\t\tif (typeof apiMsg === \"string\" && apiMsg.length > 0) return apiMsg;\r\n\r\n\t\tif (defaultErrorMessageResolver) {\r\n\t\t\treturn defaultErrorMessageResolver({\r\n\t\t\t\tstatus: res.status,\r\n\t\t\t\tres,\r\n\t\t\t\tdata,\r\n\t\t\t});\r\n\t\t}\r\n\t\treturn `HTTP ERROR${res.status} / ${res.statusText}\\n${JSON.stringify(data)}`;\r\n\t};\r\n\r\n\tconst callApi = <\r\n\t\tR,\r\n\t\tTPath extends keyof Paths = keyof Paths,\r\n\t\tTMethod extends keyof Paths[TPath] & string = keyof Paths[TPath] &\r\n\t\t\tstring,\r\n\t>(\r\n\t\tserviceArguments: ServiceArguments<Paths, TPath, TMethod, R>,\r\n\t): Observable<R> => {\r\n\t\tlet url = serviceArguments.pathVariable\r\n\t\t\t? replacePathVariable(\r\n\t\t\t\t\tString(serviceArguments.url),\r\n\t\t\t\t\tserviceArguments.pathVariable as any,\r\n\t\t\t\t)\r\n\t\t\t: String(serviceArguments.url);\r\n\r\n\t\turl =\r\n\t\t\turl +\r\n\t\t\t((serviceArguments.queryString &&\r\n\t\t\t\ttoQueryString(serviceArguments.queryString as any)) ||\r\n\t\t\t\t\"\");\r\n\r\n\t\treturn getBaseHeaders$().pipe(\r\n\t\t\tconcatMap((baseHeaders) => {\r\n\t\t\t\tconst merged: Record<string, string> = {\r\n\t\t\t\t\t...baseHeaders,\r\n\t\t\t\t\t...(serviceArguments.headers || {}),\r\n\t\t\t\t};\r\n\r\n\t\t\t\tif (dropAuthWhenCacheControl && merged[\"Cache-Control\"]) {\r\n\t\t\t\t\tdelete merged[\"Authorization\"];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst { body, headers } = normalizeBodyAndHeaders(\r\n\t\t\t\t\tserviceArguments.body,\r\n\t\t\t\t\tmerged,\r\n\t\t\t\t);\r\n\r\n\t\t\t\tconst fullUrl = joinUrl(baseUrl, url);\r\n\r\n\t\t\t\treturn fromFetch(fullUrl, {\r\n\t\t\t\t\tmethod: serviceArguments.method,\r\n\t\t\t\t\tbody,\r\n\t\t\t\t\theaders,\r\n\t\t\t\t}).pipe(\r\n\t\t\t\t\tswitchMap((res) => {\r\n\t\t\t\t\t\t// SSR 401 redirect는 코어가 모르고, 주입되면 실행\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\ttypeof window === \"undefined\" &&\r\n\t\t\t\t\t\t\tres.status === 401 &&\r\n\t\t\t\t\t\t\tonServer401\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\treturn defer(() =>\r\n\t\t\t\t\t\t\t\tPromise.resolve(onServer401()),\r\n\t\t\t\t\t\t\t).pipe(\r\n\t\t\t\t\t\t\t\tswitchMap(() =>\r\n\t\t\t\t\t\t\t\t\tthrowError(\r\n\t\t\t\t\t\t\t\t\t\t() =>\r\n\t\t\t\t\t\t\t\t\t\t\tnew HttpResponseError(\r\n\t\t\t\t\t\t\t\t\t\t\t\tres,\r\n\t\t\t\t\t\t\t\t\t\t\t\tserviceArguments,\r\n\t\t\t\t\t\t\t\t\t\t\t\tundefined,\r\n\t\t\t\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (serviceArguments.resultInterceptor) {\r\n\t\t\t\t\t\t\treturn from(\r\n\t\t\t\t\t\t\t\tserviceArguments.resultInterceptor(res),\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (!res.ok) {\r\n\t\t\t\t\t\t\treturn from(parseErrorBody(res)).pipe(\r\n\t\t\t\t\t\t\t\tswitchMap((data) => {\r\n\t\t\t\t\t\t\t\t\t// 기존 프로젝트 호환: resultType 있으면 그대로 던지기\r\n\t\t\t\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t\t\t\tdata &&\r\n\t\t\t\t\t\t\t\t\t\ttypeof data === \"object\" &&\r\n\t\t\t\t\t\t\t\t\t\t(data as any).resultType\r\n\t\t\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\t\t\treturn throwError(() => data);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tconst msg = resolveErrorMessage(res, data);\r\n\r\n\t\t\t\t\t\t\t\t\treturn throwError(\r\n\t\t\t\t\t\t\t\t\t\t() =>\r\n\t\t\t\t\t\t\t\t\t\t\tnew HttpResponseError(\r\n\t\t\t\t\t\t\t\t\t\t\t\tres,\r\n\t\t\t\t\t\t\t\t\t\t\t\tserviceArguments,\r\n\t\t\t\t\t\t\t\t\t\t\t\tdata,\r\n\t\t\t\t\t\t\t\t\t\t\t\tmsg,\r\n\t\t\t\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn from(res.json() as Promise<R>);\r\n\t\t\t\t\t}),\r\n\t\t\t\t\tcatchError((err) => {\r\n\t\t\t\t\t\t// 네트워크 에러/런타임 에러\r\n\t\t\t\t\t\tif (err instanceof HttpResponseError) {\r\n\t\t\t\t\t\t\treturn throwError(() => err);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (err instanceof Error) {\r\n\t\t\t\t\t\t\treturn throwError(() => ({\r\n\t\t\t\t\t\t\t\tmessage: err.message,\r\n\t\t\t\t\t\t\t\tstack: err.stack,\r\n\t\t\t\t\t\t\t}));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn throwError(() => err);\r\n\t\t\t\t\t}),\r\n\t\t\t\t);\r\n\t\t\t}),\r\n\t\t);\r\n\t};\r\n\r\n\tconst callApiStream = <\r\n\t\tRChunk,\r\n\t\tTPath extends keyof Paths = keyof Paths,\r\n\t\tTMethod extends keyof Paths[TPath] & string = keyof Paths[TPath] &\r\n\t\t\tstring,\r\n\t>(\r\n\t\tserviceArguments: ServiceArguments<Paths, TPath, TMethod, RChunk>,\r\n\t): Observable<RChunk> => {\r\n\t\tlet url = serviceArguments.pathVariable\r\n\t\t\t? replacePathVariable(\r\n\t\t\t\t\tString(serviceArguments.url),\r\n\t\t\t\t\tserviceArguments.pathVariable as any,\r\n\t\t\t\t)\r\n\t\t\t: String(serviceArguments.url);\r\n\r\n\t\turl =\r\n\t\t\turl +\r\n\t\t\t((serviceArguments.queryString &&\r\n\t\t\t\ttoQueryString(serviceArguments.queryString as any)) ||\r\n\t\t\t\t\"\");\r\n\r\n\t\treturn getBaseHeaders$().pipe(\r\n\t\t\tconcatMap((baseHeaders) => {\r\n\t\t\t\tconst merged: Record<string, string> = {\r\n\t\t\t\t\t...baseHeaders,\r\n\t\t\t\t\t...(serviceArguments.headers || {}),\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// 스트리밍이면 Accept 기본값을 NDJSON으로\r\n\t\t\t\tif (!merged[\"Accept\"]) {\r\n\t\t\t\t\tmerged[\"Accept\"] = \"application/x-ndjson\";\r\n\t\t\t\t\t// 서버가 application/ndjson이면 호출부에서 headers로 오버라이드 가능\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// 기존 정책 유지: Cache-Control 있으면 Authorization 제거\r\n\t\t\t\tif (dropAuthWhenCacheControl && merged[\"Cache-Control\"]) {\r\n\t\t\t\t\tdelete merged[\"Authorization\"];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst { body, headers } = normalizeBodyAndHeaders(\r\n\t\t\t\t\tserviceArguments.body,\r\n\t\t\t\t\tmerged,\r\n\t\t\t\t);\r\n\r\n\t\t\t\tconst fullUrl = joinUrl(baseUrl, url);\r\n\r\n\t\t\t\treturn fromFetch(fullUrl, {\r\n\t\t\t\t\tmethod: serviceArguments.method,\r\n\t\t\t\t\tbody,\r\n\t\t\t\t\theaders,\r\n\t\t\t\t}).pipe(\r\n\t\t\t\t\tswitchMap((res) => {\r\n\t\t\t\t\t\t// SSR 401 redirect (옵션)\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\ttypeof window === \"undefined\" &&\r\n\t\t\t\t\t\t\tres.status === 401 &&\r\n\t\t\t\t\t\t\tonServer401\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\treturn defer(() =>\r\n\t\t\t\t\t\t\t\tPromise.resolve(onServer401()),\r\n\t\t\t\t\t\t\t).pipe(\r\n\t\t\t\t\t\t\t\tswitchMap(() =>\r\n\t\t\t\t\t\t\t\t\tthrowError(\r\n\t\t\t\t\t\t\t\t\t\t() =>\r\n\t\t\t\t\t\t\t\t\t\t\tnew HttpResponseError(\r\n\t\t\t\t\t\t\t\t\t\t\t\tres,\r\n\t\t\t\t\t\t\t\t\t\t\t\tserviceArguments,\r\n\t\t\t\t\t\t\t\t\t\t\t\tundefined,\r\n\t\t\t\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// 스트리밍은 resultInterceptor(단일 JSON 파서) 대신 기본 NDJSON 처리\r\n\t\t\t\t\t\tif (!res.ok) {\r\n\t\t\t\t\t\t\treturn from(parseErrorBody(res)).pipe(\r\n\t\t\t\t\t\t\t\tswitchMap((data) => {\r\n\t\t\t\t\t\t\t\t\t// 프로젝트 호환: resultType 있으면 그대로 던지기\r\n\t\t\t\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t\t\t\tdata &&\r\n\t\t\t\t\t\t\t\t\t\ttypeof data === \"object\" &&\r\n\t\t\t\t\t\t\t\t\t\t(data as any).resultType\r\n\t\t\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\t\t\treturn throwError(() => data);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tconst msg = resolveErrorMessage(res, data);\r\n\r\n\t\t\t\t\t\t\t\t\treturn throwError(\r\n\t\t\t\t\t\t\t\t\t\t() =>\r\n\t\t\t\t\t\t\t\t\t\t\tnew HttpResponseError(\r\n\t\t\t\t\t\t\t\t\t\t\t\tres,\r\n\t\t\t\t\t\t\t\t\t\t\t\tserviceArguments,\r\n\t\t\t\t\t\t\t\t\t\t\t\tdata,\r\n\t\t\t\t\t\t\t\t\t\t\t\tmsg,\r\n\t\t\t\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (!res.body) {\r\n\t\t\t\t\t\t\treturn throwError(\r\n\t\t\t\t\t\t\t\t() => new Error(\"ReadableStream body is null\"),\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t//  한 줄에 하나씩 RChunk(JSON) 내려온다고 가정\r\n\t\t\t\t\t\treturn ndjsonStream<RChunk>(res.body);\r\n\t\t\t\t\t}),\r\n\t\t\t\t);\r\n\t\t\t}),\r\n\t\t);\r\n\t};\r\n\r\n\tconst defaultUploadFileHeaders: Record<string, string> = {\r\n\t\t\"Content-Encoding\": \"base64\",\r\n\t\t\"Content-Type\": \"application/octet-stream\",\r\n\t};\r\n\t/** uploadFile은 코어에 남겨도 setLogin/Wrapper와 무관 */\r\n\tconst uploadFile = ({\r\n\t\tfile,\r\n\t\turl,\r\n\t\tifNoneMatch,\r\n\t\theaders,\r\n\t}: {\r\n\t\tfile: File;\r\n\t\turl: string;\r\n\t\tifNoneMatch?: string;\r\n\t\theaders?: Record<string, string>;\r\n\t}) => {\r\n\t\tconst mergedHeaders: Record<string, string> = {\r\n\t\t\t...defaultUploadFileHeaders,\r\n\t\t\t...(headers || {}),\r\n\t\t};\r\n\t\tif (ifNoneMatch) mergedHeaders[\"If-None-Match\"] = ifNoneMatch;\r\n\t\treturn fromFetch(url, { method: \"PUT\", body: file as any, headers });\r\n\t};\r\n\r\n\t/** 개별 SSE Observable(기존 createSSEObservable 유지) */\r\n\tconst createSSEObservable = <R>(\r\n\t\tserviceArguments: ServiceArguments<Paths, any, any, any>,\r\n\t) => {\r\n\t\tlet url = serviceArguments.pathVariable\r\n\t\t\t? replacePathVariable(\r\n\t\t\t\t\tString(serviceArguments.url),\r\n\t\t\t\t\tserviceArguments.pathVariable as any,\r\n\t\t\t\t)\r\n\t\t\t: String(serviceArguments.url);\r\n\r\n\t\turl =\r\n\t\t\turl +\r\n\t\t\t((serviceArguments.queryString &&\r\n\t\t\t\ttoQueryString(serviceArguments.queryString as any)) ||\r\n\t\t\t\t\"\");\r\n\r\n\t\treturn new Observable<R>((observer: Subscriber<R>) => {\r\n\t\t\tconst eventSource = new EventSource(joinUrl(baseUrl, url), {\r\n\t\t\t\twithCredentials: false,\r\n\t\t\t});\r\n\r\n\t\t\teventSource.onmessage = (event) => {\r\n\t\t\t\tobserver.next(JSON.parse(event.data) as R);\r\n\t\t\t};\r\n\r\n\t\t\teventSource.onerror = () => {\r\n\t\t\t\tobserver.complete();\r\n\t\t\t\teventSource.close();\r\n\t\t\t};\r\n\r\n\t\t\treturn () => eventSource.close();\r\n\t\t});\r\n\t};\r\n\r\n\treturn { callApi, callApiStream, uploadFile, createSSEObservable };\r\n};\r\n","// http-core/headers.ts\r\nexport interface HeaderStore {\r\n\tget(): Record<string, string>;\r\n\tset(next: Record<string, string>): void;\r\n\tmerge(next: Record<string, string>): void;\r\n\tremove(key: string): void;\r\n\tclear(keys?: string[]): void;\r\n}\r\n\r\nexport const createHeaderStore = (\r\n\tinitial: Record<string, string> = { \"Content-Type\": \"application/json\" },\r\n): HeaderStore => {\r\n\tlet h = { ...initial };\r\n\r\n\treturn {\r\n\t\tget: () => ({ ...h }),\r\n\t\tset: (next) => {\r\n\t\t\th = { ...next };\r\n\t\t},\r\n\t\tmerge: (next) => {\r\n\t\t\tfor (const [k, v] of Object.entries(next)) {\r\n\t\t\t\tif (!v) continue;\r\n\t\t\t\th[k] = v;\r\n\t\t\t}\r\n\t\t},\r\n\t\tremove: (key) => {\r\n\t\t\tdelete h[key];\r\n\t\t},\r\n\t\tclear: (keys) => {\r\n\t\t\tif (!keys) {\r\n\t\t\t\th = {};\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tfor (const k of keys) delete h[k];\r\n\t\t},\r\n\t};\r\n};\r\n","// http-core/csr-cache.ts\r\nimport {\r\n\tBehaviorSubject,\r\n\tObservable,\r\n\tshareReplay,\r\n\tswitchMap,\r\n\ttake,\r\n} from \"rxjs\";\r\nimport type {\r\n\tCacheForService,\r\n\tOpenApiPathsLike,\r\n\tServiceArguments,\r\n} from \"./types\";\r\nimport { stableStringify } from \"./utils\";\r\n\r\ntype AnyObs = Observable<any>;\r\ntype CacheMap = Record<string, BehaviorSubject<AnyObs>>;\r\n\r\nexport const createCsrCache = <CacheName extends string = string>() => {\r\n\tconst cacheMap: CacheMap | null = typeof window !== \"undefined\" ? {} : null;\r\n\r\n\tfunction removeCsrCache(cacheName: CacheName): void;\r\n\tfunction removeCsrCache(cacheName: string): void;\r\n\tfunction removeCsrCache(cacheName: string) {\r\n\t\tif (!cacheMap) return;\r\n\t\tObject.keys(cacheMap).forEach((key) => {\r\n\t\t\tif (key.startsWith(cacheName)) delete cacheMap[key];\r\n\t\t});\r\n\t}\r\n\tconst callApiCsrCache = <\r\n\t\tPaths extends OpenApiPathsLike,\r\n\t\tR,\r\n\t\tTPath extends keyof Paths = keyof Paths,\r\n\t\tTMethod extends keyof Paths[TPath] & string = keyof Paths[TPath] &\r\n\t\t\tstring,\r\n\t>(\r\n\t\tcallApi: (\r\n\t\t\targs: ServiceArguments<Paths, TPath, TMethod, R>,\r\n\t\t) => Observable<R>,\r\n\t\tserviceArguments: ServiceArguments<Paths, TPath, TMethod, R>,\r\n\t\tcacheForService: CacheForService,\r\n\t): Observable<R> => {\r\n\t\tif (typeof window === \"undefined\" || cacheMap == null) {\r\n\t\t\treturn callApi(serviceArguments);\r\n\t\t}\r\n\r\n\t\tconst cacheKey =\r\n\t\t\tcacheForService.cacheName +\r\n\t\t\t\"=\" +\r\n\t\t\tString(serviceArguments.method) +\r\n\t\t\tString(serviceArguments.url) +\r\n\t\t\tstableStringify(serviceArguments.queryString) +\r\n\t\t\tstableStringify(serviceArguments.pathVariable) +\r\n\t\t\tstableStringify(serviceArguments.body);\r\n\r\n\t\tlet subject = cacheMap[cacheKey];\r\n\t\tif (!subject) {\r\n\t\t\tconst shared$ = callApi(serviceArguments).pipe(\r\n\t\t\t\tshareReplay({\r\n\t\t\t\t\tbufferSize: cacheForService.cacheSize ?? 1,\r\n\t\t\t\t\twindowTime: cacheForService.cacheTime,\r\n\t\t\t\t\trefCount: false,\r\n\t\t\t\t}),\r\n\t\t\t);\r\n\t\t\tsubject = new BehaviorSubject(shared$);\r\n\t\t\tcacheMap[cacheKey] = subject;\r\n\t\t}\r\n\r\n\t\treturn subject.pipe(\r\n\t\t\tswitchMap((s) => s),\r\n\t\t\ttake(1),\r\n\t\t);\r\n\t};\r\n\r\n\treturn { callApiCsrCache, removeCsrCache };\r\n};\r\n","import {\r\n\tObservable,\r\n\tcatchError,\r\n\tdefer,\r\n\tfinalize,\r\n\tmap,\r\n\tof,\r\n\tshareReplay,\r\n\tswitchMap,\r\n\ttap,\r\n\tthrowError,\r\n\ttype MonoTypeOperatorFunction,\r\n} from \"rxjs\";\r\nimport { fromFetch } from \"rxjs/fetch\";\r\nimport type { HeaderStore } from \"../headers\";\r\nimport { isHttpResponseError } from \"../types\";\r\n\r\ntype TokenJson = { token?: string };\r\n\r\nexport interface SessionAuthOptions {\r\n\theaderStore: HeaderStore;\r\n\r\n\t/** setLogin 같은 외부 사이드이펙트 주입 */\r\n\tonLoginChange?: (loggedIn: boolean) => void;\r\n\r\n\t/** 엔드포인트들(프로젝트마다 다르면 바꾸기) */\r\n\ttokenUrl?: string; // /api/auth/token\r\n\trefreshUrl?: string; // /api/auth/token/refresh\r\n\tlogoutUrl?: string; // /api/auth/logout\r\n\r\n\t/** Authorization 포맷(기본: Bearer) */\r\n\tformatAuthorization?: (rawToken: string) => string;\r\n}\r\n\r\nexport const createSessionAuth = (opts: SessionAuthOptions) => {\r\n\tconst {\r\n\t\theaderStore,\r\n\t\tonLoginChange,\r\n\t\ttokenUrl = \"/api/auth/token\",\r\n\t\trefreshUrl = \"/api/auth/token/refresh\",\r\n\t\tlogoutUrl = \"/api/auth/logout\",\r\n\t\tformatAuthorization = (t) =>\r\n\t\t\tt.startsWith(\"Bearer \") ? t : `Bearer ${t}`,\r\n\t} = opts;\r\n\r\n\tlet inFlightToken$: Observable<string> | null = null;\r\n\tlet inFlightRefresh$: Observable<string> | null = null;\r\n\tlet inFlightLogout$: Observable<any> | null = null;\r\n\r\n\tconst setAuth = (rawToken: string) => {\r\n\t\tif (rawToken) {\r\n\t\t\theaderStore.merge({\r\n\t\t\t\tAuthorization: formatAuthorization(rawToken),\r\n\t\t\t});\r\n\t\t\tonLoginChange?.(true);\r\n\t\t} else {\r\n\t\t\theaderStore.remove(\"Authorization\");\r\n\t\t\tonLoginChange?.(false);\r\n\t\t}\r\n\t};\r\n\r\n\tconst getCurrentAuthHeader = () => {\r\n\t\tconst h = headerStore.get();\r\n\t\tconst v = h[\"Authorization\"];\r\n\t\treturn v && v.trim() ? v : \"\";\r\n\t};\r\n\r\n\tconst fetchToken$ = () => {\r\n\t\treturn fromFetch(tokenUrl).pipe(\r\n\t\t\tswitchMap((res) => {\r\n\t\t\t\tif (!res.ok) return Promise.reject(res);\r\n\t\t\t\treturn res.json() as Promise<TokenJson>;\r\n\t\t\t}),\r\n\t\t\tmap((json) => json.token ?? \"\"),\r\n\t\t\ttap((token) => setAuth(token)),\r\n\t\t\tcatchError((err) => {\r\n\t\t\t\tconsole.error(err);\r\n\t\t\t\tsetAuth(\"\");\r\n\t\t\t\treturn of(\"\");\r\n\t\t\t}),\r\n\t\t\tfinalize(() => {\r\n\t\t\t\tinFlightToken$ = null;\r\n\t\t\t}),\r\n\t\t\tshareReplay({\r\n\t\t\t\tbufferSize: 1,\r\n\t\t\t\trefCount: false,\r\n\t\t\t}),\r\n\t\t);\r\n\t};\r\n\r\n\t/** 토큰이 없으면 서버에서 한 번 동기화(/api/auth/token) */\r\n\tconst ensureToken$ = (): Observable<string> => {\r\n\t\tconst cur = getCurrentAuthHeader();\r\n\t\tif (cur) return of(cur);\r\n\r\n\t\tif (!inFlightToken$) {\r\n\t\t\tinFlightToken$ = fetchToken$();\r\n\t\t}\r\n\r\n\t\treturn inFlightToken$;\r\n\t};\r\n\r\n\tconst refreshToken$ = (): Observable<string> => {\r\n\t\tif (!inFlightRefresh$) {\r\n\t\t\tinFlightRefresh$ = defer(() =>\r\n\t\t\t\tensureToken$().pipe(\r\n\t\t\t\t\tswitchMap((authHeader) => {\r\n\t\t\t\t\t\t// refresh는 현재 Authorization 헤더가 있어야 의미가 있음\r\n\t\t\t\t\t\tif (!authHeader) {\r\n\t\t\t\t\t\t\tsetAuth(\"\");\r\n\t\t\t\t\t\t\treturn of(\"\");\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn fromFetch(refreshUrl, {\r\n\t\t\t\t\t\t\theaders: {\r\n\t\t\t\t\t\t\t\tAuthorization: authHeader,\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t}).pipe(\r\n\t\t\t\t\t\t\tswitchMap((res) => {\r\n\t\t\t\t\t\t\t\tif (!res.ok) {\r\n\t\t\t\t\t\t\t\t\treturn Promise.reject(res);\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\treturn res.json() as Promise<TokenJson>;\r\n\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\tmap((json) => json.token ?? \"\"),\r\n\t\t\t\t\t\t\ttap((token) => setAuth(token)),\r\n\t\t\t\t\t\t\tcatchError((err) => {\r\n\t\t\t\t\t\t\t\tconsole.error(err);\r\n\t\t\t\t\t\t\t\tsetAuth(\"\");\r\n\t\t\t\t\t\t\t\treturn of(\"\");\r\n\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}),\r\n\t\t\t\t),\r\n\t\t\t).pipe(\r\n\t\t\t\tfinalize(() => {\r\n\t\t\t\t\tinFlightRefresh$ = null;\r\n\t\t\t\t}),\r\n\t\t\t\tshareReplay({\r\n\t\t\t\t\tbufferSize: 1,\r\n\t\t\t\t\trefCount: false,\r\n\t\t\t\t}),\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\treturn inFlightRefresh$;\r\n\t};\r\n\r\n\tconst sharedLogout$ = () => {\r\n\t\tif (!inFlightLogout$) {\r\n\t\t\tinFlightLogout$ = fromFetch(logoutUrl).pipe(\r\n\t\t\t\ttap(() => setAuth(\"\")),\r\n\t\t\t\tfinalize(() => {\r\n\t\t\t\t\tinFlightLogout$ = null;\r\n\t\t\t\t}),\r\n\t\t\t\tshareReplay({\r\n\t\t\t\t\tbufferSize: 1,\r\n\t\t\t\t\trefCount: false,\r\n\t\t\t\t}),\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\treturn inFlightLogout$;\r\n\t};\r\n\r\n\t/**\r\n\t * callApi(...) 뒤에 .pipe(withSessionAuth())로 붙였다 떼기\r\n\t * - subscribe 시점에 ensureToken$ 먼저 수행(헤더 세팅)\r\n\t * - 401이면 공유된 refresh를 1번 수행\r\n\t * - refresh 성공 후 각 원 요청을 개별적으로 1번 재시도\r\n\t * - refresh 실패/토큰 없음이면 공유된 logout 후 최초 401 전달\r\n\t */\r\n\tconst withSessionAuth = <T>(): MonoTypeOperatorFunction<T> => {\r\n\t\treturn (source) =>\r\n\t\t\tdefer(() =>\r\n\t\t\t\tensureToken$().pipe(\r\n\t\t\t\t\tswitchMap(() => source),\r\n\t\t\t\t\tcatchError((err) => {\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t!isHttpResponseError(err) ||\r\n\t\t\t\t\t\t\terr.status !== 401\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\treturn throwError(() => err);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn refreshToken$().pipe(\r\n\t\t\t\t\t\t\tswitchMap((newToken) => {\r\n\t\t\t\t\t\t\t\tif (!newToken) {\r\n\t\t\t\t\t\t\t\t\treturn sharedLogout$().pipe(\r\n\t\t\t\t\t\t\t\t\t\tswitchMap(() =>\r\n\t\t\t\t\t\t\t\t\t\t\tthrowError(() => err),\r\n\t\t\t\t\t\t\t\t\t\t),\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t// 공유 refresh 성공 후 현재 요청만 개별 재시도\r\n\t\t\t\t\t\t\t\treturn source;\r\n\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}),\r\n\t\t\t\t),\r\n\t\t\t);\r\n\t};\r\n\r\n\t/**\r\n\t * 원하면 “ensureToken만” 따로 붙일 수도 있음\r\n\t * - 인증이 필요한데 401 refresh는 싫을 때\r\n\t */\r\n\tconst withEnsureToken = <T>(): MonoTypeOperatorFunction<T> => {\r\n\t\treturn (source) =>\r\n\t\t\tdefer(() =>\r\n\t\t\t\tensureToken$().pipe(\r\n\t\t\t\t\tswitchMap(() => source),\r\n\t\t\t\t),\r\n\t\t\t);\r\n\t};\r\n\r\n\treturn {\r\n\t\tensureToken$,\r\n\t\trefreshToken$,\r\n\t\tlogout$: sharedLogout$,\r\n\t\twithSessionAuth,\r\n\t\twithEnsureToken,\r\n\t};\r\n};"]}