entity-client 1.0.26 → 1.0.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/request.js +1 -1
- package/dist/client/request.js.map +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/react.js +1 -1
- package/dist/react.js.map +2 -2
- package/package.json +1 -1
package/dist/client/request.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{derivePacketKey as D,encryptPacket as z,decryptPacket as _}from"./packet.js";import{buildHmacHeaders as F}from"./hmac.js";function Q(e){switch(e.toUpperCase()){case"POST":case"PUT":case"PATCH":case"DELETE":return!0;default:return!1}}function V(e,t,n){if(n.autoAbortKey===!1)return null;if(typeof n.autoAbortKey=="string"){const o=n.autoAbortKey.trim();return o||null}return Q(e)?`${e.toUpperCase()} ${t}`:null}function W(e){const t=e.filter(s=>!!s);if(t.length===0)return;if(t.length===1)return t[0];if(typeof AbortSignal.any=="function")return AbortSignal.any(t);const n=new AbortController,o=()=>n.abort();for(const s of t){if(s.aborted){n.abort();break}s.addEventListener("abort",o,{once:!0})}return n.signal}function Y(e,t,n,o){const s=V(t,n,o);if(!s)return{signal:o.signal,abortKey:null,controller:null};e.requestAbortControllers.get(s)?.abort();const l=new AbortController;return e.requestAbortControllers.set(s,l),{signal:W([o.signal,l.signal]),abortKey:s,controller:l}}function Z(e,t,n){!t||!n||e.requestAbortControllers.get(t)===n&&e.requestAbortControllers.delete(t)}function ee(e){return e.hmacSecret||e.token||e.anonymousPacketToken}function te(e,t,n){return e.hmacSecret?e.hmacSecret:t&&e.token||n}function ne(e){return e?e.length<=8?`${e.slice(0,2)}...${e.slice(-2)}`:`${e.slice(0,4)}...${e.slice(-4)}`:""}function re(e){typeof console>"u"||typeof console.error!="function"||console.error("[entity-client] packet decrypt failed",{method:e.method,path:e.path,withAuth:e.withAuth,status:e.status,contentType:e.contentType,responsePacketSource:ne(e.responsePacketSource),tokenPresent:e.tokenPresent,anonymousPacketTokenPresent:e.anonymousPacketTokenPresent,hmacEnabled:e.hmacEnabled,error:e.error instanceof Error?{name:e.error.name,message:e.error.message,stack:e.error.stack}:e.error})}function oe(e){return e!=="GET"&&e!=="HEAD"&&e!=="OPTIONS"}function E(e){if(typeof document>"u")return"";for(const t of document.cookie.split(";")){const n=t.indexOf("=");if(!(n<0)&&t.substring(0,n).trim()===e)return decodeURIComponent(t.substring(n+1).trim())}return""}function se(e,t){return e===403&&/csrf/i.test(t)?!0:/csrf/i.test(t)&&/expired|token validation failed/i.test(t)}function ie(e,t){return e===401&&/nonce already used/i.test(t)}async function $(e){if((e.headers.get("Content-Type")??"").includes("application/json")){const o=await e.json().catch(()=>null);if(o?.error)return{message:o.error,code:o.code,body:o};if(o?.message)return{message:o.message,code:o.code,body:o}}return{message:await e.text().catch(()=>"")||`HTTP ${e.status}`}}function q(e,t){const n=new Error(t.message);return n.status=e,t.code&&(n.code=t.code),t.body&&(n.details=t.body),n}async function ue(e,t,n,o,s=!0,l={},T=!0){const P=typeof T=="boolean"?{requireOkShape:T}:T,B=P.requireOkShape??!0,A=new Set(P.allowStatuses??[]),S=Y(e,t,n,P),N=S.signal,{baseUrl:j,token:k,apiKey:R,hmacSecret:f,encryptRequests:v,csrfEnabled:M,csrfHeaderName:I,csrfCookieName:h,refreshCsrfCookie:p,onAccessToken:O,debugPlainSecret:C}=e,g=e.anonymousPacketToken||E("anon_token"),y=s&&!!(R&&f),L=ee(e),x=te(e,s,g),m=M&&oe(t)&&!y;let u=m?E(h):"",H="application/json";const X=!y&&!!g;let a=null;if(o!=null)if(!C&&v&&!!L&&s&&t!=="GET"&&t!=="HEAD"){const i=D(f,k||g);a=z(new TextEncoder().encode(JSON.stringify(o)),i),H="application/octet-stream"}else a=JSON.stringify(o);const G=r=>{const i={...l},d=Object.keys(i).some(c=>c.toLowerCase()==="content-type");if(a!=null&&!d&&(i["Content-Type"]=H),!y&&s&&k&&(i.Authorization=`Bearer ${k}`),X&&(i["X-Packet-Token"]=g),C&&(i["X-Debug-Plain"]=C),m&&r&&(i[I]=r),y){const c=a instanceof Uint8Array?a:typeof a=="string"?new TextEncoder().encode(a):new Uint8Array(0);Object.assign(i,F(t,n,c,R,f))}return i};m&&!u&&p&&(await p(),u=E(h));const w=r=>fetch(j+n,{method:t,headers:G(r),...a!=null?{body:a}:{},credentials:"include",signal:N});try{let r=await w(u);if(!r.ok){const b=await $(r.clone());if(y&&ie(r.status,b.message))r=await w(u);else if(m&&p&&se(r.status,b.message))await p(),u=E(h),r=await w(u);else if(!A.has(r.status))throw q(r.status,b)}if(!r.ok&&!A.has(r.status))throw q(r.status,await $(r));const i=r.headers.get("X-Access-Token")?.trim()??"",d=r.headers.get("Content-Type")??"";if(d.includes("application/octet-stream")){const b=D(f,x),J=await r.arrayBuffer();let K;try{K=_(J,b)}catch(U){throw re({method:t,path:n,withAuth:s,status:r.status,contentType:d,responsePacketSource:x,tokenPresent:!!k,anonymousPacketTokenPresent:!!g,hmacEnabled:!!f,error:U}),U}return i&&O?.(i),K}if(i&&O?.(i),!d.includes("application/json"))return await r.text();const c=await r.json();if(B&&!c.ok&&!A.has(r.status))throw q(r.status,{message:c.message??`EntityServer error (HTTP ${r.status})`,code:c.code,body:c});return c}finally{Z(e,S.abortKey,S.controller)}}export{ue as entityRequest};
|
|
1
|
+
import{derivePacketKey as D,encryptPacket as z,decryptPacket as _}from"./packet.js";import{buildHmacHeaders as F}from"./hmac.js";function Q(e){switch(e.toUpperCase()){case"POST":case"PUT":case"PATCH":case"DELETE":return!0;default:return!1}}function V(e,t,n){if(n.autoAbortKey===!1)return null;if(typeof n.autoAbortKey=="string"){const o=n.autoAbortKey.trim();return o||null}return typeof window>"u"?null:Q(e)?`${e.toUpperCase()} ${t}`:null}function W(e){const t=e.filter(s=>!!s);if(t.length===0)return;if(t.length===1)return t[0];if(typeof AbortSignal.any=="function")return AbortSignal.any(t);const n=new AbortController,o=()=>n.abort();for(const s of t){if(s.aborted){n.abort();break}s.addEventListener("abort",o,{once:!0})}return n.signal}function Y(e,t,n,o){const s=V(t,n,o);if(!s)return{signal:o.signal,abortKey:null,controller:null};e.requestAbortControllers.get(s)?.abort();const l=new AbortController;return e.requestAbortControllers.set(s,l),{signal:W([o.signal,l.signal]),abortKey:s,controller:l}}function Z(e,t,n){!t||!n||e.requestAbortControllers.get(t)===n&&e.requestAbortControllers.delete(t)}function ee(e){return e.hmacSecret||e.token||e.anonymousPacketToken}function te(e,t,n){return e.hmacSecret?e.hmacSecret:t&&e.token||n}function ne(e){return e?e.length<=8?`${e.slice(0,2)}...${e.slice(-2)}`:`${e.slice(0,4)}...${e.slice(-4)}`:""}function re(e){typeof console>"u"||typeof console.error!="function"||console.error("[entity-client] packet decrypt failed",{method:e.method,path:e.path,withAuth:e.withAuth,status:e.status,contentType:e.contentType,responsePacketSource:ne(e.responsePacketSource),tokenPresent:e.tokenPresent,anonymousPacketTokenPresent:e.anonymousPacketTokenPresent,hmacEnabled:e.hmacEnabled,error:e.error instanceof Error?{name:e.error.name,message:e.error.message,stack:e.error.stack}:e.error})}function oe(e){return e!=="GET"&&e!=="HEAD"&&e!=="OPTIONS"}function E(e){if(typeof document>"u")return"";for(const t of document.cookie.split(";")){const n=t.indexOf("=");if(!(n<0)&&t.substring(0,n).trim()===e)return decodeURIComponent(t.substring(n+1).trim())}return""}function se(e,t){return e===403&&/csrf/i.test(t)?!0:/csrf/i.test(t)&&/expired|token validation failed/i.test(t)}function ie(e,t){return e===401&&/nonce already used/i.test(t)}async function $(e){if((e.headers.get("Content-Type")??"").includes("application/json")){const o=await e.json().catch(()=>null);if(o?.error)return{message:o.error,code:o.code,body:o};if(o?.message)return{message:o.message,code:o.code,body:o}}return{message:await e.text().catch(()=>"")||`HTTP ${e.status}`}}function q(e,t){const n=new Error(t.message);return n.status=e,t.code&&(n.code=t.code),t.body&&(n.details=t.body),n}async function ue(e,t,n,o,s=!0,l={},T=!0){const P=typeof T=="boolean"?{requireOkShape:T}:T,B=P.requireOkShape??!0,A=new Set(P.allowStatuses??[]),S=Y(e,t,n,P),N=S.signal,{baseUrl:j,token:k,apiKey:R,hmacSecret:f,encryptRequests:v,csrfEnabled:M,csrfHeaderName:I,csrfCookieName:h,refreshCsrfCookie:p,onAccessToken:O,debugPlainSecret:C}=e,g=e.anonymousPacketToken||E("anon_token"),y=s&&!!(R&&f),L=ee(e),x=te(e,s,g),m=M&&oe(t)&&!y;let u=m?E(h):"",H="application/json";const X=!y&&!!g;let a=null;if(o!=null)if(!C&&v&&!!L&&s&&t!=="GET"&&t!=="HEAD"){const i=D(f,k||g);a=z(new TextEncoder().encode(JSON.stringify(o)),i),H="application/octet-stream"}else a=JSON.stringify(o);const G=r=>{const i={...l},d=Object.keys(i).some(c=>c.toLowerCase()==="content-type");if(a!=null&&!d&&(i["Content-Type"]=H),!y&&s&&k&&(i.Authorization=`Bearer ${k}`),X&&(i["X-Packet-Token"]=g),C&&(i["X-Debug-Plain"]=C),m&&r&&(i[I]=r),y){const c=a instanceof Uint8Array?a:typeof a=="string"?new TextEncoder().encode(a):new Uint8Array(0);Object.assign(i,F(t,n,c,R,f))}return i};m&&!u&&p&&(await p(),u=E(h));const w=r=>fetch(j+n,{method:t,headers:G(r),...a!=null?{body:a}:{},credentials:"include",signal:N});try{let r=await w(u);if(!r.ok){const b=await $(r.clone());if(y&&ie(r.status,b.message))r=await w(u);else if(m&&p&&se(r.status,b.message))await p(),u=E(h),r=await w(u);else if(!A.has(r.status))throw q(r.status,b)}if(!r.ok&&!A.has(r.status))throw q(r.status,await $(r));const i=r.headers.get("X-Access-Token")?.trim()??"",d=r.headers.get("Content-Type")??"";if(d.includes("application/octet-stream")){const b=D(f,x),J=await r.arrayBuffer();let K;try{K=_(J,b)}catch(U){throw re({method:t,path:n,withAuth:s,status:r.status,contentType:d,responsePacketSource:x,tokenPresent:!!k,anonymousPacketTokenPresent:!!g,hmacEnabled:!!f,error:U}),U}return i&&O?.(i),K}if(i&&O?.(i),!d.includes("application/json"))return await r.text();const c=await r.json();if(B&&!c.ok&&!A.has(r.status))throw q(r.status,{message:c.message??`EntityServer error (HTTP ${r.status})`,code:c.code,body:c});return c}finally{Z(e,S.abortKey,S.controller)}}export{ue as entityRequest};
|
|
2
2
|
//# sourceMappingURL=request.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/client/request.ts"],
|
|
4
|
-
"sourcesContent": ["import { derivePacketKey, encryptPacket, decryptPacket } from \"./packet.js\";\nimport { buildHmacHeaders } from \"./hmac.js\";\n\nexport interface RequestOptions {\n baseUrl: string;\n token: string;\n anonymousPacketToken: string;\n apiKey: string;\n hmacSecret: string;\n encryptRequests: boolean;\n csrfEnabled: boolean;\n csrfHeaderName: string;\n csrfCookieName: string;\n refreshCsrfCookie: (() => Promise<void>) | null;\n onAccessToken?: (token: string) => void;\n requestAbortControllers: Map<string, AbortController>;\n /**\n * dev \uB514\uBC84\uADF8 \uD3C9\uBB38 \uC2DC\uD06C\uB9BF. \uC124\uC815\uB418\uBA74 \uC694\uCCAD\uC744 \uC554\uD638\uD654\uD558\uC9C0 \uC54A\uACE0(\uD3C9\uBB38),\n * `X-Debug-Plain` \uD5E4\uB354\uB85C \uC804\uC1A1\uD55C\uB2E4. \uC11C\uBC84\uC758 `DEBUG_PLAIN_SECRET` \uACFC \uC77C\uCE58\uD558\uBA74\n * \uC11C\uBC84\uB3C4 \uD574\uB2F9 \uC694\uCCAD/\uC751\uB2F5\uC744 \uD3C9\uBB38\uC73C\uB85C \uCC98\uB9AC\uD55C\uB2E4(\uD328\uD0B7 \uC554\uD638\uD654 \uC6B0\uD68C).\n */\n debugPlainSecret?: string;\n}\n\nexport interface EntityRequestConfig {\n requireOkShape?: boolean;\n allowStatuses?: number[];\n signal?: AbortSignal;\n autoAbortKey?: string | false;\n}\n\nexport interface EntityRequestError extends Error {\n status?: number;\n code?: string;\n details?: unknown;\n}\n\ninterface EntityErrorBody {\n error?: string;\n message?: string;\n code?: string;\n [key: string]: unknown;\n}\n\ninterface EntityErrorDetails {\n message: string;\n code?: string;\n body?: EntityErrorBody;\n}\n\n// isAutoAbortableMethod\uB294 \uAE30\uBCF8 \uC790\uB3D9 \uCDE8\uC18C \uD0A4\uB97C \uD5C8\uC6A9\uD558\uB294 \uC4F0\uAE30 \uBA54\uC11C\uB4DC\uC778\uC9C0 \uD655\uC778\uD569\uB2C8\uB2E4.\nfunction isAutoAbortableMethod(method: string): boolean {\n switch (method.toUpperCase()) {\n case \"POST\":\n case \"PUT\":\n case \"PATCH\":\n case \"DELETE\":\n return true;\n default:\n return false;\n }\n}\n\n// resolveAutoAbortKey\uB294 \uC694\uCCAD\uBCC4 \uC790\uB3D9 \uCDE8\uC18C \uD0A4\uB97C \uACC4\uC0B0\uD569\uB2C8\uB2E4.\nfunction resolveAutoAbortKey(\n method: string,\n path: string,\n config: EntityRequestConfig,\n): string | null {\n if (config.autoAbortKey === false) {\n return null;\n }\n\n if (typeof config.autoAbortKey === \"string\") {\n const trimmed = config.autoAbortKey.trim();\n return trimmed ? trimmed : null;\n }\n\n if (isAutoAbortableMethod(method)) {\n return `${method.toUpperCase()} ${path}`;\n }\n\n return null;\n}\n\n// composeAbortSignal\uC740 \uC678\uBD80 signal\uACFC \uB0B4\uBD80 \uCDE8\uC18C signal\uC744 \uD558\uB098\uB85C \uD569\uCE69\uB2C8\uB2E4.\nfunction composeAbortSignal(\n signals: Array<AbortSignal | undefined>,\n): AbortSignal | undefined {\n const activeSignals = signals.filter(\n (signal): signal is AbortSignal => !!signal,\n );\n if (activeSignals.length === 0) {\n return undefined;\n }\n if (activeSignals.length === 1) {\n return activeSignals[0];\n }\n if (typeof AbortSignal.any === \"function\") {\n return AbortSignal.any(activeSignals);\n }\n\n const controller = new AbortController();\n const abort = () => controller.abort();\n for (const signal of activeSignals) {\n if (signal.aborted) {\n controller.abort();\n break;\n }\n signal.addEventListener(\"abort\", abort, { once: true });\n }\n return controller.signal;\n}\n\n// createManagedAbortSignal\uC740 \uAC19\uC740 \uD0A4\uC758 \uC774\uC804 \uC694\uCCAD\uC744 \uCDE8\uC18C\uD558\uACE0 \uD604\uC7AC \uC694\uCCAD signal\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4.\nfunction createManagedAbortSignal(\n opts: RequestOptions,\n method: string,\n path: string,\n requestConfig: EntityRequestConfig,\n): {\n signal?: AbortSignal;\n abortKey: string | null;\n controller: AbortController | null;\n} {\n const abortKey = resolveAutoAbortKey(method, path, requestConfig);\n if (!abortKey) {\n return {\n signal: requestConfig.signal,\n abortKey: null,\n controller: null,\n };\n }\n\n opts.requestAbortControllers.get(abortKey)?.abort();\n\n const controller = new AbortController();\n opts.requestAbortControllers.set(abortKey, controller);\n\n return {\n signal: composeAbortSignal([requestConfig.signal, controller.signal]),\n abortKey,\n controller,\n };\n}\n\n// clearManagedAbortSignal\uC740 \uD604\uC7AC \uC694\uCCAD\uC774 \uB4F1\uB85D\uD55C \uCDE8\uC18C \uD0A4\uB9CC \uC548\uC804\uD558\uAC8C \uC815\uB9AC\uD569\uB2C8\uB2E4.\nfunction clearManagedAbortSignal(\n opts: RequestOptions,\n abortKey: string | null,\n controller: AbortController | null,\n): void {\n if (!abortKey || !controller) {\n return;\n }\n if (opts.requestAbortControllers.get(abortKey) === controller) {\n opts.requestAbortControllers.delete(abortKey);\n }\n}\n\nfunction resolvePacketSource(opts: RequestOptions): string {\n return opts.hmacSecret || opts.token || opts.anonymousPacketToken;\n}\n\nfunction resolveResponsePacketSource(\n opts: RequestOptions,\n withAuth: boolean,\n anonymousPacketToken: string,\n): string {\n if (opts.hmacSecret) {\n return opts.hmacSecret;\n }\n\n if (!withAuth) {\n return anonymousPacketToken;\n }\n\n return opts.token || anonymousPacketToken;\n}\n\nfunction maskPacketSource(value: string): string {\n if (!value) {\n return \"\";\n }\n\n if (value.length <= 8) {\n return `${value.slice(0, 2)}...${value.slice(-2)}`;\n }\n\n return `${value.slice(0, 4)}...${value.slice(-4)}`;\n}\n\nfunction logPacketDecryptError(details: {\n method: string;\n path: string;\n withAuth: boolean;\n status: number;\n contentType: string;\n responsePacketSource: string;\n tokenPresent: boolean;\n anonymousPacketTokenPresent: boolean;\n hmacEnabled: boolean;\n error: unknown;\n}): void {\n if (typeof console === \"undefined\" || typeof console.error !== \"function\") {\n return;\n }\n\n console.error(\"[entity-client] packet decrypt failed\", {\n method: details.method,\n path: details.path,\n withAuth: details.withAuth,\n status: details.status,\n contentType: details.contentType,\n responsePacketSource: maskPacketSource(details.responsePacketSource),\n tokenPresent: details.tokenPresent,\n anonymousPacketTokenPresent: details.anonymousPacketTokenPresent,\n hmacEnabled: details.hmacEnabled,\n error:\n details.error instanceof Error\n ? {\n name: details.error.name,\n message: details.error.message,\n stack: details.error.stack,\n }\n : details.error,\n });\n}\n\nfunction requiresCsrf(method: string): boolean {\n return method !== \"GET\" && method !== \"HEAD\" && method !== \"OPTIONS\";\n}\n\nfunction readCsrfCookie(name: string): string {\n if (typeof document === \"undefined\") return \"\";\n for (const chunk of document.cookie.split(\";\")) {\n const idx = chunk.indexOf(\"=\");\n if (idx < 0) continue;\n if (chunk.substring(0, idx).trim() === name) {\n return decodeURIComponent(chunk.substring(idx + 1).trim());\n }\n }\n return \"\";\n}\n\nfunction isCsrfError(status: number, message: string): boolean {\n if (status === 403 && /csrf/i.test(message)) {\n return true;\n }\n\n return (\n /csrf/i.test(message) &&\n /expired|token validation failed/i.test(message)\n );\n}\n\n// HMAC nonce \uC7AC\uC0AC\uC6A9 \uC751\uB2F5\uC778\uC9C0 \uD655\uC778\uD569\uB2C8\uB2E4.\nfunction isHmacNonceReuseError(status: number, message: string): boolean {\n return status === 401 && /nonce already used/i.test(message);\n}\n\n// readErrorDetails\uB294 \uC5D0\uB7EC \uC751\uB2F5 \uBCF8\uBB38\uC5D0\uC11C \uBA54\uC2DC\uC9C0\uC640 \uCF54\uB4DC\uB97C \uCD94\uCD9C\uD569\uB2C8\uB2E4.\nasync function readErrorDetails(res: Response): Promise<EntityErrorDetails> {\n const contentType = res.headers.get(\"Content-Type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n const data = (await res\n .json()\n .catch(() => null)) as EntityErrorBody | null;\n if (data?.error)\n return { message: data.error, code: data.code, body: data };\n if (data?.message)\n return { message: data.message, code: data.code, body: data };\n }\n\n const text = await res.text().catch(() => \"\");\n return { message: text || `HTTP ${res.status}` };\n}\n\n// createEntityRequestError\uB294 HTTP \uC5D0\uB7EC \uC815\uBCF4\uB97C Error \uAC1D\uCCB4\uC5D0 \uBCF4\uC874\uD569\uB2C8\uB2E4.\nfunction createEntityRequestError(\n status: number,\n details: EntityErrorDetails,\n): EntityRequestError {\n const err = new Error(details.message) as EntityRequestError;\n err.status = status;\n if (details.code) {\n err.code = details.code;\n }\n if (details.body) {\n err.details = details.body;\n }\n return err;\n}\n\n/**\n * Entity Server\uC5D0 HTTP \uC694\uCCAD\uC744 \uBCF4\uB0C5\uB2C8\uB2E4.\n *\n * - `encryptRequests` \uD65C\uC131\uD654 \uC2DC \uC778\uC99D\uB41C POST \uBC14\uB514\uB97C \uC790\uB3D9 \uC554\uD638\uD654\uD569\uB2C8\uB2E4.\n * - \uC751\uB2F5\uC774 `application/octet-stream`\uC774\uBA74 \uC790\uB3D9 \uBCF5\uD638\uD654\uD569\uB2C8\uB2E4.\n * - JSON \uC751\uB2F5\uC758 `ok`\uAC00 false\uC774\uBA74 \uC5D0\uB7EC\uB97C \uB358\uC9D1\uB2C8\uB2E4.\n */\nexport async function entityRequest<T>(\n opts: RequestOptions,\n method: string,\n path: string,\n body?: unknown,\n withAuth = true,\n extraHeaders: Record<string, string> = {},\n config: boolean | EntityRequestConfig = true,\n): Promise<T> {\n const requestConfig: EntityRequestConfig =\n typeof config === \"boolean\" ? { requireOkShape: config } : config;\n const requireOkShape = requestConfig.requireOkShape ?? true;\n const allowStatuses = new Set(requestConfig.allowStatuses ?? []);\n const managedAbort = createManagedAbortSignal(\n opts,\n method,\n path,\n requestConfig,\n );\n const signal = managedAbort.signal;\n\n const {\n baseUrl,\n token,\n apiKey,\n hmacSecret,\n encryptRequests,\n csrfEnabled,\n csrfHeaderName,\n csrfCookieName,\n refreshCsrfCookie,\n onAccessToken,\n debugPlainSecret,\n } = opts;\n // checkHealth()\uAC00 \uC644\uB8CC\uB418\uAE30 \uC804 race condition\uC744 \uB9C9\uAE30 \uC704\uD574 anon_token \uCFE0\uD0A4\uB97C \uC9C1\uC811 fallback\uC73C\uB85C \uC77D\uC74C\n const anonymousPacketToken =\n opts.anonymousPacketToken || readCsrfCookie(\"anon_token\");\n const isHmacMode = withAuth && !!(apiKey && hmacSecret);\n const packetSource = resolvePacketSource(opts);\n const responsePacketSource = resolveResponsePacketSource(\n opts,\n withAuth,\n anonymousPacketToken,\n );\n const shouldUseCsrf = csrfEnabled && requiresCsrf(method) && !isHmacMode;\n let csrfToken = shouldUseCsrf ? readCsrfCookie(csrfCookieName) : \"\";\n let requestContentType = \"application/json\";\n const includeAnonymousPacketHeader = !isHmacMode && !!anonymousPacketToken;\n\n let fetchBody: string | Uint8Array | null = null;\n if (body != null) {\n const shouldEncrypt =\n !debugPlainSecret &&\n encryptRequests &&\n !!packetSource &&\n withAuth &&\n method !== \"GET\" &&\n method !== \"HEAD\";\n\n if (shouldEncrypt) {\n const key = derivePacketKey(\n hmacSecret,\n token || anonymousPacketToken,\n );\n fetchBody = encryptPacket(\n new TextEncoder().encode(JSON.stringify(body)),\n key,\n );\n requestContentType = \"application/octet-stream\";\n } else {\n fetchBody = JSON.stringify(body);\n }\n }\n\n const buildHeaders = (\n resolvedCsrfToken: string,\n ): Record<string, string> => {\n const headers: Record<string, string> = { ...extraHeaders };\n const hasExplicitContentType = Object.keys(headers).some(\n (key) => key.toLowerCase() === \"content-type\",\n );\n if (fetchBody != null && !hasExplicitContentType) {\n headers[\"Content-Type\"] = requestContentType;\n }\n if (!isHmacMode && withAuth && token) {\n headers.Authorization = `Bearer ${token}`;\n }\n if (includeAnonymousPacketHeader) {\n headers[\"X-Packet-Token\"] = anonymousPacketToken;\n }\n // dev \uB514\uBC84\uADF8 \uBC14\uC774\uD328\uC2A4: \uC11C\uBC84\uAC00 \uD3C9\uBB38 \uCC98\uB9AC\uD558\uB3C4\uB85D \uC2DC\uD06C\uB9BF \uD5E4\uB354\uB97C \uBCF4\uB0B8\uB2E4.\n if (debugPlainSecret) {\n headers[\"X-Debug-Plain\"] = debugPlainSecret;\n }\n if (shouldUseCsrf && resolvedCsrfToken) {\n headers[csrfHeaderName] = resolvedCsrfToken;\n }\n if (isHmacMode) {\n const bodyBytes =\n fetchBody instanceof Uint8Array\n ? fetchBody\n : typeof fetchBody === \"string\"\n ? new TextEncoder().encode(fetchBody)\n : new Uint8Array(0);\n Object.assign(\n headers,\n buildHmacHeaders(method, path, bodyBytes, apiKey, hmacSecret),\n );\n }\n return headers;\n };\n\n if (shouldUseCsrf && !csrfToken && refreshCsrfCookie) {\n await refreshCsrfCookie();\n csrfToken = readCsrfCookie(csrfCookieName);\n }\n\n const executeRequest = (resolvedCsrfToken: string): Promise<Response> =>\n fetch(baseUrl + path, {\n method,\n headers: buildHeaders(resolvedCsrfToken),\n ...(fetchBody != null\n ? { body: fetchBody as RequestInit[\"body\"] }\n : {}),\n credentials: \"include\",\n signal,\n });\n\n try {\n let res = await executeRequest(csrfToken);\n\n if (!res.ok) {\n const details = await readErrorDetails(res.clone());\n if (\n isHmacMode &&\n isHmacNonceReuseError(res.status, details.message)\n ) {\n res = await executeRequest(csrfToken);\n } else if (\n shouldUseCsrf &&\n refreshCsrfCookie &&\n isCsrfError(res.status, details.message)\n ) {\n await refreshCsrfCookie();\n csrfToken = readCsrfCookie(csrfCookieName);\n res = await executeRequest(csrfToken);\n } else if (!allowStatuses.has(res.status)) {\n throw createEntityRequestError(res.status, details);\n } else {\n // \uD5C8\uC6A9\uB41C \uBE44\uC815\uC0C1 \uC0C1\uD0DC\uB294 \uBCF8\uBB38\uC744 \uADF8\uB300\uB85C \uD30C\uC2F1\uD574 \uD638\uCD9C\uC790\uC5D0\uAC8C \uB118\uAE41\uB2C8\uB2E4.\n }\n }\n\n if (!res.ok && !allowStatuses.has(res.status)) {\n throw createEntityRequestError(\n res.status,\n await readErrorDetails(res),\n );\n }\n\n const accessTokenHeader =\n res.headers.get(\"X-Access-Token\")?.trim() ?? \"\";\n\n const contentType = res.headers.get(\"Content-Type\") ?? \"\";\n if (contentType.includes(\"application/octet-stream\")) {\n const key = derivePacketKey(hmacSecret, responsePacketSource);\n const encryptedBody = await res.arrayBuffer();\n let decrypted: T;\n\n try {\n decrypted = decryptPacket<T>(encryptedBody, key);\n } catch (error) {\n logPacketDecryptError({\n method,\n path,\n withAuth,\n status: res.status,\n contentType,\n responsePacketSource,\n tokenPresent: !!token,\n anonymousPacketTokenPresent: !!anonymousPacketToken,\n hmacEnabled: !!hmacSecret,\n error,\n });\n throw error;\n }\n\n if (accessTokenHeader) {\n onAccessToken?.(accessTokenHeader);\n }\n return decrypted;\n }\n\n if (accessTokenHeader) {\n onAccessToken?.(accessTokenHeader);\n }\n\n if (!contentType.includes(\"application/json\")) {\n return (await res.text()) as T;\n }\n\n const data = (await res.json()) as {\n ok?: boolean;\n message?: string;\n code?: string;\n };\n if (requireOkShape && !data.ok && !allowStatuses.has(res.status)) {\n throw createEntityRequestError(res.status, {\n message:\n data.message ?? `EntityServer error (HTTP ${res.status})`,\n code: data.code,\n body: data,\n });\n } else {\n return data as T;\n }\n } finally {\n clearManagedAbortSignal(\n opts,\n managedAbort.abortKey,\n managedAbort.controller,\n );\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,OAAS,mBAAAA,EAAiB,iBAAAC,EAAe,iBAAAC,MAAqB,cAC9D,OAAS,oBAAAC,MAAwB,YAkDjC,SAASC,EAAsBC,EAAyB,CACpD,OAAQA,EAAO,YAAY,EAAG,CAC1B,IAAK,OACL,IAAK,MACL,IAAK,QACL,IAAK,SACD,MAAO,GACX,QACI,MAAO,EACf,CACJ,CAGA,SAASC,EACLD,EACAE,EACAC,EACa,CACb,GAAIA,EAAO,eAAiB,GACxB,OAAO,KAGX,GAAI,OAAOA,EAAO,cAAiB,SAAU,CACzC,MAAMC,EAAUD,EAAO,aAAa,KAAK,EACzC,OAAOC,GAAoB,IAC/B,
|
|
4
|
+
"sourcesContent": ["import { derivePacketKey, encryptPacket, decryptPacket } from \"./packet.js\";\nimport { buildHmacHeaders } from \"./hmac.js\";\n\nexport interface RequestOptions {\n baseUrl: string;\n token: string;\n anonymousPacketToken: string;\n apiKey: string;\n hmacSecret: string;\n encryptRequests: boolean;\n csrfEnabled: boolean;\n csrfHeaderName: string;\n csrfCookieName: string;\n refreshCsrfCookie: (() => Promise<void>) | null;\n onAccessToken?: (token: string) => void;\n requestAbortControllers: Map<string, AbortController>;\n /**\n * dev \uB514\uBC84\uADF8 \uD3C9\uBB38 \uC2DC\uD06C\uB9BF. \uC124\uC815\uB418\uBA74 \uC694\uCCAD\uC744 \uC554\uD638\uD654\uD558\uC9C0 \uC54A\uACE0(\uD3C9\uBB38),\n * `X-Debug-Plain` \uD5E4\uB354\uB85C \uC804\uC1A1\uD55C\uB2E4. \uC11C\uBC84\uC758 `DEBUG_PLAIN_SECRET` \uACFC \uC77C\uCE58\uD558\uBA74\n * \uC11C\uBC84\uB3C4 \uD574\uB2F9 \uC694\uCCAD/\uC751\uB2F5\uC744 \uD3C9\uBB38\uC73C\uB85C \uCC98\uB9AC\uD55C\uB2E4(\uD328\uD0B7 \uC554\uD638\uD654 \uC6B0\uD68C).\n */\n debugPlainSecret?: string;\n}\n\nexport interface EntityRequestConfig {\n requireOkShape?: boolean;\n allowStatuses?: number[];\n signal?: AbortSignal;\n autoAbortKey?: string | false;\n}\n\nexport interface EntityRequestError extends Error {\n status?: number;\n code?: string;\n details?: unknown;\n}\n\ninterface EntityErrorBody {\n error?: string;\n message?: string;\n code?: string;\n [key: string]: unknown;\n}\n\ninterface EntityErrorDetails {\n message: string;\n code?: string;\n body?: EntityErrorBody;\n}\n\n// isAutoAbortableMethod\uB294 \uAE30\uBCF8 \uC790\uB3D9 \uCDE8\uC18C \uD0A4\uB97C \uD5C8\uC6A9\uD558\uB294 \uC4F0\uAE30 \uBA54\uC11C\uB4DC\uC778\uC9C0 \uD655\uC778\uD569\uB2C8\uB2E4.\nfunction isAutoAbortableMethod(method: string): boolean {\n switch (method.toUpperCase()) {\n case \"POST\":\n case \"PUT\":\n case \"PATCH\":\n case \"DELETE\":\n return true;\n default:\n return false;\n }\n}\n\n// resolveAutoAbortKey\uB294 \uC694\uCCAD\uBCC4 \uC790\uB3D9 \uCDE8\uC18C \uD0A4\uB97C \uACC4\uC0B0\uD569\uB2C8\uB2E4.\nfunction resolveAutoAbortKey(\n method: string,\n path: string,\n config: EntityRequestConfig,\n): string | null {\n if (config.autoAbortKey === false) {\n return null;\n }\n\n if (typeof config.autoAbortKey === \"string\") {\n const trimmed = config.autoAbortKey.trim();\n return trimmed ? trimmed : null;\n }\n\n // \uC790\uB3D9 \uCDE8\uC18C(\uAC19\uC740 \uACBD\uB85C \uC911\uBCF5 \uC694\uCCAD \uCDE8\uC18C)\uB294 \uBE0C\uB77C\uC6B0\uC800 UX \uCD5C\uC801\uD654\uB2E4. \uC11C\uBC84(Node)\uC5D0\uC11C\uB294\n // \uB3D9\uC2DC \uC694\uCCAD\uC774 \uC815\uC0C1 \uB3D9\uC791\uC774\uBBC0\uB85C \uAE30\uBCF8 \uC790\uB3D9 \uCDE8\uC18C\uB97C \uC801\uC6A9\uD558\uC9C0 \uC54A\uB294\uB2E4 \u2014 \uAC19\uC740 \uACBD\uB85C \uB3D9\uC2DC \uD638\uCD9C\uC774\n // \uC11C\uB85C\uB97C AbortError \uB85C \uCDE8\uC18C\uD558\uB294 \uBB38\uC81C(\uC608: \uD55C \uD578\uB4E4\uB7EC\uC5D0\uC11C \uAC19\uC740 \uC5D4\uD2F0\uD2F0 list 2\uAC1C\uB97C Promise.all \uB85C\n // \uB3D9\uC2DC \uD638\uCD9C, \uB610\uB294 \uD3F4\uB9C1\uC73C\uB85C \uB3D9\uC2DC \uC694\uCCAD\uC774 \uACB9\uCE58\uB294 \uACBD\uC6B0)\uB97C \uB9C9\uB294\uB2E4.\n // \uBA85\uC2DC\uC801 autoAbortKey(\uBB38\uC790\uC5F4/false)\uB294 \uC11C\uBC84\uC5D0\uC11C\uB3C4 \uC704\uC5D0\uC11C \uADF8\uB300\uB85C \uC874\uC911\uD55C\uB2E4.\n if (typeof window === \"undefined\") {\n return null;\n }\n\n if (isAutoAbortableMethod(method)) {\n return `${method.toUpperCase()} ${path}`;\n }\n\n return null;\n}\n\n// composeAbortSignal\uC740 \uC678\uBD80 signal\uACFC \uB0B4\uBD80 \uCDE8\uC18C signal\uC744 \uD558\uB098\uB85C \uD569\uCE69\uB2C8\uB2E4.\nfunction composeAbortSignal(\n signals: Array<AbortSignal | undefined>,\n): AbortSignal | undefined {\n const activeSignals = signals.filter(\n (signal): signal is AbortSignal => !!signal,\n );\n if (activeSignals.length === 0) {\n return undefined;\n }\n if (activeSignals.length === 1) {\n return activeSignals[0];\n }\n if (typeof AbortSignal.any === \"function\") {\n return AbortSignal.any(activeSignals);\n }\n\n const controller = new AbortController();\n const abort = () => controller.abort();\n for (const signal of activeSignals) {\n if (signal.aborted) {\n controller.abort();\n break;\n }\n signal.addEventListener(\"abort\", abort, { once: true });\n }\n return controller.signal;\n}\n\n// createManagedAbortSignal\uC740 \uAC19\uC740 \uD0A4\uC758 \uC774\uC804 \uC694\uCCAD\uC744 \uCDE8\uC18C\uD558\uACE0 \uD604\uC7AC \uC694\uCCAD signal\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4.\nfunction createManagedAbortSignal(\n opts: RequestOptions,\n method: string,\n path: string,\n requestConfig: EntityRequestConfig,\n): {\n signal?: AbortSignal;\n abortKey: string | null;\n controller: AbortController | null;\n} {\n const abortKey = resolveAutoAbortKey(method, path, requestConfig);\n if (!abortKey) {\n return {\n signal: requestConfig.signal,\n abortKey: null,\n controller: null,\n };\n }\n\n opts.requestAbortControllers.get(abortKey)?.abort();\n\n const controller = new AbortController();\n opts.requestAbortControllers.set(abortKey, controller);\n\n return {\n signal: composeAbortSignal([requestConfig.signal, controller.signal]),\n abortKey,\n controller,\n };\n}\n\n// clearManagedAbortSignal\uC740 \uD604\uC7AC \uC694\uCCAD\uC774 \uB4F1\uB85D\uD55C \uCDE8\uC18C \uD0A4\uB9CC \uC548\uC804\uD558\uAC8C \uC815\uB9AC\uD569\uB2C8\uB2E4.\nfunction clearManagedAbortSignal(\n opts: RequestOptions,\n abortKey: string | null,\n controller: AbortController | null,\n): void {\n if (!abortKey || !controller) {\n return;\n }\n if (opts.requestAbortControllers.get(abortKey) === controller) {\n opts.requestAbortControllers.delete(abortKey);\n }\n}\n\nfunction resolvePacketSource(opts: RequestOptions): string {\n return opts.hmacSecret || opts.token || opts.anonymousPacketToken;\n}\n\nfunction resolveResponsePacketSource(\n opts: RequestOptions,\n withAuth: boolean,\n anonymousPacketToken: string,\n): string {\n if (opts.hmacSecret) {\n return opts.hmacSecret;\n }\n\n if (!withAuth) {\n return anonymousPacketToken;\n }\n\n return opts.token || anonymousPacketToken;\n}\n\nfunction maskPacketSource(value: string): string {\n if (!value) {\n return \"\";\n }\n\n if (value.length <= 8) {\n return `${value.slice(0, 2)}...${value.slice(-2)}`;\n }\n\n return `${value.slice(0, 4)}...${value.slice(-4)}`;\n}\n\nfunction logPacketDecryptError(details: {\n method: string;\n path: string;\n withAuth: boolean;\n status: number;\n contentType: string;\n responsePacketSource: string;\n tokenPresent: boolean;\n anonymousPacketTokenPresent: boolean;\n hmacEnabled: boolean;\n error: unknown;\n}): void {\n if (typeof console === \"undefined\" || typeof console.error !== \"function\") {\n return;\n }\n\n console.error(\"[entity-client] packet decrypt failed\", {\n method: details.method,\n path: details.path,\n withAuth: details.withAuth,\n status: details.status,\n contentType: details.contentType,\n responsePacketSource: maskPacketSource(details.responsePacketSource),\n tokenPresent: details.tokenPresent,\n anonymousPacketTokenPresent: details.anonymousPacketTokenPresent,\n hmacEnabled: details.hmacEnabled,\n error:\n details.error instanceof Error\n ? {\n name: details.error.name,\n message: details.error.message,\n stack: details.error.stack,\n }\n : details.error,\n });\n}\n\nfunction requiresCsrf(method: string): boolean {\n return method !== \"GET\" && method !== \"HEAD\" && method !== \"OPTIONS\";\n}\n\nfunction readCsrfCookie(name: string): string {\n if (typeof document === \"undefined\") return \"\";\n for (const chunk of document.cookie.split(\";\")) {\n const idx = chunk.indexOf(\"=\");\n if (idx < 0) continue;\n if (chunk.substring(0, idx).trim() === name) {\n return decodeURIComponent(chunk.substring(idx + 1).trim());\n }\n }\n return \"\";\n}\n\nfunction isCsrfError(status: number, message: string): boolean {\n if (status === 403 && /csrf/i.test(message)) {\n return true;\n }\n\n return (\n /csrf/i.test(message) &&\n /expired|token validation failed/i.test(message)\n );\n}\n\n// HMAC nonce \uC7AC\uC0AC\uC6A9 \uC751\uB2F5\uC778\uC9C0 \uD655\uC778\uD569\uB2C8\uB2E4.\nfunction isHmacNonceReuseError(status: number, message: string): boolean {\n return status === 401 && /nonce already used/i.test(message);\n}\n\n// readErrorDetails\uB294 \uC5D0\uB7EC \uC751\uB2F5 \uBCF8\uBB38\uC5D0\uC11C \uBA54\uC2DC\uC9C0\uC640 \uCF54\uB4DC\uB97C \uCD94\uCD9C\uD569\uB2C8\uB2E4.\nasync function readErrorDetails(res: Response): Promise<EntityErrorDetails> {\n const contentType = res.headers.get(\"Content-Type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n const data = (await res\n .json()\n .catch(() => null)) as EntityErrorBody | null;\n if (data?.error)\n return { message: data.error, code: data.code, body: data };\n if (data?.message)\n return { message: data.message, code: data.code, body: data };\n }\n\n const text = await res.text().catch(() => \"\");\n return { message: text || `HTTP ${res.status}` };\n}\n\n// createEntityRequestError\uB294 HTTP \uC5D0\uB7EC \uC815\uBCF4\uB97C Error \uAC1D\uCCB4\uC5D0 \uBCF4\uC874\uD569\uB2C8\uB2E4.\nfunction createEntityRequestError(\n status: number,\n details: EntityErrorDetails,\n): EntityRequestError {\n const err = new Error(details.message) as EntityRequestError;\n err.status = status;\n if (details.code) {\n err.code = details.code;\n }\n if (details.body) {\n err.details = details.body;\n }\n return err;\n}\n\n/**\n * Entity Server\uC5D0 HTTP \uC694\uCCAD\uC744 \uBCF4\uB0C5\uB2C8\uB2E4.\n *\n * - `encryptRequests` \uD65C\uC131\uD654 \uC2DC \uC778\uC99D\uB41C POST \uBC14\uB514\uB97C \uC790\uB3D9 \uC554\uD638\uD654\uD569\uB2C8\uB2E4.\n * - \uC751\uB2F5\uC774 `application/octet-stream`\uC774\uBA74 \uC790\uB3D9 \uBCF5\uD638\uD654\uD569\uB2C8\uB2E4.\n * - JSON \uC751\uB2F5\uC758 `ok`\uAC00 false\uC774\uBA74 \uC5D0\uB7EC\uB97C \uB358\uC9D1\uB2C8\uB2E4.\n */\nexport async function entityRequest<T>(\n opts: RequestOptions,\n method: string,\n path: string,\n body?: unknown,\n withAuth = true,\n extraHeaders: Record<string, string> = {},\n config: boolean | EntityRequestConfig = true,\n): Promise<T> {\n const requestConfig: EntityRequestConfig =\n typeof config === \"boolean\" ? { requireOkShape: config } : config;\n const requireOkShape = requestConfig.requireOkShape ?? true;\n const allowStatuses = new Set(requestConfig.allowStatuses ?? []);\n const managedAbort = createManagedAbortSignal(\n opts,\n method,\n path,\n requestConfig,\n );\n const signal = managedAbort.signal;\n\n const {\n baseUrl,\n token,\n apiKey,\n hmacSecret,\n encryptRequests,\n csrfEnabled,\n csrfHeaderName,\n csrfCookieName,\n refreshCsrfCookie,\n onAccessToken,\n debugPlainSecret,\n } = opts;\n // checkHealth()\uAC00 \uC644\uB8CC\uB418\uAE30 \uC804 race condition\uC744 \uB9C9\uAE30 \uC704\uD574 anon_token \uCFE0\uD0A4\uB97C \uC9C1\uC811 fallback\uC73C\uB85C \uC77D\uC74C\n const anonymousPacketToken =\n opts.anonymousPacketToken || readCsrfCookie(\"anon_token\");\n const isHmacMode = withAuth && !!(apiKey && hmacSecret);\n const packetSource = resolvePacketSource(opts);\n const responsePacketSource = resolveResponsePacketSource(\n opts,\n withAuth,\n anonymousPacketToken,\n );\n const shouldUseCsrf = csrfEnabled && requiresCsrf(method) && !isHmacMode;\n let csrfToken = shouldUseCsrf ? readCsrfCookie(csrfCookieName) : \"\";\n let requestContentType = \"application/json\";\n const includeAnonymousPacketHeader = !isHmacMode && !!anonymousPacketToken;\n\n let fetchBody: string | Uint8Array | null = null;\n if (body != null) {\n const shouldEncrypt =\n !debugPlainSecret &&\n encryptRequests &&\n !!packetSource &&\n withAuth &&\n method !== \"GET\" &&\n method !== \"HEAD\";\n\n if (shouldEncrypt) {\n const key = derivePacketKey(\n hmacSecret,\n token || anonymousPacketToken,\n );\n fetchBody = encryptPacket(\n new TextEncoder().encode(JSON.stringify(body)),\n key,\n );\n requestContentType = \"application/octet-stream\";\n } else {\n fetchBody = JSON.stringify(body);\n }\n }\n\n const buildHeaders = (\n resolvedCsrfToken: string,\n ): Record<string, string> => {\n const headers: Record<string, string> = { ...extraHeaders };\n const hasExplicitContentType = Object.keys(headers).some(\n (key) => key.toLowerCase() === \"content-type\",\n );\n if (fetchBody != null && !hasExplicitContentType) {\n headers[\"Content-Type\"] = requestContentType;\n }\n if (!isHmacMode && withAuth && token) {\n headers.Authorization = `Bearer ${token}`;\n }\n if (includeAnonymousPacketHeader) {\n headers[\"X-Packet-Token\"] = anonymousPacketToken;\n }\n // dev \uB514\uBC84\uADF8 \uBC14\uC774\uD328\uC2A4: \uC11C\uBC84\uAC00 \uD3C9\uBB38 \uCC98\uB9AC\uD558\uB3C4\uB85D \uC2DC\uD06C\uB9BF \uD5E4\uB354\uB97C \uBCF4\uB0B8\uB2E4.\n if (debugPlainSecret) {\n headers[\"X-Debug-Plain\"] = debugPlainSecret;\n }\n if (shouldUseCsrf && resolvedCsrfToken) {\n headers[csrfHeaderName] = resolvedCsrfToken;\n }\n if (isHmacMode) {\n const bodyBytes =\n fetchBody instanceof Uint8Array\n ? fetchBody\n : typeof fetchBody === \"string\"\n ? new TextEncoder().encode(fetchBody)\n : new Uint8Array(0);\n Object.assign(\n headers,\n buildHmacHeaders(method, path, bodyBytes, apiKey, hmacSecret),\n );\n }\n return headers;\n };\n\n if (shouldUseCsrf && !csrfToken && refreshCsrfCookie) {\n await refreshCsrfCookie();\n csrfToken = readCsrfCookie(csrfCookieName);\n }\n\n const executeRequest = (resolvedCsrfToken: string): Promise<Response> =>\n fetch(baseUrl + path, {\n method,\n headers: buildHeaders(resolvedCsrfToken),\n ...(fetchBody != null\n ? { body: fetchBody as RequestInit[\"body\"] }\n : {}),\n credentials: \"include\",\n signal,\n });\n\n try {\n let res = await executeRequest(csrfToken);\n\n if (!res.ok) {\n const details = await readErrorDetails(res.clone());\n if (\n isHmacMode &&\n isHmacNonceReuseError(res.status, details.message)\n ) {\n res = await executeRequest(csrfToken);\n } else if (\n shouldUseCsrf &&\n refreshCsrfCookie &&\n isCsrfError(res.status, details.message)\n ) {\n await refreshCsrfCookie();\n csrfToken = readCsrfCookie(csrfCookieName);\n res = await executeRequest(csrfToken);\n } else if (!allowStatuses.has(res.status)) {\n throw createEntityRequestError(res.status, details);\n } else {\n // \uD5C8\uC6A9\uB41C \uBE44\uC815\uC0C1 \uC0C1\uD0DC\uB294 \uBCF8\uBB38\uC744 \uADF8\uB300\uB85C \uD30C\uC2F1\uD574 \uD638\uCD9C\uC790\uC5D0\uAC8C \uB118\uAE41\uB2C8\uB2E4.\n }\n }\n\n if (!res.ok && !allowStatuses.has(res.status)) {\n throw createEntityRequestError(\n res.status,\n await readErrorDetails(res),\n );\n }\n\n const accessTokenHeader =\n res.headers.get(\"X-Access-Token\")?.trim() ?? \"\";\n\n const contentType = res.headers.get(\"Content-Type\") ?? \"\";\n if (contentType.includes(\"application/octet-stream\")) {\n const key = derivePacketKey(hmacSecret, responsePacketSource);\n const encryptedBody = await res.arrayBuffer();\n let decrypted: T;\n\n try {\n decrypted = decryptPacket<T>(encryptedBody, key);\n } catch (error) {\n logPacketDecryptError({\n method,\n path,\n withAuth,\n status: res.status,\n contentType,\n responsePacketSource,\n tokenPresent: !!token,\n anonymousPacketTokenPresent: !!anonymousPacketToken,\n hmacEnabled: !!hmacSecret,\n error,\n });\n throw error;\n }\n\n if (accessTokenHeader) {\n onAccessToken?.(accessTokenHeader);\n }\n return decrypted;\n }\n\n if (accessTokenHeader) {\n onAccessToken?.(accessTokenHeader);\n }\n\n if (!contentType.includes(\"application/json\")) {\n return (await res.text()) as T;\n }\n\n const data = (await res.json()) as {\n ok?: boolean;\n message?: string;\n code?: string;\n };\n if (requireOkShape && !data.ok && !allowStatuses.has(res.status)) {\n throw createEntityRequestError(res.status, {\n message:\n data.message ?? `EntityServer error (HTTP ${res.status})`,\n code: data.code,\n body: data,\n });\n } else {\n return data as T;\n }\n } finally {\n clearManagedAbortSignal(\n opts,\n managedAbort.abortKey,\n managedAbort.controller,\n );\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["derivePacketKey", "encryptPacket", "decryptPacket", "buildHmacHeaders", "isAutoAbortableMethod", "method", "resolveAutoAbortKey", "path", "config", "trimmed", "composeAbortSignal", "signals", "activeSignals", "signal", "controller", "abort", "createManagedAbortSignal", "opts", "requestConfig", "abortKey", "clearManagedAbortSignal", "resolvePacketSource", "resolveResponsePacketSource", "withAuth", "anonymousPacketToken", "maskPacketSource", "value", "logPacketDecryptError", "details", "requiresCsrf", "readCsrfCookie", "name", "chunk", "idx", "isCsrfError", "status", "message", "isHmacNonceReuseError", "readErrorDetails", "res", "data", "createEntityRequestError", "err", "entityRequest", "body", "extraHeaders", "requireOkShape", "allowStatuses", "managedAbort", "baseUrl", "token", "apiKey", "hmacSecret", "encryptRequests", "csrfEnabled", "csrfHeaderName", "csrfCookieName", "refreshCsrfCookie", "onAccessToken", "debugPlainSecret", "isHmacMode", "packetSource", "responsePacketSource", "shouldUseCsrf", "csrfToken", "requestContentType", "includeAnonymousPacketHeader", "fetchBody", "key", "buildHeaders", "resolvedCsrfToken", "headers", "hasExplicitContentType", "bodyBytes", "executeRequest", "accessTokenHeader", "contentType", "encryptedBody", "decrypted", "error"]
|
|
7
7
|
}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
function H(r){let n=import.meta;if(n?.env?.[r]!=null)return n.env[r];let e=globalThis.process;if(e?.env?.[r]!=null)return e.env[r]}function l(r){return Object.entries(r).filter(([,n])=>n!=null).map(([n,e])=>`${encodeURIComponent(n==="orderBy"?"order_by":n)}=${encodeURIComponent(String(e))}`).join("&")}import{xchacha20poly1305 as Pe}from"@noble/ciphers/chacha";import{sha256 as He}from"@noble/hashes/sha2";import{hkdf as Ie}from"@noble/hashes/hkdf";var I=32,G=2,F=14,y=24,Ge=16,Fe="entity-server:hkdf:v1",De="entity-server:packet-encryption";function x(r){return r instanceof Uint8Array?r:new Uint8Array(r)}function be(r,n=De){return Ie(He,new TextEncoder().encode(r),new TextEncoder().encode(Fe),new TextEncoder().encode(n),I)}function we(r,n=G,e=F){let t=x(r);return t.length<I?n:n+t[I-1]%e}function ve(r,n,e=G,t=F){let s=x(r),i=x(n),o=we(i,e,t),a=crypto.getRandomValues(new Uint8Array(o)),u=crypto.getRandomValues(new Uint8Array(y)),h=Pe(i,u).encrypt(s),p=new Uint8Array(o+y+h.length);return p.set(a,0),p.set(u,o),p.set(h,o+y),p}function Re(r,n,e=G,t=F){let s=x(r),i=x(n),o=we(i,e,t);if(s.length<o+y+Ge)throw new Error("Encrypted packet too short");let a=s.slice(o,o+y),u=s.slice(o+y);return Pe(i,a).decrypt(u)}function C(r,n){return be(r||n)}function Se(r,n){return ve(r,n)}function $(r,n){let e=Re(r,n);return JSON.parse(new TextDecoder().decode(e))}function xe(r,n,e,t){let s=n.toLowerCase().includes("application/octet-stream");if(e&&!s)throw new Error("Encrypted request required: Content-Type must be application/octet-stream");if(s){if(r==null)throw new Error("Encrypted request body is empty");if(r instanceof ArrayBuffer)return $(r,t);if(r instanceof Uint8Array){let i=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);return $(i,t)}throw new Error("Encrypted request body must be ArrayBuffer or Uint8Array")}return r==null||r===""?{}:typeof r=="string"?JSON.parse(r):r}import{sha256 as je}from"@noble/hashes/sha2";import{hmac as Ke}from"@noble/hashes/hmac";function Ce(r,n,e,t,s){let i=String(Math.floor(Date.now()/1e3)),o=crypto.randomUUID(),a=new TextEncoder().encode(`${r}|${n}|${i}|${o}|`),u=new Uint8Array(a.length+e.length);u.set(a,0),u.set(e,a.length);let h=[...Ke(je,new TextEncoder().encode(s),u)].map(p=>p.toString(16).padStart(2,"0")).join("");return{"X-API-Key":t,"X-Timestamp":i,"X-Nonce":o,"X-Signature":h}}function Ne(r){switch(r.toUpperCase()){case"POST":case"PUT":case"PATCH":case"DELETE":return!0;default:return!1}}function Ve(r,n,e){if(e.autoAbortKey===!1)return null;if(typeof e.autoAbortKey=="string"){let t=e.autoAbortKey.trim();return t||null}return Ne(r)?`${r.toUpperCase()} ${n}`:null}function We(r){let n=r.filter(s=>!!s);if(n.length===0)return;if(n.length===1)return n[0];if(typeof AbortSignal.any=="function")return AbortSignal.any(n);let e=new AbortController,t=()=>e.abort();for(let s of n){if(s.aborted){e.abort();break}s.addEventListener("abort",t,{once:!0})}return e.signal}function ze(r,n,e,t){let s=Ve(n,e,t);if(!s)return{signal:t.signal,abortKey:null,controller:null};r.requestAbortControllers.get(s)?.abort();let i=new AbortController;return r.requestAbortControllers.set(s,i),{signal:We([t.signal,i.signal]),abortKey:s,controller:i}}function Qe(r,n,e){!n||!e||r.requestAbortControllers.get(n)===e&&r.requestAbortControllers.delete(n)}function Xe(r){return r.hmacSecret||r.token||r.anonymousPacketToken}function Je(r,n,e){return r.hmacSecret?r.hmacSecret:n&&r.token||e}function Ye(r){return r?r.length<=8?`${r.slice(0,2)}...${r.slice(-2)}`:`${r.slice(0,4)}...${r.slice(-4)}`:""}function Ze(r){typeof console>"u"||typeof console.error!="function"||console.error("[entity-client] packet decrypt failed",{method:r.method,path:r.path,withAuth:r.withAuth,status:r.status,contentType:r.contentType,responsePacketSource:Ye(r.responsePacketSource),tokenPresent:r.tokenPresent,anonymousPacketTokenPresent:r.anonymousPacketTokenPresent,hmacEnabled:r.hmacEnabled,error:r.error instanceof Error?{name:r.error.name,message:r.error.message,stack:r.error.stack}:r.error})}function et(r){return r!=="GET"&&r!=="HEAD"&&r!=="OPTIONS"}function q(r){if(typeof document>"u")return"";for(let n of document.cookie.split(";")){let e=n.indexOf("=");if(!(e<0)&&n.substring(0,e).trim()===r)return decodeURIComponent(n.substring(e+1).trim())}return""}function tt(r,n){return r===403&&/csrf/i.test(n)?!0:/csrf/i.test(n)&&/expired|token validation failed/i.test(n)}function nt(r,n){return r===401&&/nonce already used/i.test(n)}async function Ee(r){if((r.headers.get("Content-Type")??"").includes("application/json")){let t=await r.json().catch(()=>null);if(t?.error)return{message:t.error,code:t.code,body:t};if(t?.message)return{message:t.message,code:t.code,body:t}}return{message:await r.text().catch(()=>"")||`HTTP ${r.status}`}}function D(r,n){let e=new Error(n.message);return e.status=r,n.code&&(e.code=n.code),n.body&&(e.details=n.body),e}async function k(r,n,e,t,s=!0,i={},o=!0){let a=typeof o=="boolean"?{requireOkShape:o}:o,u=a.requireOkShape??!0,m=new Set(a.allowStatuses??[]),h=ze(r,n,e,a),p=h.signal,{baseUrl:Be,token:E,apiKey:pe,hmacSecret:b,encryptRequests:$e,csrfEnabled:qe,csrfHeaderName:Me,csrfCookieName:L,refreshCsrfCookie:A,onAccessToken:fe,debugPlainSecret:U}=r,w=r.anonymousPacketToken||q("anon_token"),v=s&&!!(pe&&b),Oe=Xe(r),ge=Je(r,s,w),B=qe&&et(n)&&!v,T=B?q(L):"",ke="application/json",Le=!v&&!!w,f=null;if(t!=null)if(!U&&$e&&!!Oe&&s&&n!=="GET"&&n!=="HEAD"){let d=C(b,E||w);f=Se(new TextEncoder().encode(JSON.stringify(t)),d),ke="application/octet-stream"}else f=JSON.stringify(t);let Ue=c=>{let d={...i},R=Object.keys(d).some(g=>g.toLowerCase()==="content-type");if(f!=null&&!R&&(d["Content-Type"]=ke),!v&&s&&E&&(d.Authorization=`Bearer ${E}`),Le&&(d["X-Packet-Token"]=w),U&&(d["X-Debug-Plain"]=U),B&&c&&(d[Me]=c),v){let g=f instanceof Uint8Array?f:typeof f=="string"?new TextEncoder().encode(f):new Uint8Array(0);Object.assign(d,Ce(n,e,g,pe,b))}return d};B&&!T&&A&&(await A(),T=q(L));let _=c=>fetch(Be+e,{method:n,headers:Ue(c),...f!=null?{body:f}:{},credentials:"include",signal:p});try{let c=await _(T);if(!c.ok){let S=await Ee(c.clone());if(v&&nt(c.status,S.message))c=await _(T);else if(B&&A&&tt(c.status,S.message))await A(),T=q(L),c=await _(T);else if(!m.has(c.status))throw D(c.status,S)}if(!c.ok&&!m.has(c.status))throw D(c.status,await Ee(c));let d=c.headers.get("X-Access-Token")?.trim()??"",R=c.headers.get("Content-Type")??"";if(R.includes("application/octet-stream")){let S=C(b,ge),_e=await c.arrayBuffer(),Te;try{Te=$(_e,S)}catch(ye){throw Ze({method:n,path:e,withAuth:s,status:c.status,contentType:R,responsePacketSource:ge,tokenPresent:!!E,anonymousPacketTokenPresent:!!w,hmacEnabled:!!b,error:ye}),ye}return d&&fe?.(d),Te}if(d&&fe?.(d),!R.includes("application/json"))return await c.text();let g=await c.json();if(u&&!g.ok&&!m.has(c.status))throw D(c.status,{message:g.message??`EntityServer error (HTTP ${c.status})`,code:g.code,body:g});return g}finally{Qe(r,h.abortKey,h.controller)}}var j="/v1/realtime",M=class{baseUrl;token;anonymousPacketToken;apiKey;hmacSecret;encryptRequests;debugPlainSecret;csrfEnabled;csrfHeaderName;csrfCookieName;csrfRefresher=null;requestAbortControllers=new Map;activeTxId=null;initialHealthFired=!1;keepSession;refreshBuffer;onTokenRefreshed;onSessionExpired;onHealthChange;sessionRefreshToken=null;refreshTimer=null;healthTickTimer=null;healthTickPromise=null;realtimeEnabled;realtimePath;realtimeAutoReconnect;realtimeReconnectDelayMs;realtimeStatus;realtimeSocket=null;realtimeConnectPromise=null;realtimeReconnectTimer=null;realtimeShouldReconnect=!1;realtimeMessageListeners=new Set;realtimeStatusListeners=new Set;realtimeEventListeners=new Map;constructor(n={}){let e=H("VITE_ENTITY_SERVER_URL");this.baseUrl=(n.baseUrl??e??"").replace(/\/$/,""),this.token=n.token??"",this.anonymousPacketToken=n.anonymousPacketToken??"",this.apiKey=n.apiKey??"",this.hmacSecret=n.hmacSecret??"",this.encryptRequests=n.encryptRequests??!1,this.debugPlainSecret=n.debugPlainSecret??"",this.csrfEnabled=n.csrfEnabled??!1,this.csrfHeaderName=n.csrfHeaderName??"x-csrf-token",this.csrfCookieName=n.csrfCookieName??"_csrf",this.keepSession=n.keepSession??!1,this.refreshBuffer=n.refreshBuffer??60,this.onTokenRefreshed=n.onTokenRefreshed,this.onSessionExpired=n.onSessionExpired,this.onHealthChange=n.onHealthChange,this.realtimeEnabled=!1,this.realtimePath=j,this.realtimeAutoReconnect=!0,this.realtimeReconnectDelayMs=3e3,this.realtimeStatus="idle",this.applyRealtimeOptions(n.realtime),typeof n.healthTickInterval=="number"&&n.healthTickInterval>0&&Promise.resolve().then(()=>this.startHealthTick(n.healthTickInterval,!1)),this.fireInitialHealth()}configure(n){typeof n.baseUrl=="string"&&(this.baseUrl=n.baseUrl.replace(/\/$/,"")),typeof n.token=="string"&&(this.token=n.token),typeof n.anonymousPacketToken=="string"&&(this.anonymousPacketToken=n.anonymousPacketToken),typeof n.encryptRequests=="boolean"&&(this.encryptRequests=n.encryptRequests),typeof n.debugPlainSecret=="string"&&(this.debugPlainSecret=n.debugPlainSecret),typeof n.csrfEnabled=="boolean"&&(this.csrfEnabled=n.csrfEnabled),typeof n.csrfHeaderName=="string"&&(this.csrfHeaderName=n.csrfHeaderName),typeof n.csrfCookieName=="string"&&(this.csrfCookieName=n.csrfCookieName),typeof n.apiKey=="string"&&(this.apiKey=n.apiKey),typeof n.hmacSecret=="string"&&(this.hmacSecret=n.hmacSecret),typeof n.keepSession=="boolean"&&(this.keepSession=n.keepSession),typeof n.refreshBuffer=="number"&&(this.refreshBuffer=n.refreshBuffer),n.onTokenRefreshed&&(this.onTokenRefreshed=n.onTokenRefreshed),n.onSessionExpired&&(this.onSessionExpired=n.onSessionExpired),n.onHealthChange&&(this.onHealthChange=n.onHealthChange),typeof n.realtime<"u"&&this.applyRealtimeOptions(n.realtime),typeof n.healthTickInterval=="number"&&n.healthTickInterval>0&&Promise.resolve().then(()=>this.startHealthTick(n.healthTickInterval,!1)),this.fireInitialHealth()}fireInitialHealth(){if(this.initialHealthFired||typeof document>"u"||!this.baseUrl)return;this.initialHealthFired=!0;let n=this;typeof n.checkHealth=="function"&&Promise.resolve().then(()=>n.checkHealth(!1).catch(()=>{}))}setToken(n){this.token=n,this.syncRealtimeWithToken()}setAccessTokenFromResponse(n){this.token=n,this.syncRealtimeWithToken()}syncRealtimeWithToken(){if(!this.token){this.disconnectRealtime("token_cleared");return}!this.realtimeEnabled||typeof WebSocket>"u"||this.connectRealtime().catch(()=>{})}setAnonymousPacketToken(n){this.anonymousPacketToken=n}setApiKey(n){this.apiKey=n}setHmacSecret(n){this.hmacSecret=n}setEncryptRequests(n){this.encryptRequests=n}setCsrfEnabled(n){this.csrfEnabled=n}addRealtimeListener(n){this.realtimeMessageListeners.add(n)}removeRealtimeListener(n){this.realtimeMessageListeners.delete(n)}addRealtimeStatusListener(n){this.realtimeStatusListeners.add(n)}removeRealtimeStatusListener(n){this.realtimeStatusListeners.delete(n)}addRealtimeEventListener(n,e){let t=String(n).trim();t&&(this.realtimeEventListeners.has(t)||this.realtimeEventListeners.set(t,new Set),this.realtimeEventListeners.get(t).add(e))}removeRealtimeEventListener(n,e){let t=String(n).trim();if(!t)return;let s=this.realtimeEventListeners.get(t);s&&(s.delete(e),s.size===0&&this.realtimeEventListeners.delete(t))}async connectRealtime(){if(!this.realtimeEnabled){this.setRealtimeStatus("disabled","realtime_disabled");return}if(!this.token)throw new Error("Cannot open realtime connection without access token.");if(typeof WebSocket>"u")throw new Error("WebSocket is not available in this environment.");if(this.realtimeSocket&&this.realtimeSocket.readyState===WebSocket.OPEN)return;if(this.realtimeSocket&&this.realtimeSocket.readyState===WebSocket.CONNECTING&&this.realtimeConnectPromise)return this.realtimeConnectPromise;this.clearRealtimeReconnectTimer(),this.realtimeShouldReconnect=this.realtimeAutoReconnect,this.setRealtimeStatus("connecting","connect_requested");let n=new WebSocket(this.buildRealtimeUrl());return this.realtimeSocket=n,this.realtimeConnectPromise=new Promise((e,t)=>{let s=!1,i=()=>{s||(s=!0,this.realtimeConnectPromise=null,e())},o=a=>{s||(s=!0,this.realtimeConnectPromise=null,t(a))};n.addEventListener("open",()=>{this.setRealtimeStatus("open","socket_open"),i()}),n.addEventListener("message",a=>{this.handleRealtimeMessage(a.data)}),n.addEventListener("error",()=>{this.setRealtimeStatus("closed","socket_error",new Error("Realtime socket error."))}),n.addEventListener("close",a=>{this.realtimeSocket===n&&(this.realtimeSocket=null);let u=a.reason||"socket_closed",m=new Error(`Realtime socket closed (${a.code}${a.reason?`: ${a.reason}`:""}).`);this.setRealtimeStatus("closed",u,m),s||o(m),this.realtimeShouldReconnect&&this.realtimeEnabled&&this.realtimeAutoReconnect&&this.token&&this.scheduleRealtimeReconnect(u)})}),this.realtimeConnectPromise}disconnectRealtime(n="client_disconnect"){if(this.realtimeShouldReconnect=!1,this.clearRealtimeReconnectTimer(),this.realtimeSocket){let e=this.realtimeSocket;this.realtimeSocket=null;try{(e.readyState===WebSocket.OPEN||e.readyState===WebSocket.CONNECTING)&&e.close(1e3,n)}catch{}}this.realtimeConnectPromise=null,this.setRealtimeStatus(this.realtimeEnabled?"idle":"disabled",n)}sendRealtime(n){return!this.realtimeSocket||this.realtimeSocket.readyState!==WebSocket.OPEN?!1:(this.realtimeSocket.send(JSON.stringify(n)),!0)}subscribeRealtime(n){return this.sendRealtime({type:"subscribe",channel:"session",event:"session.subscribe",data:{subscriptions:n}})}unsubscribeRealtime(n){return this.sendRealtime({type:"unsubscribe",channel:"session",event:"session.unsubscribe",data:{subscriptions:n}})}startHealthTick(n=300*1e3,e=!0){this.stopHealthTick();let t=()=>{this.healthTickPromise||(this.healthTickPromise=(this.csrfRefresher?this.csrfRefresher():Promise.resolve()).then(()=>{this.onHealthChange?.(!0)}).catch(()=>{this.onHealthChange?.(!1)}).finally(()=>{this.healthTickPromise=null}))};e&&t(),this.healthTickTimer=setInterval(t,n)}stopHealthTick(){this.healthTickTimer!==null&&(clearInterval(this.healthTickTimer),this.healthTickTimer=null),this.healthTickPromise=null}scheduleKeepSession(n,e,t){this.clearRefreshTimer(),this.sessionRefreshToken=n;let s=Math.max((e-this.refreshBuffer)*1e3,0);this.refreshTimer=setTimeout(async()=>{if(this.sessionRefreshToken)try{let i=await t(this.sessionRefreshToken);this.onTokenRefreshed?.(i.access_token,i.expires_in),this.scheduleKeepSession(this.sessionRefreshToken,i.expires_in,t)}catch(i){this.clearRefreshTimer(),this.onSessionExpired?.(i instanceof Error?i:new Error(String(i)))}},s)}clearRefreshTimer(){this.refreshTimer!==null&&(clearTimeout(this.refreshTimer),this.refreshTimer=null)}stopKeepSession(){this.clearRefreshTimer(),this.sessionRefreshToken=null}applyRealtimeOptions(n){let e=typeof n=="boolean"?{enabled:n}:n??{};if(this.realtimeEnabled=e.enabled??!1,this.realtimePath=String(e.path??j).trim()||j,this.realtimeAutoReconnect=e.autoReconnect??!0,this.realtimeReconnectDelayMs=Math.max(250,e.reconnectDelayMs??3e3),!this.realtimeEnabled){this.disconnectRealtime("realtime_disabled");return}this.setRealtimeStatus("idle","realtime_enabled")}buildRealtimeUrl(){let n=this.baseUrl||H("VITE_ENTITY_SERVER_URL")||"",e=typeof window<"u"?window.location.origin:"",t=n||e;if(!t)throw new Error("Realtime connection requires baseUrl.");let s=new URL(t,e||void 0),i=s.pathname==="/"?"":s.pathname.replace(/\/+$/,""),o=`/${this.realtimePath.replace(/^\/+/,"")}`;return s.pathname=`${i}${o}`||o,s.search="",s.hash="",s.protocol=s.protocol==="https:"?"wss:":"ws:",s.searchParams.set("access_token",this.token),s.toString()}handleRealtimeMessage(n){if(typeof n!="string")return;let e;try{e=JSON.parse(n)}catch{return}for(let s of this.realtimeMessageListeners)s(e);let t=this.realtimeEventListeners.get(e.event);if(t)for(let s of t)s(e)}scheduleRealtimeReconnect(n){this.clearRealtimeReconnectTimer(),this.realtimeReconnectTimer=setTimeout(()=>{this.realtimeReconnectTimer=null,!(!this.realtimeEnabled||!this.token)&&(this.setRealtimeStatus("connecting",`${n}:reconnect`),this.connectRealtime().catch(()=>{}))},this.realtimeReconnectDelayMs)}clearRealtimeReconnectTimer(){this.realtimeReconnectTimer!==null&&(clearTimeout(this.realtimeReconnectTimer),this.realtimeReconnectTimer=null)}setRealtimeStatus(n,e,t){let s=this.realtimeStatus;if(!(s===n&&typeof e>"u"&&typeof t>"u")){this.realtimeStatus=n;for(let i of this.realtimeStatusListeners)i({status:n,previousStatus:s,...e?{reason:e}:{},...t?{error:t}:{}})}}applyCsrfHealth(){if(!(typeof document>"u")){for(let n of document.cookie.split(";")){let e=n.indexOf("=");if(!(e<0)&&n.substring(0,e).trim()===this.csrfCookieName){this.csrfEnabled=!!n.substring(e+1).trim();return}}this.csrfEnabled=!1}}readRequestBody(n,e="application/json",t=!1){let s=C(this.hmacSecret,this.token||this.anonymousPacketToken);return xe(n,e,t,s)}get reqOpts(){return{baseUrl:this.baseUrl,token:this.token,anonymousPacketToken:this.anonymousPacketToken,apiKey:this.apiKey,hmacSecret:this.hmacSecret,encryptRequests:this.encryptRequests,csrfEnabled:this.csrfEnabled,csrfHeaderName:this.csrfHeaderName,csrfCookieName:this.csrfCookieName,refreshCsrfCookie:this.csrfEnabled?this.csrfRefresher:null,requestAbortControllers:this.requestAbortControllers,debugPlainSecret:this.debugPlainSecret,onAccessToken:n=>{this.setAccessTokenFromResponse(n)}}}prepareRequest(n){return Promise.resolve()}get http(){let n=this;return{get(e,t=!0,s,i){return n.prepareRequest(t).then(()=>k(n.reqOpts,"GET",e,void 0,t,s,i??!0))},post(e,t,s=!0,i,o){return n.prepareRequest(s).then(()=>k(n.reqOpts,"POST",e,t,s,i,o??!0))},put(e,t,s=!0,i,o){return n.prepareRequest(s).then(()=>k(n.reqOpts,"PUT",e,t,s,i,o??!0))},patch(e,t,s=!0,i,o){return n.prepareRequest(s).then(()=>k(n.reqOpts,"PATCH",e,t,s,i,o??!0))},delete(e,t,s=!0,i,o){return n.prepareRequest(s).then(()=>k(n.reqOpts,"DELETE",e,t,s,i,o??!0))}}}request(n,e,t,s=!0,i,o){return this.prepareRequest(s).then(()=>k(this.reqOpts,n,e,t,s,i,o??!0))}async requestBinary(n,e,t,s=!0){await this.prepareRequest(s);let i={"Content-Type":"application/json"};s&&this.token&&(i.Authorization=`Bearer ${this.token}`),this.apiKey&&(i["X-API-Key"]=this.apiKey);let o=await fetch(this.baseUrl+e,{method:n,headers:i,...t!=null?{body:JSON.stringify(t)}:{},credentials:"include"});if(!o.ok){let a=await o.text(),u=new Error(`HTTP ${o.status}: ${a}`);throw u.status=o.status,u}return o.arrayBuffer()}async requestForm(n,e,t,s=!0){let i={};s&&this.token&&(i.Authorization=`Bearer ${this.token}`),this.apiKey&&(i["X-API-Key"]=this.apiKey);let o=await fetch(this.baseUrl+e,{method:n,headers:i,body:t,credentials:"include"}),a=await o.json();if(!a.ok){let u=new Error(a.message??`EntityServer error (HTTP ${o.status})`);throw u.status=o.status,u}return a}async requestFormBinary(n,e,t,s=!0){let i={};s&&this.token&&(i.Authorization=`Bearer ${this.token}`),this.apiKey&&(i["X-API-Key"]=this.apiKey);let o=await fetch(this.baseUrl+e,{method:n,headers:i,body:t,credentials:"include"});if(!o.ok){let a=await o.text(),u=new Error(`HTTP ${o.status}: ${a}`);throw u.status=o.status,u}return o.arrayBuffer()}};function Ae(r){return r.ok===!0&&r.requires_2fa!==!0&&typeof r.data=="object"&&r.data!==null&&"access_token"in r.data}function K(r){return class extends r{authBootstrapPromise=null;authBootstrapToken="";authBootstrapAnonymousCompleted=!1;setAccessTokenFromResponse(e){super.setAccessTokenFromResponse(e),this.authBootstrapToken=e,this.authBootstrapAnonymousCompleted=!1}csrfRefresher=()=>this.checkHealth(this.keepSession).then(()=>{});async checkHealth(e=!1){try{let t=this.token,s={};e&&(s["X-Session-Bootstrap"]="1");let i=await fetch(`${this.baseUrl}/v1/health`,{signal:AbortSignal.timeout(3e3),credentials:"include",headers:s}),o=await i.json(),a=i.headers.get("X-Access-Token");a&&(this.token=a,e&&a!==t&&this.onTokenRefreshed?.(a,0));let u=i.headers.get("X-Packet-Encryption")==="1"||o.packet_encryption===!0,m=this.readCookie("anon_token");return u&&m&&(this.anonymousPacketToken=m,this.encryptRequests=!0),this.applyCsrfHealth(),this.onHealthChange?.(!0),e&&o.authenticated===!1&&t&&(this.disconnectRealtime("session_expired"),this.onSessionExpired?.(new Error("Session expired"))),o}catch(t){throw this.onHealthChange?.(!1),t}}readCookie(e){if(typeof document>"u")return null;let t=document.cookie.split(";").map(s=>s.trim()).find(s=>s.startsWith(`${e}=`));if(!t)return null;try{return decodeURIComponent(t.slice(e.length+1))}catch{return t.slice(e.length+1)}}async ensurePublicAuthBootstrap(){if(typeof document>"u"||this.apiKey&&this.hmacSecret)return;let e=!!this.anonymousPacketToken||!!this.readCookie("anon_token"),t=!!this.readCookie(this.csrfCookieName);e&&t&&this.csrfEnabled||await this.checkHealth(!1)}async ensureAuthenticatedRequestBootstrap(){if(!(typeof document>"u")&&!(this.apiKey&&this.hmacSecret)){if(this.token){if(this.authBootstrapToken===this.token)return}else if(this.authBootstrapAnonymousCompleted)return;return this.authBootstrapPromise?this.authBootstrapPromise:(this.authBootstrapPromise=this.checkHealth(!0).then(()=>{this.token?this.authBootstrapToken=this.token:this.authBootstrapAnonymousCompleted=!0}).finally(()=>{this.authBootstrapPromise=null}),this.authBootstrapPromise)}}async prepareRequest(e){await super.prepareRequest(e),e&&await this.ensureAuthenticatedRequestBootstrap()}async login(e,t){await this.ensurePublicAuthBootstrap();let s=await k(this.reqOpts,"POST","/v1/auth/login",{email:e,passwd:t},!1,{},{requireOkShape:!1,allowStatuses:[403]});return Ae(s)&&(this.token=s.data.access_token,this.applyCsrfHealth(),this.keepSession&&this.healthTickTimer===null&&this.startHealthTick()),s}async tokenRefresh(){let e=await this.request("POST","/v1/auth/token_refresh",void 0,!1);return this.token=e.data.access_token,this.applyCsrfHealth(),e.data}async refreshToken(e){if(!e)return this.tokenRefresh();let t=await this.request("POST","/v1/auth/refresh",{refresh_token:e},!1);return this.token=t.data.access_token,this.applyCsrfHealth(),t.data}async logout(e){this.stopKeepSession(),this.stopHealthTick(),this.disconnectRealtime("logout");let t=await this.request("POST","/v1/auth/logout",e?{refresh_token:e}:void 0,!1);return this.token="",this.applyCsrfHealth(),t}me(){return this.request("GET","/v1/auth/me")}withdraw(e){return this.request("POST","/v1/auth/withdraw",e?{passwd:e}:{})}}}function N(r){return class extends r{async transStart(){let e=await this.request("POST","/v1/transaction/start",void 0,!1);return this.activeTxId=e.transaction_id,this.activeTxId}transRollback(e){let t=e??this.activeTxId;return t?(this.activeTxId=null,this.request("POST",`/v1/transaction/rollback/${t}`)):Promise.reject(new Error("No active transaction. Call transStart() first."))}transCommit(e){let t=e??this.activeTxId;return t?(this.activeTxId=null,this.request("POST",`/v1/transaction/commit/${t}`)):Promise.reject(new Error("No active transaction. Call transStart() first."))}meta(e){return this.request("POST",`/v1/entity/${e}/meta`,{})}validate(e,t){return this.http.post(`/v1/entity/${e}/validate`,t)}get(e,t,s={}){let i=s.skipHooks?"?skipHooks=true":"";return this.request("GET",`/v1/entity/${e}/${t}${i}`)}find(e,t,s={}){let i=s.skipHooks?"?skipHooks=true":"";return this.request("POST",`/v1/entity/${e}/find${i}`,t??{})}list(e,t={}){let{conditions:s,fields:i,orderDir:o,orderBy:a,...u}=t,m={page:1,limit:20,...u};return a&&(m.orderBy=o==="DESC"?`-${a}`:a),i?.length&&(m.fields=i.join(",")),this.request("POST",`/v1/entity/${e}/list?${l(m)}`,s??{})}count(e,t){return this.request("POST",`/v1/entity/${e}/count`,t??{})}query(e,t){return this.request("POST",`/v1/entity/${e}/query`,t)}submit(e,t,s={}){let i=s.transactionId??this.activeTxId,o=i?{"X-Transaction-ID":i}:void 0,a=s.skipHooks?"?skipHooks=true":"";return this.request("POST",`/v1/entity/${e}/submit${a}`,t,!0,o)}delete(e,t,s={}){let i=new URLSearchParams;s.hard&&i.set("hard","true"),s.skipHooks&&i.set("skipHooks","true");let o=i.size?`?${i}`:"",a=s.transactionId??this.activeTxId,u=a?{"X-Transaction-ID":a}:void 0;return this.request("POST",`/v1/entity/${e}/delete/${t}${o}`,void 0,!0,u)}history(e,t,s={}){return this.request("GET",`/v1/entity/${e}/history/${t}?${l({page:1,limit:50,...s})}`)}rollback(e,t){return this.request("POST",`/v1/entity/${e}/rollback/${t}`)}}}function V(r){return class extends r{async fileUpload(e,t,s={}){let i=new FormData;return i.append("file",t,t instanceof File?t.name:"upload"),s.refSeq!=null&&i.append("ref_seq",String(s.refSeq)),s.isPublic!=null&&i.append("is_public",s.isPublic?"true":"false"),this.requestForm("POST",`/v1/files/${e}/upload`,i)}fileDownload(e,t){return this.requestBinary("POST",`/v1/files/${e}/download/${t}`,{})}fileDelete(e,t){return this.request("POST",`/v1/files/${e}/delete/${t}`,{})}fileList(e,t={}){return this.request("POST",`/v1/files/${e}/list`,t.refSeq?{ref_seq:t.refSeq}:{})}fileMeta(e,t){return this.request("POST",`/v1/files/${e}/meta/${t}`,{})}fileToken(e){return this.request("POST",`/v1/files/token/${e}`,{})}fileViewUrl(e,t={}){let s=t.download?"?download=true":"";return`${this.baseUrl}/v1/files/${e}${s}`}fileUrl(e){return`${this.baseUrl}/v1/files/${e}`}storageUpload(e,t,s={}){return this.fileUpload(e,t,s)}storageDownload(e,t){return this.fileDownload(e,t)}storageDelete(e,t){return this.fileDelete(e,t)}storageList(e,t={}){return this.fileList(e,t)}storageMeta(e,t){return this.fileMeta(e,t)}storageToken(e){return this.fileToken(e)}storageViewUrl(e,t={}){return this.fileViewUrl(e,t)}storageDownloadUrl(e){return this.fileViewUrl(e,{download:!0})}storageUrl(e){return this.fileUrl(e)}}}function W(r){return class extends r{push(e,t,s={}){return this.submit(e,t,s)}pushLogList(e={}){return this.list("push_log",e)}registerPushDevice(e,t,s,i={}){let{platform:o,deviceType:a,browser:u,browserVersion:m,pushEnabled:h=!0,transactionId:p}=i;return this.submit("account_device",{id:t,account_seq:e,push_token:s,push_enabled:h,...o?{platform:o}:{},...a?{device_type:a}:{},...u?{browser:u}:{},...m?{browser_version:m}:{}},{transactionId:p})}updatePushDeviceToken(e,t,s={}){let{pushEnabled:i=!0,transactionId:o}=s;return this.submit("account_device",{seq:e,push_token:t,push_enabled:i},{transactionId:o})}disablePushDevice(e,t={}){return this.submit("account_device",{seq:e,push_enabled:!1},{transactionId:t.transactionId})}}}function z(r){return class extends r{smtpSend(e){return this.request("POST","/v1/smtp/send",e)}smtpStatus(e){return this.request("POST",`/v1/smtp/status/${e}`,{})}smtpTemplatePreview(e){let t=e.split("/").map(encodeURIComponent).join("/");return fetch(`${this.baseUrl}/v1/smtp/template/${t}`,{credentials:"include"}).then(s=>s.text())}}}function Q(r){return class extends r{transactionStart(e){return this.request("POST","/v1/transaction/start",e??{})}transactionCommit(e){return this.request("POST",`/v1/transaction/commit/${encodeURIComponent(e)}`,{})}transactionRollback(e){return this.request("POST",`/v1/transaction/rollback/${encodeURIComponent(e)}`,{})}}}function X(r){return class extends r{addressSido(){return this.http.get("/v1/utils/address/sido",!1)}addressSigungu(e){let t=new URLSearchParams({sido:e.sido}).toString();return this.http.get(`/v1/utils/address/sigungu?${t}`,!1)}addressDong(e){let t=new URLSearchParams({sido:e.sido,sigungu:e.sigungu}).toString();return this.http.get(`/v1/utils/address/dong?${t}`,!1)}addressClean(e){let t=new URLSearchParams({q:e.q}).toString();return this.http.get(`/v1/utils/address/clean?${t}`,!1)}qrcode(e,t={}){return this.requestBinary("POST","/v1/utils/qrcode",{content:e,...t})}qrcodeBase64(e,t={}){return this.request("POST","/v1/utils/qrcode/base64",{content:e,...t})}qrcodeText(e,t={}){return this.request("POST","/v1/utils/qrcode/text",{content:e,...t})}barcode(e,t={}){return this.requestBinary("POST","/v1/utils/barcode",{content:e,...t})}pdf2png(e,t={}){let s=new FormData;s.append("file",new Blob([e],{type:"application/pdf"}),"document.pdf");let i=new URLSearchParams;t.dpi!=null&&i.set("dpi",String(t.dpi)),t.firstPage!=null&&i.set("first_page",String(t.firstPage)),t.lastPage!=null&&i.set("last_page",String(t.lastPage));let o=i.toString(),a="/v1/utils/pdf2png"+(o?`?${o}`:"");return this.requestFormBinary("POST",a,s)}pdf2pngByFileSeq(e,t={}){return this.requestBinary("POST",`/v1/utils/pdf2png/${e}`,t)}pdf2jpg(e,t={}){let s=new FormData;s.append("file",new Blob([e],{type:"application/pdf"}),"document.pdf");let i=new URLSearchParams;t.dpi!=null&&i.set("dpi",String(t.dpi)),t.firstPage!=null&&i.set("first_page",String(t.firstPage)),t.lastPage!=null&&i.set("last_page",String(t.lastPage));let o=i.toString(),a="/v1/utils/pdf2jpg"+(o?`?${o}`:"");return this.requestFormBinary("POST",a,s)}pdf2jpgByFileSeq(e,t={}){return this.requestBinary("POST",`/v1/utils/pdf2jpg/${e}`,t)}}}function J(r){return class extends r{adminPath(e){return`/v1/admin${e}`}adminGet(e){return this.http.get(this.adminPath(e))}adminPost(e,t){return this.http.post(this.adminPath(e),t)}adminPut(e,t){return this.http.put(this.adminPath(e),t)}adminPatch(e,t){return this.http.patch(this.adminPath(e),t)}adminDelete(e,t){return this.http.delete(this.adminPath(e),t)}listAdminEntities(){return this.adminGet("/entities")}getAdminErdSchema(){return this.adminGet("/erd/schema")}batchEnsureAdminEntities(e){return this.adminPost("/entities/batch-ensure",e)}createAdminEntityConfig(e,t){return this.adminPost(`/${e}/create`,t)}getAdminEntityConfig(e){return this.adminGet(`/${e}/config`)}updateAdminEntityConfig(e,t){return this.adminPut(`/${e}/config`,t)}validateAdminEntityConfig(e,t){return this.adminPost(t?`/${t}/validate`:"/entity/validate",e)}normalizeAdminEntityConfig(e,t){return this.adminPost(t?`/${t}/normalize`:"/entity/normalize",e)}getAdminEntityStats(e,t){return this.adminPost(`/${e}/stats`,t)}reindexAdminEntity(e){return this.adminPost(`/${e}/reindex`)}syncAdminEntitySchema(e){return this.adminPost(`/${e}/sync-schema`)}resetAdminEntity(e){return this.adminPost(`/${e}/reset`)}truncateAdminEntity(e){return this.adminPost(`/${e}/truncate`)}dropAdminEntity(e){return this.adminPost(`/${e}/drop`)}resetAllAdmin(e){return this.adminPost("/reset-all",e)}listAdminConfigs(){return this.adminGet("/configs")}getAdminConfig(e){return this.adminGet(`/configs/${e}`)}updateAdminConfig(e,t){return this.adminPatch(`/configs/${e}`,t)}listAdminRoles(){return this.adminGet("/roles")}createAdminRole(e){return this.adminPost("/roles",e)}getAdminRole(e){return this.adminGet(`/roles/${e}`)}updateAdminRole(e,t){return this.adminPatch(`/roles/${e}`,t)}deleteAdminRole(e){return this.adminDelete(`/roles/${e}`)}listAdminApiKeys(){return this.adminGet("/api-keys")}createAdminApiKey(e){return this.adminPost("/api-keys",e)}getAdminApiKey(e){return this.adminGet(`/api-keys/${e}`)}updateAdminApiKey(e,t){return this.adminPatch(`/api-keys/${e}`,t)}deleteAdminApiKey(e){return this.adminDelete(`/api-keys/${e}`)}regenerateAdminApiKeySecret(e){return this.adminPost(`/api-keys/${e}/regenerate-secret`)}listAdminAccounts(){return this.adminGet("/accounts")}createAdminAccount(e){return this.adminPost("/accounts",e)}getAdminAccount(e){return this.adminGet(`/accounts/${e}`)}updateAdminAccount(e,t){return this.adminPatch(`/accounts/${e}`,t)}deleteAdminAccount(e){return this.adminDelete(`/accounts/${e}`)}listAdminLicenses(){return this.adminGet("/licenses")}createAdminLicense(e){return this.adminPost("/licenses",e)}getAdminLicense(e){return this.adminGet(`/licenses/${e}`)}updateAdminLicense(e,t){return this.adminPatch(`/licenses/${e}`,t)}deleteAdminLicense(e){return this.adminDelete(`/licenses/${e}`)}runAdminBackup(e){return this.adminPost("/backup/run",e)}getAdminBackupStatus(e){return this.adminPost("/backup/status",e)}listAdminBackups(e){return this.adminPost("/backup/list",e)}restoreAdminBackup(e){return this.adminPost("/backup/restore",e)}deleteAdminBackup(e){return this.adminPost("/backup/delete",e)}disableAdminAccountTwoFactor(e){return this.adminDelete(`/accounts/${e}/2fa`)}}}var P=class extends X(Q(V(z(W(J(N(K(M)))))))){};function Y(r){return class extends r{accountRegister(e){return this.http.post("/v1/account/register",e,!1)}accountWithdraw(e){return this.http.post("/v1/account/withdraw",e)}accountChangePassword(e){return this.http.post("/v1/account/change-password",e)}accountReactivate(e){return this.http.post("/v1/account/reactivate",e,!1)}listAccountBiometrics(){return this.http.get("/v1/account/biometric")}registerAccountBiometric(e){return this.http.post("/v1/account/biometric",e)}deleteAccountBiometric(e){return this.http.delete(`/v1/account/biometric/${e}`)}}}function Z(r){return class extends r{listBoardCategories(e={}){let t=l(e);return this.http.get(`/v1/board/categories${t?`?${t}`:""}`,!1)}getBoardCategory(e){return this.http.get(`/v1/board/categories/${e}`,!1)}createBoardCategory(e){return this.http.post("/v1/board/categories",e)}updateBoardCategory(e,t){return this.http.put(`/v1/board/categories/${e}`,t)}deleteBoardCategory(e){return this.http.delete(`/v1/board/categories/${e}`)}listBoardPosts(e,t={}){let s=l(t);return this.http.get(`/v1/board/${e}/list${s?`?${s}`:""}`)}getBoardPost(e){return this.http.get(`/v1/board/posts/${e}`)}createBoardPost(e,t){return this.http.post(`/v1/board/${e}/submit`,t)}updateBoardPost(e,t){return this.http.patch(`/v1/board/posts/${e}`,t)}expireBoardPost(e){return this.http.post(`/v1/board/posts/${e}/expire`,{})}deleteBoardPost(e){return this.http.delete(`/v1/board/posts/${e}`)}listBoardComments(e,t={}){let s=l(t);return this.http.get(`/v1/board/posts/${e}/comments${s?`?${s}`:""}`,!1)}createBoardComment(e,t){return this.http.post(`/v1/board/posts/${e}/comments/submit`,t)}updateBoardComment(e,t){return this.http.put(`/v1/board/comments/${e}`,t)}deleteBoardComment(e){return this.http.delete(`/v1/board/comments/${e}`)}listBoardFiles(e){return this.http.get(`/v1/board/posts/${e}/files`,!1)}async uploadBoardFile(e,t){let s=new FormData;return s.append("file",t,t instanceof File?t.name:"upload"),this.requestForm("POST",`/v1/board/posts/${e}/files`,s)}boardFileUrl(e){return`${this.baseUrl}/v1/board/files/${e}`}deleteBoardFile(e){return this.http.delete(`/v1/board/files/${e}`)}createBoardGuestPost(e,t){return this.http.post(`/v1/board/${e}/guest-submit`,t,!1)}authenticateBoardGuestPost(e,t){return this.http.post(`/v1/board/posts/${e}/guest-auth`,t,!1)}toggleBoardPostLike(e){return this.http.post(`/v1/board/posts/${e}/like`,{})}acceptBoardPost(e){return this.http.post(`/v1/board/posts/${e}/accept`,{})}rateBoardPost(e,t){return this.http.post(`/v1/board/posts/${e}/rating`,t)}rateBoardComment(e,t){return this.http.post(`/v1/board/comments/${e}/rating`,t)}listBoardTags(e={}){let t=l(e);return this.http.get(`/v1/board/tags${t?`?${t}`:""}`,!1)}setBoardPostTags(e,t){return this.http.put(`/v1/board/posts/${e}/tags`,t)}reportBoardPost(e,t){return this.http.post(`/v1/board/posts/${e}/report`,t)}reportBoardComment(e,t){return this.http.post(`/v1/board/comments/${e}/report`,t)}listBoardReports(e={}){let t=l(e);return this.http.get(`/v1/board/admin/reports${t?`?${t}`:""}`)}updateBoardReport(e,t){return this.http.patch(`/v1/board/admin/reports/${e}`,t)}markBoardPostRead(e){return this.http.post(`/v1/board/posts/${e}/read`,{})}listBoardMentions(e={}){let t=l(e);return this.http.get(`/v1/board/mentions${t?`?${t}`:""}`)}markBoardMentionRead(e){return this.http.patch(`/v1/board/mentions/${e}/read`,{})}}}function ee(r){return class extends r{sendEmailVerification(e){return this.http.post("/v1/email-verify/send",e,!1)}confirmEmailVerification(e){return this.http.post("/v1/email-verify/confirm",e,!1)}activateEmailVerification(e){let t=l(e);return this.http.get(`/v1/email-verify/activate${t?`?${t}`:""}`,!1)}getEmailVerificationStatus(){return this.http.get("/v1/email-verify/status")}changeVerifiedEmail(e){return this.http.post("/v1/email-verify/change",e)}}}function te(r){return class extends r{oauthAuthorizeUrl(e,t={}){let s=l(t);return`${this.baseUrl}/v1/oauth/${e}${s?`?${s}`:""}`}oauthCallback(e,t,s="POST"){if(s==="GET"){let i=l(t??{});return this.http.get(`/v1/oauth/${e}/callback${i?`?${i}`:""}`,!1)}return this.http.post(`/v1/oauth/${e}/callback`,t,!1)}linkOAuthAccount(e){return this.http.post("/v1/account/oauth/link",e)}unlinkOAuthAccount(e){return this.http.delete(`/v1/account/oauth/link/${e}`)}listOAuthProviders(){return this.http.get("/v1/account/oauth/providers")}refreshOAuthProviderToken(e,t){return this.http.post(`/v1/account/oauth/refresh/${e}`,t)}}}function ne(r){return class extends r{requestPasswordReset(e){return this.http.post("/v1/password-reset/request",e,!1)}validatePasswordResetToken(e){return this.http.get(`/v1/password-reset/validate/${encodeURIComponent(e)}`,!1)}verifyPasswordReset(e){return this.http.post("/v1/password-reset/verify",e,!1)}}}function re(r){return class extends r{setupTwoFactor(e){return this.http.post("/v1/account/2fa/setup",e)}verifyTwoFactorSetup(e){return this.http.post("/v1/account/2fa/setup/verify",e,!1)}disableTwoFactor(){return this.http.delete("/v1/account/2fa")}getTwoFactorStatus(){return this.http.get("/v1/account/2fa/status")}regenerateTwoFactorRecoveryCodes(){return this.http.post("/v1/account/2fa/recovery/regenerate")}verifyTwoFactor(e){return this.http.post("/v1/account/2fa/verify",e,!1)}recoverTwoFactorAccess(e){return this.http.post("/v1/account/2fa/recovery",e,!1)}}}function se(r){return class extends r{alimtalkSend(e){return this.http.post("/v1/alimtalk/send",e)}alimtalkStatus(e){return this.http.get(`/v1/alimtalk/status/${e}`,!1)}listAlimtalkTemplates(){return this.http.get("/v1/alimtalk/templates",!1)}alimtalkWebhook(e,t){return this.http.post(`/v1/alimtalk/webhook/${encodeURIComponent(e)}`,t,!1)}}}function ie(r){return class extends r{friendtalkSend(e){return this.http.post("/v1/friendtalk/send",e)}}}function oe(r){return class extends r{listHolidays(e={}){let t=l(e);return this.http.get(`/v1/holidays${t?`?${t}`:""}`,!1)}getHolidayByDate(e){return this.http.get(`/v1/holidays/${encodeURIComponent(e)}`,!1)}syncHolidays(e){return this.http.post("/v1/holidays/sync",e)}}}function ae(r){return class extends r{identityRequest(e){return this.http.post("/v1/identity/request",e,!1)}identityCallback(e){return this.http.post("/v1/identity/callback",e,!1)}identityResult(e){return this.http.get(`/v1/identity/result/${encodeURIComponent(e)}`,!1)}identityVerifyCI(e){return this.http.post("/v1/identity/verify-ci",e)}}}function ue(r){return class extends r{llmChat(e){return this.http.post("/v1/llm/chat",e)}llmChatStream(e){return this.http.post("/v1/llm/chat/stream",e)}createLlmConversation(e){return this.http.post("/v1/llm/conversations",e)}sendLlmMessage(e,t){return this.http.post(`/v1/llm/conversations/${e}/messages`,t)}listLlmConversations(e={}){let t=l(e);return this.http.get(`/v1/llm/conversations${t?`?${t}`:""}`)}getLlmConversation(e){return this.http.get(`/v1/llm/conversations/${e}`)}updateLlmConversation(e,t){return this.http.patch(`/v1/llm/conversations/${e}`,t)}deleteLlmConversation(e){return this.http.delete(`/v1/llm/conversations/${e}`)}ragUploadDocument(e){return this.requestForm("POST","/v1/llm/rag/documents",e)}ragListDocuments(e={}){let t=l(e);return this.http.get(`/v1/llm/rag/documents${t?`?${t}`:""}`)}ragDeleteDocument(e){return this.http.delete(`/v1/llm/rag/documents/${encodeURIComponent(e)}`)}ragSearch(e){return this.http.post("/v1/llm/rag/search",e)}ragChat(e){return this.http.post("/v1/llm/rag/chat",e)}ragChatStream(e){return this.http.post("/v1/llm/rag/chat/stream",e)}ragRebuildIndex(e){return this.http.post("/v1/llm/rag/rebuild-index",e)}listLlmProviders(){return this.http.get("/v1/llm/providers")}getLlmUsage(e={}){let t=l(e);return this.http.get(`/v1/llm/usage${t?`?${t}`:""}`)}getLlmUsageSummary(e={}){let t=l(e);return this.http.get(`/v1/llm/usage/summary${t?`?${t}`:""}`)}getLlmCacheStats(){return this.http.get("/v1/llm/cache/stats")}clearLlmCache(){return this.http.delete("/v1/llm/cache")}listLlmTemplates(){return this.http.get("/v1/llm/templates")}llmTemplateChat(e,t){return this.http.post(`/v1/llm/${encodeURIComponent(e)}/chat`,t)}llmTemplateChatStream(e,t){return this.http.post(`/v1/llm/${encodeURIComponent(e)}/chat/stream`,t)}listLlmChatbots(e={}){let t=l(e);return this.http.get(`/v1/llm/chatbots${t?`?${t}`:""}`)}createLlmChatbot(e){return this.http.post("/v1/llm/chatbots",e)}getLlmChatbot(e){return this.http.get(`/v1/llm/chatbots/${e}`)}updateLlmChatbot(e,t){return this.http.patch(`/v1/llm/chatbots/${e}`,t)}deleteLlmChatbot(e){return this.http.delete(`/v1/llm/chatbots/${e}`)}llmChatbotChat(e,t){return this.http.post(`/v1/llm/chatbots/${e}/chat`,t)}llmChatbotChatStream(e,t){return this.http.post(`/v1/llm/chatbots/${e}/chat/stream`,t)}listLlmChatbotSessions(e,t={}){let s=l(t);return this.http.get(`/v1/llm/chatbots/${e}/sessions${s?`?${s}`:""}`)}deleteLlmChatbotSession(e,t){return this.http.delete(`/v1/llm/chatbots/${e}/sessions/${t}`)}listLlmProfiles(e={}){let t=l(e);return this.http.get(`/v1/llm/profiles${t?`?${t}`:""}`)}upsertLlmProfile(e){return this.http.post("/v1/llm/profiles",e)}deleteLlmProfile(e){return this.http.delete(`/v1/llm/profiles/${e}`)}}}function ce(r){return class extends r{ocrRecognize(e){return this.requestForm("POST","/v1/ocr/recognize",e)}ocrRecognizeAsync(e){return this.requestForm("POST","/v1/ocr/recognize/async",e)}ocrRecognizeByDocType(e,t){return this.requestForm("POST",`/v1/ocr/${encodeURIComponent(e)}`,t)}listOcrResults(e={}){let t=l(e);return this.http.get(`/v1/ocr/results${t?`?${t}`:""}`)}getOcrResult(e){return this.http.get(`/v1/ocr/results/${encodeURIComponent(e)}`)}getOcrResultText(e){return this.http.get(`/v1/ocr/results/${encodeURIComponent(e)}/text`)}deleteOcrResult(e){return this.http.delete(`/v1/ocr/results/${encodeURIComponent(e)}`)}getOcrQuota(){return this.http.get("/v1/ocr/quota")}}}function le(r){return class extends r{pgCreateOrder(e){return this.http.post("/v1/pg/orders",e)}pgGetOrder(e){return this.http.get(`/v1/pg/orders/${encodeURIComponent(e)}`)}pgConfirmPayment(e){return this.http.post("/v1/pg/confirm",e)}pgCancelPayment(e,t){return this.http.post(`/v1/pg/orders/${encodeURIComponent(e)}/cancel`,t)}pgSyncPaymentStatus(e,t){return this.http.post(`/v1/pg/orders/${encodeURIComponent(e)}/sync`,t)}pgWebhook(e){return this.http.post("/v1/pg/webhook",e,!1)}pgGetClientConfig(){return this.http.get("/v1/pg/config",!1)}}}function me(r){return class extends r{appPushSend(e){return this.http.post("/v1/push/send",e)}appPushBroadcast(e){return this.http.post("/v1/push/broadcast",e)}appPushStatus(e){return this.http.get(`/v1/push/status/${e}`)}appPushRegisterDevice(e){return this.http.post("/v1/push/device",e)}appPushUnregisterDevice(e){return this.http.delete(`/v1/push/device/${e}`)}}}function de(r){return class extends r{smsSend(e){return this.http.post("/v1/sms/send",e)}smsStatus(e){return this.http.get(`/v1/sms/status/${e}`,!1)}smsVerificationSend(e){return this.http.post("/v1/sms/verification/send",e,!1)}smsVerificationVerify(e){return this.http.post("/v1/sms/verification/verify",e,!1)}}}function he(r){return class extends r{taxinvoiceRegistIssue(e){return this.http.post("/v1/taxinvoice",e)}taxinvoiceRegister(e){return this.http.post("/v1/taxinvoice/register",e)}taxinvoiceIssue(e){return this.http.post(`/v1/taxinvoice/${e}/issue`,{})}taxinvoiceCancelIssue(e,t){return this.http.post(`/v1/taxinvoice/${e}/cancel`,t)}taxinvoiceGetState(e){return this.http.get(`/v1/taxinvoice/${e}/state`)}taxinvoiceGetDetail(e){return this.http.get(`/v1/taxinvoice/${e}`)}}}var O=class extends se(ie(de(me(le(he(ce(ue(ae(oe(te(re(ne(ee(Z(Y(P)))))))))))))))){};var ir=new P,or=new O;export{Y as AccountAppMixin,J as AdminMixin,K as AuthMixin,Z as BoardMixin,ee as EmailVerifyMixin,O as EntityAppServerApi,N as EntityMixin,P as EntityServerApi,V as FileMixin,te as OAuthMixin,Fe as PACKET_HKDF_SALT,De as PACKET_INFO_LABEL,I as PACKET_KEY_SIZE,G as PACKET_MAGIC_MIN,F as PACKET_MAGIC_RANGE,y as PACKET_NONCE_SIZE,Ge as PACKET_TAG_SIZE,ne as PasswordResetMixin,W as PushMixin,z as SmtpMixin,Q as TransactionMixin,re as TwoFactorMixin,X as UtilsMixin,Re as decryptPacket,be as derivePacketKey,ve as encryptPacket,or as entityAppServer,ir as entityServer,Ae as isAuthLoginSuccessResponse,we as packetMagicLenFromKey};
|
|
1
|
+
function H(r){let n=import.meta;if(n?.env?.[r]!=null)return n.env[r];let e=globalThis.process;if(e?.env?.[r]!=null)return e.env[r]}function l(r){return Object.entries(r).filter(([,n])=>n!=null).map(([n,e])=>`${encodeURIComponent(n==="orderBy"?"order_by":n)}=${encodeURIComponent(String(e))}`).join("&")}import{xchacha20poly1305 as Pe}from"@noble/ciphers/chacha";import{sha256 as He}from"@noble/hashes/sha2";import{hkdf as Ie}from"@noble/hashes/hkdf";var I=32,G=2,F=14,y=24,Ge=16,Fe="entity-server:hkdf:v1",De="entity-server:packet-encryption";function x(r){return r instanceof Uint8Array?r:new Uint8Array(r)}function be(r,n=De){return Ie(He,new TextEncoder().encode(r),new TextEncoder().encode(Fe),new TextEncoder().encode(n),I)}function we(r,n=G,e=F){let t=x(r);return t.length<I?n:n+t[I-1]%e}function ve(r,n,e=G,t=F){let s=x(r),i=x(n),o=we(i,e,t),a=crypto.getRandomValues(new Uint8Array(o)),u=crypto.getRandomValues(new Uint8Array(y)),h=Pe(i,u).encrypt(s),p=new Uint8Array(o+y+h.length);return p.set(a,0),p.set(u,o),p.set(h,o+y),p}function Re(r,n,e=G,t=F){let s=x(r),i=x(n),o=we(i,e,t);if(s.length<o+y+Ge)throw new Error("Encrypted packet too short");let a=s.slice(o,o+y),u=s.slice(o+y);return Pe(i,a).decrypt(u)}function C(r,n){return be(r||n)}function Se(r,n){return ve(r,n)}function $(r,n){let e=Re(r,n);return JSON.parse(new TextDecoder().decode(e))}function xe(r,n,e,t){let s=n.toLowerCase().includes("application/octet-stream");if(e&&!s)throw new Error("Encrypted request required: Content-Type must be application/octet-stream");if(s){if(r==null)throw new Error("Encrypted request body is empty");if(r instanceof ArrayBuffer)return $(r,t);if(r instanceof Uint8Array){let i=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);return $(i,t)}throw new Error("Encrypted request body must be ArrayBuffer or Uint8Array")}return r==null||r===""?{}:typeof r=="string"?JSON.parse(r):r}import{sha256 as je}from"@noble/hashes/sha2";import{hmac as Ke}from"@noble/hashes/hmac";function Ce(r,n,e,t,s){let i=String(Math.floor(Date.now()/1e3)),o=crypto.randomUUID(),a=new TextEncoder().encode(`${r}|${n}|${i}|${o}|`),u=new Uint8Array(a.length+e.length);u.set(a,0),u.set(e,a.length);let h=[...Ke(je,new TextEncoder().encode(s),u)].map(p=>p.toString(16).padStart(2,"0")).join("");return{"X-API-Key":t,"X-Timestamp":i,"X-Nonce":o,"X-Signature":h}}function Ne(r){switch(r.toUpperCase()){case"POST":case"PUT":case"PATCH":case"DELETE":return!0;default:return!1}}function Ve(r,n,e){if(e.autoAbortKey===!1)return null;if(typeof e.autoAbortKey=="string"){let t=e.autoAbortKey.trim();return t||null}return typeof window>"u"?null:Ne(r)?`${r.toUpperCase()} ${n}`:null}function We(r){let n=r.filter(s=>!!s);if(n.length===0)return;if(n.length===1)return n[0];if(typeof AbortSignal.any=="function")return AbortSignal.any(n);let e=new AbortController,t=()=>e.abort();for(let s of n){if(s.aborted){e.abort();break}s.addEventListener("abort",t,{once:!0})}return e.signal}function ze(r,n,e,t){let s=Ve(n,e,t);if(!s)return{signal:t.signal,abortKey:null,controller:null};r.requestAbortControllers.get(s)?.abort();let i=new AbortController;return r.requestAbortControllers.set(s,i),{signal:We([t.signal,i.signal]),abortKey:s,controller:i}}function Qe(r,n,e){!n||!e||r.requestAbortControllers.get(n)===e&&r.requestAbortControllers.delete(n)}function Xe(r){return r.hmacSecret||r.token||r.anonymousPacketToken}function Je(r,n,e){return r.hmacSecret?r.hmacSecret:n&&r.token||e}function Ye(r){return r?r.length<=8?`${r.slice(0,2)}...${r.slice(-2)}`:`${r.slice(0,4)}...${r.slice(-4)}`:""}function Ze(r){typeof console>"u"||typeof console.error!="function"||console.error("[entity-client] packet decrypt failed",{method:r.method,path:r.path,withAuth:r.withAuth,status:r.status,contentType:r.contentType,responsePacketSource:Ye(r.responsePacketSource),tokenPresent:r.tokenPresent,anonymousPacketTokenPresent:r.anonymousPacketTokenPresent,hmacEnabled:r.hmacEnabled,error:r.error instanceof Error?{name:r.error.name,message:r.error.message,stack:r.error.stack}:r.error})}function et(r){return r!=="GET"&&r!=="HEAD"&&r!=="OPTIONS"}function q(r){if(typeof document>"u")return"";for(let n of document.cookie.split(";")){let e=n.indexOf("=");if(!(e<0)&&n.substring(0,e).trim()===r)return decodeURIComponent(n.substring(e+1).trim())}return""}function tt(r,n){return r===403&&/csrf/i.test(n)?!0:/csrf/i.test(n)&&/expired|token validation failed/i.test(n)}function nt(r,n){return r===401&&/nonce already used/i.test(n)}async function Ee(r){if((r.headers.get("Content-Type")??"").includes("application/json")){let t=await r.json().catch(()=>null);if(t?.error)return{message:t.error,code:t.code,body:t};if(t?.message)return{message:t.message,code:t.code,body:t}}return{message:await r.text().catch(()=>"")||`HTTP ${r.status}`}}function D(r,n){let e=new Error(n.message);return e.status=r,n.code&&(e.code=n.code),n.body&&(e.details=n.body),e}async function k(r,n,e,t,s=!0,i={},o=!0){let a=typeof o=="boolean"?{requireOkShape:o}:o,u=a.requireOkShape??!0,m=new Set(a.allowStatuses??[]),h=ze(r,n,e,a),p=h.signal,{baseUrl:Be,token:E,apiKey:pe,hmacSecret:b,encryptRequests:$e,csrfEnabled:qe,csrfHeaderName:Me,csrfCookieName:L,refreshCsrfCookie:A,onAccessToken:fe,debugPlainSecret:U}=r,w=r.anonymousPacketToken||q("anon_token"),v=s&&!!(pe&&b),Oe=Xe(r),ge=Je(r,s,w),B=qe&&et(n)&&!v,T=B?q(L):"",ke="application/json",Le=!v&&!!w,f=null;if(t!=null)if(!U&&$e&&!!Oe&&s&&n!=="GET"&&n!=="HEAD"){let d=C(b,E||w);f=Se(new TextEncoder().encode(JSON.stringify(t)),d),ke="application/octet-stream"}else f=JSON.stringify(t);let Ue=c=>{let d={...i},R=Object.keys(d).some(g=>g.toLowerCase()==="content-type");if(f!=null&&!R&&(d["Content-Type"]=ke),!v&&s&&E&&(d.Authorization=`Bearer ${E}`),Le&&(d["X-Packet-Token"]=w),U&&(d["X-Debug-Plain"]=U),B&&c&&(d[Me]=c),v){let g=f instanceof Uint8Array?f:typeof f=="string"?new TextEncoder().encode(f):new Uint8Array(0);Object.assign(d,Ce(n,e,g,pe,b))}return d};B&&!T&&A&&(await A(),T=q(L));let _=c=>fetch(Be+e,{method:n,headers:Ue(c),...f!=null?{body:f}:{},credentials:"include",signal:p});try{let c=await _(T);if(!c.ok){let S=await Ee(c.clone());if(v&&nt(c.status,S.message))c=await _(T);else if(B&&A&&tt(c.status,S.message))await A(),T=q(L),c=await _(T);else if(!m.has(c.status))throw D(c.status,S)}if(!c.ok&&!m.has(c.status))throw D(c.status,await Ee(c));let d=c.headers.get("X-Access-Token")?.trim()??"",R=c.headers.get("Content-Type")??"";if(R.includes("application/octet-stream")){let S=C(b,ge),_e=await c.arrayBuffer(),Te;try{Te=$(_e,S)}catch(ye){throw Ze({method:n,path:e,withAuth:s,status:c.status,contentType:R,responsePacketSource:ge,tokenPresent:!!E,anonymousPacketTokenPresent:!!w,hmacEnabled:!!b,error:ye}),ye}return d&&fe?.(d),Te}if(d&&fe?.(d),!R.includes("application/json"))return await c.text();let g=await c.json();if(u&&!g.ok&&!m.has(c.status))throw D(c.status,{message:g.message??`EntityServer error (HTTP ${c.status})`,code:g.code,body:g});return g}finally{Qe(r,h.abortKey,h.controller)}}var j="/v1/realtime",M=class{baseUrl;token;anonymousPacketToken;apiKey;hmacSecret;encryptRequests;debugPlainSecret;csrfEnabled;csrfHeaderName;csrfCookieName;csrfRefresher=null;requestAbortControllers=new Map;activeTxId=null;initialHealthFired=!1;keepSession;refreshBuffer;onTokenRefreshed;onSessionExpired;onHealthChange;sessionRefreshToken=null;refreshTimer=null;healthTickTimer=null;healthTickPromise=null;realtimeEnabled;realtimePath;realtimeAutoReconnect;realtimeReconnectDelayMs;realtimeStatus;realtimeSocket=null;realtimeConnectPromise=null;realtimeReconnectTimer=null;realtimeShouldReconnect=!1;realtimeMessageListeners=new Set;realtimeStatusListeners=new Set;realtimeEventListeners=new Map;constructor(n={}){let e=H("VITE_ENTITY_SERVER_URL");this.baseUrl=(n.baseUrl??e??"").replace(/\/$/,""),this.token=n.token??"",this.anonymousPacketToken=n.anonymousPacketToken??"",this.apiKey=n.apiKey??"",this.hmacSecret=n.hmacSecret??"",this.encryptRequests=n.encryptRequests??!1,this.debugPlainSecret=n.debugPlainSecret??"",this.csrfEnabled=n.csrfEnabled??!1,this.csrfHeaderName=n.csrfHeaderName??"x-csrf-token",this.csrfCookieName=n.csrfCookieName??"_csrf",this.keepSession=n.keepSession??!1,this.refreshBuffer=n.refreshBuffer??60,this.onTokenRefreshed=n.onTokenRefreshed,this.onSessionExpired=n.onSessionExpired,this.onHealthChange=n.onHealthChange,this.realtimeEnabled=!1,this.realtimePath=j,this.realtimeAutoReconnect=!0,this.realtimeReconnectDelayMs=3e3,this.realtimeStatus="idle",this.applyRealtimeOptions(n.realtime),typeof n.healthTickInterval=="number"&&n.healthTickInterval>0&&Promise.resolve().then(()=>this.startHealthTick(n.healthTickInterval,!1)),this.fireInitialHealth()}configure(n){typeof n.baseUrl=="string"&&(this.baseUrl=n.baseUrl.replace(/\/$/,"")),typeof n.token=="string"&&(this.token=n.token),typeof n.anonymousPacketToken=="string"&&(this.anonymousPacketToken=n.anonymousPacketToken),typeof n.encryptRequests=="boolean"&&(this.encryptRequests=n.encryptRequests),typeof n.debugPlainSecret=="string"&&(this.debugPlainSecret=n.debugPlainSecret),typeof n.csrfEnabled=="boolean"&&(this.csrfEnabled=n.csrfEnabled),typeof n.csrfHeaderName=="string"&&(this.csrfHeaderName=n.csrfHeaderName),typeof n.csrfCookieName=="string"&&(this.csrfCookieName=n.csrfCookieName),typeof n.apiKey=="string"&&(this.apiKey=n.apiKey),typeof n.hmacSecret=="string"&&(this.hmacSecret=n.hmacSecret),typeof n.keepSession=="boolean"&&(this.keepSession=n.keepSession),typeof n.refreshBuffer=="number"&&(this.refreshBuffer=n.refreshBuffer),n.onTokenRefreshed&&(this.onTokenRefreshed=n.onTokenRefreshed),n.onSessionExpired&&(this.onSessionExpired=n.onSessionExpired),n.onHealthChange&&(this.onHealthChange=n.onHealthChange),typeof n.realtime<"u"&&this.applyRealtimeOptions(n.realtime),typeof n.healthTickInterval=="number"&&n.healthTickInterval>0&&Promise.resolve().then(()=>this.startHealthTick(n.healthTickInterval,!1)),this.fireInitialHealth()}fireInitialHealth(){if(this.initialHealthFired||typeof document>"u"||!this.baseUrl)return;this.initialHealthFired=!0;let n=this;typeof n.checkHealth=="function"&&Promise.resolve().then(()=>n.checkHealth(!1).catch(()=>{}))}setToken(n){this.token=n,this.syncRealtimeWithToken()}setAccessTokenFromResponse(n){this.token=n,this.syncRealtimeWithToken()}syncRealtimeWithToken(){if(!this.token){this.disconnectRealtime("token_cleared");return}!this.realtimeEnabled||typeof WebSocket>"u"||this.connectRealtime().catch(()=>{})}setAnonymousPacketToken(n){this.anonymousPacketToken=n}setApiKey(n){this.apiKey=n}setHmacSecret(n){this.hmacSecret=n}setEncryptRequests(n){this.encryptRequests=n}setCsrfEnabled(n){this.csrfEnabled=n}addRealtimeListener(n){this.realtimeMessageListeners.add(n)}removeRealtimeListener(n){this.realtimeMessageListeners.delete(n)}addRealtimeStatusListener(n){this.realtimeStatusListeners.add(n)}removeRealtimeStatusListener(n){this.realtimeStatusListeners.delete(n)}addRealtimeEventListener(n,e){let t=String(n).trim();t&&(this.realtimeEventListeners.has(t)||this.realtimeEventListeners.set(t,new Set),this.realtimeEventListeners.get(t).add(e))}removeRealtimeEventListener(n,e){let t=String(n).trim();if(!t)return;let s=this.realtimeEventListeners.get(t);s&&(s.delete(e),s.size===0&&this.realtimeEventListeners.delete(t))}async connectRealtime(){if(!this.realtimeEnabled){this.setRealtimeStatus("disabled","realtime_disabled");return}if(!this.token)throw new Error("Cannot open realtime connection without access token.");if(typeof WebSocket>"u")throw new Error("WebSocket is not available in this environment.");if(this.realtimeSocket&&this.realtimeSocket.readyState===WebSocket.OPEN)return;if(this.realtimeSocket&&this.realtimeSocket.readyState===WebSocket.CONNECTING&&this.realtimeConnectPromise)return this.realtimeConnectPromise;this.clearRealtimeReconnectTimer(),this.realtimeShouldReconnect=this.realtimeAutoReconnect,this.setRealtimeStatus("connecting","connect_requested");let n=new WebSocket(this.buildRealtimeUrl());return this.realtimeSocket=n,this.realtimeConnectPromise=new Promise((e,t)=>{let s=!1,i=()=>{s||(s=!0,this.realtimeConnectPromise=null,e())},o=a=>{s||(s=!0,this.realtimeConnectPromise=null,t(a))};n.addEventListener("open",()=>{this.setRealtimeStatus("open","socket_open"),i()}),n.addEventListener("message",a=>{this.handleRealtimeMessage(a.data)}),n.addEventListener("error",()=>{this.setRealtimeStatus("closed","socket_error",new Error("Realtime socket error."))}),n.addEventListener("close",a=>{this.realtimeSocket===n&&(this.realtimeSocket=null);let u=a.reason||"socket_closed",m=new Error(`Realtime socket closed (${a.code}${a.reason?`: ${a.reason}`:""}).`);this.setRealtimeStatus("closed",u,m),s||o(m),this.realtimeShouldReconnect&&this.realtimeEnabled&&this.realtimeAutoReconnect&&this.token&&this.scheduleRealtimeReconnect(u)})}),this.realtimeConnectPromise}disconnectRealtime(n="client_disconnect"){if(this.realtimeShouldReconnect=!1,this.clearRealtimeReconnectTimer(),this.realtimeSocket){let e=this.realtimeSocket;this.realtimeSocket=null;try{(e.readyState===WebSocket.OPEN||e.readyState===WebSocket.CONNECTING)&&e.close(1e3,n)}catch{}}this.realtimeConnectPromise=null,this.setRealtimeStatus(this.realtimeEnabled?"idle":"disabled",n)}sendRealtime(n){return!this.realtimeSocket||this.realtimeSocket.readyState!==WebSocket.OPEN?!1:(this.realtimeSocket.send(JSON.stringify(n)),!0)}subscribeRealtime(n){return this.sendRealtime({type:"subscribe",channel:"session",event:"session.subscribe",data:{subscriptions:n}})}unsubscribeRealtime(n){return this.sendRealtime({type:"unsubscribe",channel:"session",event:"session.unsubscribe",data:{subscriptions:n}})}startHealthTick(n=300*1e3,e=!0){this.stopHealthTick();let t=()=>{this.healthTickPromise||(this.healthTickPromise=(this.csrfRefresher?this.csrfRefresher():Promise.resolve()).then(()=>{this.onHealthChange?.(!0)}).catch(()=>{this.onHealthChange?.(!1)}).finally(()=>{this.healthTickPromise=null}))};e&&t(),this.healthTickTimer=setInterval(t,n)}stopHealthTick(){this.healthTickTimer!==null&&(clearInterval(this.healthTickTimer),this.healthTickTimer=null),this.healthTickPromise=null}scheduleKeepSession(n,e,t){this.clearRefreshTimer(),this.sessionRefreshToken=n;let s=Math.max((e-this.refreshBuffer)*1e3,0);this.refreshTimer=setTimeout(async()=>{if(this.sessionRefreshToken)try{let i=await t(this.sessionRefreshToken);this.onTokenRefreshed?.(i.access_token,i.expires_in),this.scheduleKeepSession(this.sessionRefreshToken,i.expires_in,t)}catch(i){this.clearRefreshTimer(),this.onSessionExpired?.(i instanceof Error?i:new Error(String(i)))}},s)}clearRefreshTimer(){this.refreshTimer!==null&&(clearTimeout(this.refreshTimer),this.refreshTimer=null)}stopKeepSession(){this.clearRefreshTimer(),this.sessionRefreshToken=null}applyRealtimeOptions(n){let e=typeof n=="boolean"?{enabled:n}:n??{};if(this.realtimeEnabled=e.enabled??!1,this.realtimePath=String(e.path??j).trim()||j,this.realtimeAutoReconnect=e.autoReconnect??!0,this.realtimeReconnectDelayMs=Math.max(250,e.reconnectDelayMs??3e3),!this.realtimeEnabled){this.disconnectRealtime("realtime_disabled");return}this.setRealtimeStatus("idle","realtime_enabled")}buildRealtimeUrl(){let n=this.baseUrl||H("VITE_ENTITY_SERVER_URL")||"",e=typeof window<"u"?window.location.origin:"",t=n||e;if(!t)throw new Error("Realtime connection requires baseUrl.");let s=new URL(t,e||void 0),i=s.pathname==="/"?"":s.pathname.replace(/\/+$/,""),o=`/${this.realtimePath.replace(/^\/+/,"")}`;return s.pathname=`${i}${o}`||o,s.search="",s.hash="",s.protocol=s.protocol==="https:"?"wss:":"ws:",s.searchParams.set("access_token",this.token),s.toString()}handleRealtimeMessage(n){if(typeof n!="string")return;let e;try{e=JSON.parse(n)}catch{return}for(let s of this.realtimeMessageListeners)s(e);let t=this.realtimeEventListeners.get(e.event);if(t)for(let s of t)s(e)}scheduleRealtimeReconnect(n){this.clearRealtimeReconnectTimer(),this.realtimeReconnectTimer=setTimeout(()=>{this.realtimeReconnectTimer=null,!(!this.realtimeEnabled||!this.token)&&(this.setRealtimeStatus("connecting",`${n}:reconnect`),this.connectRealtime().catch(()=>{}))},this.realtimeReconnectDelayMs)}clearRealtimeReconnectTimer(){this.realtimeReconnectTimer!==null&&(clearTimeout(this.realtimeReconnectTimer),this.realtimeReconnectTimer=null)}setRealtimeStatus(n,e,t){let s=this.realtimeStatus;if(!(s===n&&typeof e>"u"&&typeof t>"u")){this.realtimeStatus=n;for(let i of this.realtimeStatusListeners)i({status:n,previousStatus:s,...e?{reason:e}:{},...t?{error:t}:{}})}}applyCsrfHealth(){if(!(typeof document>"u")){for(let n of document.cookie.split(";")){let e=n.indexOf("=");if(!(e<0)&&n.substring(0,e).trim()===this.csrfCookieName){this.csrfEnabled=!!n.substring(e+1).trim();return}}this.csrfEnabled=!1}}readRequestBody(n,e="application/json",t=!1){let s=C(this.hmacSecret,this.token||this.anonymousPacketToken);return xe(n,e,t,s)}get reqOpts(){return{baseUrl:this.baseUrl,token:this.token,anonymousPacketToken:this.anonymousPacketToken,apiKey:this.apiKey,hmacSecret:this.hmacSecret,encryptRequests:this.encryptRequests,csrfEnabled:this.csrfEnabled,csrfHeaderName:this.csrfHeaderName,csrfCookieName:this.csrfCookieName,refreshCsrfCookie:this.csrfEnabled?this.csrfRefresher:null,requestAbortControllers:this.requestAbortControllers,debugPlainSecret:this.debugPlainSecret,onAccessToken:n=>{this.setAccessTokenFromResponse(n)}}}prepareRequest(n){return Promise.resolve()}get http(){let n=this;return{get(e,t=!0,s,i){return n.prepareRequest(t).then(()=>k(n.reqOpts,"GET",e,void 0,t,s,i??!0))},post(e,t,s=!0,i,o){return n.prepareRequest(s).then(()=>k(n.reqOpts,"POST",e,t,s,i,o??!0))},put(e,t,s=!0,i,o){return n.prepareRequest(s).then(()=>k(n.reqOpts,"PUT",e,t,s,i,o??!0))},patch(e,t,s=!0,i,o){return n.prepareRequest(s).then(()=>k(n.reqOpts,"PATCH",e,t,s,i,o??!0))},delete(e,t,s=!0,i,o){return n.prepareRequest(s).then(()=>k(n.reqOpts,"DELETE",e,t,s,i,o??!0))}}}request(n,e,t,s=!0,i,o){return this.prepareRequest(s).then(()=>k(this.reqOpts,n,e,t,s,i,o??!0))}async requestBinary(n,e,t,s=!0){await this.prepareRequest(s);let i={"Content-Type":"application/json"};s&&this.token&&(i.Authorization=`Bearer ${this.token}`),this.apiKey&&(i["X-API-Key"]=this.apiKey);let o=await fetch(this.baseUrl+e,{method:n,headers:i,...t!=null?{body:JSON.stringify(t)}:{},credentials:"include"});if(!o.ok){let a=await o.text(),u=new Error(`HTTP ${o.status}: ${a}`);throw u.status=o.status,u}return o.arrayBuffer()}async requestForm(n,e,t,s=!0){let i={};s&&this.token&&(i.Authorization=`Bearer ${this.token}`),this.apiKey&&(i["X-API-Key"]=this.apiKey);let o=await fetch(this.baseUrl+e,{method:n,headers:i,body:t,credentials:"include"}),a=await o.json();if(!a.ok){let u=new Error(a.message??`EntityServer error (HTTP ${o.status})`);throw u.status=o.status,u}return a}async requestFormBinary(n,e,t,s=!0){let i={};s&&this.token&&(i.Authorization=`Bearer ${this.token}`),this.apiKey&&(i["X-API-Key"]=this.apiKey);let o=await fetch(this.baseUrl+e,{method:n,headers:i,body:t,credentials:"include"});if(!o.ok){let a=await o.text(),u=new Error(`HTTP ${o.status}: ${a}`);throw u.status=o.status,u}return o.arrayBuffer()}};function Ae(r){return r.ok===!0&&r.requires_2fa!==!0&&typeof r.data=="object"&&r.data!==null&&"access_token"in r.data}function K(r){return class extends r{authBootstrapPromise=null;authBootstrapToken="";authBootstrapAnonymousCompleted=!1;setAccessTokenFromResponse(e){super.setAccessTokenFromResponse(e),this.authBootstrapToken=e,this.authBootstrapAnonymousCompleted=!1}csrfRefresher=()=>this.checkHealth(this.keepSession).then(()=>{});async checkHealth(e=!1){try{let t=this.token,s={};e&&(s["X-Session-Bootstrap"]="1");let i=await fetch(`${this.baseUrl}/v1/health`,{signal:AbortSignal.timeout(3e3),credentials:"include",headers:s}),o=await i.json(),a=i.headers.get("X-Access-Token");a&&(this.token=a,e&&a!==t&&this.onTokenRefreshed?.(a,0));let u=i.headers.get("X-Packet-Encryption")==="1"||o.packet_encryption===!0,m=this.readCookie("anon_token");return u&&m&&(this.anonymousPacketToken=m,this.encryptRequests=!0),this.applyCsrfHealth(),this.onHealthChange?.(!0),e&&o.authenticated===!1&&t&&(this.disconnectRealtime("session_expired"),this.onSessionExpired?.(new Error("Session expired"))),o}catch(t){throw this.onHealthChange?.(!1),t}}readCookie(e){if(typeof document>"u")return null;let t=document.cookie.split(";").map(s=>s.trim()).find(s=>s.startsWith(`${e}=`));if(!t)return null;try{return decodeURIComponent(t.slice(e.length+1))}catch{return t.slice(e.length+1)}}async ensurePublicAuthBootstrap(){if(typeof document>"u"||this.apiKey&&this.hmacSecret)return;let e=!!this.anonymousPacketToken||!!this.readCookie("anon_token"),t=!!this.readCookie(this.csrfCookieName);e&&t&&this.csrfEnabled||await this.checkHealth(!1)}async ensureAuthenticatedRequestBootstrap(){if(!(typeof document>"u")&&!(this.apiKey&&this.hmacSecret)){if(this.token){if(this.authBootstrapToken===this.token)return}else if(this.authBootstrapAnonymousCompleted)return;return this.authBootstrapPromise?this.authBootstrapPromise:(this.authBootstrapPromise=this.checkHealth(!0).then(()=>{this.token?this.authBootstrapToken=this.token:this.authBootstrapAnonymousCompleted=!0}).finally(()=>{this.authBootstrapPromise=null}),this.authBootstrapPromise)}}async prepareRequest(e){await super.prepareRequest(e),e&&await this.ensureAuthenticatedRequestBootstrap()}async login(e,t){await this.ensurePublicAuthBootstrap();let s=await k(this.reqOpts,"POST","/v1/auth/login",{email:e,passwd:t},!1,{},{requireOkShape:!1,allowStatuses:[403]});return Ae(s)&&(this.token=s.data.access_token,this.applyCsrfHealth(),this.keepSession&&this.healthTickTimer===null&&this.startHealthTick()),s}async tokenRefresh(){let e=await this.request("POST","/v1/auth/token_refresh",void 0,!1);return this.token=e.data.access_token,this.applyCsrfHealth(),e.data}async refreshToken(e){if(!e)return this.tokenRefresh();let t=await this.request("POST","/v1/auth/refresh",{refresh_token:e},!1);return this.token=t.data.access_token,this.applyCsrfHealth(),t.data}async logout(e){this.stopKeepSession(),this.stopHealthTick(),this.disconnectRealtime("logout");let t=await this.request("POST","/v1/auth/logout",e?{refresh_token:e}:void 0,!1);return this.token="",this.applyCsrfHealth(),t}me(){return this.request("GET","/v1/auth/me")}withdraw(e){return this.request("POST","/v1/auth/withdraw",e?{passwd:e}:{})}}}function N(r){return class extends r{async transStart(){let e=await this.request("POST","/v1/transaction/start",void 0,!1);return this.activeTxId=e.transaction_id,this.activeTxId}transRollback(e){let t=e??this.activeTxId;return t?(this.activeTxId=null,this.request("POST",`/v1/transaction/rollback/${t}`)):Promise.reject(new Error("No active transaction. Call transStart() first."))}transCommit(e){let t=e??this.activeTxId;return t?(this.activeTxId=null,this.request("POST",`/v1/transaction/commit/${t}`)):Promise.reject(new Error("No active transaction. Call transStart() first."))}meta(e){return this.request("POST",`/v1/entity/${e}/meta`,{})}validate(e,t){return this.http.post(`/v1/entity/${e}/validate`,t)}get(e,t,s={}){let i=s.skipHooks?"?skipHooks=true":"";return this.request("GET",`/v1/entity/${e}/${t}${i}`)}find(e,t,s={}){let i=s.skipHooks?"?skipHooks=true":"";return this.request("POST",`/v1/entity/${e}/find${i}`,t??{})}list(e,t={}){let{conditions:s,fields:i,orderDir:o,orderBy:a,...u}=t,m={page:1,limit:20,...u};return a&&(m.orderBy=o==="DESC"?`-${a}`:a),i?.length&&(m.fields=i.join(",")),this.request("POST",`/v1/entity/${e}/list?${l(m)}`,s??{})}count(e,t){return this.request("POST",`/v1/entity/${e}/count`,t??{})}query(e,t){return this.request("POST",`/v1/entity/${e}/query`,t)}submit(e,t,s={}){let i=s.transactionId??this.activeTxId,o=i?{"X-Transaction-ID":i}:void 0,a=s.skipHooks?"?skipHooks=true":"";return this.request("POST",`/v1/entity/${e}/submit${a}`,t,!0,o)}delete(e,t,s={}){let i=new URLSearchParams;s.hard&&i.set("hard","true"),s.skipHooks&&i.set("skipHooks","true");let o=i.size?`?${i}`:"",a=s.transactionId??this.activeTxId,u=a?{"X-Transaction-ID":a}:void 0;return this.request("POST",`/v1/entity/${e}/delete/${t}${o}`,void 0,!0,u)}history(e,t,s={}){return this.request("GET",`/v1/entity/${e}/history/${t}?${l({page:1,limit:50,...s})}`)}rollback(e,t){return this.request("POST",`/v1/entity/${e}/rollback/${t}`)}}}function V(r){return class extends r{async fileUpload(e,t,s={}){let i=new FormData;return i.append("file",t,t instanceof File?t.name:"upload"),s.refSeq!=null&&i.append("ref_seq",String(s.refSeq)),s.isPublic!=null&&i.append("is_public",s.isPublic?"true":"false"),this.requestForm("POST",`/v1/files/${e}/upload`,i)}fileDownload(e,t){return this.requestBinary("POST",`/v1/files/${e}/download/${t}`,{})}fileDelete(e,t){return this.request("POST",`/v1/files/${e}/delete/${t}`,{})}fileList(e,t={}){return this.request("POST",`/v1/files/${e}/list`,t.refSeq?{ref_seq:t.refSeq}:{})}fileMeta(e,t){return this.request("POST",`/v1/files/${e}/meta/${t}`,{})}fileToken(e){return this.request("POST",`/v1/files/token/${e}`,{})}fileViewUrl(e,t={}){let s=t.download?"?download=true":"";return`${this.baseUrl}/v1/files/${e}${s}`}fileUrl(e){return`${this.baseUrl}/v1/files/${e}`}storageUpload(e,t,s={}){return this.fileUpload(e,t,s)}storageDownload(e,t){return this.fileDownload(e,t)}storageDelete(e,t){return this.fileDelete(e,t)}storageList(e,t={}){return this.fileList(e,t)}storageMeta(e,t){return this.fileMeta(e,t)}storageToken(e){return this.fileToken(e)}storageViewUrl(e,t={}){return this.fileViewUrl(e,t)}storageDownloadUrl(e){return this.fileViewUrl(e,{download:!0})}storageUrl(e){return this.fileUrl(e)}}}function W(r){return class extends r{push(e,t,s={}){return this.submit(e,t,s)}pushLogList(e={}){return this.list("push_log",e)}registerPushDevice(e,t,s,i={}){let{platform:o,deviceType:a,browser:u,browserVersion:m,pushEnabled:h=!0,transactionId:p}=i;return this.submit("account_device",{id:t,account_seq:e,push_token:s,push_enabled:h,...o?{platform:o}:{},...a?{device_type:a}:{},...u?{browser:u}:{},...m?{browser_version:m}:{}},{transactionId:p})}updatePushDeviceToken(e,t,s={}){let{pushEnabled:i=!0,transactionId:o}=s;return this.submit("account_device",{seq:e,push_token:t,push_enabled:i},{transactionId:o})}disablePushDevice(e,t={}){return this.submit("account_device",{seq:e,push_enabled:!1},{transactionId:t.transactionId})}}}function z(r){return class extends r{smtpSend(e){return this.request("POST","/v1/smtp/send",e)}smtpStatus(e){return this.request("POST",`/v1/smtp/status/${e}`,{})}smtpTemplatePreview(e){let t=e.split("/").map(encodeURIComponent).join("/");return fetch(`${this.baseUrl}/v1/smtp/template/${t}`,{credentials:"include"}).then(s=>s.text())}}}function Q(r){return class extends r{transactionStart(e){return this.request("POST","/v1/transaction/start",e??{})}transactionCommit(e){return this.request("POST",`/v1/transaction/commit/${encodeURIComponent(e)}`,{})}transactionRollback(e){return this.request("POST",`/v1/transaction/rollback/${encodeURIComponent(e)}`,{})}}}function X(r){return class extends r{addressSido(){return this.http.get("/v1/utils/address/sido",!1)}addressSigungu(e){let t=new URLSearchParams({sido:e.sido}).toString();return this.http.get(`/v1/utils/address/sigungu?${t}`,!1)}addressDong(e){let t=new URLSearchParams({sido:e.sido,sigungu:e.sigungu}).toString();return this.http.get(`/v1/utils/address/dong?${t}`,!1)}addressClean(e){let t=new URLSearchParams({q:e.q}).toString();return this.http.get(`/v1/utils/address/clean?${t}`,!1)}qrcode(e,t={}){return this.requestBinary("POST","/v1/utils/qrcode",{content:e,...t})}qrcodeBase64(e,t={}){return this.request("POST","/v1/utils/qrcode/base64",{content:e,...t})}qrcodeText(e,t={}){return this.request("POST","/v1/utils/qrcode/text",{content:e,...t})}barcode(e,t={}){return this.requestBinary("POST","/v1/utils/barcode",{content:e,...t})}pdf2png(e,t={}){let s=new FormData;s.append("file",new Blob([e],{type:"application/pdf"}),"document.pdf");let i=new URLSearchParams;t.dpi!=null&&i.set("dpi",String(t.dpi)),t.firstPage!=null&&i.set("first_page",String(t.firstPage)),t.lastPage!=null&&i.set("last_page",String(t.lastPage));let o=i.toString(),a="/v1/utils/pdf2png"+(o?`?${o}`:"");return this.requestFormBinary("POST",a,s)}pdf2pngByFileSeq(e,t={}){return this.requestBinary("POST",`/v1/utils/pdf2png/${e}`,t)}pdf2jpg(e,t={}){let s=new FormData;s.append("file",new Blob([e],{type:"application/pdf"}),"document.pdf");let i=new URLSearchParams;t.dpi!=null&&i.set("dpi",String(t.dpi)),t.firstPage!=null&&i.set("first_page",String(t.firstPage)),t.lastPage!=null&&i.set("last_page",String(t.lastPage));let o=i.toString(),a="/v1/utils/pdf2jpg"+(o?`?${o}`:"");return this.requestFormBinary("POST",a,s)}pdf2jpgByFileSeq(e,t={}){return this.requestBinary("POST",`/v1/utils/pdf2jpg/${e}`,t)}}}function J(r){return class extends r{adminPath(e){return`/v1/admin${e}`}adminGet(e){return this.http.get(this.adminPath(e))}adminPost(e,t){return this.http.post(this.adminPath(e),t)}adminPut(e,t){return this.http.put(this.adminPath(e),t)}adminPatch(e,t){return this.http.patch(this.adminPath(e),t)}adminDelete(e,t){return this.http.delete(this.adminPath(e),t)}listAdminEntities(){return this.adminGet("/entities")}getAdminErdSchema(){return this.adminGet("/erd/schema")}batchEnsureAdminEntities(e){return this.adminPost("/entities/batch-ensure",e)}createAdminEntityConfig(e,t){return this.adminPost(`/${e}/create`,t)}getAdminEntityConfig(e){return this.adminGet(`/${e}/config`)}updateAdminEntityConfig(e,t){return this.adminPut(`/${e}/config`,t)}validateAdminEntityConfig(e,t){return this.adminPost(t?`/${t}/validate`:"/entity/validate",e)}normalizeAdminEntityConfig(e,t){return this.adminPost(t?`/${t}/normalize`:"/entity/normalize",e)}getAdminEntityStats(e,t){return this.adminPost(`/${e}/stats`,t)}reindexAdminEntity(e){return this.adminPost(`/${e}/reindex`)}syncAdminEntitySchema(e){return this.adminPost(`/${e}/sync-schema`)}resetAdminEntity(e){return this.adminPost(`/${e}/reset`)}truncateAdminEntity(e){return this.adminPost(`/${e}/truncate`)}dropAdminEntity(e){return this.adminPost(`/${e}/drop`)}resetAllAdmin(e){return this.adminPost("/reset-all",e)}listAdminConfigs(){return this.adminGet("/configs")}getAdminConfig(e){return this.adminGet(`/configs/${e}`)}updateAdminConfig(e,t){return this.adminPatch(`/configs/${e}`,t)}listAdminRoles(){return this.adminGet("/roles")}createAdminRole(e){return this.adminPost("/roles",e)}getAdminRole(e){return this.adminGet(`/roles/${e}`)}updateAdminRole(e,t){return this.adminPatch(`/roles/${e}`,t)}deleteAdminRole(e){return this.adminDelete(`/roles/${e}`)}listAdminApiKeys(){return this.adminGet("/api-keys")}createAdminApiKey(e){return this.adminPost("/api-keys",e)}getAdminApiKey(e){return this.adminGet(`/api-keys/${e}`)}updateAdminApiKey(e,t){return this.adminPatch(`/api-keys/${e}`,t)}deleteAdminApiKey(e){return this.adminDelete(`/api-keys/${e}`)}regenerateAdminApiKeySecret(e){return this.adminPost(`/api-keys/${e}/regenerate-secret`)}listAdminAccounts(){return this.adminGet("/accounts")}createAdminAccount(e){return this.adminPost("/accounts",e)}getAdminAccount(e){return this.adminGet(`/accounts/${e}`)}updateAdminAccount(e,t){return this.adminPatch(`/accounts/${e}`,t)}deleteAdminAccount(e){return this.adminDelete(`/accounts/${e}`)}listAdminLicenses(){return this.adminGet("/licenses")}createAdminLicense(e){return this.adminPost("/licenses",e)}getAdminLicense(e){return this.adminGet(`/licenses/${e}`)}updateAdminLicense(e,t){return this.adminPatch(`/licenses/${e}`,t)}deleteAdminLicense(e){return this.adminDelete(`/licenses/${e}`)}runAdminBackup(e){return this.adminPost("/backup/run",e)}getAdminBackupStatus(e){return this.adminPost("/backup/status",e)}listAdminBackups(e){return this.adminPost("/backup/list",e)}restoreAdminBackup(e){return this.adminPost("/backup/restore",e)}deleteAdminBackup(e){return this.adminPost("/backup/delete",e)}disableAdminAccountTwoFactor(e){return this.adminDelete(`/accounts/${e}/2fa`)}}}var P=class extends X(Q(V(z(W(J(N(K(M)))))))){};function Y(r){return class extends r{accountRegister(e){return this.http.post("/v1/account/register",e,!1)}accountWithdraw(e){return this.http.post("/v1/account/withdraw",e)}accountChangePassword(e){return this.http.post("/v1/account/change-password",e)}accountReactivate(e){return this.http.post("/v1/account/reactivate",e,!1)}listAccountBiometrics(){return this.http.get("/v1/account/biometric")}registerAccountBiometric(e){return this.http.post("/v1/account/biometric",e)}deleteAccountBiometric(e){return this.http.delete(`/v1/account/biometric/${e}`)}}}function Z(r){return class extends r{listBoardCategories(e={}){let t=l(e);return this.http.get(`/v1/board/categories${t?`?${t}`:""}`,!1)}getBoardCategory(e){return this.http.get(`/v1/board/categories/${e}`,!1)}createBoardCategory(e){return this.http.post("/v1/board/categories",e)}updateBoardCategory(e,t){return this.http.put(`/v1/board/categories/${e}`,t)}deleteBoardCategory(e){return this.http.delete(`/v1/board/categories/${e}`)}listBoardPosts(e,t={}){let s=l(t);return this.http.get(`/v1/board/${e}/list${s?`?${s}`:""}`)}getBoardPost(e){return this.http.get(`/v1/board/posts/${e}`)}createBoardPost(e,t){return this.http.post(`/v1/board/${e}/submit`,t)}updateBoardPost(e,t){return this.http.patch(`/v1/board/posts/${e}`,t)}expireBoardPost(e){return this.http.post(`/v1/board/posts/${e}/expire`,{})}deleteBoardPost(e){return this.http.delete(`/v1/board/posts/${e}`)}listBoardComments(e,t={}){let s=l(t);return this.http.get(`/v1/board/posts/${e}/comments${s?`?${s}`:""}`,!1)}createBoardComment(e,t){return this.http.post(`/v1/board/posts/${e}/comments/submit`,t)}updateBoardComment(e,t){return this.http.put(`/v1/board/comments/${e}`,t)}deleteBoardComment(e){return this.http.delete(`/v1/board/comments/${e}`)}listBoardFiles(e){return this.http.get(`/v1/board/posts/${e}/files`,!1)}async uploadBoardFile(e,t){let s=new FormData;return s.append("file",t,t instanceof File?t.name:"upload"),this.requestForm("POST",`/v1/board/posts/${e}/files`,s)}boardFileUrl(e){return`${this.baseUrl}/v1/board/files/${e}`}deleteBoardFile(e){return this.http.delete(`/v1/board/files/${e}`)}createBoardGuestPost(e,t){return this.http.post(`/v1/board/${e}/guest-submit`,t,!1)}authenticateBoardGuestPost(e,t){return this.http.post(`/v1/board/posts/${e}/guest-auth`,t,!1)}toggleBoardPostLike(e){return this.http.post(`/v1/board/posts/${e}/like`,{})}acceptBoardPost(e){return this.http.post(`/v1/board/posts/${e}/accept`,{})}rateBoardPost(e,t){return this.http.post(`/v1/board/posts/${e}/rating`,t)}rateBoardComment(e,t){return this.http.post(`/v1/board/comments/${e}/rating`,t)}listBoardTags(e={}){let t=l(e);return this.http.get(`/v1/board/tags${t?`?${t}`:""}`,!1)}setBoardPostTags(e,t){return this.http.put(`/v1/board/posts/${e}/tags`,t)}reportBoardPost(e,t){return this.http.post(`/v1/board/posts/${e}/report`,t)}reportBoardComment(e,t){return this.http.post(`/v1/board/comments/${e}/report`,t)}listBoardReports(e={}){let t=l(e);return this.http.get(`/v1/board/admin/reports${t?`?${t}`:""}`)}updateBoardReport(e,t){return this.http.patch(`/v1/board/admin/reports/${e}`,t)}markBoardPostRead(e){return this.http.post(`/v1/board/posts/${e}/read`,{})}listBoardMentions(e={}){let t=l(e);return this.http.get(`/v1/board/mentions${t?`?${t}`:""}`)}markBoardMentionRead(e){return this.http.patch(`/v1/board/mentions/${e}/read`,{})}}}function ee(r){return class extends r{sendEmailVerification(e){return this.http.post("/v1/email-verify/send",e,!1)}confirmEmailVerification(e){return this.http.post("/v1/email-verify/confirm",e,!1)}activateEmailVerification(e){let t=l(e);return this.http.get(`/v1/email-verify/activate${t?`?${t}`:""}`,!1)}getEmailVerificationStatus(){return this.http.get("/v1/email-verify/status")}changeVerifiedEmail(e){return this.http.post("/v1/email-verify/change",e)}}}function te(r){return class extends r{oauthAuthorizeUrl(e,t={}){let s=l(t);return`${this.baseUrl}/v1/oauth/${e}${s?`?${s}`:""}`}oauthCallback(e,t,s="POST"){if(s==="GET"){let i=l(t??{});return this.http.get(`/v1/oauth/${e}/callback${i?`?${i}`:""}`,!1)}return this.http.post(`/v1/oauth/${e}/callback`,t,!1)}linkOAuthAccount(e){return this.http.post("/v1/account/oauth/link",e)}unlinkOAuthAccount(e){return this.http.delete(`/v1/account/oauth/link/${e}`)}listOAuthProviders(){return this.http.get("/v1/account/oauth/providers")}refreshOAuthProviderToken(e,t){return this.http.post(`/v1/account/oauth/refresh/${e}`,t)}}}function ne(r){return class extends r{requestPasswordReset(e){return this.http.post("/v1/password-reset/request",e,!1)}validatePasswordResetToken(e){return this.http.get(`/v1/password-reset/validate/${encodeURIComponent(e)}`,!1)}verifyPasswordReset(e){return this.http.post("/v1/password-reset/verify",e,!1)}}}function re(r){return class extends r{setupTwoFactor(e){return this.http.post("/v1/account/2fa/setup",e)}verifyTwoFactorSetup(e){return this.http.post("/v1/account/2fa/setup/verify",e,!1)}disableTwoFactor(){return this.http.delete("/v1/account/2fa")}getTwoFactorStatus(){return this.http.get("/v1/account/2fa/status")}regenerateTwoFactorRecoveryCodes(){return this.http.post("/v1/account/2fa/recovery/regenerate")}verifyTwoFactor(e){return this.http.post("/v1/account/2fa/verify",e,!1)}recoverTwoFactorAccess(e){return this.http.post("/v1/account/2fa/recovery",e,!1)}}}function se(r){return class extends r{alimtalkSend(e){return this.http.post("/v1/alimtalk/send",e)}alimtalkStatus(e){return this.http.get(`/v1/alimtalk/status/${e}`,!1)}listAlimtalkTemplates(){return this.http.get("/v1/alimtalk/templates",!1)}alimtalkWebhook(e,t){return this.http.post(`/v1/alimtalk/webhook/${encodeURIComponent(e)}`,t,!1)}}}function ie(r){return class extends r{friendtalkSend(e){return this.http.post("/v1/friendtalk/send",e)}}}function oe(r){return class extends r{listHolidays(e={}){let t=l(e);return this.http.get(`/v1/holidays${t?`?${t}`:""}`,!1)}getHolidayByDate(e){return this.http.get(`/v1/holidays/${encodeURIComponent(e)}`,!1)}syncHolidays(e){return this.http.post("/v1/holidays/sync",e)}}}function ae(r){return class extends r{identityRequest(e){return this.http.post("/v1/identity/request",e,!1)}identityCallback(e){return this.http.post("/v1/identity/callback",e,!1)}identityResult(e){return this.http.get(`/v1/identity/result/${encodeURIComponent(e)}`,!1)}identityVerifyCI(e){return this.http.post("/v1/identity/verify-ci",e)}}}function ue(r){return class extends r{llmChat(e){return this.http.post("/v1/llm/chat",e)}llmChatStream(e){return this.http.post("/v1/llm/chat/stream",e)}createLlmConversation(e){return this.http.post("/v1/llm/conversations",e)}sendLlmMessage(e,t){return this.http.post(`/v1/llm/conversations/${e}/messages`,t)}listLlmConversations(e={}){let t=l(e);return this.http.get(`/v1/llm/conversations${t?`?${t}`:""}`)}getLlmConversation(e){return this.http.get(`/v1/llm/conversations/${e}`)}updateLlmConversation(e,t){return this.http.patch(`/v1/llm/conversations/${e}`,t)}deleteLlmConversation(e){return this.http.delete(`/v1/llm/conversations/${e}`)}ragUploadDocument(e){return this.requestForm("POST","/v1/llm/rag/documents",e)}ragListDocuments(e={}){let t=l(e);return this.http.get(`/v1/llm/rag/documents${t?`?${t}`:""}`)}ragDeleteDocument(e){return this.http.delete(`/v1/llm/rag/documents/${encodeURIComponent(e)}`)}ragSearch(e){return this.http.post("/v1/llm/rag/search",e)}ragChat(e){return this.http.post("/v1/llm/rag/chat",e)}ragChatStream(e){return this.http.post("/v1/llm/rag/chat/stream",e)}ragRebuildIndex(e){return this.http.post("/v1/llm/rag/rebuild-index",e)}listLlmProviders(){return this.http.get("/v1/llm/providers")}getLlmUsage(e={}){let t=l(e);return this.http.get(`/v1/llm/usage${t?`?${t}`:""}`)}getLlmUsageSummary(e={}){let t=l(e);return this.http.get(`/v1/llm/usage/summary${t?`?${t}`:""}`)}getLlmCacheStats(){return this.http.get("/v1/llm/cache/stats")}clearLlmCache(){return this.http.delete("/v1/llm/cache")}listLlmTemplates(){return this.http.get("/v1/llm/templates")}llmTemplateChat(e,t){return this.http.post(`/v1/llm/${encodeURIComponent(e)}/chat`,t)}llmTemplateChatStream(e,t){return this.http.post(`/v1/llm/${encodeURIComponent(e)}/chat/stream`,t)}listLlmChatbots(e={}){let t=l(e);return this.http.get(`/v1/llm/chatbots${t?`?${t}`:""}`)}createLlmChatbot(e){return this.http.post("/v1/llm/chatbots",e)}getLlmChatbot(e){return this.http.get(`/v1/llm/chatbots/${e}`)}updateLlmChatbot(e,t){return this.http.patch(`/v1/llm/chatbots/${e}`,t)}deleteLlmChatbot(e){return this.http.delete(`/v1/llm/chatbots/${e}`)}llmChatbotChat(e,t){return this.http.post(`/v1/llm/chatbots/${e}/chat`,t)}llmChatbotChatStream(e,t){return this.http.post(`/v1/llm/chatbots/${e}/chat/stream`,t)}listLlmChatbotSessions(e,t={}){let s=l(t);return this.http.get(`/v1/llm/chatbots/${e}/sessions${s?`?${s}`:""}`)}deleteLlmChatbotSession(e,t){return this.http.delete(`/v1/llm/chatbots/${e}/sessions/${t}`)}listLlmProfiles(e={}){let t=l(e);return this.http.get(`/v1/llm/profiles${t?`?${t}`:""}`)}upsertLlmProfile(e){return this.http.post("/v1/llm/profiles",e)}deleteLlmProfile(e){return this.http.delete(`/v1/llm/profiles/${e}`)}}}function ce(r){return class extends r{ocrRecognize(e){return this.requestForm("POST","/v1/ocr/recognize",e)}ocrRecognizeAsync(e){return this.requestForm("POST","/v1/ocr/recognize/async",e)}ocrRecognizeByDocType(e,t){return this.requestForm("POST",`/v1/ocr/${encodeURIComponent(e)}`,t)}listOcrResults(e={}){let t=l(e);return this.http.get(`/v1/ocr/results${t?`?${t}`:""}`)}getOcrResult(e){return this.http.get(`/v1/ocr/results/${encodeURIComponent(e)}`)}getOcrResultText(e){return this.http.get(`/v1/ocr/results/${encodeURIComponent(e)}/text`)}deleteOcrResult(e){return this.http.delete(`/v1/ocr/results/${encodeURIComponent(e)}`)}getOcrQuota(){return this.http.get("/v1/ocr/quota")}}}function le(r){return class extends r{pgCreateOrder(e){return this.http.post("/v1/pg/orders",e)}pgGetOrder(e){return this.http.get(`/v1/pg/orders/${encodeURIComponent(e)}`)}pgConfirmPayment(e){return this.http.post("/v1/pg/confirm",e)}pgCancelPayment(e,t){return this.http.post(`/v1/pg/orders/${encodeURIComponent(e)}/cancel`,t)}pgSyncPaymentStatus(e,t){return this.http.post(`/v1/pg/orders/${encodeURIComponent(e)}/sync`,t)}pgWebhook(e){return this.http.post("/v1/pg/webhook",e,!1)}pgGetClientConfig(){return this.http.get("/v1/pg/config",!1)}}}function me(r){return class extends r{appPushSend(e){return this.http.post("/v1/push/send",e)}appPushBroadcast(e){return this.http.post("/v1/push/broadcast",e)}appPushStatus(e){return this.http.get(`/v1/push/status/${e}`)}appPushRegisterDevice(e){return this.http.post("/v1/push/device",e)}appPushUnregisterDevice(e){return this.http.delete(`/v1/push/device/${e}`)}}}function de(r){return class extends r{smsSend(e){return this.http.post("/v1/sms/send",e)}smsStatus(e){return this.http.get(`/v1/sms/status/${e}`,!1)}smsVerificationSend(e){return this.http.post("/v1/sms/verification/send",e,!1)}smsVerificationVerify(e){return this.http.post("/v1/sms/verification/verify",e,!1)}}}function he(r){return class extends r{taxinvoiceRegistIssue(e){return this.http.post("/v1/taxinvoice",e)}taxinvoiceRegister(e){return this.http.post("/v1/taxinvoice/register",e)}taxinvoiceIssue(e){return this.http.post(`/v1/taxinvoice/${e}/issue`,{})}taxinvoiceCancelIssue(e,t){return this.http.post(`/v1/taxinvoice/${e}/cancel`,t)}taxinvoiceGetState(e){return this.http.get(`/v1/taxinvoice/${e}/state`)}taxinvoiceGetDetail(e){return this.http.get(`/v1/taxinvoice/${e}`)}}}var O=class extends se(ie(de(me(le(he(ce(ue(ae(oe(te(re(ne(ee(Z(Y(P)))))))))))))))){};var ir=new P,or=new O;export{Y as AccountAppMixin,J as AdminMixin,K as AuthMixin,Z as BoardMixin,ee as EmailVerifyMixin,O as EntityAppServerApi,N as EntityMixin,P as EntityServerApi,V as FileMixin,te as OAuthMixin,Fe as PACKET_HKDF_SALT,De as PACKET_INFO_LABEL,I as PACKET_KEY_SIZE,G as PACKET_MAGIC_MIN,F as PACKET_MAGIC_RANGE,y as PACKET_NONCE_SIZE,Ge as PACKET_TAG_SIZE,ne as PasswordResetMixin,W as PushMixin,z as SmtpMixin,Q as TransactionMixin,re as TwoFactorMixin,X as UtilsMixin,Re as decryptPacket,be as derivePacketKey,ve as encryptPacket,or as entityAppServer,ir as entityServer,Ae as isAuthLoginSuccessResponse,we as packetMagicLenFromKey};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|