entity-client 1.0.20 → 1.0.22

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.
Files changed (72) hide show
  1. package/README.md +362 -362
  2. package/dist/EntityAppServerApi.d.ts +16 -16
  3. package/dist/EntityAppServerApi.js.map +1 -1
  4. package/dist/EntityServerApi.d.ts +8 -8
  5. package/dist/EntityServerApi.js.map +1 -1
  6. package/dist/client/base.d.ts +1 -2
  7. package/dist/client/base.js +1 -1
  8. package/dist/client/base.js.map +3 -3
  9. package/dist/client/hmac.js.map +1 -1
  10. package/dist/client/packet.js.map +1 -1
  11. package/dist/client/request.js.map +1 -1
  12. package/dist/client/utils.js.map +1 -1
  13. package/dist/hooks/useEntityAppServer.js.map +1 -1
  14. package/dist/hooks/useEntityClient.js.map +1 -1
  15. package/dist/hooks/useEntityServer.js.map +1 -1
  16. package/dist/index.js +1 -1
  17. package/dist/index.js.map +3 -3
  18. package/dist/mixins/app/index.js.map +1 -1
  19. package/dist/mixins/app/plugins/alimtalk.d.ts +1 -1
  20. package/dist/mixins/app/plugins/alimtalk.js.map +1 -1
  21. package/dist/mixins/app/plugins/friendtalk.d.ts +1 -1
  22. package/dist/mixins/app/plugins/friendtalk.js.map +1 -1
  23. package/dist/mixins/app/plugins/holidays.d.ts +1 -1
  24. package/dist/mixins/app/plugins/holidays.js.map +1 -1
  25. package/dist/mixins/app/plugins/identity.d.ts +1 -1
  26. package/dist/mixins/app/plugins/identity.js.map +1 -1
  27. package/dist/mixins/app/plugins/index.js.map +1 -1
  28. package/dist/mixins/app/plugins/llm.d.ts +1 -1
  29. package/dist/mixins/app/plugins/llm.js.map +1 -1
  30. package/dist/mixins/app/plugins/ocr.d.ts +1 -1
  31. package/dist/mixins/app/plugins/ocr.js.map +1 -1
  32. package/dist/mixins/app/plugins/pg.d.ts +1 -1
  33. package/dist/mixins/app/plugins/pg.js.map +1 -1
  34. package/dist/mixins/app/plugins/push.d.ts +1 -1
  35. package/dist/mixins/app/plugins/push.js.map +1 -1
  36. package/dist/mixins/app/plugins/sms.d.ts +1 -1
  37. package/dist/mixins/app/plugins/sms.js.map +1 -1
  38. package/dist/mixins/app/plugins/taxinvoice.d.ts +1 -1
  39. package/dist/mixins/app/plugins/taxinvoice.js.map +1 -1
  40. package/dist/mixins/app/routes/account.d.ts +1 -1
  41. package/dist/mixins/app/routes/account.js.map +1 -1
  42. package/dist/mixins/app/routes/board.d.ts +1 -1
  43. package/dist/mixins/app/routes/board.js.map +1 -1
  44. package/dist/mixins/app/routes/email-verify.d.ts +1 -1
  45. package/dist/mixins/app/routes/email-verify.js.map +1 -1
  46. package/dist/mixins/app/routes/oauth.d.ts +1 -1
  47. package/dist/mixins/app/routes/oauth.js.map +1 -1
  48. package/dist/mixins/app/routes/password-reset.d.ts +1 -1
  49. package/dist/mixins/app/routes/password-reset.js.map +1 -1
  50. package/dist/mixins/app/routes/two-factor.d.ts +1 -1
  51. package/dist/mixins/app/routes/two-factor.js.map +1 -1
  52. package/dist/mixins/server/admin.d.ts +1 -1
  53. package/dist/mixins/server/admin.js.map +1 -1
  54. package/dist/mixins/server/auth.d.ts +1 -1
  55. package/dist/mixins/server/auth.js.map +1 -1
  56. package/dist/mixins/server/entity.d.ts +1 -1
  57. package/dist/mixins/server/entity.js.map +1 -1
  58. package/dist/mixins/server/file.d.ts +1 -1
  59. package/dist/mixins/server/file.js.map +1 -1
  60. package/dist/mixins/server/index.js.map +1 -1
  61. package/dist/mixins/server/push.d.ts +1 -1
  62. package/dist/mixins/server/push.js.map +1 -1
  63. package/dist/mixins/server/smtp.d.ts +1 -1
  64. package/dist/mixins/server/smtp.js.map +1 -1
  65. package/dist/mixins/server/transaction.d.ts +1 -1
  66. package/dist/mixins/server/transaction.js.map +1 -1
  67. package/dist/mixins/server/utils.d.ts +1 -1
  68. package/dist/mixins/server/utils.js.map +1 -1
  69. package/dist/packet.js.map +1 -1
  70. package/dist/react.js +1 -1
  71. package/dist/react.js.map +3 -3
  72. package/package.json +57 -57
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/client/utils.ts", "../src/packet.ts", "../src/client/packet.ts", "../src/client/hmac.ts", "../src/client/request.ts", "../src/client/base.ts", "../src/mixins/server/auth.ts", "../src/mixins/server/entity.ts", "../src/mixins/server/file.ts", "../src/mixins/server/push.ts", "../src/mixins/server/smtp.ts", "../src/mixins/server/transaction.ts", "../src/mixins/server/utils.ts", "../src/mixins/server/admin.ts", "../src/EntityServerApi.ts", "../src/mixins/app/routes/account.ts", "../src/mixins/app/routes/board.ts", "../src/mixins/app/routes/email-verify.ts", "../src/mixins/app/routes/oauth.ts", "../src/mixins/app/routes/password-reset.ts", "../src/mixins/app/routes/two-factor.ts", "../src/mixins/app/plugins/alimtalk.ts", "../src/mixins/app/plugins/friendtalk.ts", "../src/mixins/app/plugins/holidays.ts", "../src/mixins/app/plugins/identity.ts", "../src/mixins/app/plugins/llm.ts", "../src/mixins/app/plugins/ocr.ts", "../src/mixins/app/plugins/pg.ts", "../src/mixins/app/plugins/push.ts", "../src/mixins/app/plugins/sms.ts", "../src/mixins/app/plugins/taxinvoice.ts", "../src/EntityAppServerApi.ts", "../src/index.ts"],
4
- "sourcesContent": ["/**\r\n * \uD658\uACBD\uBCC0\uC218\uB97C \uC77D\uC2B5\uB2C8\uB2E4.\r\n * - \uBE0C\uB77C\uC6B0\uC800/Vite: `import.meta.env`\r\n * - Node.js: `process.env`\r\n */\r\nexport function readEnv(name: string): string | undefined {\r\n // Vite / \uAE30\uD0C0 \uBC88\uB4E4\uB7EC (import.meta.env)\r\n const meta = import.meta as unknown as {\r\n env?: Record<string, string | undefined>;\r\n };\r\n if (meta?.env?.[name] != null) return meta.env[name];\r\n\r\n // Node.js (process.env)\r\n const _proc = (\r\n globalThis as { process?: { env?: Record<string, string | undefined> } }\r\n ).process;\r\n if (_proc?.env?.[name] != null) {\r\n return _proc.env[name];\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/** \uCFFC\uB9AC \uD30C\uB77C\uBBF8\uD130 \uAC1D\uCCB4\uB97C URL \uCFFC\uB9AC \uBB38\uC790\uC5F4\uB85C \uBCC0\uD658\uD569\uB2C8\uB2E4. `orderBy` \uD0A4\uB294 `order_by`\uB85C \uBCC0\uD658\uB429\uB2C8\uB2E4. */\r\nexport function buildQuery(params: Record<string, unknown>): string {\r\n return Object.entries(params)\r\n .filter(([, value]) => value != null)\r\n .map(\r\n ([key, value]) =>\r\n `${encodeURIComponent(key === \"orderBy\" ? \"order_by\" : key)}=${encodeURIComponent(String(value))}`,\r\n )\r\n .join(\"&\");\r\n}\r\n", "// @ts-ignore\r\nimport { xchacha20poly1305 } from \"@noble/ciphers/chacha\";\r\n// @ts-ignore\r\nimport { sha256 } from \"@noble/hashes/sha2\";\r\n// @ts-ignore\r\nimport { hkdf } from \"@noble/hashes/hkdf\";\r\n\r\nexport const PACKET_KEY_SIZE = 32;\r\nexport const PACKET_MAGIC_MIN = 2;\r\nexport const PACKET_MAGIC_RANGE = 14;\r\nexport const PACKET_NONCE_SIZE = 24;\r\nexport const PACKET_TAG_SIZE = 16;\r\nexport const PACKET_HKDF_SALT = \"entity-server:hkdf:v1\";\r\nexport const PACKET_INFO_LABEL = \"entity-server:packet-encryption\";\r\n\r\nfunction toUint8Array(data: ArrayBuffer | Uint8Array): Uint8Array {\r\n return data instanceof Uint8Array ? data : new Uint8Array(data);\r\n}\r\n\r\nexport function derivePacketKey(\r\n source: string,\r\n infoLabel = PACKET_INFO_LABEL,\r\n): Uint8Array {\r\n return hkdf(\r\n sha256,\r\n new TextEncoder().encode(source),\r\n new TextEncoder().encode(PACKET_HKDF_SALT),\r\n new TextEncoder().encode(infoLabel),\r\n PACKET_KEY_SIZE,\r\n );\r\n}\r\n\r\nexport function packetMagicLenFromKey(\r\n key: ArrayBuffer | Uint8Array,\r\n magicMin = PACKET_MAGIC_MIN,\r\n magicRange = PACKET_MAGIC_RANGE,\r\n): number {\r\n const keyBytes = toUint8Array(key);\r\n if (keyBytes.length < PACKET_KEY_SIZE) return magicMin;\r\n return magicMin + (keyBytes[PACKET_KEY_SIZE - 1]! % magicRange);\r\n}\r\n\r\nexport function encryptPacket(\r\n plaintext: ArrayBuffer | Uint8Array,\r\n key: ArrayBuffer | Uint8Array,\r\n magicMin = PACKET_MAGIC_MIN,\r\n magicRange = PACKET_MAGIC_RANGE,\r\n): Uint8Array {\r\n const plaintextBytes = toUint8Array(plaintext);\r\n const keyBytes = toUint8Array(key);\r\n const magicLen = packetMagicLenFromKey(keyBytes, magicMin, magicRange);\r\n const magic = crypto.getRandomValues(new Uint8Array(magicLen));\r\n const nonce = crypto.getRandomValues(new Uint8Array(PACKET_NONCE_SIZE));\r\n const cipher = xchacha20poly1305(keyBytes, nonce);\r\n const ciphertext = cipher.encrypt(plaintextBytes);\r\n const result = new Uint8Array(\r\n magicLen + PACKET_NONCE_SIZE + ciphertext.length,\r\n );\r\n\r\n result.set(magic, 0);\r\n result.set(nonce, magicLen);\r\n result.set(ciphertext, magicLen + PACKET_NONCE_SIZE);\r\n return result;\r\n}\r\n\r\nexport function decryptPacket(\r\n buffer: ArrayBuffer | Uint8Array,\r\n key: ArrayBuffer | Uint8Array,\r\n magicMin = PACKET_MAGIC_MIN,\r\n magicRange = PACKET_MAGIC_RANGE,\r\n): Uint8Array {\r\n const data = toUint8Array(buffer);\r\n const keyBytes = toUint8Array(key);\r\n const magicLen = packetMagicLenFromKey(keyBytes, magicMin, magicRange);\r\n\r\n if (data.length < magicLen + PACKET_NONCE_SIZE + PACKET_TAG_SIZE) {\r\n throw new Error(\"Encrypted packet too short\");\r\n }\r\n\r\n const nonce = data.slice(magicLen, magicLen + PACKET_NONCE_SIZE);\r\n const ciphertext = data.slice(magicLen + PACKET_NONCE_SIZE);\r\n const cipher = xchacha20poly1305(keyBytes, nonce);\r\n return cipher.decrypt(ciphertext);\r\n}\r\n", "import {\r\n derivePacketKey as derivePacketKeyCore,\r\n encryptPacket as encryptPacketCore,\r\n decryptPacket as decryptPacketCore,\r\n} from \"../packet.js\";\r\n\r\n/**\r\n * \uD328\uD0B7 \uC554\uD638\uD654 \uD0A4\uB97C \uC720\uB3C4\uD569\uB2C8\uB2E4.\r\n * - HMAC \uBAA8\uB4DC (`hmacSecret` \uC720\uD6A8 \uC2DC): HKDF-SHA256(hmac_secret, \"entity-server:packet-encryption\")\r\n * - JWT \uBAA8\uB4DC: HKDF-SHA256(jwt_token, \"entity-server:packet-encryption\")\r\n */\r\nexport function derivePacketKey(hmacSecret: string, token: string): Uint8Array {\r\n return derivePacketKeyCore(hmacSecret || token);\r\n}\r\n\r\n/**\r\n * \uD3C9\uBB38 \uBC14\uC774\uD2B8\uB97C XChaCha20-Poly1305\uB85C \uC554\uD638\uD654\uD569\uB2C8\uB2E4.\r\n * \uD3EC\uB9F7: [random_magic:K][random_nonce:24][ciphertext+tag]\r\n * K = 2 + key[31] % 14 (\uD328\uD0B7 \uD0A4\uC5D0\uC11C \uC790\uB3D9 \uD30C\uC0DD)\r\n */\r\nexport function encryptPacket(\r\n plaintext: Uint8Array,\r\n key: Uint8Array,\r\n): Uint8Array {\r\n return encryptPacketCore(plaintext, key);\r\n}\r\n\r\n/**\r\n * XChaCha20-Poly1305 \uD328\uD0B7\uC744 \uBCF5\uD638\uD654\uD574 JSON \uAC1D\uCCB4\uB85C \uBCC0\uD658\uD569\uB2C8\uB2E4.\r\n * \uD3EC\uB9F7: [magic:K][nonce:24][ciphertext+tag]\r\n * K = 2 + key[31] % 14 (\uD328\uD0B7 \uD0A4\uC5D0\uC11C \uC790\uB3D9 \uD30C\uC0DD)\r\n */\r\nexport function decryptPacket<T>(buffer: ArrayBuffer, key: Uint8Array): T {\r\n const plaintext = decryptPacketCore(buffer, key);\r\n return JSON.parse(new TextDecoder().decode(plaintext)) as T;\r\n}\r\n\r\n/**\r\n * \uC694\uCCAD \uBC14\uB514\uB97C \uD30C\uC2F1\uD569\uB2C8\uB2E4. `application/octet-stream`\uC774\uBA74 \uBCF5\uD638\uD654, \uADF8 \uC678\uB294 JSON \uD30C\uC2F1\uD569\uB2C8\uB2E4.\r\n *\r\n * @param requireEncrypted `true`\uC774\uBA74 \uC554\uD638\uD654\uB41C \uC694\uCCAD\uB9CC \uD5C8\uC6A9\uD569\uB2C8\uB2E4.\r\n */\r\nexport function parseRequestBody<T>(\r\n body: ArrayBuffer | Uint8Array | string | T | null | undefined,\r\n contentType: string,\r\n requireEncrypted: boolean,\r\n key: Uint8Array,\r\n): T {\r\n const isEncrypted = contentType\r\n .toLowerCase()\r\n .includes(\"application/octet-stream\");\r\n\r\n if (requireEncrypted && !isEncrypted) {\r\n throw new Error(\r\n \"Encrypted request required: Content-Type must be application/octet-stream\",\r\n );\r\n }\r\n\r\n if (isEncrypted) {\r\n if (body == null) throw new Error(\"Encrypted request body is empty\");\r\n if (body instanceof ArrayBuffer) return decryptPacket<T>(body, key);\r\n if (body instanceof Uint8Array) {\r\n const sliced = body.buffer.slice(\r\n body.byteOffset,\r\n body.byteOffset + body.byteLength,\r\n );\r\n return decryptPacket<T>(sliced as ArrayBuffer, key);\r\n }\r\n throw new Error(\r\n \"Encrypted request body must be ArrayBuffer or Uint8Array\",\r\n );\r\n }\r\n\r\n if (body == null || body === \"\") return {} as T;\r\n if (typeof body === \"string\") return JSON.parse(body) as T;\r\n return body as T;\r\n}\r\n", "// @ts-ignore\r\nimport { sha256 } from \"@noble/hashes/sha2\";\r\n// @ts-ignore\r\nimport { hmac } from \"@noble/hashes/hmac\";\r\n\r\n/**\r\n * HMAC-SHA256 \uC11C\uBA85 \uD5E4\uB354\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4.\r\n *\r\n * \uC11C\uBA85 \uB300\uC0C1: `METHOD|PATH|TIMESTAMP|NONCE|BODY`\r\n *\r\n * @returns `X-API-Key`, `X-Timestamp`, `X-Nonce`, `X-Signature` \uD5E4\uB354 \uAC1D\uCCB4\r\n */\r\nexport function buildHmacHeaders(\r\n method: string,\r\n path: string,\r\n bodyBytes: Uint8Array,\r\n apiKey: string,\r\n hmacSecret: string,\r\n): Record<string, string> {\r\n const timestamp = String(Math.floor(Date.now() / 1000));\r\n const nonce = crypto.randomUUID();\r\n\r\n const prefix = new TextEncoder().encode(\r\n `${method}|${path}|${timestamp}|${nonce}|`,\r\n );\r\n const payload = new Uint8Array(prefix.length + bodyBytes.length);\r\n payload.set(prefix, 0);\r\n payload.set(bodyBytes, prefix.length);\r\n\r\n const sig = hmac(sha256, new TextEncoder().encode(hmacSecret), payload);\r\n const signature = [...sig]\r\n .map((b) => b.toString(16).padStart(2, \"0\"))\r\n .join(\"\");\r\n\r\n return {\r\n \"X-API-Key\": apiKey,\r\n \"X-Timestamp\": timestamp,\r\n \"X-Nonce\": nonce,\r\n \"X-Signature\": signature,\r\n };\r\n}\r\n", "import { derivePacketKey, encryptPacket, decryptPacket } from \"./packet.js\";\r\nimport { buildHmacHeaders } from \"./hmac.js\";\r\n\r\nexport interface RequestOptions {\r\n baseUrl: string;\r\n token: string;\r\n anonymousPacketToken: string;\r\n apiKey: string;\r\n hmacSecret: string;\r\n encryptRequests: boolean;\r\n csrfEnabled: boolean;\r\n csrfHeaderName: string;\r\n csrfCookieName: string;\r\n refreshCsrfCookie: (() => Promise<void>) | null;\r\n onAccessToken?: (token: string) => void;\r\n}\r\n\r\nexport interface EntityRequestConfig {\r\n requireOkShape?: boolean;\r\n allowStatuses?: number[];\r\n signal?: AbortSignal;\r\n}\r\n\r\nfunction resolvePacketSource(opts: RequestOptions): string {\r\n return opts.hmacSecret || opts.token || opts.anonymousPacketToken;\r\n}\r\n\r\nfunction resolveResponsePacketSource(\r\n opts: RequestOptions,\r\n withAuth: boolean,\r\n anonymousPacketToken: string,\r\n): string {\r\n if (opts.hmacSecret) {\r\n return opts.hmacSecret;\r\n }\r\n\r\n if (!withAuth) {\r\n return anonymousPacketToken;\r\n }\r\n\r\n return opts.token || anonymousPacketToken;\r\n}\r\n\r\nfunction maskPacketSource(value: string): string {\r\n if (!value) {\r\n return \"\";\r\n }\r\n\r\n if (value.length <= 8) {\r\n return `${value.slice(0, 2)}...${value.slice(-2)}`;\r\n }\r\n\r\n return `${value.slice(0, 4)}...${value.slice(-4)}`;\r\n}\r\n\r\nfunction logPacketDecryptError(details: {\r\n method: string;\r\n path: string;\r\n withAuth: boolean;\r\n status: number;\r\n contentType: string;\r\n responsePacketSource: string;\r\n tokenPresent: boolean;\r\n anonymousPacketTokenPresent: boolean;\r\n hmacEnabled: boolean;\r\n error: unknown;\r\n}): void {\r\n if (typeof console === \"undefined\" || typeof console.error !== \"function\") {\r\n return;\r\n }\r\n\r\n console.error(\"[entity-client] packet decrypt failed\", {\r\n method: details.method,\r\n path: details.path,\r\n withAuth: details.withAuth,\r\n status: details.status,\r\n contentType: details.contentType,\r\n responsePacketSource: maskPacketSource(details.responsePacketSource),\r\n tokenPresent: details.tokenPresent,\r\n anonymousPacketTokenPresent: details.anonymousPacketTokenPresent,\r\n hmacEnabled: details.hmacEnabled,\r\n error:\r\n details.error instanceof Error\r\n ? {\r\n name: details.error.name,\r\n message: details.error.message,\r\n stack: details.error.stack,\r\n }\r\n : details.error,\r\n });\r\n}\r\n\r\nfunction requiresCsrf(method: string): boolean {\r\n return method !== \"GET\" && method !== \"HEAD\" && method !== \"OPTIONS\";\r\n}\r\n\r\nfunction readCsrfCookie(name: string): string {\r\n if (typeof document === \"undefined\") return \"\";\r\n for (const chunk of document.cookie.split(\";\")) {\r\n const idx = chunk.indexOf(\"=\");\r\n if (idx < 0) continue;\r\n if (chunk.substring(0, idx).trim() === name) {\r\n return decodeURIComponent(chunk.substring(idx + 1).trim());\r\n }\r\n }\r\n return \"\";\r\n}\r\n\r\nfunction isCsrfError(status: number, message: string): boolean {\r\n if (status === 403 && /csrf/i.test(message)) {\r\n return true;\r\n }\r\n\r\n return (\r\n /csrf/i.test(message) &&\r\n /expired|token validation failed/i.test(message)\r\n );\r\n}\r\n\r\nasync function readErrorMessage(res: Response): Promise<string> {\r\n const contentType = res.headers.get(\"Content-Type\") ?? \"\";\r\n if (contentType.includes(\"application/json\")) {\r\n const data = (await res.json().catch(() => null)) as {\r\n error?: string;\r\n message?: string;\r\n } | null;\r\n if (data?.error) return data.error;\r\n if (data?.message) return data.message;\r\n }\r\n\r\n const text = await res.text().catch(() => \"\");\r\n return text || `HTTP ${res.status}`;\r\n}\r\n\r\n/**\r\n * Entity Server\uC5D0 HTTP \uC694\uCCAD\uC744 \uBCF4\uB0C5\uB2C8\uB2E4.\r\n *\r\n * - `encryptRequests` \uD65C\uC131\uD654 \uC2DC \uC778\uC99D\uB41C POST \uBC14\uB514\uB97C \uC790\uB3D9 \uC554\uD638\uD654\uD569\uB2C8\uB2E4.\r\n * - \uC751\uB2F5\uC774 `application/octet-stream`\uC774\uBA74 \uC790\uB3D9 \uBCF5\uD638\uD654\uD569\uB2C8\uB2E4.\r\n * - JSON \uC751\uB2F5\uC758 `ok`\uAC00 false\uC774\uBA74 \uC5D0\uB7EC\uB97C \uB358\uC9D1\uB2C8\uB2E4.\r\n */\r\nexport async function entityRequest<T>(\r\n opts: RequestOptions,\r\n method: string,\r\n path: string,\r\n body?: unknown,\r\n withAuth = true,\r\n extraHeaders: Record<string, string> = {},\r\n config: boolean | EntityRequestConfig = true,\r\n): Promise<T> {\r\n const requestConfig: EntityRequestConfig =\r\n typeof config === \"boolean\" ? { requireOkShape: config } : config;\r\n const requireOkShape = requestConfig.requireOkShape ?? true;\r\n const allowStatuses = new Set(requestConfig.allowStatuses ?? []);\r\n const signal = requestConfig.signal;\r\n\r\n const {\r\n baseUrl,\r\n token,\r\n apiKey,\r\n hmacSecret,\r\n encryptRequests,\r\n csrfEnabled,\r\n csrfHeaderName,\r\n csrfCookieName,\r\n refreshCsrfCookie,\r\n onAccessToken,\r\n } = opts;\r\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\r\n const anonymousPacketToken =\r\n opts.anonymousPacketToken || readCsrfCookie(\"anon_token\");\r\n const isHmacMode = withAuth && !!(apiKey && hmacSecret);\r\n const packetSource = resolvePacketSource(opts);\r\n const responsePacketSource = resolveResponsePacketSource(\r\n opts,\r\n withAuth,\r\n anonymousPacketToken,\r\n );\r\n const shouldUseCsrf = csrfEnabled && requiresCsrf(method) && !isHmacMode;\r\n let csrfToken = shouldUseCsrf ? readCsrfCookie(csrfCookieName) : \"\";\r\n let requestContentType = \"application/json\";\r\n const includeAnonymousPacketHeader = !isHmacMode && !!anonymousPacketToken;\r\n\r\n let fetchBody: string | Uint8Array | null = null;\r\n if (body != null) {\r\n const shouldEncrypt =\r\n encryptRequests &&\r\n !!packetSource &&\r\n withAuth &&\r\n method !== \"GET\" &&\r\n method !== \"HEAD\";\r\n\r\n if (shouldEncrypt) {\r\n const key = derivePacketKey(\r\n hmacSecret,\r\n token || anonymousPacketToken,\r\n );\r\n fetchBody = encryptPacket(\r\n new TextEncoder().encode(JSON.stringify(body)),\r\n key,\r\n );\r\n requestContentType = \"application/octet-stream\";\r\n } else {\r\n fetchBody = JSON.stringify(body);\r\n }\r\n }\r\n\r\n const buildHeaders = (\r\n resolvedCsrfToken: string,\r\n ): Record<string, string> => {\r\n const headers: Record<string, string> = { ...extraHeaders };\r\n const hasExplicitContentType = Object.keys(headers).some(\r\n (key) => key.toLowerCase() === \"content-type\",\r\n );\r\n if (fetchBody != null && !hasExplicitContentType) {\r\n headers[\"Content-Type\"] = requestContentType;\r\n }\r\n if (!isHmacMode && withAuth && token) {\r\n headers.Authorization = `Bearer ${token}`;\r\n }\r\n if (includeAnonymousPacketHeader) {\r\n headers[\"X-Packet-Token\"] = anonymousPacketToken;\r\n }\r\n if (shouldUseCsrf && resolvedCsrfToken) {\r\n headers[csrfHeaderName] = resolvedCsrfToken;\r\n }\r\n if (isHmacMode) {\r\n const bodyBytes =\r\n fetchBody instanceof Uint8Array\r\n ? fetchBody\r\n : typeof fetchBody === \"string\"\r\n ? new TextEncoder().encode(fetchBody)\r\n : new Uint8Array(0);\r\n Object.assign(\r\n headers,\r\n buildHmacHeaders(method, path, bodyBytes, apiKey, hmacSecret),\r\n );\r\n }\r\n return headers;\r\n };\r\n\r\n if (shouldUseCsrf && !csrfToken && refreshCsrfCookie) {\r\n await refreshCsrfCookie();\r\n csrfToken = readCsrfCookie(csrfCookieName);\r\n }\r\n\r\n const executeRequest = (resolvedCsrfToken: string): Promise<Response> =>\r\n fetch(baseUrl + path, {\r\n method,\r\n headers: buildHeaders(resolvedCsrfToken),\r\n ...(fetchBody != null\r\n ? { body: fetchBody as RequestInit[\"body\"] }\r\n : {}),\r\n credentials: \"include\",\r\n signal,\r\n });\r\n\r\n let res = await executeRequest(csrfToken);\r\n\r\n if (!res.ok) {\r\n const message = await readErrorMessage(res.clone());\r\n if (\r\n shouldUseCsrf &&\r\n refreshCsrfCookie &&\r\n isCsrfError(res.status, message)\r\n ) {\r\n await refreshCsrfCookie();\r\n csrfToken = readCsrfCookie(csrfCookieName);\r\n res = await executeRequest(csrfToken);\r\n } else if (!allowStatuses.has(res.status)) {\r\n const err = new Error(message);\r\n (err as { status?: number }).status = res.status;\r\n throw err;\r\n } else {\r\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.\r\n }\r\n }\r\n\r\n if (!res.ok && !allowStatuses.has(res.status)) {\r\n const err = new Error(await readErrorMessage(res));\r\n (err as { status?: number }).status = res.status;\r\n throw err;\r\n }\r\n\r\n const accessTokenHeader = res.headers.get(\"X-Access-Token\")?.trim() ?? \"\";\r\n\r\n const contentType = res.headers.get(\"Content-Type\") ?? \"\";\r\n if (contentType.includes(\"application/octet-stream\")) {\r\n const key = derivePacketKey(hmacSecret, responsePacketSource);\r\n const encryptedBody = await res.arrayBuffer();\r\n let decrypted: T;\r\n\r\n try {\r\n decrypted = decryptPacket<T>(encryptedBody, key);\r\n } catch (error) {\r\n logPacketDecryptError({\r\n method,\r\n path,\r\n withAuth,\r\n status: res.status,\r\n contentType,\r\n responsePacketSource,\r\n tokenPresent: !!token,\r\n anonymousPacketTokenPresent: !!anonymousPacketToken,\r\n hmacEnabled: !!hmacSecret,\r\n error,\r\n });\r\n throw error;\r\n }\r\n\r\n if (accessTokenHeader) {\r\n onAccessToken?.(accessTokenHeader);\r\n }\r\n return decrypted;\r\n }\r\n\r\n if (accessTokenHeader) {\r\n onAccessToken?.(accessTokenHeader);\r\n }\r\n\r\n if (!contentType.includes(\"application/json\")) {\r\n return (await res.text()) as T;\r\n }\r\n\r\n const data = (await res.json()) as { ok?: boolean; message?: string };\r\n if (requireOkShape && !data.ok && !allowStatuses.has(res.status)) {\r\n const err = new Error(\r\n data.message ?? `EntityServer error (HTTP ${res.status})`,\r\n );\r\n (err as { status?: number }).status = res.status;\r\n throw err;\r\n }\r\n\r\n return data as T;\r\n}\r\n", "import type {\r\n EntityServerClientOptions,\r\n RealtimeClientOptions,\r\n RealtimeConnectionStatus,\r\n RealtimeEnvelope,\r\n RealtimeMessageListener,\r\n RealtimeStatusListener,\r\n} from \"../types.js\";\r\nimport { readEnv } from \"./utils.js\";\r\nimport { derivePacketKey, parseRequestBody } from \"./packet.js\";\r\nimport {\r\n entityRequest,\r\n type EntityRequestConfig,\r\n type RequestOptions,\r\n} from \"./request.js\";\r\n\r\nconst REALTIME_DEFAULT_PATH = \"/v1/realtime\";\r\n\r\n// mixin \uD5EC\uD37C \uD0C0\uC785\r\nexport type GConstructor<T = object> = new (...args: any[]) => T;\r\n\r\nexport class EntityServerClientBase {\r\n baseUrl: string;\r\n token: string;\r\n anonymousPacketToken: string;\r\n apiKey: string;\r\n hmacSecret: string;\r\n encryptRequests: boolean;\r\n csrfEnabled: boolean;\r\n csrfHeaderName: string;\r\n csrfCookieName: string;\r\n /** @internal health \uC7AC\uD638\uCD9C\uB85C CSRF \uCFE0\uD0A4 \uAC31\uC2E0 (AuthMixin\uC5D0\uC11C \uC124\uC815) */\r\n csrfRefresher: (() => Promise<void>) | null = null;\r\n activeTxId: string | null = null;\r\n\r\n // \uC138\uC158 \uC720\uC9C0 \uAD00\uB828\r\n keepSession: boolean;\r\n refreshBuffer: number;\r\n onTokenRefreshed?: (accessToken: string, expiresIn: number) => void;\r\n onSessionExpired?: (error: Error) => void;\r\n onHealthChange?: (online: boolean) => void;\r\n sessionRefreshToken: string | null = null;\r\n refreshTimer: ReturnType<typeof setTimeout> | null = null;\r\n healthTickTimer: ReturnType<typeof setInterval> | null = null;\r\n healthTickPromise: Promise<unknown> | null = null;\r\n realtimeEnabled: boolean;\r\n realtimePath: string;\r\n realtimeAutoConnect: boolean;\r\n realtimeAutoReconnect: boolean;\r\n realtimeReconnectDelayMs: number;\r\n realtimeStatus: RealtimeConnectionStatus;\r\n realtimeSocket: WebSocket | null = null;\r\n realtimeConnectPromise: Promise<void> | null = null;\r\n realtimeReconnectTimer: ReturnType<typeof setTimeout> | null = null;\r\n realtimeShouldReconnect = false;\r\n realtimeMessageListeners = new Set<RealtimeMessageListener>();\r\n realtimeStatusListeners = new Set<RealtimeStatusListener>();\r\n realtimeEventListeners = new Map<string, Set<RealtimeMessageListener>>();\r\n // \u2500\u2500\u2500 \uCD08\uAE30\uD654 & \uC124\uC815 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /**\r\n * EntityServerClient \uC778\uC2A4\uD134\uC2A4\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4.\r\n *\r\n * \uAE30\uBCF8\uAC12:\r\n * - `baseUrl`: `VITE_ENTITY_SERVER_URL` \uB610\uB294 \uC0C1\uB300 \uACBD\uB85C(`\"\"`)\r\n */\r\n constructor(options: EntityServerClientOptions = {}) {\r\n const envBaseUrl = readEnv(\"VITE_ENTITY_SERVER_URL\");\r\n\r\n this.baseUrl = (options.baseUrl ?? envBaseUrl ?? \"\").replace(/\\/$/, \"\");\r\n this.token = options.token ?? \"\";\r\n this.anonymousPacketToken = options.anonymousPacketToken ?? \"\";\r\n this.apiKey = options.apiKey ?? \"\";\r\n this.hmacSecret = options.hmacSecret ?? \"\";\r\n this.encryptRequests = options.encryptRequests ?? false;\r\n this.csrfEnabled = options.csrfEnabled ?? false;\r\n this.csrfHeaderName = options.csrfHeaderName ?? \"x-csrf-token\";\r\n this.csrfCookieName = options.csrfCookieName ?? \"_csrf\";\r\n this.keepSession = options.keepSession ?? false;\r\n this.refreshBuffer = options.refreshBuffer ?? 60;\r\n this.onTokenRefreshed = options.onTokenRefreshed;\r\n this.onSessionExpired = options.onSessionExpired;\r\n this.onHealthChange = options.onHealthChange;\r\n this.realtimeEnabled = false;\r\n this.realtimePath = REALTIME_DEFAULT_PATH;\r\n this.realtimeAutoConnect = true;\r\n this.realtimeAutoReconnect = true;\r\n this.realtimeReconnectDelayMs = 3000;\r\n this.realtimeStatus = \"idle\";\r\n this.applyRealtimeOptions(options.realtime);\r\n if (\r\n typeof options.healthTickInterval === \"number\" &&\r\n options.healthTickInterval > 0\r\n ) {\r\n // csrfRefresher\uB294 AuthMixin\uC5D0\uC11C \uC124\uC815\uB418\uBBC0\uB85C \uB2E4\uC74C tick\uC5D0 \uC2DC\uC791\r\n Promise.resolve().then(() =>\r\n this.startHealthTick(options.healthTickInterval, false),\r\n );\r\n }\r\n }\r\n\r\n /** baseUrl, token, encryptRequests \uAC12\uC744 \uB7F0\uD0C0\uC784\uC5D0 \uAC31\uC2E0\uD569\uB2C8\uB2E4. */\r\n configure(options: Partial<EntityServerClientOptions>): void {\r\n if (typeof options.baseUrl === \"string\") {\r\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\r\n }\r\n if (typeof options.token === \"string\") this.token = options.token;\r\n if (typeof options.anonymousPacketToken === \"string\") {\r\n this.anonymousPacketToken = options.anonymousPacketToken;\r\n }\r\n if (typeof options.encryptRequests === \"boolean\")\r\n this.encryptRequests = options.encryptRequests;\r\n if (typeof options.csrfEnabled === \"boolean\") {\r\n this.csrfEnabled = options.csrfEnabled;\r\n }\r\n if (typeof options.csrfHeaderName === \"string\") {\r\n this.csrfHeaderName = options.csrfHeaderName;\r\n }\r\n if (typeof options.csrfCookieName === \"string\") {\r\n this.csrfCookieName = options.csrfCookieName;\r\n }\r\n if (typeof options.apiKey === \"string\") this.apiKey = options.apiKey;\r\n if (typeof options.hmacSecret === \"string\")\r\n this.hmacSecret = options.hmacSecret;\r\n if (typeof options.keepSession === \"boolean\")\r\n this.keepSession = options.keepSession;\r\n if (typeof options.refreshBuffer === \"number\")\r\n this.refreshBuffer = options.refreshBuffer;\r\n if (options.onTokenRefreshed)\r\n this.onTokenRefreshed = options.onTokenRefreshed;\r\n if (options.onSessionExpired)\r\n this.onSessionExpired = options.onSessionExpired;\r\n if (options.onHealthChange)\r\n this.onHealthChange = options.onHealthChange;\r\n if (typeof options.realtime !== \"undefined\") {\r\n this.applyRealtimeOptions(options.realtime);\r\n }\r\n if (\r\n typeof options.healthTickInterval === \"number\" &&\r\n options.healthTickInterval > 0\r\n ) {\r\n Promise.resolve().then(() =>\r\n this.startHealthTick(options.healthTickInterval, false),\r\n );\r\n }\r\n }\r\n\r\n /** \uC778\uC99D \uC694\uCCAD\uC5D0 \uC0AC\uC6A9\uD560 JWT Access Token\uC744 \uC124\uC815\uD569\uB2C8\uB2E4. */\r\n setToken(token: string): void {\r\n this.token = token;\r\n if (!token) {\r\n this.disconnectRealtime(\"token_cleared\");\r\n return;\r\n }\r\n if (this.realtimeEnabled && this.realtimeAutoConnect) {\r\n void this.connectRealtime().catch(() => {});\r\n }\r\n }\r\n\r\n /** \uC775\uBA85 \uD328\uD0B7 \uC554\uD638\uD654\uC6A9 \uD1A0\uD070\uC744 \uC124\uC815\uD569\uB2C8\uB2E4. */\r\n setAnonymousPacketToken(token: string): void {\r\n this.anonymousPacketToken = token;\r\n }\r\n\r\n /** HMAC \uC778\uC99D\uC6A9 API Key\uB97C \uC124\uC815\uD569\uB2C8\uB2E4. */\r\n setApiKey(apiKey: string): void {\r\n this.apiKey = apiKey;\r\n }\r\n\r\n /** HMAC \uC778\uC99D\uC6A9 \uC2DC\uD06C\uB9BF\uC744 \uC124\uC815\uD569\uB2C8\uB2E4. */\r\n setHmacSecret(secret: string): void {\r\n this.hmacSecret = secret;\r\n }\r\n\r\n /** \uC554\uD638\uD654 \uC694\uCCAD \uD65C\uC131\uD654 \uC5EC\uBD80\uB97C \uC124\uC815\uD569\uB2C8\uB2E4. */\r\n setEncryptRequests(value: boolean): void {\r\n this.encryptRequests = value;\r\n }\r\n\r\n setCsrfEnabled(enabled: boolean): void {\r\n this.csrfEnabled = enabled;\r\n }\r\n\r\n addRealtimeListener(listener: RealtimeMessageListener): void {\r\n this.realtimeMessageListeners.add(listener);\r\n }\r\n\r\n removeRealtimeListener(listener: RealtimeMessageListener): void {\r\n this.realtimeMessageListeners.delete(listener);\r\n }\r\n\r\n addRealtimeStatusListener(listener: RealtimeStatusListener): void {\r\n this.realtimeStatusListeners.add(listener);\r\n }\r\n\r\n removeRealtimeStatusListener(listener: RealtimeStatusListener): void {\r\n this.realtimeStatusListeners.delete(listener);\r\n }\r\n\r\n addRealtimeEventListener(\r\n eventName: string,\r\n listener: RealtimeMessageListener,\r\n ): void {\r\n const key = String(eventName).trim();\r\n if (!key) {\r\n return;\r\n }\r\n if (!this.realtimeEventListeners.has(key)) {\r\n this.realtimeEventListeners.set(key, new Set());\r\n }\r\n this.realtimeEventListeners.get(key)!.add(listener);\r\n }\r\n\r\n removeRealtimeEventListener(\r\n eventName: string,\r\n listener: RealtimeMessageListener,\r\n ): void {\r\n const key = String(eventName).trim();\r\n if (!key) {\r\n return;\r\n }\r\n const listeners = this.realtimeEventListeners.get(key);\r\n if (!listeners) {\r\n return;\r\n }\r\n listeners.delete(listener);\r\n if (listeners.size === 0) {\r\n this.realtimeEventListeners.delete(key);\r\n }\r\n }\r\n\r\n async connectRealtime(): Promise<void> {\r\n if (!this.realtimeEnabled) {\r\n this.setRealtimeStatus(\"disabled\", \"realtime_disabled\");\r\n return;\r\n }\r\n\r\n if (!this.token) {\r\n throw new Error(\r\n \"Cannot open realtime connection without access token.\",\r\n );\r\n }\r\n\r\n if (typeof WebSocket === \"undefined\") {\r\n throw new Error(\"WebSocket is not available in this environment.\");\r\n }\r\n\r\n if (\r\n this.realtimeSocket &&\r\n this.realtimeSocket.readyState === WebSocket.OPEN\r\n ) {\r\n return;\r\n }\r\n\r\n if (\r\n this.realtimeSocket &&\r\n this.realtimeSocket.readyState === WebSocket.CONNECTING &&\r\n this.realtimeConnectPromise\r\n ) {\r\n return this.realtimeConnectPromise;\r\n }\r\n\r\n this.clearRealtimeReconnectTimer();\r\n this.realtimeShouldReconnect = this.realtimeAutoReconnect;\r\n this.setRealtimeStatus(\"connecting\", \"connect_requested\");\r\n\r\n const socket = new WebSocket(this.buildRealtimeUrl());\r\n this.realtimeSocket = socket;\r\n\r\n this.realtimeConnectPromise = new Promise<void>((resolve, reject) => {\r\n let settled = false;\r\n\r\n const finalizeResolve = () => {\r\n if (settled) {\r\n return;\r\n }\r\n settled = true;\r\n this.realtimeConnectPromise = null;\r\n resolve();\r\n };\r\n\r\n const finalizeReject = (error: Error) => {\r\n if (settled) {\r\n return;\r\n }\r\n settled = true;\r\n this.realtimeConnectPromise = null;\r\n reject(error);\r\n };\r\n\r\n socket.addEventListener(\"open\", () => {\r\n this.setRealtimeStatus(\"open\", \"socket_open\");\r\n finalizeResolve();\r\n });\r\n\r\n socket.addEventListener(\"message\", (event) => {\r\n this.handleRealtimeMessage(event.data);\r\n });\r\n\r\n socket.addEventListener(\"error\", () => {\r\n this.setRealtimeStatus(\r\n \"closed\",\r\n \"socket_error\",\r\n new Error(\"Realtime socket error.\"),\r\n );\r\n });\r\n\r\n socket.addEventListener(\"close\", (event) => {\r\n if (this.realtimeSocket === socket) {\r\n this.realtimeSocket = null;\r\n }\r\n\r\n const reason = event.reason || \"socket_closed\";\r\n const error = new Error(\r\n `Realtime socket closed (${event.code}${event.reason ? `: ${event.reason}` : \"\"}).`,\r\n );\r\n\r\n this.setRealtimeStatus(\"closed\", reason, error);\r\n if (!settled) {\r\n finalizeReject(error);\r\n }\r\n\r\n if (\r\n this.realtimeShouldReconnect &&\r\n this.realtimeEnabled &&\r\n this.realtimeAutoReconnect &&\r\n this.token\r\n ) {\r\n this.scheduleRealtimeReconnect(reason);\r\n }\r\n });\r\n });\r\n\r\n return this.realtimeConnectPromise;\r\n }\r\n\r\n disconnectRealtime(reason = \"client_disconnect\"): void {\r\n this.realtimeShouldReconnect = false;\r\n this.clearRealtimeReconnectTimer();\r\n\r\n if (this.realtimeSocket) {\r\n const socket = this.realtimeSocket;\r\n this.realtimeSocket = null;\r\n try {\r\n if (\r\n socket.readyState === WebSocket.OPEN ||\r\n socket.readyState === WebSocket.CONNECTING\r\n ) {\r\n socket.close(1000, reason);\r\n }\r\n } catch {\r\n // ignore close errors\r\n }\r\n }\r\n\r\n this.realtimeConnectPromise = null;\r\n this.setRealtimeStatus(\r\n this.realtimeEnabled ? \"idle\" : \"disabled\",\r\n reason,\r\n );\r\n }\r\n\r\n sendRealtime(message: RealtimeEnvelope | Record<string, unknown>): boolean {\r\n if (\r\n !this.realtimeSocket ||\r\n this.realtimeSocket.readyState !== WebSocket.OPEN\r\n ) {\r\n return false;\r\n }\r\n\r\n this.realtimeSocket.send(JSON.stringify(message));\r\n return true;\r\n }\r\n\r\n subscribeRealtime(subscriptions: string[]): boolean {\r\n return this.sendRealtime({\r\n type: \"subscribe\",\r\n channel: \"session\",\r\n event: \"session.subscribe\",\r\n data: { subscriptions },\r\n });\r\n }\r\n\r\n unsubscribeRealtime(subscriptions: string[]): boolean {\r\n return this.sendRealtime({\r\n type: \"unsubscribe\",\r\n channel: \"session\",\r\n event: \"session.unsubscribe\",\r\n data: { subscriptions },\r\n });\r\n }\r\n\r\n /**\r\n * \uC8FC\uAE30\uC801\uC73C\uB85C health \uCCB4\uD06C\uB97C \uC2E4\uD589\uD569\uB2C8\uB2E4.\r\n * CSRF \uCFE0\uD0A4 \uAC31\uC2E0\uACFC \uC11C\uBC84 \uC0C1\uD0DC \uD655\uC778\uC744 \uC790\uB3D9\uD654\uD569\uB2C8\uB2E4.\r\n * keepSession=true \uC774\uBA74 \uAC01 tick\uC5D0\uC11C \uC138\uC158 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uB3C4 \uD568\uAED8 \uC2DC\uB3C4\uD569\uB2C8\uB2E4.\r\n *\r\n * @param intervalMs \uD638\uCD9C \uC8FC\uAE30(ms). \uAE30\uBCF8\uAC12: 5\uBD84\r\n * @param runImmediately true\uBA74 \uC2DC\uC791 \uC9C1\uD6C4 \uCCAB tick\uC744 \uC989\uC2DC \uC2E4\uD589\uD569\uB2C8\uB2E4.\r\n */\r\n startHealthTick(\r\n intervalMs: number = 5 * 60 * 1000,\r\n runImmediately = true,\r\n ): void {\r\n this.stopHealthTick();\r\n const tick = (): void => {\r\n if (this.healthTickPromise) return;\r\n this.healthTickPromise = (\r\n this.csrfRefresher ? this.csrfRefresher() : Promise.resolve()\r\n )\r\n .then(() => {\r\n this.onHealthChange?.(true);\r\n })\r\n .catch(() => {\r\n this.onHealthChange?.(false);\r\n })\r\n .finally(() => {\r\n this.healthTickPromise = null;\r\n });\r\n };\r\n if (runImmediately) {\r\n tick();\r\n }\r\n this.healthTickTimer = setInterval(tick, intervalMs);\r\n }\r\n\r\n /** health tick \uD0C0\uC774\uBA38\uB97C \uC911\uC9C0\uD569\uB2C8\uB2E4. */\r\n stopHealthTick(): void {\r\n if (this.healthTickTimer !== null) {\r\n clearInterval(this.healthTickTimer);\r\n this.healthTickTimer = null;\r\n }\r\n this.healthTickPromise = null;\r\n }\r\n\r\n // \u2500\u2500\u2500 \uC138\uC158 \uC720\uC9C0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** @deprecated \uC138\uC158 \uC5F0\uC7A5\uC740 health tick \uAE30\uBC18 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uC73C\uB85C \uB300\uCCB4\uB418\uC5C8\uC2B5\uB2C8\uB2E4. */\r\n scheduleKeepSession(\r\n refreshToken: string,\r\n expiresIn: number,\r\n refreshFn: (\r\n rt: string,\r\n ) => Promise<{ access_token: string; expires_in: number }>,\r\n ): void {\r\n this.clearRefreshTimer();\r\n this.sessionRefreshToken = refreshToken;\r\n const delayMs = Math.max((expiresIn - this.refreshBuffer) * 1000, 0);\r\n this.refreshTimer = setTimeout(async () => {\r\n if (!this.sessionRefreshToken) return;\r\n try {\r\n const result = await refreshFn(this.sessionRefreshToken);\r\n this.onTokenRefreshed?.(result.access_token, result.expires_in);\r\n this.scheduleKeepSession(\r\n this.sessionRefreshToken,\r\n result.expires_in,\r\n refreshFn,\r\n );\r\n } catch (err) {\r\n this.clearRefreshTimer();\r\n this.onSessionExpired?.(\r\n err instanceof Error ? err : new Error(String(err)),\r\n );\r\n }\r\n }, delayMs);\r\n }\r\n\r\n /** @deprecated \uC138\uC158 \uC5F0\uC7A5\uC740 health tick \uAE30\uBC18 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uC73C\uB85C \uB300\uCCB4\uB418\uC5C8\uC2B5\uB2C8\uB2E4. */\r\n clearRefreshTimer(): void {\r\n if (this.refreshTimer !== null) {\r\n clearTimeout(this.refreshTimer);\r\n this.refreshTimer = null;\r\n }\r\n }\r\n\r\n /**\r\n * \uC138\uC158 \uC790\uB3D9 \uC5F0\uC7A5\uC744 \uC911\uC9C0\uD569\uB2C8\uB2E4.\r\n * `logout()` \uD638\uCD9C \uC2DC \uC790\uB3D9\uC73C\uB85C \uC911\uC9C0\uB418\uBA70, \uC9C1\uC811 \uD638\uCD9C\uC774 \uD544\uC694\uD55C \uACBD\uC6B0\uB294 \uB4DC\uBB45\uB2C8\uB2E4.\r\n */\r\n stopKeepSession(): void {\r\n this.clearRefreshTimer();\r\n this.sessionRefreshToken = null;\r\n }\r\n\r\n applyRealtimeOptions(options?: boolean | RealtimeClientOptions): void {\r\n const normalized: RealtimeClientOptions =\r\n typeof options === \"boolean\"\r\n ? { enabled: options }\r\n : (options ?? {});\r\n\r\n this.realtimeEnabled = normalized.enabled ?? false;\r\n this.realtimePath =\r\n String(normalized.path ?? REALTIME_DEFAULT_PATH).trim() ||\r\n REALTIME_DEFAULT_PATH;\r\n this.realtimeAutoConnect = normalized.autoConnect ?? true;\r\n this.realtimeAutoReconnect = normalized.autoReconnect ?? true;\r\n this.realtimeReconnectDelayMs = Math.max(\r\n 250,\r\n normalized.reconnectDelayMs ?? 3000,\r\n );\r\n\r\n if (!this.realtimeEnabled) {\r\n this.disconnectRealtime(\"realtime_disabled\");\r\n return;\r\n }\r\n\r\n this.setRealtimeStatus(\"idle\", \"realtime_enabled\");\r\n if (this.token && this.realtimeAutoConnect) {\r\n void this.connectRealtime().catch(() => {});\r\n }\r\n }\r\n\r\n buildRealtimeUrl(): string {\r\n const rawBaseUrl =\r\n this.baseUrl || readEnv(\"VITE_ENTITY_SERVER_URL\") || \"\";\r\n const baseUrl =\r\n rawBaseUrl ||\r\n (typeof window !== \"undefined\" ? window.location.origin : \"\");\r\n\r\n if (!baseUrl) {\r\n throw new Error(\"Realtime connection requires baseUrl.\");\r\n }\r\n\r\n const url = new URL(this.realtimePath, baseUrl);\r\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\r\n url.searchParams.set(\"access_token\", this.token);\r\n return url.toString();\r\n }\r\n\r\n handleRealtimeMessage(payload: unknown): void {\r\n if (typeof payload !== \"string\") {\r\n return;\r\n }\r\n\r\n let envelope: RealtimeEnvelope;\r\n try {\r\n envelope = JSON.parse(payload) as RealtimeEnvelope;\r\n } catch {\r\n return;\r\n }\r\n\r\n for (const listener of this.realtimeMessageListeners) {\r\n listener(envelope);\r\n }\r\n\r\n const listeners = this.realtimeEventListeners.get(envelope.event);\r\n if (listeners) {\r\n for (const listener of listeners) {\r\n listener(envelope);\r\n }\r\n }\r\n }\r\n\r\n scheduleRealtimeReconnect(reason: string): void {\r\n this.clearRealtimeReconnectTimer();\r\n this.realtimeReconnectTimer = setTimeout(() => {\r\n this.realtimeReconnectTimer = null;\r\n if (!this.realtimeEnabled || !this.token) {\r\n return;\r\n }\r\n this.setRealtimeStatus(\"connecting\", `${reason}:reconnect`);\r\n void this.connectRealtime().catch(() => {});\r\n }, this.realtimeReconnectDelayMs);\r\n }\r\n\r\n clearRealtimeReconnectTimer(): void {\r\n if (this.realtimeReconnectTimer !== null) {\r\n clearTimeout(this.realtimeReconnectTimer);\r\n this.realtimeReconnectTimer = null;\r\n }\r\n }\r\n\r\n setRealtimeStatus(\r\n status: RealtimeConnectionStatus,\r\n reason?: string,\r\n error?: Error,\r\n ): void {\r\n const previousStatus = this.realtimeStatus;\r\n if (\r\n previousStatus === status &&\r\n typeof reason === \"undefined\" &&\r\n typeof error === \"undefined\"\r\n ) {\r\n return;\r\n }\r\n\r\n this.realtimeStatus = status;\r\n for (const listener of this.realtimeStatusListeners) {\r\n listener({\r\n status,\r\n previousStatus,\r\n ...(reason ? { reason } : {}),\r\n ...(error ? { error } : {}),\r\n });\r\n }\r\n }\r\n\r\n applyCsrfHealth(): void {\r\n if (typeof document === \"undefined\") return;\r\n for (const chunk of document.cookie.split(\";\")) {\r\n const idx = chunk.indexOf(\"=\");\r\n if (idx < 0) continue;\r\n if (chunk.substring(0, idx).trim() === this.csrfCookieName) {\r\n this.csrfEnabled = !!chunk.substring(idx + 1).trim();\r\n return;\r\n }\r\n }\r\n this.csrfEnabled = false;\r\n }\r\n\r\n // \u2500\u2500\u2500 \uC694\uCCAD \uBCF8\uBB38 \uD30C\uC2F1 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /**\r\n * \uC694\uCCAD \uBC14\uB514\uB97C \uD30C\uC2F1\uD569\uB2C8\uB2E4.\r\n * `application/octet-stream`\uC774\uBA74 XChaCha20-Poly1305 \uBCF5\uD638\uD654, \uADF8 \uC678\uB294 JSON \uD30C\uC2F1\uD569\uB2C8\uB2E4.\r\n *\r\n * @param requireEncrypted `true`\uC774\uBA74 \uC554\uD638\uD654\uB41C \uC694\uCCAD\uB9CC \uD5C8\uC6A9\uD569\uB2C8\uB2E4.\r\n */\r\n readRequestBody<T = Record<string, unknown>>(\r\n body: ArrayBuffer | Uint8Array | string | T | null | undefined,\r\n contentType = \"application/json\",\r\n requireEncrypted = false,\r\n ): T {\r\n const key = derivePacketKey(\r\n this.hmacSecret,\r\n this.token || this.anonymousPacketToken,\r\n );\r\n return parseRequestBody<T>(body, contentType, requireEncrypted, key);\r\n }\r\n\r\n // \u2500\u2500\u2500 \uB0B4\uBD80 \uD5EC\uD37C \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n get reqOpts(): RequestOptions {\r\n return {\r\n baseUrl: this.baseUrl,\r\n token: this.token,\r\n anonymousPacketToken: this.anonymousPacketToken,\r\n apiKey: this.apiKey,\r\n hmacSecret: this.hmacSecret,\r\n encryptRequests: this.encryptRequests,\r\n csrfEnabled: this.csrfEnabled,\r\n csrfHeaderName: this.csrfHeaderName,\r\n csrfCookieName: this.csrfCookieName,\r\n refreshCsrfCookie: this.csrfEnabled ? this.csrfRefresher : null,\r\n onAccessToken: (token) => {\r\n this.token = token;\r\n },\r\n };\r\n }\r\n\r\n // \uC778\uC99D \uC694\uCCAD \uC804\uC5D0 \uD544\uC694\uD55C \uD074\uB77C\uC774\uC5B8\uD2B8 \uC900\uBE44 \uC791\uC5C5\uC744 \uC218\uD589\uD569\uB2C8\uB2E4.\r\n prepareRequest(_withAuth: boolean): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n /**\r\n * \uCEE4\uC2A4\uD140 \uB77C\uC6B0\uD2B8 \uC9C1\uC811 \uD638\uCD9C\uC6A9 HTTP \uB124\uC784\uC2A4\uD398\uC774\uC2A4.\r\n * \uC778\uC99D\u00B7\uC554\uD638\uD654\u00B7HMAC \uB4F1 SDK \uC635\uC158\uC774 \uADF8\uB300\uB85C \uC801\uC6A9\uB429\uB2C8\uB2E4.\r\n *\r\n * @example\r\n * const res = await client.http.get<{ version: string }>(\"/api/v1/status\", false);\r\n * const res = await client.http.post<MyResponse>(\"/api/v1/custom\", { key: \"value\" });\r\n */\r\n get http() {\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n const self = this;\r\n return {\r\n get<T>(\r\n path: string,\r\n withAuth = true,\r\n extraHeaders?: Record<string, string>,\r\n requestConfig?: EntityRequestConfig,\r\n ): Promise<T> {\r\n return self\r\n .prepareRequest(withAuth)\r\n .then(() =>\r\n entityRequest<T>(\r\n self.reqOpts,\r\n \"GET\",\r\n path,\r\n undefined,\r\n withAuth,\r\n extraHeaders,\r\n requestConfig ?? true,\r\n ),\r\n );\r\n },\r\n post<T>(\r\n path: string,\r\n body?: unknown,\r\n withAuth = true,\r\n extraHeaders?: Record<string, string>,\r\n requestConfig?: EntityRequestConfig,\r\n ): Promise<T> {\r\n return self\r\n .prepareRequest(withAuth)\r\n .then(() =>\r\n entityRequest<T>(\r\n self.reqOpts,\r\n \"POST\",\r\n path,\r\n body,\r\n withAuth,\r\n extraHeaders,\r\n requestConfig ?? true,\r\n ),\r\n );\r\n },\r\n put<T>(\r\n path: string,\r\n body?: unknown,\r\n withAuth = true,\r\n extraHeaders?: Record<string, string>,\r\n requestConfig?: EntityRequestConfig,\r\n ): Promise<T> {\r\n return self\r\n .prepareRequest(withAuth)\r\n .then(() =>\r\n entityRequest<T>(\r\n self.reqOpts,\r\n \"PUT\",\r\n path,\r\n body,\r\n withAuth,\r\n extraHeaders,\r\n requestConfig ?? true,\r\n ),\r\n );\r\n },\r\n patch<T>(\r\n path: string,\r\n body?: unknown,\r\n withAuth = true,\r\n extraHeaders?: Record<string, string>,\r\n requestConfig?: EntityRequestConfig,\r\n ): Promise<T> {\r\n return self\r\n .prepareRequest(withAuth)\r\n .then(() =>\r\n entityRequest<T>(\r\n self.reqOpts,\r\n \"PATCH\",\r\n path,\r\n body,\r\n withAuth,\r\n extraHeaders,\r\n requestConfig ?? true,\r\n ),\r\n );\r\n },\r\n delete<T>(\r\n path: string,\r\n body?: unknown,\r\n withAuth = true,\r\n extraHeaders?: Record<string, string>,\r\n requestConfig?: EntityRequestConfig,\r\n ): Promise<T> {\r\n return self\r\n .prepareRequest(withAuth)\r\n .then(() =>\r\n entityRequest<T>(\r\n self.reqOpts,\r\n \"DELETE\",\r\n path,\r\n body,\r\n withAuth,\r\n extraHeaders,\r\n requestConfig ?? true,\r\n ),\r\n );\r\n },\r\n };\r\n }\r\n\r\n request<T>(\r\n method: string,\r\n path: string,\r\n body?: unknown,\r\n withAuth = true,\r\n extraHeaders?: Record<string, string>,\r\n requestConfig?: EntityRequestConfig,\r\n ): Promise<T> {\r\n return this.prepareRequest(withAuth).then(() =>\r\n entityRequest<T>(\r\n this.reqOpts,\r\n method,\r\n path,\r\n body,\r\n withAuth,\r\n extraHeaders,\r\n requestConfig ?? true,\r\n ),\r\n );\r\n }\r\n\r\n /** PNG/\uBC14\uC774\uB108\uB9AC \uC751\uB2F5\uC744 ArrayBuffer\uB85C \uBC18\uD658\uD569\uB2C8\uB2E4. (QR, \uBC14\uCF54\uB4DC \uB4F1) */\r\n async requestBinary(\r\n method: string,\r\n path: string,\r\n body?: unknown,\r\n withAuth = true,\r\n ): Promise<ArrayBuffer> {\r\n await this.prepareRequest(withAuth);\r\n\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n };\r\n if (withAuth && this.token)\r\n headers[\"Authorization\"] = `Bearer ${this.token}`;\r\n if (this.apiKey) headers[\"X-API-Key\"] = this.apiKey;\r\n\r\n const res = await fetch(this.baseUrl + path, {\r\n method,\r\n headers,\r\n ...(body != null ? { body: JSON.stringify(body) } : {}),\r\n credentials: \"include\",\r\n });\r\n\r\n if (!res.ok) {\r\n const text = await res.text();\r\n const err = new Error(`HTTP ${res.status}: ${text}`);\r\n (err as { status?: number }).status = res.status;\r\n throw err;\r\n }\r\n\r\n return res.arrayBuffer();\r\n }\r\n\r\n /** multipart/form-data \uC694\uCCAD\uC744 \uBCF4\uB0C5\uB2C8\uB2E4. (\uD30C\uC77C \uC5C5\uB85C\uB4DC \uB4F1) */\r\n async requestForm<T>(\r\n method: string,\r\n path: string,\r\n form: FormData,\r\n withAuth = true,\r\n ): Promise<T> {\r\n const headers: Record<string, string> = {};\r\n if (withAuth && this.token)\r\n headers[\"Authorization\"] = `Bearer ${this.token}`;\r\n if (this.apiKey) headers[\"X-API-Key\"] = this.apiKey;\r\n\r\n const res = await fetch(this.baseUrl + path, {\r\n method,\r\n headers,\r\n body: form,\r\n credentials: \"include\",\r\n });\r\n\r\n const data = (await res.json()) as { ok?: boolean; message?: string };\r\n if (!data.ok) {\r\n const err = new Error(\r\n data.message ?? `EntityServer error (HTTP ${res.status})`,\r\n );\r\n (err as { status?: number }).status = res.status;\r\n throw err;\r\n }\r\n return data as T;\r\n }\r\n\r\n /** multipart/form-data \uC694\uCCAD\uC744 \uBCF4\uB0B4\uACE0 \uBC14\uC774\uB108\uB9AC(ArrayBuffer)\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n async requestFormBinary(\r\n method: string,\r\n path: string,\r\n form: FormData,\r\n withAuth = true,\r\n ): Promise<ArrayBuffer> {\r\n const headers: Record<string, string> = {};\r\n if (withAuth && this.token)\r\n headers[\"Authorization\"] = `Bearer ${this.token}`;\r\n if (this.apiKey) headers[\"X-API-Key\"] = this.apiKey;\r\n\r\n const res = await fetch(this.baseUrl + path, {\r\n method,\r\n headers,\r\n body: form,\r\n credentials: \"include\",\r\n });\r\n\r\n if (!res.ok) {\r\n const text = await res.text();\r\n const err = new Error(`HTTP ${res.status}: ${text}`);\r\n (err as { status?: number }).status = res.status;\r\n throw err;\r\n }\r\n\r\n return res.arrayBuffer();\r\n }\r\n}\r\n", "import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../client/base.js\";\r\nimport { entityRequest } from \"../../client/request.js\";\r\n\r\nexport interface AuthLoginSuccessData {\r\n access_token: string;\r\n refresh_token: string;\r\n expires_in: number;\r\n force_password_change?: boolean;\r\n password_expired?: boolean;\r\n password_expires_in_days?: number;\r\n}\r\n\r\nexport interface AuthLoginSuccessResponse {\r\n ok: true;\r\n data: AuthLoginSuccessData;\r\n requires_2fa?: false;\r\n}\r\n\r\nexport interface AuthLoginRequiresTwoFactorResponse {\r\n ok: true;\r\n requires_2fa: true;\r\n data: {\r\n two_factor_token: string;\r\n expires_in: number;\r\n };\r\n}\r\n\r\nexport interface AuthLoginSetupRequiredResponse {\r\n ok: false;\r\n error: \"2fa_setup_required\";\r\n message: string;\r\n data: {\r\n setup_token: string;\r\n expires_in: number;\r\n };\r\n}\r\n\r\nexport type AuthLoginResponse =\r\n | AuthLoginSuccessResponse\r\n | AuthLoginRequiresTwoFactorResponse\r\n | AuthLoginSetupRequiredResponse;\r\n\r\nexport function isAuthLoginSuccessResponse(\r\n response: AuthLoginResponse,\r\n): response is AuthLoginSuccessResponse {\r\n return (\r\n response.ok === true &&\r\n response.requires_2fa !== true &&\r\n typeof response.data === \"object\" &&\r\n response.data !== null &&\r\n \"access_token\" in response.data\r\n );\r\n}\r\n\r\nexport function AuthMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class AuthMixinClass extends Base {\r\n authBootstrapPromise: Promise<void> | null = null;\r\n authBootstrapToken = \"\";\r\n authBootstrapAnonymousCompleted = false;\r\n\r\n // health tick\uC774 \uCF1C\uC838 \uC788\uC73C\uBA74 keepSession \uC5EC\uBD80\uC5D0 \uB530\uB77C \uC138\uC158 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uAE4C\uC9C0 \uD568\uAED8 \uCC98\uB9AC\uD569\uB2C8\uB2E4.\r\n csrfRefresher = (): Promise<void> =>\r\n this.checkHealth(this.keepSession).then(() => {});\r\n\r\n // \u2500\u2500\u2500 \uC778\uC99D \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /**\r\n * \uC11C\uBC84 \uD5EC\uC2A4 \uCCB4\uD06C\uB97C \uC218\uD589\uD558\uACE0 \uD328\uD0B7 \uC554\uD638\uD654 \uD65C\uC131 \uC5EC\uBD80\uB97C \uC790\uB3D9\uC73C\uB85C \uAC10\uC9C0\uD569\uB2C8\uB2E4.\r\n *\r\n * \uC11C\uBC84\uAC00 `packet_encryption: true`\uB97C \uC751\uB2F5\uD558\uBA74 \uC774\uD6C4 \uBAA8\uB4E0 \uC694\uCCAD\uC5D0 \uC554\uD638\uD654\uAC00 \uC790\uB3D9 \uC801\uC6A9\uB429\uB2C8\uB2E4.\r\n *\r\n * ```ts\r\n * await client.checkHealth();\r\n * await client.login(email, password);\r\n * ```\r\n */\r\n async checkHealth(bootstrapAuth = false): Promise<{\r\n status: string;\r\n authenticated?: boolean;\r\n packet_encryption?: boolean;\r\n }> {\r\n try {\r\n const previousToken = this.token;\r\n const headers: Record<string, string> = {};\r\n if (bootstrapAuth) {\r\n headers[\"X-Session-Bootstrap\"] = \"1\";\r\n }\r\n\r\n const res = await fetch(`${this.baseUrl}/v1/health`, {\r\n signal: AbortSignal.timeout(3000),\r\n credentials: \"include\",\r\n headers,\r\n });\r\n const data = (await res.json()) as {\r\n status: string;\r\n authenticated?: boolean;\r\n packet_encryption?: boolean;\r\n };\r\n\r\n const accessToken = res.headers.get(\"X-Access-Token\");\r\n if (accessToken) {\r\n this.token = accessToken;\r\n if (bootstrapAuth && accessToken !== previousToken) {\r\n this.onTokenRefreshed?.(accessToken, 0);\r\n }\r\n if (\r\n bootstrapAuth &&\r\n data.authenticated === true &&\r\n this.realtimeEnabled &&\r\n this.realtimeAutoConnect\r\n ) {\r\n this.connectRealtime().catch(() => {});\r\n }\r\n }\r\n\r\n // \uD328\uD0B7 \uC554\uD638\uD654\uB294 health \uC751\uB2F5\uC774 \uBA85\uC2DC\uC801\uC73C\uB85C \uD65C\uC131\uC774\uB77C\uACE0 \uC54C\uB824\uC904 \uB54C\uB9CC \uC790\uB3D9 \uD65C\uC131\uD654\uD55C\uB2E4.\r\n const anonToken = this.readCookie(\"anon_token\");\r\n if (data.packet_encryption === true && anonToken) {\r\n this.anonymousPacketToken = anonToken;\r\n this.encryptRequests = true;\r\n }\r\n\r\n this.applyCsrfHealth();\r\n this.onHealthChange?.(true);\r\n if (\r\n bootstrapAuth &&\r\n data.authenticated === false &&\r\n previousToken\r\n ) {\r\n this.disconnectRealtime(\"session_expired\");\r\n this.onSessionExpired?.(new Error(\"Session expired\"));\r\n }\r\n return data;\r\n } catch (error) {\r\n this.onHealthChange?.(false);\r\n throw error;\r\n }\r\n }\r\n\r\n /** document.cookie \uB610\uB294 Node \uD658\uACBD\uC5D0\uC11C \uCFE0\uD0A4 \uAC12 \uC77D\uAE30 (SSR \uB300\uC751) */\r\n readCookie(name: string): string | null {\r\n if (typeof document === \"undefined\") return null;\r\n const match = document.cookie\r\n .split(\";\")\r\n .map((c) => c.trim())\r\n .find((c) => c.startsWith(`${name}=`));\r\n if (!match) return null;\r\n try {\r\n return decodeURIComponent(match.slice(name.length + 1));\r\n } catch {\r\n return match.slice(name.length + 1);\r\n }\r\n }\r\n\r\n async ensurePublicAuthBootstrap(): Promise<void> {\r\n if (typeof document === \"undefined\") {\r\n return;\r\n }\r\n\r\n if (this.apiKey && this.hmacSecret) {\r\n return;\r\n }\r\n\r\n const hasAnonymousPacketToken =\r\n !!this.anonymousPacketToken || !!this.readCookie(\"anon_token\");\r\n const hasCsrfCookie = !!this.readCookie(this.csrfCookieName);\r\n\r\n if (hasAnonymousPacketToken && hasCsrfCookie && this.csrfEnabled) {\r\n return;\r\n }\r\n\r\n await this.checkHealth(false);\r\n }\r\n\r\n // \uC778\uC99D \uC694\uCCAD \uC804\uC5D0 health \uAE30\uBC18 \uC138\uC158 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uC744 \uD55C \uBC88 \uBCF4\uC7A5\uD569\uB2C8\uB2E4.\r\n async ensureAuthenticatedRequestBootstrap(): Promise<void> {\r\n if (typeof document === \"undefined\") {\r\n return;\r\n }\r\n\r\n if (this.apiKey && this.hmacSecret) {\r\n return;\r\n }\r\n\r\n if (this.token) {\r\n if (this.authBootstrapToken === this.token) {\r\n return;\r\n }\r\n } else if (this.authBootstrapAnonymousCompleted) {\r\n return;\r\n }\r\n\r\n if (this.authBootstrapPromise) {\r\n return this.authBootstrapPromise;\r\n }\r\n\r\n this.authBootstrapPromise = this.checkHealth(true)\r\n .then(() => {\r\n if (this.token) {\r\n this.authBootstrapToken = this.token;\r\n } else {\r\n this.authBootstrapAnonymousCompleted = true;\r\n }\r\n })\r\n .finally(() => {\r\n this.authBootstrapPromise = null;\r\n });\r\n\r\n return this.authBootstrapPromise;\r\n }\r\n\r\n // \uC778\uC99D \uC694\uCCAD \uC804 \uC790\uB3D9 health \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uC744 \uC218\uD589\uD569\uB2C8\uB2E4.\r\n override async prepareRequest(withAuth: boolean): Promise<void> {\r\n await super.prepareRequest(withAuth);\r\n if (!withAuth) {\r\n return;\r\n }\r\n\r\n await this.ensureAuthenticatedRequestBootstrap();\r\n }\r\n\r\n /** \uB85C\uADF8\uC778 \uC751\uB2F5\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. \uC131\uACF5 \uC2DC\uC5D0\uB9CC `access_token`\uC744 \uB0B4\uBD80 \uC0C1\uD0DC\uC5D0 \uC800\uC7A5\uD569\uB2C8\uB2E4. */\r\n async login(\r\n email: string,\r\n password: string,\r\n ): Promise<AuthLoginResponse> {\r\n await this.ensurePublicAuthBootstrap();\r\n\r\n const response = await entityRequest<AuthLoginResponse>(\r\n this.reqOpts,\r\n \"POST\",\r\n \"/v1/auth/login\",\r\n { email, passwd: password },\r\n false,\r\n {},\r\n { requireOkShape: false, allowStatuses: [403] },\r\n );\r\n\r\n if (isAuthLoginSuccessResponse(response)) {\r\n this.token = response.data.access_token;\r\n this.applyCsrfHealth();\r\n if (this.keepSession && this.healthTickTimer === null) {\r\n this.startHealthTick();\r\n }\r\n if (this.realtimeEnabled && this.realtimeAutoConnect) {\r\n this.connectRealtime().catch(() => {});\r\n }\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /** HttpOnly refresh cookie\uB85C Access Token\uC744 \uC7AC\uBC1C\uAE09\uBC1B\uC544 \uB0B4\uBD80 \uD1A0\uD070\uC744 \uAD50\uCCB4\uD569\uB2C8\uB2E4. */\r\n async tokenRefresh(): Promise<{\r\n access_token: string;\r\n refresh_token: string;\r\n expires_in: number;\r\n }> {\r\n const data = await this.request<{\r\n data: {\r\n access_token: string;\r\n refresh_token: string;\r\n expires_in: number;\r\n };\r\n }>(\"POST\", \"/v1/auth/token_refresh\", undefined, false);\r\n this.token = data.data.access_token;\r\n this.applyCsrfHealth();\r\n return data.data;\r\n }\r\n\r\n /** Refresh Token\uC73C\uB85C Access Token\uC744 \uC7AC\uBC1C\uAE09\uBC1B\uC544 \uB0B4\uBD80 \uD1A0\uD070\uC744 \uAD50\uCCB4\uD569\uB2C8\uB2E4. */\r\n async refreshToken(refreshToken?: string): Promise<{\r\n access_token: string;\r\n refresh_token?: string;\r\n expires_in: number;\r\n }> {\r\n if (!refreshToken) {\r\n return this.tokenRefresh();\r\n }\r\n\r\n const data = await this.request<{\r\n data: {\r\n access_token: string;\r\n refresh_token: string;\r\n expires_in: number;\r\n };\r\n }>(\r\n \"POST\",\r\n \"/v1/auth/refresh\",\r\n { refresh_token: refreshToken },\r\n false,\r\n );\r\n this.token = data.data.access_token;\r\n this.applyCsrfHealth();\r\n return data.data;\r\n }\r\n\r\n /**\r\n * \uC11C\uBC84\uC5D0 \uB85C\uADF8\uC544\uC6C3\uC744 \uC694\uCCAD\uD558\uACE0 \uB0B4\uBD80 \uD1A0\uD070\uC744 \uCD08\uAE30\uD654\uD569\uB2C8\uB2E4.\r\n * refresh_token\uC744 \uC11C\uBC84\uC5D0 \uC804\uB2EC\uD574 \uBB34\uD6A8\uD654\uD569\uB2C8\uB2E4.\r\n */\r\n async logout(refreshToken?: string): Promise<{ ok: boolean }> {\r\n this.stopKeepSession();\r\n this.stopHealthTick();\r\n this.disconnectRealtime(\"logout\");\r\n const data = await this.request<{ ok: boolean }>(\r\n \"POST\",\r\n \"/v1/auth/logout\",\r\n refreshToken ? { refresh_token: refreshToken } : undefined,\r\n false,\r\n );\r\n this.token = \"\";\r\n this.applyCsrfHealth();\r\n return data;\r\n }\r\n\r\n /** \uD604\uC7AC \uB85C\uADF8\uC778\uB41C \uC0AC\uC6A9\uC790 \uC815\uBCF4\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n me<T = Record<string, unknown>>(): Promise<{ ok: boolean; data: T }> {\r\n return this.request(\"GET\", \"/v1/auth/me\");\r\n }\r\n\r\n /** \uD68C\uC6D0 \uD0C8\uD1F4\uB97C \uC694\uCCAD\uD569\uB2C8\uB2E4. */\r\n withdraw(passwd?: string): Promise<{ ok: boolean }> {\r\n return this.request(\r\n \"POST\",\r\n \"/v1/auth/withdraw\",\r\n passwd ? { passwd } : {},\r\n );\r\n }\r\n };\r\n}\r\n", "import type {\r\n EntityHistoryRecord,\r\n EntityListParams,\r\n EntityListResult,\r\n EntityQueryRequest,\r\n} from \"../../types.js\";\r\nimport { buildQuery } from \"../../client/utils.js\";\r\nimport type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../client/base.js\";\r\n\r\nexport function EntityMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class EntityMixinClass extends Base {\r\n // \u2500\u2500\u2500 \uD2B8\uB79C\uC7AD\uC158 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** \uD2B8\uB79C\uC7AD\uC158\uC744 \uC2DC\uC791\uD558\uACE0 \uD65C\uC131 \uD2B8\uB79C\uC7AD\uC158 ID\uB97C \uC800\uC7A5\uD569\uB2C8\uB2E4. */\r\n async transStart(): Promise<string> {\r\n const res = await this.request<{\r\n ok: boolean;\r\n transaction_id: string;\r\n }>(\"POST\", \"/v1/transaction/start\", undefined, false);\r\n this.activeTxId = res.transaction_id;\r\n return this.activeTxId;\r\n }\r\n\r\n /** \uD65C\uC131 \uD2B8\uB79C\uC7AD\uC158(\uB610\uB294 \uC804\uB2EC\uB41C transactionId)\uC744 \uB864\uBC31\uD569\uB2C8\uB2E4. */\r\n transRollback(transactionId?: string): Promise<{ ok: boolean }> {\r\n const txId = transactionId ?? this.activeTxId;\r\n if (!txId)\r\n return Promise.reject(\r\n new Error(\r\n \"No active transaction. Call transStart() first.\",\r\n ),\r\n );\r\n this.activeTxId = null;\r\n return this.request(\"POST\", `/v1/transaction/rollback/${txId}`);\r\n }\r\n\r\n /**\r\n * \uD65C\uC131 \uD2B8\uB79C\uC7AD\uC158(\uB610\uB294 \uC804\uB2EC\uB41C transactionId)\uC744 \uCEE4\uBC0B\uD569\uB2C8\uB2E4.\r\n *\r\n * @returns `results` \uBC30\uC5F4: commit\uB41C \uAC01 \uC791\uC5C5\uC758 `entity`, `action`, `seq`\r\n */\r\n transCommit(transactionId?: string): Promise<{\r\n ok: boolean;\r\n results: Array<{ entity: string; action: string; seq: number }>;\r\n }> {\r\n const txId = transactionId ?? this.activeTxId;\r\n if (!txId)\r\n return Promise.reject(\r\n new Error(\r\n \"No active transaction. Call transStart() first.\",\r\n ),\r\n );\r\n this.activeTxId = null;\r\n return this.request(\"POST\", `/v1/transaction/commit/${txId}`);\r\n }\r\n\r\n // \u2500\u2500\u2500 \uC5D4\uD2F0\uD2F0 CRUD \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** \uC5D4\uD2F0\uD2F0 \uC124\uC815 \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n meta<T = unknown>(entity: string): Promise<{ ok: boolean; data: T }> {\r\n return this.request(\"POST\", `/v1/entity/${entity}/meta`, {});\r\n }\r\n\r\n /** \uC5D4\uD2F0\uD2F0 \uB370\uC774\uD130\uB97C \uC800\uC7A5 \uC5C6\uC774 \uAC80\uC99D\uD569\uB2C8\uB2E4. */\r\n validate<T = unknown>(\r\n entity: string,\r\n data: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(`/v1/entity/${entity}/validate`, data);\r\n }\r\n\r\n /** \uC2DC\uD000\uC2A4 ID\uB85C \uC5D4\uD2F0\uD2F0 \uB2E8\uAC74\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n get<T = unknown>(\r\n entity: string,\r\n seq: number,\r\n opts: { skipHooks?: boolean } = {},\r\n ): Promise<{ ok: boolean; data: T }> {\r\n const q = opts.skipHooks ? \"?skipHooks=true\" : \"\";\r\n return this.request(\"GET\", `/v1/entity/${entity}/${seq}${q}`);\r\n }\r\n\r\n /** \uC870\uAC74\uC73C\uB85C \uC5D4\uD2F0\uD2F0 \uB2E8\uAC74\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. data \uCEEC\uB7FC\uC744 \uC644\uC804\uD788 \uBCF5\uD638\uD654\uD558\uC5EC \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n find<T = unknown>(\r\n entity: string,\r\n conditions?: Record<string, unknown>,\r\n opts: { skipHooks?: boolean } = {},\r\n ): Promise<{ ok: boolean; data: T }> {\r\n const q = opts.skipHooks ? \"?skipHooks=true\" : \"\";\r\n return this.request(\r\n \"POST\",\r\n `/v1/entity/${entity}/find${q}`,\r\n conditions ?? {},\r\n );\r\n }\r\n\r\n /** \uD398\uC774\uC9C0\uB124\uC774\uC158/\uC815\uB82C/\uD544\uD130 \uC870\uAC74\uC73C\uB85C \uC5D4\uD2F0\uD2F0 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n list<T = unknown>(\r\n entity: string,\r\n params: EntityListParams = {},\r\n ): Promise<{ ok: boolean; data: EntityListResult<T> }> {\r\n const { conditions, fields, orderDir, orderBy, ...rest } = params;\r\n const queryObj: Record<string, unknown> = {\r\n page: 1,\r\n limit: 20,\r\n ...rest,\r\n };\r\n if (orderBy)\r\n queryObj.orderBy =\r\n orderDir === \"DESC\" ? `-${orderBy}` : orderBy;\r\n if (fields?.length) queryObj.fields = fields.join(\",\");\r\n return this.request(\r\n \"POST\",\r\n `/v1/entity/${entity}/list?${buildQuery(queryObj)}`,\r\n conditions ?? {},\r\n );\r\n }\r\n\r\n /**\r\n * \uC5D4\uD2F0\uD2F0 \uCD1D \uAC74\uC218\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4.\r\n *\r\n * @param conditions \uD544\uD130 \uC870\uAC74 (\uC608: `{ status: \"active\" }`)\r\n */\r\n count(\r\n entity: string,\r\n conditions?: Record<string, unknown>,\r\n ): Promise<{ ok: boolean; count: number }> {\r\n return this.request(\r\n \"POST\",\r\n `/v1/entity/${entity}/count`,\r\n conditions ?? {},\r\n );\r\n }\r\n\r\n /**\r\n * \uCEE4\uC2A4\uD140 SQL\uB85C \uC5D4\uD2F0\uD2F0\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4.\r\n *\r\n * SELECT \uC804\uC6A9\uC774\uBA70 \uC778\uB371\uC2A4 \uD14C\uC774\uBE14\uB9CC \uC870\uD68C \uAC00\uB2A5\uD569\uB2C8\uB2E4. JOIN \uC9C0\uC6D0.\r\n */\r\n query<T = unknown>(\r\n entity: string,\r\n req: EntityQueryRequest,\r\n ): Promise<{ ok: boolean; data: { items: T[]; count: number } }> {\r\n return this.request(\"POST\", `/v1/entity/${entity}/query`, req);\r\n }\r\n\r\n /** \uC5D4\uD2F0\uD2F0 \uB370\uC774\uD130\uB97C \uC0DD\uC131/\uC218\uC815(Submit)\uD569\uB2C8\uB2E4. `seq`\uAC00 \uC5C6\uC73C\uBA74 INSERT, \uC788\uC73C\uBA74 UPDATE\uC785\uB2C8\uB2E4. */\r\n submit(\r\n entity: string,\r\n data: Record<string, unknown>,\r\n opts: { transactionId?: string; skipHooks?: boolean } = {},\r\n ): Promise<{ ok: boolean; seq: number }> {\r\n const txId = opts.transactionId ?? this.activeTxId;\r\n const extraHeaders = txId\r\n ? { \"X-Transaction-ID\": txId }\r\n : undefined;\r\n const q = opts.skipHooks ? \"?skipHooks=true\" : \"\";\r\n return this.request(\r\n \"POST\",\r\n `/v1/entity/${entity}/submit${q}`,\r\n data,\r\n true,\r\n extraHeaders,\r\n );\r\n }\r\n\r\n /** \uC2DC\uD000\uC2A4 ID\uB85C \uC5D4\uD2F0\uD2F0\uB97C \uC0AD\uC81C\uD569\uB2C8\uB2E4(`hard=true`\uBA74 \uD558\uB4DC \uC0AD\uC81C, \uAE30\uBCF8\uC740 \uC18C\uD504\uD2B8 \uC0AD\uC81C). */\r\n delete(\r\n entity: string,\r\n seq: number,\r\n opts: {\r\n transactionId?: string;\r\n hard?: boolean;\r\n skipHooks?: boolean;\r\n } = {},\r\n ): Promise<{ ok: boolean; deleted: number }> {\r\n const params = new URLSearchParams();\r\n if (opts.hard) params.set(\"hard\", \"true\");\r\n if (opts.skipHooks) params.set(\"skipHooks\", \"true\");\r\n const q = params.size ? `?${params}` : \"\";\r\n const txId = opts.transactionId ?? this.activeTxId;\r\n const extraHeaders = txId\r\n ? { \"X-Transaction-ID\": txId }\r\n : undefined;\r\n return this.request(\r\n \"POST\",\r\n `/v1/entity/${entity}/delete/${seq}${q}`,\r\n undefined,\r\n true,\r\n extraHeaders,\r\n );\r\n }\r\n\r\n /** \uC5D4\uD2F0\uD2F0 \uB2E8\uAC74\uC758 \uBCC0\uACBD \uC774\uB825\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n history<T = unknown>(\r\n entity: string,\r\n seq: number,\r\n params: Pick<EntityListParams, \"page\" | \"limit\"> = {},\r\n ): Promise<{\r\n ok: boolean;\r\n data: EntityListResult<EntityHistoryRecord<T>>;\r\n }> {\r\n return this.request(\r\n \"GET\",\r\n `/v1/entity/${entity}/history/${seq}?${buildQuery({ page: 1, limit: 50, ...params })}`,\r\n );\r\n }\r\n\r\n /** \uD2B9\uC815 \uC774\uB825 \uC2DC\uC810\uC73C\uB85C \uC5D4\uD2F0\uD2F0\uB97C \uB864\uBC31\uD569\uB2C8\uB2E4. */\r\n rollback(entity: string, historySeq: number): Promise<{ ok: boolean }> {\r\n return this.request(\r\n \"POST\",\r\n `/v1/entity/${entity}/rollback/${historySeq}`,\r\n );\r\n }\r\n };\r\n}\r\n", "import type {\r\n FileMeta,\r\n FileUploadOptions,\r\n StorageMeta,\r\n StorageUploadOptions,\r\n} from \"../../types.js\";\r\nimport type { GConstructor, EntityServerClientBase } from \"../../client/base.js\";\r\n\r\nexport function FileMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class FileMixinClass extends Base {\r\n // \u2500\u2500\u2500 \uD30C\uC77C \uAD00\uB9AC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /**\r\n * \uD30C\uC77C\uC744 \uC5C5\uB85C\uB4DC\uD569\uB2C8\uB2E4. (multipart/form-data)\r\n *\r\n * ```ts\r\n * const input = document.querySelector('input[type=\"file\"]');\r\n * const result = await client.fileUpload(\"product\", input.files[0]);\r\n * console.log(result.data.uuid);\r\n * ```\r\n */\r\n async fileUpload(\r\n entity: string,\r\n file: File | Blob,\r\n opts: FileUploadOptions = {},\r\n ): Promise<{ ok: boolean; uuid: string; data: FileMeta }> {\r\n const form = new FormData();\r\n form.append(\r\n \"file\",\r\n file,\r\n file instanceof File ? file.name : \"upload\",\r\n );\r\n if (opts.refSeq != null)\r\n form.append(\"ref_seq\", String(opts.refSeq));\r\n if (opts.isPublic != null)\r\n form.append(\"is_public\", opts.isPublic ? \"true\" : \"false\");\r\n return this.requestForm(\r\n \"POST\",\r\n `/v1/files/${entity}/upload`,\r\n form,\r\n );\r\n }\r\n\r\n /** \uD30C\uC77C\uC744 \uB2E4\uC6B4\uB85C\uB4DC\uD569\uB2C8\uB2E4. `ArrayBuffer`\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n fileDownload(entity: string, uuid: string): Promise<ArrayBuffer> {\r\n return this.requestBinary(\r\n \"POST\",\r\n `/v1/files/${entity}/download/${uuid}`,\r\n {},\r\n );\r\n }\r\n\r\n /** \uD30C\uC77C\uC744 \uC0AD\uC81C\uD569\uB2C8\uB2E4. */\r\n fileDelete(\r\n entity: string,\r\n uuid: string,\r\n ): Promise<{ ok: boolean; uuid: string; deleted: boolean }> {\r\n return this.request(\r\n \"POST\",\r\n `/v1/files/${entity}/delete/${uuid}`,\r\n {},\r\n );\r\n }\r\n\r\n /** \uC5D4\uD2F0\uD2F0\uC5D0 \uC5F0\uACB0\uB41C \uD30C\uC77C \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n fileList(\r\n entity: string,\r\n opts: { refSeq?: number } = {},\r\n ): Promise<{\r\n ok: boolean;\r\n data: { items: FileMeta[]; total: number };\r\n }> {\r\n return this.request(\r\n \"POST\",\r\n `/v1/files/${entity}/list`,\r\n opts.refSeq ? { ref_seq: opts.refSeq } : {},\r\n );\r\n }\r\n\r\n /** \uD30C\uC77C \uBA54\uD0C0 \uC815\uBCF4\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n fileMeta(\r\n entity: string,\r\n uuid: string,\r\n ): Promise<{ ok: boolean; data: FileMeta }> {\r\n return this.request(\r\n \"POST\",\r\n `/v1/files/${entity}/meta/${uuid}`,\r\n {},\r\n );\r\n }\r\n\r\n /** \uC784\uC2DC \uD30C\uC77C \uC811\uADFC \uD1A0\uD070\uC744 \uBC1C\uAE09\uD569\uB2C8\uB2E4. */\r\n fileToken(uuid: string): Promise<{ ok: boolean; token: string }> {\r\n return this.request(\"POST\", `/v1/files/token/${uuid}`, {});\r\n }\r\n\r\n /** \uD30C\uC77C \uC778\uB77C\uC778 \uBDF0/\uB2E4\uC6B4\uB85C\uB4DC URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n fileViewUrl(uuid: string, opts: { download?: boolean } = {}): string {\r\n const qs = opts.download ? \"?download=true\" : \"\";\r\n return `${this.baseUrl}/v1/files/${uuid}${qs}`;\r\n }\r\n\r\n /** \uD30C\uC77C \uC778\uB77C\uC778 \uBDF0 URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. (fetch \uC5C6\uC74C, URL \uC870\uD569\uB9CC) */\r\n fileUrl(uuid: string): string {\r\n return `${this.baseUrl}/v1/files/${uuid}`;\r\n }\r\n\r\n // \u2500\u2500\u2500 \uC2A4\uD1A0\uB9AC\uC9C0 \uB77C\uC6B0\uD2B8 \uBCC4\uCE6D \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uC5C5\uB85C\uB4DC \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\r\n storageUpload(\r\n entity: string,\r\n file: File | Blob,\r\n opts: StorageUploadOptions = {},\r\n ): Promise<{ ok: boolean; uuid: string; data: StorageMeta }> {\r\n return this.fileUpload(entity, file, opts);\r\n }\r\n\r\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uB2E4\uC6B4\uB85C\uB4DC \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\r\n storageDownload(entity: string, uuid: string): Promise<ArrayBuffer> {\r\n return this.fileDownload(entity, uuid);\r\n }\r\n\r\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uC0AD\uC81C \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\r\n storageDelete(\r\n entity: string,\r\n uuid: string,\r\n ): Promise<{ ok: boolean; uuid: string; deleted: boolean }> {\r\n return this.fileDelete(entity, uuid);\r\n }\r\n\r\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uBAA9\uB85D \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\r\n storageList(\r\n entity: string,\r\n opts: { refSeq?: number } = {},\r\n ): Promise<{\r\n ok: boolean;\r\n data: { items: StorageMeta[]; total: number };\r\n }> {\r\n return this.fileList(entity, opts);\r\n }\r\n\r\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uBA54\uD0C0 \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\r\n storageMeta(\r\n entity: string,\r\n uuid: string,\r\n ): Promise<{ ok: boolean; data: StorageMeta }> {\r\n return this.fileMeta(entity, uuid);\r\n }\r\n\r\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uC784\uC2DC \uD1A0\uD070 \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\r\n storageToken(uuid: string): Promise<{ ok: boolean; token: string }> {\r\n return this.fileToken(uuid);\r\n }\r\n\r\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uC778\uB77C\uC778 \uBDF0/\uB2E4\uC6B4\uB85C\uB4DC URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n storageViewUrl(uuid: string, opts: { download?: boolean } = {}): string {\r\n return this.fileViewUrl(uuid, opts);\r\n }\r\n\r\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uB2E4\uC6B4\uB85C\uB4DC URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n storageDownloadUrl(uuid: string): string {\r\n return this.fileViewUrl(uuid, { download: true });\r\n }\r\n\r\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uC778\uB77C\uC778 \uBDF0 URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n storageUrl(uuid: string): string {\r\n return this.fileUrl(uuid);\r\n }\r\n };\r\n}\r\n", "import type {\r\n EntityListParams,\r\n EntityListResult,\r\n RegisterPushDeviceOptions,\r\n} from \"../../types.js\";\r\nimport type { GConstructor, EntityServerClientBase } from \"../../client/base.js\";\r\n\r\n// entity submit\uC744 \uAC00\uC9C4 base \uD0C0\uC785 (EntityMixin \uC801\uC6A9 \uD6C4)\r\ntype WithSubmit = EntityServerClientBase & {\r\n submit(\r\n entity: string,\r\n data: Record<string, unknown>,\r\n opts?: { transactionId?: string; skipHooks?: boolean },\r\n ): Promise<{ ok: boolean; seq: number }>;\r\n list<T = unknown>(\r\n entity: string,\r\n params?: EntityListParams,\r\n ): Promise<{ ok: boolean; data: EntityListResult<T> }>;\r\n};\r\n\r\nexport function PushMixin<TBase extends GConstructor<WithSubmit>>(Base: TBase) {\r\n return class PushMixinClass extends Base {\r\n // \u2500\u2500\u2500 \uD478\uC2DC submit \uB798\uD37C \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /**\r\n * \uD478\uC2DC \uAD00\uB828 \uC5D4\uD2F0\uD2F0\uB85C payload\uB97C \uC804\uC1A1(Submit)\uD569\uB2C8\uB2E4.\r\n * \uB0B4\uBD80\uC801\uC73C\uB85C `submit()` \uBA54\uC11C\uB4DC\uB97C \uD638\uCD9C\uD569\uB2C8\uB2E4.\r\n */\r\n push(\r\n pushEntity: string,\r\n payload: Record<string, unknown>,\r\n opts: { transactionId?: string } = {},\r\n ): Promise<{ ok: boolean; seq: number }> {\r\n return this.submit(pushEntity, payload, opts);\r\n }\r\n\r\n // \u2500\u2500\u2500 \uD478\uC2DC \uB514\uBC14\uC774\uC2A4 \uAD00\uB9AC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** \uD478\uC2DC \uB85C\uADF8 \uC5D4\uD2F0\uD2F0 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n pushLogList<T = unknown>(\r\n params: EntityListParams = {},\r\n ): Promise<{ ok: boolean; data: EntityListResult<T> }> {\r\n return this.list<T>(\"push_log\", params);\r\n }\r\n\r\n /** \uACC4\uC815\uC758 \uD478\uC2DC \uB514\uBC14\uC774\uC2A4\uB97C \uB4F1\uB85D\uD569\uB2C8\uB2E4. */\r\n registerPushDevice(\r\n accountSeq: number,\r\n deviceId: string,\r\n pushToken: string,\r\n opts: RegisterPushDeviceOptions = {},\r\n ): Promise<{ ok: boolean; seq: number }> {\r\n const {\r\n platform,\r\n deviceType,\r\n browser,\r\n browserVersion,\r\n pushEnabled = true,\r\n transactionId,\r\n } = opts;\r\n return this.submit(\r\n \"account_device\",\r\n {\r\n id: deviceId,\r\n account_seq: accountSeq,\r\n push_token: pushToken,\r\n push_enabled: pushEnabled,\r\n ...(platform ? { platform } : {}),\r\n ...(deviceType ? { device_type: deviceType } : {}),\r\n ...(browser ? { browser } : {}),\r\n ...(browserVersion\r\n ? { browser_version: browserVersion }\r\n : {}),\r\n },\r\n { transactionId },\r\n );\r\n }\r\n\r\n /** \uB514\uBC14\uC774\uC2A4 \uB808\uCF54\uB4DC\uC758 \uD478\uC2DC \uD1A0\uD070\uC744 \uAC31\uC2E0\uD569\uB2C8\uB2E4. */\r\n updatePushDeviceToken(\r\n deviceSeq: number,\r\n pushToken: string,\r\n opts: { pushEnabled?: boolean; transactionId?: string } = {},\r\n ): Promise<{ ok: boolean; seq: number }> {\r\n const { pushEnabled = true, transactionId } = opts;\r\n return this.submit(\r\n \"account_device\",\r\n {\r\n seq: deviceSeq,\r\n push_token: pushToken,\r\n push_enabled: pushEnabled,\r\n },\r\n { transactionId },\r\n );\r\n }\r\n\r\n /** \uB514\uBC14\uC774\uC2A4\uC758 \uD478\uC2DC \uC218\uC2E0\uC744 \uBE44\uD65C\uC131\uD654\uD569\uB2C8\uB2E4. */\r\n disablePushDevice(\r\n deviceSeq: number,\r\n opts: { transactionId?: string } = {},\r\n ): Promise<{ ok: boolean; seq: number }> {\r\n return this.submit(\r\n \"account_device\",\r\n { seq: deviceSeq, push_enabled: false },\r\n { transactionId: opts.transactionId },\r\n );\r\n }\r\n };\r\n}\r\n", "import type { SmtpSendRequest } from \"../../types.js\";\r\nimport type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../client/base.js\";\r\n\r\nexport function SmtpMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class SmtpMixinClass extends Base {\r\n // \u2500\u2500\u2500 SMTP \uBA54\uC77C \uBC1C\uC1A1 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** SMTP\uB85C \uBA54\uC77C\uC744 \uBC1C\uC1A1\uD569\uB2C8\uB2E4. */\r\n smtpSend(req: SmtpSendRequest): Promise<{ ok: boolean; seq: number }> {\r\n return this.request(\"POST\", \"/v1/smtp/send\", req);\r\n }\r\n\r\n /** SMTP \uBC1C\uC1A1 \uC0C1\uD0DC\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n smtpStatus(seq: number): Promise<{ ok: boolean; status: string }> {\r\n return this.request(\"POST\", `/v1/smtp/status/${seq}`, {});\r\n }\r\n\r\n /** SMTP \uD15C\uD50C\uB9BF \uBBF8\uB9AC\uBCF4\uAE30 HTML\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n smtpTemplatePreview(templatePath: string): Promise<string> {\r\n const encoded = templatePath\r\n .split(\"/\")\r\n .map(encodeURIComponent)\r\n .join(\"/\");\r\n return fetch(`${this.baseUrl}/v1/smtp/template/${encoded}`, {\r\n credentials: \"include\",\r\n }).then((r) => r.text());\r\n }\r\n };\r\n}\r\n", "import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../client/base.js\";\r\n\r\nexport function TransactionMixin<\r\n TBase extends GConstructor<EntityServerClientBase>,\r\n>(Base: TBase) {\r\n return class TransactionMixinClass extends Base {\r\n /** \uD2B8\uB79C\uC7AD\uC158\uC744 \uC2DC\uC791\uD558\uACE0 transaction_id\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n transactionStart<T = unknown>(\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.request(\"POST\", \"/v1/transaction/start\", body ?? {});\r\n }\r\n\r\n /** \uC9C0\uC815\uD55C \uD2B8\uB79C\uC7AD\uC158\uC744 \uCEE4\uBC0B\uD569\uB2C8\uB2E4. */\r\n transactionCommit<T = unknown>(transactionId: string): Promise<T> {\r\n return this.request(\r\n \"POST\",\r\n `/v1/transaction/commit/${encodeURIComponent(transactionId)}`,\r\n {},\r\n );\r\n }\r\n\r\n /** \uC9C0\uC815\uD55C \uD2B8\uB79C\uC7AD\uC158\uC744 \uB864\uBC31\uD569\uB2C8\uB2E4. */\r\n transactionRollback<T = unknown>(transactionId: string): Promise<T> {\r\n return this.request(\r\n \"POST\",\r\n `/v1/transaction/rollback/${encodeURIComponent(transactionId)}`,\r\n {},\r\n );\r\n }\r\n };\r\n}\r\n", "import type {\r\n QRCodeOptions,\r\n BarcodeOptions,\r\n Pdf2PngOptions,\r\n} from \"../../types.js\";\r\nimport type { GConstructor, EntityServerClientBase } from \"../../client/base.js\";\r\n\r\nexport function UtilsMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class UtilsMixinClass extends Base {\r\n addressSido<T = unknown>(): Promise<T> {\r\n return this.http.get(\r\n \"/v1/utils/address/sido\",\r\n false,\r\n );\r\n }\r\n\r\n addressSigungu<T = unknown>(query: { sido: string }): Promise<T> {\r\n const qs = new URLSearchParams({ sido: query.sido }).toString();\r\n return this.http.get(\r\n `/v1/utils/address/sigungu?${qs}`,\r\n false,\r\n );\r\n }\r\n\r\n addressDong<T = unknown>(query: {\r\n sido: string;\r\n sigungu: string;\r\n }): Promise<T> {\r\n const qs = new URLSearchParams({\r\n sido: query.sido,\r\n sigungu: query.sigungu,\r\n }).toString();\r\n return this.http.get(\r\n `/v1/utils/address/dong?${qs}`,\r\n false,\r\n );\r\n }\r\n\r\n addressClean<T = unknown>(query: { q: string }): Promise<T> {\r\n const qs = new URLSearchParams({ q: query.q }).toString();\r\n return this.http.get(\r\n `/v1/utils/address/clean?${qs}`,\r\n false,\r\n );\r\n }\r\n\r\n // \u2500\u2500\u2500 Utils (QR / \uBC14\uCF54\uB4DC) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /**\r\n * QR \uCF54\uB4DC PNG\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4. `ArrayBuffer`\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.\r\n *\r\n * ```ts\r\n * const buf = await client.qrcode(\"https://example.com\");\r\n * const blob = new Blob([buf], { type: \"image/png\" });\r\n * img.src = URL.createObjectURL(blob);\r\n * ```\r\n */\r\n qrcode(\r\n content: string,\r\n opts: QRCodeOptions = {},\r\n ): Promise<ArrayBuffer> {\r\n return this.requestBinary(\"POST\", \"/v1/utils/qrcode\", {\r\n content,\r\n ...opts,\r\n });\r\n }\r\n\r\n /**\r\n * QR \uCF54\uB4DC\uB97C base64/data URI JSON\uC73C\uB85C \uBC18\uD658\uD569\uB2C8\uB2E4.\r\n *\r\n * ```ts\r\n * const { data_uri } = await client.qrcodeBase64(\"https://example.com\");\r\n * img.src = data_uri;\r\n * ```\r\n */\r\n qrcodeBase64(\r\n content: string,\r\n opts: QRCodeOptions = {},\r\n ): Promise<{ ok: boolean; data: string; data_uri: string }> {\r\n return this.request(\"POST\", \"/v1/utils/qrcode/base64\", {\r\n content,\r\n ...opts,\r\n });\r\n }\r\n\r\n /** QR \uCF54\uB4DC\uB97C ASCII \uC544\uD2B8 \uD14D\uC2A4\uD2B8\uB85C \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n qrcodeText(\r\n content: string,\r\n opts: QRCodeOptions = {},\r\n ): Promise<{ ok: boolean; text: string }> {\r\n return this.request(\"POST\", \"/v1/utils/qrcode/text\", {\r\n content,\r\n ...opts,\r\n });\r\n }\r\n\r\n /**\r\n * \uBC14\uCF54\uB4DC PNG\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4. `ArrayBuffer`\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.\r\n *\r\n * ```ts\r\n * const buf = await client.barcode(\"1234567890128\", { type: \"ean13\" });\r\n * ```\r\n */\r\n barcode(\r\n content: string,\r\n opts: BarcodeOptions = {},\r\n ): Promise<ArrayBuffer> {\r\n return this.requestBinary(\"POST\", \"/v1/utils/barcode\", {\r\n content,\r\n ...opts,\r\n });\r\n }\r\n\r\n /**\r\n * PDF\uB97C PNG \uC774\uBBF8\uC9C0\uB85C \uBCC0\uD658\uD569\uB2C8\uB2E4.\r\n *\r\n * \uB2E8\uC77C \uD398\uC774\uC9C0 \uC694\uCCAD\uC774\uBA74 `image/png` ArrayBuffer,\r\n * \uB2E4\uC911 \uD398\uC774\uC9C0 \uC694\uCCAD\uC774\uBA74 `application/zip` ArrayBuffer\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.\r\n *\r\n * ```ts\r\n * const buf = await client.pdf2png(pdfArrayBuffer, { dpi: 200 });\r\n * ```\r\n */\r\n pdf2png(\r\n pdfData: ArrayBuffer | Uint8Array<ArrayBuffer>,\r\n opts: Pdf2PngOptions = {},\r\n ): Promise<ArrayBuffer> {\r\n const form = new FormData();\r\n form.append(\r\n \"file\",\r\n new Blob([pdfData], { type: \"application/pdf\" }),\r\n \"document.pdf\",\r\n );\r\n const params = new URLSearchParams();\r\n if (opts.dpi != null) params.set(\"dpi\", String(opts.dpi));\r\n if (opts.firstPage != null)\r\n params.set(\"first_page\", String(opts.firstPage));\r\n if (opts.lastPage != null)\r\n params.set(\"last_page\", String(opts.lastPage));\r\n const qs = params.toString();\r\n const path = \"/v1/utils/pdf2png\" + (qs ? `?${qs}` : \"\");\r\n return this.requestFormBinary(\"POST\", path, form);\r\n }\r\n\r\n pdf2pngByFileSeq(\r\n fileSeq: number,\r\n opts: Pdf2PngOptions = {},\r\n ): Promise<ArrayBuffer> {\r\n return this.requestBinary(\r\n \"POST\",\r\n `/v1/utils/pdf2png/${fileSeq}`,\r\n opts,\r\n );\r\n }\r\n\r\n pdf2jpg(\r\n pdfData: ArrayBuffer | Uint8Array<ArrayBuffer>,\r\n opts: Pdf2PngOptions = {},\r\n ): Promise<ArrayBuffer> {\r\n const form = new FormData();\r\n form.append(\r\n \"file\",\r\n new Blob([pdfData], { type: \"application/pdf\" }),\r\n \"document.pdf\",\r\n );\r\n const params = new URLSearchParams();\r\n if (opts.dpi != null) params.set(\"dpi\", String(opts.dpi));\r\n if (opts.firstPage != null)\r\n params.set(\"first_page\", String(opts.firstPage));\r\n if (opts.lastPage != null)\r\n params.set(\"last_page\", String(opts.lastPage));\r\n const qs = params.toString();\r\n const path = \"/v1/utils/pdf2jpg\" + (qs ? `?${qs}` : \"\");\r\n return this.requestFormBinary(\"POST\", path, form);\r\n }\r\n\r\n pdf2jpgByFileSeq(\r\n fileSeq: number,\r\n opts: Pdf2PngOptions = {},\r\n ): Promise<ArrayBuffer> {\r\n return this.requestBinary(\r\n \"POST\",\r\n `/v1/utils/pdf2jpg/${fileSeq}`,\r\n opts,\r\n );\r\n }\r\n };\r\n}\r\n", "import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../client/base.js\";\r\n\r\nexport function AdminMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class AdminMixinClass extends Base {\r\n adminPath(path: string): string {\r\n return `/v1/admin${path}`;\r\n }\r\n\r\n adminGet<T>(path: string): Promise<T> {\r\n return this.http.get(this.adminPath(path));\r\n }\r\n\r\n adminPost<T>(path: string, body?: unknown): Promise<T> {\r\n return this.http.post(this.adminPath(path), body);\r\n }\r\n\r\n adminPut<T>(path: string, body?: unknown): Promise<T> {\r\n return this.http.put(this.adminPath(path), body);\r\n }\r\n\r\n adminPatch<T>(path: string, body?: unknown): Promise<T> {\r\n return this.http.patch(this.adminPath(path), body);\r\n }\r\n\r\n adminDelete<T>(path: string, body?: unknown): Promise<T> {\r\n return this.http.delete(this.adminPath(path), body);\r\n }\r\n\r\n listAdminEntities<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/entities\");\r\n }\r\n\r\n getAdminErdSchema<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/erd/schema\");\r\n }\r\n\r\n batchEnsureAdminEntities<T = unknown>(configs: unknown[]): Promise<T> {\r\n return this.adminPost(\"/entities/batch-ensure\", configs);\r\n }\r\n\r\n createAdminEntityConfig<T = unknown>(\r\n entity: string,\r\n config: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(`/${entity}/create`, config);\r\n }\r\n\r\n getAdminEntityConfig<T = unknown>(entity: string): Promise<T> {\r\n return this.adminGet(`/${entity}/config`);\r\n }\r\n\r\n updateAdminEntityConfig<T = unknown>(\r\n entity: string,\r\n config: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPut(`/${entity}/config`, config);\r\n }\r\n\r\n validateAdminEntityConfig<T = unknown>(\r\n config: Record<string, unknown>,\r\n entity?: string,\r\n ): Promise<T> {\r\n return this.adminPost(\r\n entity ? `/${entity}/validate` : \"/entity/validate\",\r\n config,\r\n );\r\n }\r\n\r\n normalizeAdminEntityConfig<T = unknown>(\r\n config: Record<string, unknown>,\r\n entity?: string,\r\n ): Promise<T> {\r\n return this.adminPost(\r\n entity ? `/${entity}/normalize` : \"/entity/normalize\",\r\n config,\r\n );\r\n }\r\n\r\n getAdminEntityStats<T = unknown>(\r\n entity: string,\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(`/${entity}/stats`, body);\r\n }\r\n\r\n reindexAdminEntity<T = unknown>(entity: string): Promise<T> {\r\n return this.adminPost(`/${entity}/reindex`);\r\n }\r\n\r\n syncAdminEntitySchema<T = unknown>(entity: string): Promise<T> {\r\n return this.adminPost(`/${entity}/sync-schema`);\r\n }\r\n\r\n resetAdminEntity<T = unknown>(entity: string): Promise<T> {\r\n return this.adminPost(`/${entity}/reset`);\r\n }\r\n\r\n truncateAdminEntity<T = unknown>(entity: string): Promise<T> {\r\n return this.adminPost(`/${entity}/truncate`);\r\n }\r\n\r\n dropAdminEntity<T = unknown>(entity: string): Promise<T> {\r\n return this.adminPost(`/${entity}/drop`);\r\n }\r\n\r\n resetAllAdmin<T = unknown>(body?: Record<string, unknown>): Promise<T> {\r\n return this.adminPost(\"/reset-all\", body);\r\n }\r\n\r\n listAdminConfigs<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/configs\");\r\n }\r\n\r\n getAdminConfig<T = unknown>(domain: string): Promise<T> {\r\n return this.adminGet(`/configs/${domain}`);\r\n }\r\n\r\n updateAdminConfig<T = unknown>(\r\n domain: string,\r\n patch: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPatch(`/configs/${domain}`, patch);\r\n }\r\n\r\n listAdminRoles<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/roles\");\r\n }\r\n\r\n createAdminRole<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/roles\", body);\r\n }\r\n\r\n getAdminRole<T = unknown>(seq: number): Promise<T> {\r\n return this.adminGet(`/roles/${seq}`);\r\n }\r\n\r\n updateAdminRole<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPatch(`/roles/${seq}`, body);\r\n }\r\n\r\n deleteAdminRole<T = unknown>(seq: number): Promise<T> {\r\n return this.adminDelete(`/roles/${seq}`);\r\n }\r\n\r\n listAdminApiKeys<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/api-keys\");\r\n }\r\n\r\n createAdminApiKey<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/api-keys\", body);\r\n }\r\n\r\n getAdminApiKey<T = unknown>(seq: number): Promise<T> {\r\n return this.adminGet(`/api-keys/${seq}`);\r\n }\r\n\r\n updateAdminApiKey<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPatch(`/api-keys/${seq}`, body);\r\n }\r\n\r\n deleteAdminApiKey<T = unknown>(seq: number): Promise<T> {\r\n return this.adminDelete(`/api-keys/${seq}`);\r\n }\r\n\r\n regenerateAdminApiKeySecret<T = unknown>(seq: number): Promise<T> {\r\n return this.adminPost(`/api-keys/${seq}/regenerate-secret`);\r\n }\r\n\r\n listAdminAccounts<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/accounts\");\r\n }\r\n\r\n createAdminAccount<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/accounts\", body);\r\n }\r\n\r\n getAdminAccount<T = unknown>(seq: number): Promise<T> {\r\n return this.adminGet(`/accounts/${seq}`);\r\n }\r\n\r\n updateAdminAccount<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPatch(`/accounts/${seq}`, body);\r\n }\r\n\r\n deleteAdminAccount<T = unknown>(seq: number): Promise<T> {\r\n return this.adminDelete(`/accounts/${seq}`);\r\n }\r\n\r\n listAdminLicenses<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/licenses\");\r\n }\r\n\r\n createAdminLicense<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/licenses\", body);\r\n }\r\n\r\n getAdminLicense<T = unknown>(seq: number): Promise<T> {\r\n return this.adminGet(`/licenses/${seq}`);\r\n }\r\n\r\n updateAdminLicense<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPatch(`/licenses/${seq}`, body);\r\n }\r\n\r\n deleteAdminLicense<T = unknown>(seq: number): Promise<T> {\r\n return this.adminDelete(`/licenses/${seq}`);\r\n }\r\n\r\n runAdminBackup<T = unknown>(\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/backup/run\", body);\r\n }\r\n\r\n getAdminBackupStatus<T = unknown>(\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/backup/status\", body);\r\n }\r\n\r\n listAdminBackups<T = unknown>(\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/backup/list\", body);\r\n }\r\n\r\n restoreAdminBackup<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/backup/restore\", body);\r\n }\r\n\r\n deleteAdminBackup<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/backup/delete\", body);\r\n }\r\n\r\n disableAdminAccountTwoFactor<T = unknown>(seq: number): Promise<T> {\r\n return this.adminDelete(`/accounts/${seq}/2fa`);\r\n }\r\n };\r\n}\r\n", "/**\r\n * @file EntityServerApi.ts\r\n * entity-server core route\uC6A9 Mixin \uC870\uD569 \uD074\uB77C\uC774\uC5B8\uD2B8.\r\n *\r\n * \uC808(section)\uBCC4 \uAD6C\uD604:\r\n * src/client/base.ts \u2014 \uC0C1\uD0DC\u00B7\uC0DD\uC131\uC790\u00B7\uACF5\uD1B5 \uD5EC\uD37C\r\n * src/mixins/server/* \u2014 entity-server core route mixin\r\n * src/mixins/app/* \u2014 entity-app-server plugin mixin\r\n */\r\nimport { EntityServerClientBase } from \"./client/base.js\";\r\nimport {\r\n AdminMixin,\r\n AuthMixin,\r\n EntityMixin,\r\n FileMixin,\r\n PushMixin,\r\n SmtpMixin,\r\n TransactionMixin,\r\n UtilsMixin,\r\n} from \"./mixins/server/index.js\";\r\n\r\n// \u2500\u2500\u2500 Composed class \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\nexport class EntityServerApi extends UtilsMixin(\r\n TransactionMixin(\r\n FileMixin(\r\n SmtpMixin(\r\n PushMixin(\r\n AdminMixin(EntityMixin(AuthMixin(EntityServerClientBase))),\r\n ),\r\n ),\r\n ),\r\n ),\r\n) {}\r\n", "import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function AccountAppMixin<\r\n TBase extends GConstructor<EntityServerClientBase>,\r\n>(Base: TBase) {\r\n return class AccountAppMixinClass extends Base {\r\n accountRegister<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/account/register\",\r\n body,\r\n false,\r\n );\r\n }\r\n\r\n accountWithdraw<T = unknown>(\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\"/v1/account/withdraw\", body);\r\n }\r\n\r\n accountChangePassword<T = unknown>(body: {\r\n current_password: string;\r\n new_password: string;\r\n }): Promise<T> {\r\n return this.http.post(\r\n \"/v1/account/change-password\",\r\n body,\r\n );\r\n }\r\n\r\n accountReactivate<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/account/reactivate\",\r\n body,\r\n false,\r\n );\r\n }\r\n\r\n listAccountBiometrics<T = unknown>(): Promise<T> {\r\n return this.http.get(\"/v1/account/biometric\");\r\n }\r\n\r\n registerAccountBiometric<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\"/v1/account/biometric\", body);\r\n }\r\n\r\n deleteAccountBiometric<T = unknown>(seq: number): Promise<T> {\r\n return this.http.delete(`/v1/account/biometric/${seq}`);\r\n }\r\n };\r\n}\r\n", "import { buildQuery } from \"../../../client/utils.js\";\r\nimport type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function BoardMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class BoardMixinClass extends Base {\r\n listBoardCategories<T = unknown>(\r\n query: Record<string, unknown> = {},\r\n ): Promise<T> {\r\n const qs = buildQuery(query);\r\n return this.http.get(\r\n `/v1/board/categories${qs ? `?${qs}` : \"\"}`,\r\n false,\r\n );\r\n }\r\n\r\n getBoardCategory<T = unknown>(seq: number): Promise<T> {\r\n return this.http.get(\r\n `/v1/board/categories/${seq}`,\r\n false,\r\n );\r\n }\r\n\r\n createBoardCategory<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\"/v1/board/categories\", body);\r\n }\r\n\r\n updateBoardCategory<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.put(`/v1/board/categories/${seq}`, body);\r\n }\r\n\r\n deleteBoardCategory<T = unknown>(seq: number): Promise<T> {\r\n return this.http.delete(`/v1/board/categories/${seq}`);\r\n }\r\n\r\n listBoardPosts<T = unknown>(\r\n category: string,\r\n query: Record<string, unknown> = {},\r\n ): Promise<T> {\r\n const qs = buildQuery(query);\r\n return this.http.get(`/v1/board/${category}/list${qs ? `?${qs}` : \"\"}`);\r\n }\r\n\r\n getBoardPost<T = unknown>(seq: number): Promise<T> {\r\n return this.http.get(`/v1/board/posts/${seq}`);\r\n }\r\n\r\n createBoardPost<T = unknown>(\r\n category: string,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n `/v1/board/${category}/submit`,\r\n body,\r\n );\r\n }\r\n\r\n updateBoardPost<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.put(`/v1/board/posts/${seq}`, body);\r\n }\r\n\r\n deleteBoardPost<T = unknown>(seq: number): Promise<T> {\r\n return this.http.delete(`/v1/board/posts/${seq}`);\r\n }\r\n\r\n listBoardComments<T = unknown>(\r\n postSeq: number,\r\n query: Record<string, unknown> = {},\r\n ): Promise<T> {\r\n const qs = buildQuery(query);\r\n return this.http.get(\r\n `/v1/board/posts/${postSeq}/comments${qs ? `?${qs}` : \"\"}`,\r\n false,\r\n );\r\n }\r\n\r\n createBoardComment<T = unknown>(\r\n postSeq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n `/v1/board/posts/${postSeq}/comments/submit`,\r\n body,\r\n );\r\n }\r\n\r\n updateBoardComment<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.put(`/v1/board/comments/${seq}`, body);\r\n }\r\n\r\n deleteBoardComment<T = unknown>(seq: number): Promise<T> {\r\n return this.http.delete(`/v1/board/comments/${seq}`);\r\n }\r\n\r\n listBoardFiles<T = unknown>(postSeq: number): Promise<T> {\r\n return this.http.get(\r\n `/v1/board/posts/${postSeq}/files`,\r\n false,\r\n );\r\n }\r\n\r\n async uploadBoardFile<T = unknown>(\r\n postSeq: number,\r\n file: File | Blob,\r\n ): Promise<T> {\r\n const form = new FormData();\r\n form.append(\r\n \"file\",\r\n file,\r\n file instanceof File ? file.name : \"upload\",\r\n );\r\n return this.requestForm(\r\n \"POST\",\r\n `/v1/board/posts/${postSeq}/files`,\r\n form,\r\n );\r\n }\r\n\r\n boardFileUrl(uuid: string): string {\r\n return `${this.baseUrl}/v1/board/files/${uuid}`;\r\n }\r\n\r\n deleteBoardFile<T = unknown>(uuid: string): Promise<T> {\r\n return this.http.delete(`/v1/board/files/${uuid}`);\r\n }\r\n\r\n createBoardGuestPost<T = unknown>(\r\n category: string,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n `/v1/board/${category}/guest-submit`,\r\n body,\r\n false,\r\n );\r\n }\r\n\r\n authenticateBoardGuestPost<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n `/v1/board/posts/${seq}/guest-auth`,\r\n body,\r\n false,\r\n );\r\n }\r\n\r\n toggleBoardPostLike<T = unknown>(seq: number): Promise<T> {\r\n return this.http.post(`/v1/board/posts/${seq}/like`, {});\r\n }\r\n\r\n acceptBoardPost<T = unknown>(seq: number): Promise<T> {\r\n return this.http.post(\r\n `/v1/board/posts/${seq}/accept`,\r\n {},\r\n );\r\n }\r\n\r\n rateBoardPost<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n `/v1/board/posts/${seq}/rating`,\r\n body,\r\n );\r\n }\r\n\r\n rateBoardComment<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n `/v1/board/comments/${seq}/rating`,\r\n body,\r\n );\r\n }\r\n\r\n listBoardTags<T = unknown>(\r\n query: Record<string, unknown> = {},\r\n ): Promise<T> {\r\n const qs = buildQuery(query);\r\n return this.http.get(\r\n `/v1/board/tags${qs ? `?${qs}` : \"\"}`,\r\n false,\r\n );\r\n }\r\n\r\n setBoardPostTags<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.put(`/v1/board/posts/${seq}/tags`, body);\r\n }\r\n\r\n reportBoardPost<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n `/v1/board/posts/${seq}/report`,\r\n body,\r\n );\r\n }\r\n\r\n reportBoardComment<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n `/v1/board/comments/${seq}/report`,\r\n body,\r\n );\r\n }\r\n\r\n listBoardReports<T = unknown>(\r\n query: Record<string, unknown> = {},\r\n ): Promise<T> {\r\n const qs = buildQuery(query);\r\n return this.http.get(\r\n `/v1/board/admin/reports${qs ? `?${qs}` : \"\"}`,\r\n );\r\n }\r\n\r\n updateBoardReport<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.patch(\r\n `/v1/board/admin/reports/${seq}`,\r\n body,\r\n );\r\n }\r\n\r\n markBoardPostRead<T = unknown>(seq: number): Promise<T> {\r\n return this.http.post(`/v1/board/posts/${seq}/read`, {});\r\n }\r\n\r\n listBoardMentions<T = unknown>(\r\n query: Record<string, unknown> = {},\r\n ): Promise<T> {\r\n const qs = buildQuery(query);\r\n return this.http.get(\r\n `/v1/board/mentions${qs ? `?${qs}` : \"\"}`,\r\n );\r\n }\r\n\r\n markBoardMentionRead<T = unknown>(seq: number): Promise<T> {\r\n return this.http.patch(\r\n `/v1/board/mentions/${seq}/read`,\r\n {},\r\n );\r\n }\r\n };\r\n}\r\n", "import { buildQuery } from \"../../../client/utils.js\";\r\nimport type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function EmailVerifyMixin<\r\n TBase extends GConstructor<EntityServerClientBase>,\r\n>(Base: TBase) {\r\n return class EmailVerifyMixinClass extends Base {\r\n sendEmailVerification<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/email-verify/send\",\r\n body,\r\n false,\r\n );\r\n }\r\n\r\n confirmEmailVerification<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/email-verify/confirm\",\r\n body,\r\n false,\r\n );\r\n }\r\n\r\n activateEmailVerification<T = unknown>(\r\n query: Record<string, unknown>,\r\n ): Promise<T> {\r\n const qs = buildQuery(query);\r\n return this.http.get(\r\n `/v1/email-verify/activate${qs ? `?${qs}` : \"\"}`,\r\n false,\r\n );\r\n }\r\n\r\n getEmailVerificationStatus<T = unknown>(): Promise<T> {\r\n return this.http.get(\"/v1/email-verify/status\");\r\n }\r\n\r\n changeVerifiedEmail<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\"/v1/email-verify/change\", body);\r\n }\r\n };\r\n}\r\n", "import { buildQuery } from \"../../../client/utils.js\";\r\nimport type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function OAuthMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class OAuthMixinClass extends Base {\r\n oauthAuthorizeUrl(\r\n provider: string,\r\n query: Record<string, unknown> = {},\r\n ): string {\r\n const qs = buildQuery(query);\r\n return `${this.baseUrl}/v1/oauth/${provider}${qs ? `?${qs}` : \"\"}`;\r\n }\r\n\r\n oauthCallback<T = unknown>(\r\n provider: string,\r\n payload?: Record<string, unknown>,\r\n method: \"GET\" | \"POST\" = \"POST\",\r\n ): Promise<T> {\r\n if (method === \"GET\") {\r\n const qs = buildQuery(payload ?? {});\r\n return this.http.get(\r\n `/v1/oauth/${provider}/callback${qs ? `?${qs}` : \"\"}`,\r\n false,\r\n );\r\n }\r\n\r\n return this.http.post(\r\n `/v1/oauth/${provider}/callback`,\r\n payload,\r\n false,\r\n );\r\n }\r\n\r\n linkOAuthAccount<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\"/v1/account/oauth/link\", body);\r\n }\r\n\r\n unlinkOAuthAccount<T = unknown>(provider: string): Promise<T> {\r\n return this.http.delete(\r\n `/v1/account/oauth/link/${provider}`,\r\n );\r\n }\r\n\r\n listOAuthProviders<T = unknown>(): Promise<T> {\r\n return this.http.get(\"/v1/account/oauth/providers\");\r\n }\r\n\r\n refreshOAuthProviderToken<T = unknown>(\r\n provider: string,\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n `/v1/account/oauth/refresh/${provider}`,\r\n body,\r\n );\r\n }\r\n };\r\n}\r\n", "import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function PasswordResetMixin<\r\n TBase extends GConstructor<EntityServerClientBase>,\r\n>(Base: TBase) {\r\n return class PasswordResetMixinClass extends Base {\r\n requestPasswordReset<T = unknown>(\r\n body: { email: string } | Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/password-reset/request\",\r\n body,\r\n false,\r\n );\r\n }\r\n\r\n validatePasswordResetToken<T = unknown>(token: string): Promise<T> {\r\n return this.http.get(\r\n `/v1/password-reset/validate/${encodeURIComponent(token)}`,\r\n false,\r\n );\r\n }\r\n\r\n verifyPasswordReset<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/password-reset/verify\",\r\n body,\r\n false,\r\n );\r\n }\r\n };\r\n}\r\n", "import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function TwoFactorMixin<\r\n TBase extends GConstructor<EntityServerClientBase>,\r\n>(Base: TBase) {\r\n return class TwoFactorMixinClass extends Base {\r\n setupTwoFactor<T = unknown>(\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\"/v1/account/2fa/setup\", body);\r\n }\r\n\r\n verifyTwoFactorSetup<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/account/2fa/setup/verify\",\r\n body,\r\n false,\r\n );\r\n }\r\n\r\n disableTwoFactor<T = unknown>(): Promise<T> {\r\n return this.http.delete(\"/v1/account/2fa\");\r\n }\r\n\r\n getTwoFactorStatus<T = unknown>(): Promise<T> {\r\n return this.http.get(\"/v1/account/2fa/status\");\r\n }\r\n\r\n regenerateTwoFactorRecoveryCodes<T = unknown>(): Promise<T> {\r\n return this.http.post(\r\n \"/v1/account/2fa/recovery/regenerate\",\r\n );\r\n }\r\n\r\n verifyTwoFactor<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/account/2fa/verify\",\r\n body,\r\n false,\r\n );\r\n }\r\n\r\n recoverTwoFactorAccess<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/account/2fa/recovery\",\r\n body,\r\n false,\r\n );\r\n }\r\n };\r\n}\r\n", "import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function AlimtalkMixin<\r\n TBase extends GConstructor<EntityServerClientBase>,\r\n>(Base: TBase) {\r\n return class AlimtalkMixinClass extends Base {\r\n /** \uC54C\uB9BC\uD1A1\uC744 \uBC1C\uC1A1\uD569\uB2C8\uB2E4. */\r\n alimtalkSend<T = unknown>(body: Record<string, unknown>): Promise<T> {\r\n return this.http.post(\"/v1/alimtalk/send\", body);\r\n }\r\n\r\n /** \uC54C\uB9BC\uD1A1 \uBC1C\uC1A1 \uC0C1\uD0DC\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n alimtalkStatus<T = unknown>(seq: number): Promise<T> {\r\n return this.http.get(\r\n `/v1/alimtalk/status/${seq}`,\r\n false,\r\n );\r\n }\r\n\r\n /** \uC54C\uB9BC\uD1A1 \uD15C\uD50C\uB9BF \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n listAlimtalkTemplates<T = unknown>(): Promise<T> {\r\n return this.http.get(\r\n \"/v1/alimtalk/templates\",\r\n false,\r\n );\r\n }\r\n\r\n /** \uC54C\uB9BC\uD1A1 \uC6F9\uD6C5\uC744 \uC218\uC2E0\uD569\uB2C8\uB2E4. */\r\n alimtalkWebhook<T = unknown>(\r\n provider: string,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n `/v1/alimtalk/webhook/${encodeURIComponent(provider)}`,\r\n body,\r\n false,\r\n );\r\n }\r\n };\r\n}\r\n", "import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function FriendtalkMixin<\r\n TBase extends GConstructor<EntityServerClientBase>,\r\n>(Base: TBase) {\r\n return class FriendtalkMixinClass extends Base {\r\n /** \uCE5C\uAD6C\uD1A1\uC744 \uBC1C\uC1A1\uD569\uB2C8\uB2E4. */\r\n friendtalkSend<T = unknown>(body: Record<string, unknown>): Promise<T> {\r\n return this.http.post(\"/v1/friendtalk/send\", body);\r\n }\r\n };\r\n}\r\n", "import { buildQuery } from \"../../../client/utils.js\";\r\nimport type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function HolidaysMixin<\r\n TBase extends GConstructor<EntityServerClientBase>,\r\n>(Base: TBase) {\r\n return class HolidaysMixinClass extends Base {\r\n /** \uACF5\uD734\uC77C \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n listHolidays<T = unknown>(\r\n query: {\r\n year?: number;\r\n month?: number;\r\n is_holiday?: \"Y\" | \"N\";\r\n } = {},\r\n ): Promise<T> {\r\n const qs = buildQuery(query as Record<string, unknown>);\r\n return this.http.get(\r\n `/v1/holidays${qs ? `?${qs}` : \"\"}`,\r\n false,\r\n );\r\n }\r\n\r\n /** \uD2B9\uC815 \uB0A0\uC9DC\uC758 \uACF5\uD734\uC77C \uC815\uBCF4\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. (e.g. \"20250101\") */\r\n getHolidayByDate<T = unknown>(locdate: string): Promise<T> {\r\n return this.http.get(\r\n `/v1/holidays/${encodeURIComponent(locdate)}`,\r\n false,\r\n );\r\n }\r\n\r\n /** \uACF5\uD734\uC77C \uB370\uC774\uD130\uB97C \uB3D9\uAE30\uD654\uD569\uB2C8\uB2E4. (\uAD00\uB9AC\uC790 \uC804\uC6A9) */\r\n syncHolidays<T = unknown>(body?: Record<string, unknown>): Promise<T> {\r\n return this.http.post(\"/v1/holidays/sync\", body);\r\n }\r\n };\r\n}\r\n", "import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function IdentityMixin<\r\n TBase extends GConstructor<EntityServerClientBase>,\r\n>(Base: TBase) {\r\n return class IdentityMixinClass extends Base {\r\n /** \uBCF8\uC778\uC778\uC99D \uC694\uCCAD\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4. */\r\n identityRequest<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/identity/request\",\r\n body,\r\n false,\r\n );\r\n }\r\n\r\n /** \uBCF8\uC778\uC778\uC99D \uC911\uACC4\uC0AC \uCF5C\uBC31\uC744 \uC218\uC2E0\uD569\uB2C8\uB2E4. */\r\n identityCallback<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/identity/callback\",\r\n body,\r\n false,\r\n );\r\n }\r\n\r\n /** \uBCF8\uC778\uC778\uC99D \uACB0\uACFC\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n identityResult<T = unknown>(requestId: string): Promise<T> {\r\n return this.http.get(\r\n `/v1/identity/result/${encodeURIComponent(requestId)}`,\r\n false,\r\n );\r\n }\r\n\r\n /** CI \uC911\uBCF5 \uC5EC\uBD80\uB97C \uD655\uC778\uD569\uB2C8\uB2E4. (JWT \uD544\uC694) */\r\n identityVerifyCI<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\"/v1/identity/verify-ci\", body);\r\n }\r\n };\r\n}\r\n", "import { buildQuery } from \"../../../client/utils.js\";\r\nimport type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function LlmMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class LlmMixinClass extends Base {\r\n // \u2500\u2500 \uCC44\uD305 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** LLM \uCC44\uD305 \uC751\uB2F5\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n llmChat<T = unknown>(body: Record<string, unknown>): Promise<T> {\r\n return this.http.post(\"/v1/llm/chat\", body);\r\n }\r\n\r\n /** LLM \uCC44\uD305 \uC2A4\uD2B8\uB9BC \uC751\uB2F5\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n llmChatStream<T = unknown>(body: Record<string, unknown>): Promise<T> {\r\n return this.http.post(\"/v1/llm/chat/stream\", body);\r\n }\r\n\r\n // \u2500\u2500 \uB300\uD654 \uC138\uC158 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** \uB300\uD654 \uC138\uC158\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4. */\r\n createLlmConversation<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\"/v1/llm/conversations\", body);\r\n }\r\n\r\n /** \uB300\uD654 \uC138\uC158\uC5D0 \uBA54\uC2DC\uC9C0\uB97C \uC804\uC1A1\uD569\uB2C8\uB2E4. */\r\n sendLlmMessage<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n `/v1/llm/conversations/${seq}/messages`,\r\n body,\r\n );\r\n }\r\n\r\n /** \uB300\uD654 \uC138\uC158 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n listLlmConversations<T = unknown>(\r\n query: Record<string, unknown> = {},\r\n ): Promise<T> {\r\n const qs = buildQuery(query);\r\n return this.http.get(\r\n `/v1/llm/conversations${qs ? `?${qs}` : \"\"}`,\r\n );\r\n }\r\n\r\n /** \uB300\uD654 \uC138\uC158 \uC0C1\uC138\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n getLlmConversation<T = unknown>(seq: number): Promise<T> {\r\n return this.http.get(`/v1/llm/conversations/${seq}`);\r\n }\r\n\r\n /** \uB300\uD654 \uC138\uC158\uC744 \uC218\uC815\uD569\uB2C8\uB2E4. */\r\n updateLlmConversation<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.patch(\r\n `/v1/llm/conversations/${seq}`,\r\n body,\r\n );\r\n }\r\n\r\n /** \uB300\uD654 \uC138\uC158\uC744 \uC0AD\uC81C\uD569\uB2C8\uB2E4. */\r\n deleteLlmConversation<T = unknown>(seq: number): Promise<T> {\r\n return this.http.delete(`/v1/llm/conversations/${seq}`);\r\n }\r\n\r\n // \u2500\u2500 RAG \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** RAG \uBB38\uC11C\uB97C \uC5C5\uB85C\uB4DC\uD569\uB2C8\uB2E4. */\r\n ragUploadDocument<T = unknown>(form: FormData): Promise<T> {\r\n return this.requestForm(\"POST\", \"/v1/llm/rag/documents\", form);\r\n }\r\n\r\n /** RAG \uBB38\uC11C \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n ragListDocuments<T = unknown>(\r\n query: Record<string, unknown> = {},\r\n ): Promise<T> {\r\n const qs = buildQuery(query);\r\n return this.http.get(\r\n `/v1/llm/rag/documents${qs ? `?${qs}` : \"\"}`,\r\n );\r\n }\r\n\r\n /** RAG \uBB38\uC11C\uB97C \uC0AD\uC81C\uD569\uB2C8\uB2E4. */\r\n ragDeleteDocument<T = unknown>(id: string): Promise<T> {\r\n return this.http.delete(\r\n `/v1/llm/rag/documents/${encodeURIComponent(id)}`,\r\n );\r\n }\r\n\r\n /** RAG \uAC80\uC0C9\uC744 \uC218\uD589\uD569\uB2C8\uB2E4. */\r\n ragSearch<T = unknown>(body: Record<string, unknown>): Promise<T> {\r\n return this.http.post(\"/v1/llm/rag/search\", body);\r\n }\r\n\r\n /** RAG \uAE30\uBC18 \uCC44\uD305 \uC751\uB2F5\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n ragChat<T = unknown>(body: Record<string, unknown>): Promise<T> {\r\n return this.http.post(\"/v1/llm/rag/chat\", body);\r\n }\r\n\r\n /** RAG \uAE30\uBC18 \uCC44\uD305 \uC2A4\uD2B8\uB9BC \uC751\uB2F5\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n ragChatStream<T = unknown>(body: Record<string, unknown>): Promise<T> {\r\n return this.http.post(\"/v1/llm/rag/chat/stream\", body);\r\n }\r\n\r\n /** RAG \uC778\uB371\uC2A4\uB97C \uC7AC\uAD6C\uCD95\uD569\uB2C8\uB2E4. */\r\n ragRebuildIndex<T = unknown>(\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\"/v1/llm/rag/rebuild-index\", body);\r\n }\r\n\r\n // \u2500\u2500 \uD504\uB85C\uBC14\uC774\uB354 / \uC0AC\uC6A9\uB7C9 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** LLM \uD504\uB85C\uBC14\uC774\uB354 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n listLlmProviders<T = unknown>(): Promise<T> {\r\n return this.http.get(\"/v1/llm/providers\");\r\n }\r\n\r\n /** LLM \uC0AC\uC6A9\uB7C9\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n getLlmUsage<T = unknown>(\r\n query: Record<string, unknown> = {},\r\n ): Promise<T> {\r\n const qs = buildQuery(query);\r\n return this.http.get(\r\n `/v1/llm/usage${qs ? `?${qs}` : \"\"}`,\r\n );\r\n }\r\n\r\n /** LLM \uC0AC\uC6A9\uB7C9 \uC694\uC57D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n getLlmUsageSummary<T = unknown>(\r\n query: Record<string, unknown> = {},\r\n ): Promise<T> {\r\n const qs = buildQuery(query);\r\n return this.http.get(\r\n `/v1/llm/usage/summary${qs ? `?${qs}` : \"\"}`,\r\n );\r\n }\r\n\r\n // \u2500\u2500 \uCE90\uC2DC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** LLM \uCE90\uC2DC \uD1B5\uACC4\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n getLlmCacheStats<T = unknown>(): Promise<T> {\r\n return this.http.get(\"/v1/llm/cache/stats\");\r\n }\r\n\r\n /** LLM \uCE90\uC2DC\uB97C \uCD08\uAE30\uD654\uD569\uB2C8\uB2E4. */\r\n clearLlmCache<T = unknown>(): Promise<T> {\r\n return this.http.delete(\"/v1/llm/cache\");\r\n }\r\n\r\n // \u2500\u2500 \uD504\uB86C\uD504\uD2B8 \uD15C\uD50C\uB9BF \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** \uD504\uB86C\uD504\uD2B8 \uD15C\uD50C\uB9BF \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n listLlmTemplates<T = unknown>(): Promise<T> {\r\n return this.http.get(\"/v1/llm/templates\");\r\n }\r\n\r\n /** \uD15C\uD50C\uB9BF \uAE30\uBC18 \uCC44\uD305 \uC751\uB2F5\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n llmTemplateChat<T = unknown>(\r\n name: string,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n `/v1/llm/${encodeURIComponent(name)}/chat`,\r\n body,\r\n );\r\n }\r\n\r\n /** \uD15C\uD50C\uB9BF \uAE30\uBC18 \uCC44\uD305 \uC2A4\uD2B8\uB9BC \uC751\uB2F5\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n llmTemplateChatStream<T = unknown>(\r\n name: string,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n `/v1/llm/${encodeURIComponent(name)}/chat/stream`,\r\n body,\r\n );\r\n }\r\n\r\n // \u2500\u2500 \uCC57\uBD07 \uAD00\uB9AC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** \uCC57\uBD07 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n listLlmChatbots<T = unknown>(\r\n query: Record<string, unknown> = {},\r\n ): Promise<T> {\r\n const qs = buildQuery(query);\r\n return this.http.get(\r\n `/v1/llm/chatbots${qs ? `?${qs}` : \"\"}`,\r\n );\r\n }\r\n\r\n /** \uCC57\uBD07\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4. */\r\n createLlmChatbot<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\"/v1/llm/chatbots\", body);\r\n }\r\n\r\n /** \uCC57\uBD07 \uC0C1\uC138\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n getLlmChatbot<T = unknown>(seq: number): Promise<T> {\r\n return this.http.get(`/v1/llm/chatbots/${seq}`);\r\n }\r\n\r\n /** \uCC57\uBD07\uC744 \uC218\uC815\uD569\uB2C8\uB2E4. */\r\n updateLlmChatbot<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.patch(`/v1/llm/chatbots/${seq}`, body);\r\n }\r\n\r\n /** \uCC57\uBD07\uC744 \uC0AD\uC81C\uD569\uB2C8\uB2E4. */\r\n deleteLlmChatbot<T = unknown>(seq: number): Promise<T> {\r\n return this.http.delete(`/v1/llm/chatbots/${seq}`);\r\n }\r\n\r\n // \u2500\u2500 \uCC57\uBD07 \uCC44\uD305 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** \uCC57\uBD07\uACFC \uCC44\uD305\uD569\uB2C8\uB2E4. */\r\n llmChatbotChat<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n `/v1/llm/chatbots/${seq}/chat`,\r\n body,\r\n );\r\n }\r\n\r\n /** \uCC57\uBD07\uACFC \uCC44\uD305 \uC2A4\uD2B8\uB9BC \uC751\uB2F5\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n llmChatbotChatStream<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n `/v1/llm/chatbots/${seq}/chat/stream`,\r\n body,\r\n );\r\n }\r\n\r\n // \u2500\u2500 \uCC57\uBD07 \uC138\uC158 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** \uCC57\uBD07 \uC138\uC158 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n listLlmChatbotSessions<T = unknown>(\r\n seq: number,\r\n query: Record<string, unknown> = {},\r\n ): Promise<T> {\r\n const qs = buildQuery(query);\r\n return this.http.get(\r\n `/v1/llm/chatbots/${seq}/sessions${qs ? `?${qs}` : \"\"}`,\r\n );\r\n }\r\n\r\n /** \uCC57\uBD07 \uC138\uC158\uC744 \uC0AD\uC81C\uD569\uB2C8\uB2E4. */\r\n deleteLlmChatbotSession<T = unknown>(\r\n seq: number,\r\n sessionSeq: number,\r\n ): Promise<T> {\r\n return this.http.delete(\r\n `/v1/llm/chatbots/${seq}/sessions/${sessionSeq}`,\r\n );\r\n }\r\n\r\n // \u2500\u2500 Profile Memory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** \uD504\uB85C\uD544 \uBA54\uBAA8\uB9AC \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n listLlmProfiles<T = unknown>(\r\n query: Record<string, unknown> = {},\r\n ): Promise<T> {\r\n const qs = buildQuery(query);\r\n return this.http.get(\r\n `/v1/llm/profiles${qs ? `?${qs}` : \"\"}`,\r\n );\r\n }\r\n\r\n /** \uD504\uB85C\uD544 \uBA54\uBAA8\uB9AC\uB97C upsert\uD569\uB2C8\uB2E4. */\r\n upsertLlmProfile<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\"/v1/llm/profiles\", body);\r\n }\r\n\r\n /** \uD504\uB85C\uD544 \uBA54\uBAA8\uB9AC\uB97C \uC0AD\uC81C\uD569\uB2C8\uB2E4. */\r\n deleteLlmProfile<T = unknown>(seq: number): Promise<T> {\r\n return this.http.delete(`/v1/llm/profiles/${seq}`);\r\n }\r\n };\r\n}\r\n", "import { buildQuery } from \"../../../client/utils.js\";\r\nimport type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function OcrMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class OcrMixinClass extends Base {\r\n /** OCR \uC778\uC2DD\uC744 \uC218\uD589\uD569\uB2C8\uB2E4. */\r\n ocrRecognize<T = unknown>(form: FormData): Promise<T> {\r\n return this.requestForm(\"POST\", \"/v1/ocr/recognize\", form);\r\n }\r\n\r\n /** OCR \uC778\uC2DD\uC744 \uBE44\uB3D9\uAE30\uB85C \uC694\uCCAD\uD569\uB2C8\uB2E4. */\r\n ocrRecognizeAsync<T = unknown>(form: FormData): Promise<T> {\r\n return this.requestForm(\"POST\", \"/v1/ocr/recognize/async\", form);\r\n }\r\n\r\n /** \uBB38\uC11C \uC720\uD615\uBCC4 OCR \uC778\uC2DD\uC744 \uC218\uD589\uD569\uB2C8\uB2E4. */\r\n ocrRecognizeByDocType<T = unknown>(\r\n docType: string,\r\n form: FormData,\r\n ): Promise<T> {\r\n return this.requestForm(\r\n \"POST\",\r\n `/v1/ocr/${encodeURIComponent(docType)}`,\r\n form,\r\n );\r\n }\r\n\r\n /** OCR \uACB0\uACFC \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n listOcrResults<T = unknown>(\r\n query: Record<string, unknown> = {},\r\n ): Promise<T> {\r\n const qs = buildQuery(query);\r\n return this.http.get(\r\n `/v1/ocr/results${qs ? `?${qs}` : \"\"}`,\r\n );\r\n }\r\n\r\n /** OCR \uACB0\uACFC \uC0C1\uC138\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n getOcrResult<T = unknown>(id: string): Promise<T> {\r\n return this.http.get(\r\n `/v1/ocr/results/${encodeURIComponent(id)}`,\r\n );\r\n }\r\n\r\n /** OCR \uACB0\uACFC \uD14D\uC2A4\uD2B8\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n getOcrResultText<T = unknown>(id: string): Promise<T> {\r\n return this.http.get(\r\n `/v1/ocr/results/${encodeURIComponent(id)}/text`,\r\n );\r\n }\r\n\r\n /** OCR \uACB0\uACFC\uB97C \uC0AD\uC81C\uD569\uB2C8\uB2E4. */\r\n deleteOcrResult<T = unknown>(id: string): Promise<T> {\r\n return this.http.delete(\r\n `/v1/ocr/results/${encodeURIComponent(id)}`,\r\n );\r\n }\r\n\r\n /** OCR \uC0AC\uC6A9 \uD560\uB2F9\uB7C9\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n getOcrQuota<T = unknown>(): Promise<T> {\r\n return this.http.get(\"/v1/ocr/quota\");\r\n }\r\n };\r\n}\r\n", "import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function PgMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class PgMixinClass extends Base {\r\n /** \uC8FC\uBB38\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4. */\r\n pgCreateOrder<T = unknown>(body: Record<string, unknown>): Promise<T> {\r\n return this.http.post(\"/v1/pg/orders\", body);\r\n }\r\n\r\n /** \uC8FC\uBB38\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n pgGetOrder<T = unknown>(orderId: string): Promise<T> {\r\n return this.http.get(\r\n `/v1/pg/orders/${encodeURIComponent(orderId)}`,\r\n );\r\n }\r\n\r\n /** \uACB0\uC81C\uB97C \uC2B9\uC778\uD569\uB2C8\uB2E4. */\r\n pgConfirmPayment<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\"/v1/pg/confirm\", body);\r\n }\r\n\r\n /** \uACB0\uC81C\uB97C \uCDE8\uC18C\uD569\uB2C8\uB2E4. */\r\n pgCancelPayment<T = unknown>(\r\n orderId: string,\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n `/v1/pg/orders/${encodeURIComponent(orderId)}/cancel`,\r\n body,\r\n );\r\n }\r\n\r\n /** \uACB0\uC81C \uC0C1\uD0DC\uB97C \uB3D9\uAE30\uD654\uD569\uB2C8\uB2E4. (\uAD00\uB9AC\uC790\uC6A9) */\r\n pgSyncPaymentStatus<T = unknown>(\r\n orderId: string,\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n `/v1/pg/orders/${encodeURIComponent(orderId)}/sync`,\r\n body,\r\n );\r\n }\r\n\r\n /** PG\uC0AC \uC6F9\uD6C5\uC744 \uC218\uC2E0\uD569\uB2C8\uB2E4. */\r\n pgWebhook<T = unknown>(body: Record<string, unknown>): Promise<T> {\r\n return this.http.post(\"/v1/pg/webhook\", body, false);\r\n }\r\n\r\n /** \uD074\uB77C\uC774\uC5B8\uD2B8 SDK \uC124\uC815\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n pgGetClientConfig<T = unknown>(): Promise<T> {\r\n return this.http.get(\"/v1/pg/config\", false);\r\n }\r\n };\r\n}\r\n", "import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function AppPushMixin<\r\n TBase extends GConstructor<EntityServerClientBase>,\r\n>(Base: TBase) {\r\n return class AppPushMixinClass extends Base {\r\n /** \uB2E8\uC77C \uACC4\uC815\uC5D0 \uD478\uC2DC \uC54C\uB9BC\uC744 \uBC1C\uC1A1\uD569\uB2C8\uB2E4. */\r\n appPushSend<T = unknown>(body: Record<string, unknown>): Promise<T> {\r\n return this.http.post(\"/v1/push/send\", body);\r\n }\r\n\r\n /** \uB2E4\uC911 \uACC4\uC815\uC5D0 \uD478\uC2DC \uC54C\uB9BC\uC744 \uBE0C\uB85C\uB4DC\uCE90\uC2A4\uD2B8\uD569\uB2C8\uB2E4. */\r\n appPushBroadcast<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\"/v1/push/broadcast\", body);\r\n }\r\n\r\n /** \uD478\uC2DC \uBC1C\uC1A1 \uC0C1\uD0DC\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n appPushStatus<T = unknown>(seq: number): Promise<T> {\r\n return this.http.get(`/v1/push/status/${seq}`);\r\n }\r\n\r\n /** \uB514\uBC14\uC774\uC2A4 \uD1A0\uD070\uC744 \uB4F1\uB85D/\uAC31\uC2E0\uD569\uB2C8\uB2E4. */\r\n appPushRegisterDevice<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\"/v1/push/device\", body);\r\n }\r\n\r\n /** \uB514\uBC14\uC774\uC2A4 \uD478\uC2DC \uC218\uC2E0\uC744 \uBE44\uD65C\uC131\uD654\uD569\uB2C8\uB2E4. */\r\n appPushUnregisterDevice<T = unknown>(seq: number): Promise<T> {\r\n return this.http.delete(`/v1/push/device/${seq}`);\r\n }\r\n };\r\n}\r\n", "import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function SmsMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class SmsMixinClass extends Base {\r\n /** SMS/LMS/MMS\uB97C \uBC1C\uC1A1\uD569\uB2C8\uB2E4. */\r\n smsSend<T = unknown>(body: Record<string, unknown>): Promise<T> {\r\n return this.http.post(\"/v1/sms/send\", body);\r\n }\r\n\r\n /** SMS \uBC1C\uC1A1 \uC0C1\uD0DC\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n smsStatus<T = unknown>(seq: number): Promise<T> {\r\n return this.http.get(\r\n `/v1/sms/status/${seq}`,\r\n false,\r\n );\r\n }\r\n\r\n /** SMS \uC778\uC99D\uBC88\uD638\uB97C \uBC1C\uC1A1\uD569\uB2C8\uB2E4. */\r\n smsVerificationSend<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/sms/verification/send\",\r\n body,\r\n false,\r\n );\r\n }\r\n\r\n /** SMS \uC778\uC99D\uBC88\uD638\uB97C \uAC80\uC99D\uD569\uB2C8\uB2E4. */\r\n smsVerificationVerify<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/sms/verification/verify\",\r\n body,\r\n false,\r\n );\r\n }\r\n };\r\n}\r\n", "import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function TaxinvoiceMixin<\r\n TBase extends GConstructor<EntityServerClientBase>,\r\n>(Base: TBase) {\r\n return class TaxinvoiceMixinClass extends Base {\r\n /** \uC804\uC790\uC138\uAE08\uACC4\uC0B0\uC11C\uB97C \uC989\uC2DC \uB4F1\uB85D\u00B7\uBC1C\uD589\uD569\uB2C8\uB2E4. */\r\n taxinvoiceRegistIssue<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\"/v1/taxinvoice\", body);\r\n }\r\n\r\n /** \uC804\uC790\uC138\uAE08\uACC4\uC0B0\uC11C\uB97C \uC784\uC2DC \uB4F1\uB85D\uD569\uB2C8\uB2E4. */\r\n taxinvoiceRegister<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\"/v1/taxinvoice/register\", body);\r\n }\r\n\r\n /** \uC784\uC2DC \uC800\uC7A5\uB41C \uC804\uC790\uC138\uAE08\uACC4\uC0B0\uC11C\uB97C \uBC1C\uD589\uD569\uB2C8\uB2E4. */\r\n taxinvoiceIssue<T = unknown>(seq: number): Promise<T> {\r\n return this.http.post(`/v1/taxinvoice/${seq}/issue`, {});\r\n }\r\n\r\n /** \uC804\uC790\uC138\uAE08\uACC4\uC0B0\uC11C \uBC1C\uD589\uC744 \uCDE8\uC18C\uD569\uB2C8\uB2E4. */\r\n taxinvoiceCancelIssue<T = unknown>(\r\n seq: number,\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n `/v1/taxinvoice/${seq}/cancel`,\r\n body,\r\n );\r\n }\r\n\r\n /** \uC804\uC790\uC138\uAE08\uACC4\uC0B0\uC11C \uAD6D\uC138\uCCAD \uC804\uC1A1 \uC0C1\uD0DC\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n taxinvoiceGetState<T = unknown>(seq: number): Promise<T> {\r\n return this.http.get(`/v1/taxinvoice/${seq}/state`);\r\n }\r\n\r\n /** \uC804\uC790\uC138\uAE08\uACC4\uC0B0\uC11C \uC0C1\uC138 \uC815\uBCF4\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n taxinvoiceGetDetail<T = unknown>(seq: number): Promise<T> {\r\n return this.http.get(`/v1/taxinvoice/${seq}`);\r\n }\r\n };\r\n}\r\n", "import { EntityServerApi } from \"./EntityServerApi.js\";\r\nimport {\r\n AccountAppMixin,\r\n BoardMixin,\r\n EmailVerifyMixin,\r\n OAuthMixin,\r\n PasswordResetMixin,\r\n TwoFactorMixin,\r\n} from \"./mixins/app/index.js\";\r\nimport {\r\n AlimtalkMixin,\r\n AppPushMixin,\r\n FriendtalkMixin,\r\n HolidaysMixin,\r\n IdentityMixin,\r\n LlmMixin,\r\n OcrMixin,\r\n PgMixin,\r\n SmsMixin,\r\n TaxinvoiceMixin,\r\n} from \"./mixins/app/plugins/index.js\";\r\n\r\nexport class EntityAppServerApi extends AlimtalkMixin(\r\n FriendtalkMixin(\r\n SmsMixin(\r\n AppPushMixin(\r\n PgMixin(\r\n TaxinvoiceMixin(\r\n OcrMixin(\r\n LlmMixin(\r\n IdentityMixin(\r\n HolidaysMixin(\r\n OAuthMixin(\r\n TwoFactorMixin(\r\n PasswordResetMixin(\r\n EmailVerifyMixin(\r\n BoardMixin(\r\n AccountAppMixin(\r\n EntityServerApi,\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n) {}\r\n", "export * from \"./types.js\";\r\nexport * from \"./EntityServerApi.js\";\r\nexport * from \"./EntityAppServerApi.js\";\r\nexport * from \"./mixins/server/index.js\";\r\nexport * from \"./mixins/app/index.js\";\r\nexport * from \"./packet.js\";\r\n\r\nimport { EntityServerApi } from \"./EntityServerApi.js\";\r\nimport { EntityAppServerApi } from \"./EntityAppServerApi.js\";\r\n\r\nexport const entityServer = new EntityServerApi();\r\nexport const entityAppServer = new EntityAppServerApi();\r\n"],
5
- "mappings": "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",
6
- "names": ["readEnv", "name", "meta", "_proc", "buildQuery", "params", "value", "key", "xchacha20poly1305", "sha256", "hkdf", "PACKET_KEY_SIZE", "PACKET_MAGIC_MIN", "PACKET_MAGIC_RANGE", "PACKET_NONCE_SIZE", "PACKET_TAG_SIZE", "PACKET_HKDF_SALT", "PACKET_INFO_LABEL", "toUint8Array", "data", "derivePacketKey", "source", "infoLabel", "packetMagicLenFromKey", "key", "magicMin", "magicRange", "keyBytes", "encryptPacket", "plaintext", "plaintextBytes", "magicLen", "magic", "nonce", "ciphertext", "result", "decryptPacket", "buffer", "derivePacketKey", "hmacSecret", "token", "encryptPacket", "plaintext", "key", "decryptPacket", "buffer", "parseRequestBody", "body", "contentType", "requireEncrypted", "isEncrypted", "sliced", "sha256", "hmac", "buildHmacHeaders", "method", "path", "bodyBytes", "apiKey", "hmacSecret", "timestamp", "nonce", "prefix", "payload", "signature", "b", "resolvePacketSource", "opts", "resolveResponsePacketSource", "withAuth", "anonymousPacketToken", "maskPacketSource", "value", "logPacketDecryptError", "details", "requiresCsrf", "method", "readCsrfCookie", "name", "chunk", "idx", "isCsrfError", "status", "message", "readErrorMessage", "res", "data", "entityRequest", "path", "body", "extraHeaders", "config", "requestConfig", "requireOkShape", "allowStatuses", "signal", "baseUrl", "token", "apiKey", "hmacSecret", "encryptRequests", "csrfEnabled", "csrfHeaderName", "csrfCookieName", "refreshCsrfCookie", "onAccessToken", "isHmacMode", "packetSource", "responsePacketSource", "shouldUseCsrf", "csrfToken", "requestContentType", "includeAnonymousPacketHeader", "fetchBody", "key", "derivePacketKey", "encryptPacket", "buildHeaders", "resolvedCsrfToken", "headers", "hasExplicitContentType", "bodyBytes", "buildHmacHeaders", "executeRequest", "err", "accessTokenHeader", "contentType", "encryptedBody", "decrypted", "decryptPacket", "error", "REALTIME_DEFAULT_PATH", "EntityServerClientBase", "options", "envBaseUrl", "readEnv", "token", "apiKey", "secret", "value", "enabled", "listener", "eventName", "key", "listeners", "socket", "resolve", "reject", "settled", "finalizeResolve", "finalizeReject", "error", "event", "reason", "message", "subscriptions", "intervalMs", "runImmediately", "tick", "refreshToken", "expiresIn", "refreshFn", "delayMs", "result", "err", "normalized", "baseUrl", "url", "payload", "envelope", "status", "previousStatus", "chunk", "idx", "body", "contentType", "requireEncrypted", "derivePacketKey", "parseRequestBody", "_withAuth", "self", "path", "withAuth", "extraHeaders", "requestConfig", "entityRequest", "method", "headers", "res", "text", "form", "data", "isAuthLoginSuccessResponse", "response", "AuthMixin", "Base", "bootstrapAuth", "previousToken", "headers", "res", "data", "accessToken", "anonToken", "error", "name", "match", "c", "hasAnonymousPacketToken", "hasCsrfCookie", "withAuth", "email", "password", "entityRequest", "refreshToken", "passwd", "EntityMixin", "Base", "res", "transactionId", "txId", "entity", "data", "seq", "opts", "q", "conditions", "params", "fields", "orderDir", "orderBy", "rest", "queryObj", "buildQuery", "req", "extraHeaders", "historySeq", "FileMixin", "Base", "entity", "file", "opts", "form", "uuid", "qs", "PushMixin", "Base", "pushEntity", "payload", "opts", "params", "accountSeq", "deviceId", "pushToken", "platform", "deviceType", "browser", "browserVersion", "pushEnabled", "transactionId", "deviceSeq", "SmtpMixin", "Base", "req", "seq", "templatePath", "encoded", "r", "TransactionMixin", "Base", "body", "transactionId", "UtilsMixin", "Base", "query", "qs", "content", "opts", "pdfData", "form", "params", "path", "fileSeq", "AdminMixin", "Base", "path", "body", "configs", "entity", "config", "domain", "patch", "seq", "EntityServerApi", "UtilsMixin", "TransactionMixin", "FileMixin", "SmtpMixin", "PushMixin", "AdminMixin", "EntityMixin", "AuthMixin", "EntityServerClientBase", "AccountAppMixin", "Base", "body", "seq", "BoardMixin", "Base", "query", "qs", "buildQuery", "seq", "body", "category", "postSeq", "file", "form", "uuid", "EmailVerifyMixin", "Base", "body", "query", "qs", "buildQuery", "OAuthMixin", "Base", "provider", "query", "qs", "buildQuery", "payload", "method", "body", "PasswordResetMixin", "Base", "body", "token", "TwoFactorMixin", "Base", "body", "AlimtalkMixin", "Base", "body", "seq", "provider", "FriendtalkMixin", "Base", "body", "HolidaysMixin", "Base", "query", "qs", "buildQuery", "locdate", "body", "IdentityMixin", "Base", "body", "requestId", "LlmMixin", "Base", "body", "seq", "query", "qs", "buildQuery", "form", "id", "name", "sessionSeq", "OcrMixin", "Base", "form", "docType", "query", "qs", "buildQuery", "id", "PgMixin", "Base", "body", "orderId", "AppPushMixin", "Base", "body", "seq", "SmsMixin", "Base", "body", "seq", "TaxinvoiceMixin", "Base", "body", "seq", "EntityAppServerApi", "AlimtalkMixin", "FriendtalkMixin", "SmsMixin", "AppPushMixin", "PgMixin", "TaxinvoiceMixin", "OcrMixin", "LlmMixin", "IdentityMixin", "HolidaysMixin", "OAuthMixin", "TwoFactorMixin", "PasswordResetMixin", "EmailVerifyMixin", "BoardMixin", "AccountAppMixin", "EntityServerApi", "entityServer", "EntityServerApi", "entityAppServer", "EntityAppServerApi"]
4
+ "sourcesContent": ["/**\n * \uD658\uACBD\uBCC0\uC218\uB97C \uC77D\uC2B5\uB2C8\uB2E4.\n * - \uBE0C\uB77C\uC6B0\uC800/Vite: `import.meta.env`\n * - Node.js: `process.env`\n */\nexport function readEnv(name: string): string | undefined {\n // Vite / \uAE30\uD0C0 \uBC88\uB4E4\uB7EC (import.meta.env)\n const meta = import.meta as unknown as {\n env?: Record<string, string | undefined>;\n };\n if (meta?.env?.[name] != null) return meta.env[name];\n\n // Node.js (process.env)\n const _proc = (\n globalThis as { process?: { env?: Record<string, string | undefined> } }\n ).process;\n if (_proc?.env?.[name] != null) {\n return _proc.env[name];\n }\n\n return undefined;\n}\n\n/** \uCFFC\uB9AC \uD30C\uB77C\uBBF8\uD130 \uAC1D\uCCB4\uB97C URL \uCFFC\uB9AC \uBB38\uC790\uC5F4\uB85C \uBCC0\uD658\uD569\uB2C8\uB2E4. `orderBy` \uD0A4\uB294 `order_by`\uB85C \uBCC0\uD658\uB429\uB2C8\uB2E4. */\nexport function buildQuery(params: Record<string, unknown>): string {\n return Object.entries(params)\n .filter(([, value]) => value != null)\n .map(\n ([key, value]) =>\n `${encodeURIComponent(key === \"orderBy\" ? \"order_by\" : key)}=${encodeURIComponent(String(value))}`,\n )\n .join(\"&\");\n}\n", "// @ts-ignore\nimport { xchacha20poly1305 } from \"@noble/ciphers/chacha\";\n// @ts-ignore\nimport { sha256 } from \"@noble/hashes/sha2\";\n// @ts-ignore\nimport { hkdf } from \"@noble/hashes/hkdf\";\n\nexport const PACKET_KEY_SIZE = 32;\nexport const PACKET_MAGIC_MIN = 2;\nexport const PACKET_MAGIC_RANGE = 14;\nexport const PACKET_NONCE_SIZE = 24;\nexport const PACKET_TAG_SIZE = 16;\nexport const PACKET_HKDF_SALT = \"entity-server:hkdf:v1\";\nexport const PACKET_INFO_LABEL = \"entity-server:packet-encryption\";\n\nfunction toUint8Array(data: ArrayBuffer | Uint8Array): Uint8Array {\n return data instanceof Uint8Array ? data : new Uint8Array(data);\n}\n\nexport function derivePacketKey(\n source: string,\n infoLabel = PACKET_INFO_LABEL,\n): Uint8Array {\n return hkdf(\n sha256,\n new TextEncoder().encode(source),\n new TextEncoder().encode(PACKET_HKDF_SALT),\n new TextEncoder().encode(infoLabel),\n PACKET_KEY_SIZE,\n );\n}\n\nexport function packetMagicLenFromKey(\n key: ArrayBuffer | Uint8Array,\n magicMin = PACKET_MAGIC_MIN,\n magicRange = PACKET_MAGIC_RANGE,\n): number {\n const keyBytes = toUint8Array(key);\n if (keyBytes.length < PACKET_KEY_SIZE) return magicMin;\n return magicMin + (keyBytes[PACKET_KEY_SIZE - 1]! % magicRange);\n}\n\nexport function encryptPacket(\n plaintext: ArrayBuffer | Uint8Array,\n key: ArrayBuffer | Uint8Array,\n magicMin = PACKET_MAGIC_MIN,\n magicRange = PACKET_MAGIC_RANGE,\n): Uint8Array {\n const plaintextBytes = toUint8Array(plaintext);\n const keyBytes = toUint8Array(key);\n const magicLen = packetMagicLenFromKey(keyBytes, magicMin, magicRange);\n const magic = crypto.getRandomValues(new Uint8Array(magicLen));\n const nonce = crypto.getRandomValues(new Uint8Array(PACKET_NONCE_SIZE));\n const cipher = xchacha20poly1305(keyBytes, nonce);\n const ciphertext = cipher.encrypt(plaintextBytes);\n const result = new Uint8Array(\n magicLen + PACKET_NONCE_SIZE + ciphertext.length,\n );\n\n result.set(magic, 0);\n result.set(nonce, magicLen);\n result.set(ciphertext, magicLen + PACKET_NONCE_SIZE);\n return result;\n}\n\nexport function decryptPacket(\n buffer: ArrayBuffer | Uint8Array,\n key: ArrayBuffer | Uint8Array,\n magicMin = PACKET_MAGIC_MIN,\n magicRange = PACKET_MAGIC_RANGE,\n): Uint8Array {\n const data = toUint8Array(buffer);\n const keyBytes = toUint8Array(key);\n const magicLen = packetMagicLenFromKey(keyBytes, magicMin, magicRange);\n\n if (data.length < magicLen + PACKET_NONCE_SIZE + PACKET_TAG_SIZE) {\n throw new Error(\"Encrypted packet too short\");\n }\n\n const nonce = data.slice(magicLen, magicLen + PACKET_NONCE_SIZE);\n const ciphertext = data.slice(magicLen + PACKET_NONCE_SIZE);\n const cipher = xchacha20poly1305(keyBytes, nonce);\n return cipher.decrypt(ciphertext);\n}\n", "import {\n derivePacketKey as derivePacketKeyCore,\n encryptPacket as encryptPacketCore,\n decryptPacket as decryptPacketCore,\n} from \"../packet.js\";\n\n/**\n * \uD328\uD0B7 \uC554\uD638\uD654 \uD0A4\uB97C \uC720\uB3C4\uD569\uB2C8\uB2E4.\n * - HMAC \uBAA8\uB4DC (`hmacSecret` \uC720\uD6A8 \uC2DC): HKDF-SHA256(hmac_secret, \"entity-server:packet-encryption\")\n * - JWT \uBAA8\uB4DC: HKDF-SHA256(jwt_token, \"entity-server:packet-encryption\")\n */\nexport function derivePacketKey(hmacSecret: string, token: string): Uint8Array {\n return derivePacketKeyCore(hmacSecret || token);\n}\n\n/**\n * \uD3C9\uBB38 \uBC14\uC774\uD2B8\uB97C XChaCha20-Poly1305\uB85C \uC554\uD638\uD654\uD569\uB2C8\uB2E4.\n * \uD3EC\uB9F7: [random_magic:K][random_nonce:24][ciphertext+tag]\n * K = 2 + key[31] % 14 (\uD328\uD0B7 \uD0A4\uC5D0\uC11C \uC790\uB3D9 \uD30C\uC0DD)\n */\nexport function encryptPacket(\n plaintext: Uint8Array,\n key: Uint8Array,\n): Uint8Array {\n return encryptPacketCore(plaintext, key);\n}\n\n/**\n * XChaCha20-Poly1305 \uD328\uD0B7\uC744 \uBCF5\uD638\uD654\uD574 JSON \uAC1D\uCCB4\uB85C \uBCC0\uD658\uD569\uB2C8\uB2E4.\n * \uD3EC\uB9F7: [magic:K][nonce:24][ciphertext+tag]\n * K = 2 + key[31] % 14 (\uD328\uD0B7 \uD0A4\uC5D0\uC11C \uC790\uB3D9 \uD30C\uC0DD)\n */\nexport function decryptPacket<T>(buffer: ArrayBuffer, key: Uint8Array): T {\n const plaintext = decryptPacketCore(buffer, key);\n return JSON.parse(new TextDecoder().decode(plaintext)) as T;\n}\n\n/**\n * \uC694\uCCAD \uBC14\uB514\uB97C \uD30C\uC2F1\uD569\uB2C8\uB2E4. `application/octet-stream`\uC774\uBA74 \uBCF5\uD638\uD654, \uADF8 \uC678\uB294 JSON \uD30C\uC2F1\uD569\uB2C8\uB2E4.\n *\n * @param requireEncrypted `true`\uC774\uBA74 \uC554\uD638\uD654\uB41C \uC694\uCCAD\uB9CC \uD5C8\uC6A9\uD569\uB2C8\uB2E4.\n */\nexport function parseRequestBody<T>(\n body: ArrayBuffer | Uint8Array | string | T | null | undefined,\n contentType: string,\n requireEncrypted: boolean,\n key: Uint8Array,\n): T {\n const isEncrypted = contentType\n .toLowerCase()\n .includes(\"application/octet-stream\");\n\n if (requireEncrypted && !isEncrypted) {\n throw new Error(\n \"Encrypted request required: Content-Type must be application/octet-stream\",\n );\n }\n\n if (isEncrypted) {\n if (body == null) throw new Error(\"Encrypted request body is empty\");\n if (body instanceof ArrayBuffer) return decryptPacket<T>(body, key);\n if (body instanceof Uint8Array) {\n const sliced = body.buffer.slice(\n body.byteOffset,\n body.byteOffset + body.byteLength,\n );\n return decryptPacket<T>(sliced as ArrayBuffer, key);\n }\n throw new Error(\n \"Encrypted request body must be ArrayBuffer or Uint8Array\",\n );\n }\n\n if (body == null || body === \"\") return {} as T;\n if (typeof body === \"string\") return JSON.parse(body) as T;\n return body as T;\n}\n", "// @ts-ignore\nimport { sha256 } from \"@noble/hashes/sha2\";\n// @ts-ignore\nimport { hmac } from \"@noble/hashes/hmac\";\n\n/**\n * HMAC-SHA256 \uC11C\uBA85 \uD5E4\uB354\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4.\n *\n * \uC11C\uBA85 \uB300\uC0C1: `METHOD|PATH|TIMESTAMP|NONCE|BODY`\n *\n * @returns `X-API-Key`, `X-Timestamp`, `X-Nonce`, `X-Signature` \uD5E4\uB354 \uAC1D\uCCB4\n */\nexport function buildHmacHeaders(\n method: string,\n path: string,\n bodyBytes: Uint8Array,\n apiKey: string,\n hmacSecret: string,\n): Record<string, string> {\n const timestamp = String(Math.floor(Date.now() / 1000));\n const nonce = crypto.randomUUID();\n\n const prefix = new TextEncoder().encode(\n `${method}|${path}|${timestamp}|${nonce}|`,\n );\n const payload = new Uint8Array(prefix.length + bodyBytes.length);\n payload.set(prefix, 0);\n payload.set(bodyBytes, prefix.length);\n\n const sig = hmac(sha256, new TextEncoder().encode(hmacSecret), payload);\n const signature = [...sig]\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n return {\n \"X-API-Key\": apiKey,\n \"X-Timestamp\": timestamp,\n \"X-Nonce\": nonce,\n \"X-Signature\": signature,\n };\n}\n", "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}\n\nexport interface EntityRequestConfig {\n requireOkShape?: boolean;\n allowStatuses?: number[];\n signal?: AbortSignal;\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\nasync function readErrorMessage(res: Response): Promise<string> {\n const contentType = res.headers.get(\"Content-Type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n const data = (await res.json().catch(() => null)) as {\n error?: string;\n message?: string;\n } | null;\n if (data?.error) return data.error;\n if (data?.message) return data.message;\n }\n\n const text = await res.text().catch(() => \"\");\n return text || `HTTP ${res.status}`;\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 signal = requestConfig.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 } = 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 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 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 let res = await executeRequest(csrfToken);\n\n if (!res.ok) {\n const message = await readErrorMessage(res.clone());\n if (\n shouldUseCsrf &&\n refreshCsrfCookie &&\n isCsrfError(res.status, message)\n ) {\n await refreshCsrfCookie();\n csrfToken = readCsrfCookie(csrfCookieName);\n res = await executeRequest(csrfToken);\n } else if (!allowStatuses.has(res.status)) {\n const err = new Error(message);\n (err as { status?: number }).status = res.status;\n throw err;\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 const err = new Error(await readErrorMessage(res));\n (err as { status?: number }).status = res.status;\n throw err;\n }\n\n const accessTokenHeader = 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 { ok?: boolean; message?: string };\n if (requireOkShape && !data.ok && !allowStatuses.has(res.status)) {\n const err = new Error(\n data.message ?? `EntityServer error (HTTP ${res.status})`,\n );\n (err as { status?: number }).status = res.status;\n throw err;\n }\n\n return data as T;\n}\n", "import type {\n EntityServerClientOptions,\n RealtimeClientOptions,\n RealtimeConnectionStatus,\n RealtimeEnvelope,\n RealtimeMessageListener,\n RealtimeStatusListener,\n} from \"../types.js\";\nimport { readEnv } from \"./utils.js\";\nimport { derivePacketKey, parseRequestBody } from \"./packet.js\";\nimport {\n entityRequest,\n type EntityRequestConfig,\n type RequestOptions,\n} from \"./request.js\";\n\nconst REALTIME_DEFAULT_PATH = \"/v1/realtime\";\n\n// mixin \uD5EC\uD37C \uD0C0\uC785\nexport type GConstructor<T = object> = new (...args: any[]) => T;\n\nexport class EntityServerClientBase {\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 /** @internal health \uC7AC\uD638\uCD9C\uB85C CSRF \uCFE0\uD0A4 \uAC31\uC2E0 (AuthMixin\uC5D0\uC11C \uC124\uC815) */\n csrfRefresher: (() => Promise<void>) | null = null;\n activeTxId: string | null = null;\n\n // \uC138\uC158 \uC720\uC9C0 \uAD00\uB828\n keepSession: boolean;\n refreshBuffer: number;\n onTokenRefreshed?: (accessToken: string, expiresIn: number) => void;\n onSessionExpired?: (error: Error) => void;\n onHealthChange?: (online: boolean) => void;\n sessionRefreshToken: string | null = null;\n refreshTimer: ReturnType<typeof setTimeout> | null = null;\n healthTickTimer: ReturnType<typeof setInterval> | null = null;\n healthTickPromise: Promise<unknown> | null = null;\n realtimeEnabled: boolean;\n realtimePath: string;\n realtimeAutoConnect: boolean;\n realtimeAutoReconnect: boolean;\n realtimeReconnectDelayMs: number;\n realtimeStatus: RealtimeConnectionStatus;\n realtimeSocket: WebSocket | null = null;\n realtimeConnectPromise: Promise<void> | null = null;\n realtimeReconnectTimer: ReturnType<typeof setTimeout> | null = null;\n realtimeShouldReconnect = false;\n realtimeMessageListeners = new Set<RealtimeMessageListener>();\n realtimeStatusListeners = new Set<RealtimeStatusListener>();\n realtimeEventListeners = new Map<string, Set<RealtimeMessageListener>>();\n // \u2500\u2500\u2500 \uCD08\uAE30\uD654 & \uC124\uC815 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * EntityServerClient \uC778\uC2A4\uD134\uC2A4\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4.\n *\n * \uAE30\uBCF8\uAC12:\n * - `baseUrl`: `VITE_ENTITY_SERVER_URL` \uB610\uB294 \uC0C1\uB300 \uACBD\uB85C(`\"\"`)\n */\n constructor(options: EntityServerClientOptions = {}) {\n const envBaseUrl = readEnv(\"VITE_ENTITY_SERVER_URL\");\n\n this.baseUrl = (options.baseUrl ?? envBaseUrl ?? \"\").replace(/\\/$/, \"\");\n this.token = options.token ?? \"\";\n this.anonymousPacketToken = options.anonymousPacketToken ?? \"\";\n this.apiKey = options.apiKey ?? \"\";\n this.hmacSecret = options.hmacSecret ?? \"\";\n this.encryptRequests = options.encryptRequests ?? false;\n this.csrfEnabled = options.csrfEnabled ?? false;\n this.csrfHeaderName = options.csrfHeaderName ?? \"x-csrf-token\";\n this.csrfCookieName = options.csrfCookieName ?? \"_csrf\";\n this.keepSession = options.keepSession ?? false;\n this.refreshBuffer = options.refreshBuffer ?? 60;\n this.onTokenRefreshed = options.onTokenRefreshed;\n this.onSessionExpired = options.onSessionExpired;\n this.onHealthChange = options.onHealthChange;\n this.realtimeEnabled = false;\n this.realtimePath = REALTIME_DEFAULT_PATH;\n this.realtimeAutoConnect = true;\n this.realtimeAutoReconnect = true;\n this.realtimeReconnectDelayMs = 3000;\n this.realtimeStatus = \"idle\";\n this.applyRealtimeOptions(options.realtime);\n if (\n typeof options.healthTickInterval === \"number\" &&\n options.healthTickInterval > 0\n ) {\n // csrfRefresher\uB294 AuthMixin\uC5D0\uC11C \uC124\uC815\uB418\uBBC0\uB85C \uB2E4\uC74C tick\uC5D0 \uC2DC\uC791\n Promise.resolve().then(() =>\n this.startHealthTick(options.healthTickInterval),\n );\n }\n }\n\n /** baseUrl, token, encryptRequests \uAC12\uC744 \uB7F0\uD0C0\uC784\uC5D0 \uAC31\uC2E0\uD569\uB2C8\uB2E4. */\n configure(options: Partial<EntityServerClientOptions>): void {\n if (typeof options.baseUrl === \"string\") {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n }\n if (typeof options.token === \"string\") this.token = options.token;\n if (typeof options.anonymousPacketToken === \"string\") {\n this.anonymousPacketToken = options.anonymousPacketToken;\n }\n if (typeof options.encryptRequests === \"boolean\")\n this.encryptRequests = options.encryptRequests;\n if (typeof options.csrfEnabled === \"boolean\") {\n this.csrfEnabled = options.csrfEnabled;\n }\n if (typeof options.csrfHeaderName === \"string\") {\n this.csrfHeaderName = options.csrfHeaderName;\n }\n if (typeof options.csrfCookieName === \"string\") {\n this.csrfCookieName = options.csrfCookieName;\n }\n if (typeof options.apiKey === \"string\") this.apiKey = options.apiKey;\n if (typeof options.hmacSecret === \"string\")\n this.hmacSecret = options.hmacSecret;\n if (typeof options.keepSession === \"boolean\")\n this.keepSession = options.keepSession;\n if (typeof options.refreshBuffer === \"number\")\n this.refreshBuffer = options.refreshBuffer;\n if (options.onTokenRefreshed)\n this.onTokenRefreshed = options.onTokenRefreshed;\n if (options.onSessionExpired)\n this.onSessionExpired = options.onSessionExpired;\n if (options.onHealthChange)\n this.onHealthChange = options.onHealthChange;\n if (typeof options.realtime !== \"undefined\") {\n this.applyRealtimeOptions(options.realtime);\n }\n if (\n typeof options.healthTickInterval === \"number\" &&\n options.healthTickInterval > 0\n ) {\n Promise.resolve().then(() =>\n this.startHealthTick(options.healthTickInterval),\n );\n }\n }\n\n /** \uC778\uC99D \uC694\uCCAD\uC5D0 \uC0AC\uC6A9\uD560 JWT Access Token\uC744 \uC124\uC815\uD569\uB2C8\uB2E4. */\n setToken(token: string): void {\n this.token = token;\n if (!token) {\n this.disconnectRealtime(\"token_cleared\");\n return;\n }\n if (this.realtimeEnabled && this.realtimeAutoConnect) {\n void this.connectRealtime().catch(() => {});\n }\n }\n\n /** \uC775\uBA85 \uD328\uD0B7 \uC554\uD638\uD654\uC6A9 \uD1A0\uD070\uC744 \uC124\uC815\uD569\uB2C8\uB2E4. */\n setAnonymousPacketToken(token: string): void {\n this.anonymousPacketToken = token;\n }\n\n /** HMAC \uC778\uC99D\uC6A9 API Key\uB97C \uC124\uC815\uD569\uB2C8\uB2E4. */\n setApiKey(apiKey: string): void {\n this.apiKey = apiKey;\n }\n\n /** HMAC \uC778\uC99D\uC6A9 \uC2DC\uD06C\uB9BF\uC744 \uC124\uC815\uD569\uB2C8\uB2E4. */\n setHmacSecret(secret: string): void {\n this.hmacSecret = secret;\n }\n\n /** \uC554\uD638\uD654 \uC694\uCCAD \uD65C\uC131\uD654 \uC5EC\uBD80\uB97C \uC124\uC815\uD569\uB2C8\uB2E4. */\n setEncryptRequests(value: boolean): void {\n this.encryptRequests = value;\n }\n\n setCsrfEnabled(enabled: boolean): void {\n this.csrfEnabled = enabled;\n }\n\n addRealtimeListener(listener: RealtimeMessageListener): void {\n this.realtimeMessageListeners.add(listener);\n }\n\n removeRealtimeListener(listener: RealtimeMessageListener): void {\n this.realtimeMessageListeners.delete(listener);\n }\n\n addRealtimeStatusListener(listener: RealtimeStatusListener): void {\n this.realtimeStatusListeners.add(listener);\n }\n\n removeRealtimeStatusListener(listener: RealtimeStatusListener): void {\n this.realtimeStatusListeners.delete(listener);\n }\n\n addRealtimeEventListener(\n eventName: string,\n listener: RealtimeMessageListener,\n ): void {\n const key = String(eventName).trim();\n if (!key) {\n return;\n }\n if (!this.realtimeEventListeners.has(key)) {\n this.realtimeEventListeners.set(key, new Set());\n }\n this.realtimeEventListeners.get(key)!.add(listener);\n }\n\n removeRealtimeEventListener(\n eventName: string,\n listener: RealtimeMessageListener,\n ): void {\n const key = String(eventName).trim();\n if (!key) {\n return;\n }\n const listeners = this.realtimeEventListeners.get(key);\n if (!listeners) {\n return;\n }\n listeners.delete(listener);\n if (listeners.size === 0) {\n this.realtimeEventListeners.delete(key);\n }\n }\n\n async connectRealtime(): Promise<void> {\n if (!this.realtimeEnabled) {\n this.setRealtimeStatus(\"disabled\", \"realtime_disabled\");\n return;\n }\n\n if (!this.token) {\n throw new Error(\n \"Cannot open realtime connection without access token.\",\n );\n }\n\n if (typeof WebSocket === \"undefined\") {\n throw new Error(\"WebSocket is not available in this environment.\");\n }\n\n if (\n this.realtimeSocket &&\n this.realtimeSocket.readyState === WebSocket.OPEN\n ) {\n return;\n }\n\n if (\n this.realtimeSocket &&\n this.realtimeSocket.readyState === WebSocket.CONNECTING &&\n this.realtimeConnectPromise\n ) {\n return this.realtimeConnectPromise;\n }\n\n this.clearRealtimeReconnectTimer();\n this.realtimeShouldReconnect = this.realtimeAutoReconnect;\n this.setRealtimeStatus(\"connecting\", \"connect_requested\");\n\n const socket = new WebSocket(this.buildRealtimeUrl());\n this.realtimeSocket = socket;\n\n this.realtimeConnectPromise = new Promise<void>((resolve, reject) => {\n let settled = false;\n\n const finalizeResolve = () => {\n if (settled) {\n return;\n }\n settled = true;\n this.realtimeConnectPromise = null;\n resolve();\n };\n\n const finalizeReject = (error: Error) => {\n if (settled) {\n return;\n }\n settled = true;\n this.realtimeConnectPromise = null;\n reject(error);\n };\n\n socket.addEventListener(\"open\", () => {\n this.setRealtimeStatus(\"open\", \"socket_open\");\n finalizeResolve();\n });\n\n socket.addEventListener(\"message\", (event) => {\n this.handleRealtimeMessage(event.data);\n });\n\n socket.addEventListener(\"error\", () => {\n this.setRealtimeStatus(\n \"closed\",\n \"socket_error\",\n new Error(\"Realtime socket error.\"),\n );\n });\n\n socket.addEventListener(\"close\", (event) => {\n if (this.realtimeSocket === socket) {\n this.realtimeSocket = null;\n }\n\n const reason = event.reason || \"socket_closed\";\n const error = new Error(\n `Realtime socket closed (${event.code}${event.reason ? `: ${event.reason}` : \"\"}).`,\n );\n\n this.setRealtimeStatus(\"closed\", reason, error);\n if (!settled) {\n finalizeReject(error);\n }\n\n if (\n this.realtimeShouldReconnect &&\n this.realtimeEnabled &&\n this.realtimeAutoReconnect &&\n this.token\n ) {\n this.scheduleRealtimeReconnect(reason);\n }\n });\n });\n\n return this.realtimeConnectPromise;\n }\n\n disconnectRealtime(reason = \"client_disconnect\"): void {\n this.realtimeShouldReconnect = false;\n this.clearRealtimeReconnectTimer();\n\n if (this.realtimeSocket) {\n const socket = this.realtimeSocket;\n this.realtimeSocket = null;\n try {\n if (\n socket.readyState === WebSocket.OPEN ||\n socket.readyState === WebSocket.CONNECTING\n ) {\n socket.close(1000, reason);\n }\n } catch {\n // ignore close errors\n }\n }\n\n this.realtimeConnectPromise = null;\n this.setRealtimeStatus(\n this.realtimeEnabled ? \"idle\" : \"disabled\",\n reason,\n );\n }\n\n sendRealtime(message: RealtimeEnvelope | Record<string, unknown>): boolean {\n if (\n !this.realtimeSocket ||\n this.realtimeSocket.readyState !== WebSocket.OPEN\n ) {\n return false;\n }\n\n this.realtimeSocket.send(JSON.stringify(message));\n return true;\n }\n\n subscribeRealtime(subscriptions: string[]): boolean {\n return this.sendRealtime({\n type: \"subscribe\",\n channel: \"session\",\n event: \"session.subscribe\",\n data: { subscriptions },\n });\n }\n\n unsubscribeRealtime(subscriptions: string[]): boolean {\n return this.sendRealtime({\n type: \"unsubscribe\",\n channel: \"session\",\n event: \"session.unsubscribe\",\n data: { subscriptions },\n });\n }\n\n /**\n * \uC8FC\uAE30\uC801\uC73C\uB85C health \uCCB4\uD06C\uB97C \uC2E4\uD589\uD569\uB2C8\uB2E4.\n * CSRF \uCFE0\uD0A4 \uAC31\uC2E0\uACFC \uC11C\uBC84 \uC0C1\uD0DC \uD655\uC778\uC744 \uC790\uB3D9\uD654\uD569\uB2C8\uB2E4.\n * keepSession=true \uC774\uBA74 \uAC01 tick\uC5D0\uC11C \uC138\uC158 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uB3C4 \uD568\uAED8 \uC2DC\uB3C4\uD569\uB2C8\uB2E4.\n *\n * @param intervalMs \uD638\uCD9C \uC8FC\uAE30(ms). \uAE30\uBCF8\uAC12: 5\uBD84\n */\n startHealthTick(intervalMs: number = 5 * 60 * 1000): void {\n this.stopHealthTick();\n const tick = (): void => {\n if (this.healthTickPromise) return;\n this.healthTickPromise = (\n this.csrfRefresher ? this.csrfRefresher() : Promise.resolve()\n )\n .then(() => {\n this.onHealthChange?.(true);\n })\n .catch(() => {\n this.onHealthChange?.(false);\n })\n .finally(() => {\n this.healthTickPromise = null;\n });\n };\n tick(); // \uC989\uC2DC 1\uD68C \uC2E4\uD589\n this.healthTickTimer = setInterval(tick, intervalMs);\n }\n\n /** health tick \uD0C0\uC774\uBA38\uB97C \uC911\uC9C0\uD569\uB2C8\uB2E4. */\n stopHealthTick(): void {\n if (this.healthTickTimer !== null) {\n clearInterval(this.healthTickTimer);\n this.healthTickTimer = null;\n }\n this.healthTickPromise = null;\n }\n\n // \u2500\u2500\u2500 \uC138\uC158 \uC720\uC9C0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** @deprecated \uC138\uC158 \uC5F0\uC7A5\uC740 health tick \uAE30\uBC18 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uC73C\uB85C \uB300\uCCB4\uB418\uC5C8\uC2B5\uB2C8\uB2E4. */\n scheduleKeepSession(\n refreshToken: string,\n expiresIn: number,\n refreshFn: (\n rt: string,\n ) => Promise<{ access_token: string; expires_in: number }>,\n ): void {\n this.clearRefreshTimer();\n this.sessionRefreshToken = refreshToken;\n const delayMs = Math.max((expiresIn - this.refreshBuffer) * 1000, 0);\n this.refreshTimer = setTimeout(async () => {\n if (!this.sessionRefreshToken) return;\n try {\n const result = await refreshFn(this.sessionRefreshToken);\n this.onTokenRefreshed?.(result.access_token, result.expires_in);\n this.scheduleKeepSession(\n this.sessionRefreshToken,\n result.expires_in,\n refreshFn,\n );\n } catch (err) {\n this.clearRefreshTimer();\n this.onSessionExpired?.(\n err instanceof Error ? err : new Error(String(err)),\n );\n }\n }, delayMs);\n }\n\n /** @deprecated \uC138\uC158 \uC5F0\uC7A5\uC740 health tick \uAE30\uBC18 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uC73C\uB85C \uB300\uCCB4\uB418\uC5C8\uC2B5\uB2C8\uB2E4. */\n clearRefreshTimer(): void {\n if (this.refreshTimer !== null) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n }\n\n /**\n * \uC138\uC158 \uC790\uB3D9 \uC5F0\uC7A5\uC744 \uC911\uC9C0\uD569\uB2C8\uB2E4.\n * `logout()` \uD638\uCD9C \uC2DC \uC790\uB3D9\uC73C\uB85C \uC911\uC9C0\uB418\uBA70, \uC9C1\uC811 \uD638\uCD9C\uC774 \uD544\uC694\uD55C \uACBD\uC6B0\uB294 \uB4DC\uBB45\uB2C8\uB2E4.\n */\n stopKeepSession(): void {\n this.clearRefreshTimer();\n this.sessionRefreshToken = null;\n }\n\n applyRealtimeOptions(options?: boolean | RealtimeClientOptions): void {\n const normalized: RealtimeClientOptions =\n typeof options === \"boolean\"\n ? { enabled: options }\n : (options ?? {});\n\n this.realtimeEnabled = normalized.enabled ?? false;\n this.realtimePath =\n String(normalized.path ?? REALTIME_DEFAULT_PATH).trim() ||\n REALTIME_DEFAULT_PATH;\n this.realtimeAutoConnect = normalized.autoConnect ?? true;\n this.realtimeAutoReconnect = normalized.autoReconnect ?? true;\n this.realtimeReconnectDelayMs = Math.max(\n 250,\n normalized.reconnectDelayMs ?? 3000,\n );\n\n if (!this.realtimeEnabled) {\n this.disconnectRealtime(\"realtime_disabled\");\n return;\n }\n\n this.setRealtimeStatus(\"idle\", \"realtime_enabled\");\n if (this.token && this.realtimeAutoConnect) {\n void this.connectRealtime().catch(() => {});\n }\n }\n\n buildRealtimeUrl(): string {\n const rawBaseUrl =\n this.baseUrl || readEnv(\"VITE_ENTITY_SERVER_URL\") || \"\";\n const origin =\n typeof window !== \"undefined\" ? window.location.origin : \"\";\n const baseUrl = rawBaseUrl || origin;\n\n if (!baseUrl) {\n throw new Error(\"Realtime connection requires baseUrl.\");\n }\n\n const url = new URL(baseUrl, origin || undefined);\n const basePath =\n url.pathname === \"/\" ? \"\" : url.pathname.replace(/\\/+$/, \"\");\n const realtimePath = `/${this.realtimePath.replace(/^\\/+/, \"\")}`;\n\n url.pathname = `${basePath}${realtimePath}` || realtimePath;\n url.search = \"\";\n url.hash = \"\";\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n url.searchParams.set(\"access_token\", this.token);\n return url.toString();\n }\n\n handleRealtimeMessage(payload: unknown): void {\n if (typeof payload !== \"string\") {\n return;\n }\n\n let envelope: RealtimeEnvelope;\n try {\n envelope = JSON.parse(payload) as RealtimeEnvelope;\n } catch {\n return;\n }\n\n for (const listener of this.realtimeMessageListeners) {\n listener(envelope);\n }\n\n const listeners = this.realtimeEventListeners.get(envelope.event);\n if (listeners) {\n for (const listener of listeners) {\n listener(envelope);\n }\n }\n }\n\n scheduleRealtimeReconnect(reason: string): void {\n this.clearRealtimeReconnectTimer();\n this.realtimeReconnectTimer = setTimeout(() => {\n this.realtimeReconnectTimer = null;\n if (!this.realtimeEnabled || !this.token) {\n return;\n }\n this.setRealtimeStatus(\"connecting\", `${reason}:reconnect`);\n void this.connectRealtime().catch(() => {});\n }, this.realtimeReconnectDelayMs);\n }\n\n clearRealtimeReconnectTimer(): void {\n if (this.realtimeReconnectTimer !== null) {\n clearTimeout(this.realtimeReconnectTimer);\n this.realtimeReconnectTimer = null;\n }\n }\n\n setRealtimeStatus(\n status: RealtimeConnectionStatus,\n reason?: string,\n error?: Error,\n ): void {\n const previousStatus = this.realtimeStatus;\n if (\n previousStatus === status &&\n typeof reason === \"undefined\" &&\n typeof error === \"undefined\"\n ) {\n return;\n }\n\n this.realtimeStatus = status;\n for (const listener of this.realtimeStatusListeners) {\n listener({\n status,\n previousStatus,\n ...(reason ? { reason } : {}),\n ...(error ? { error } : {}),\n });\n }\n }\n\n applyCsrfHealth(): void {\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() === this.csrfCookieName) {\n this.csrfEnabled = !!chunk.substring(idx + 1).trim();\n return;\n }\n }\n this.csrfEnabled = false;\n }\n\n // \u2500\u2500\u2500 \uC694\uCCAD \uBCF8\uBB38 \uD30C\uC2F1 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * \uC694\uCCAD \uBC14\uB514\uB97C \uD30C\uC2F1\uD569\uB2C8\uB2E4.\n * `application/octet-stream`\uC774\uBA74 XChaCha20-Poly1305 \uBCF5\uD638\uD654, \uADF8 \uC678\uB294 JSON \uD30C\uC2F1\uD569\uB2C8\uB2E4.\n *\n * @param requireEncrypted `true`\uC774\uBA74 \uC554\uD638\uD654\uB41C \uC694\uCCAD\uB9CC \uD5C8\uC6A9\uD569\uB2C8\uB2E4.\n */\n readRequestBody<T = Record<string, unknown>>(\n body: ArrayBuffer | Uint8Array | string | T | null | undefined,\n contentType = \"application/json\",\n requireEncrypted = false,\n ): T {\n const key = derivePacketKey(\n this.hmacSecret,\n this.token || this.anonymousPacketToken,\n );\n return parseRequestBody<T>(body, contentType, requireEncrypted, key);\n }\n\n // \u2500\u2500\u2500 \uB0B4\uBD80 \uD5EC\uD37C \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n get reqOpts(): RequestOptions {\n return {\n baseUrl: this.baseUrl,\n token: this.token,\n anonymousPacketToken: this.anonymousPacketToken,\n apiKey: this.apiKey,\n hmacSecret: this.hmacSecret,\n encryptRequests: this.encryptRequests,\n csrfEnabled: this.csrfEnabled,\n csrfHeaderName: this.csrfHeaderName,\n csrfCookieName: this.csrfCookieName,\n refreshCsrfCookie: this.csrfEnabled ? this.csrfRefresher : null,\n onAccessToken: (token) => {\n this.token = token;\n },\n };\n }\n\n // \uC778\uC99D \uC694\uCCAD \uC804\uC5D0 \uD544\uC694\uD55C \uD074\uB77C\uC774\uC5B8\uD2B8 \uC900\uBE44 \uC791\uC5C5\uC744 \uC218\uD589\uD569\uB2C8\uB2E4.\n prepareRequest(_withAuth: boolean): Promise<void> {\n return Promise.resolve();\n }\n\n /**\n * \uCEE4\uC2A4\uD140 \uB77C\uC6B0\uD2B8 \uC9C1\uC811 \uD638\uCD9C\uC6A9 HTTP \uB124\uC784\uC2A4\uD398\uC774\uC2A4.\n * \uC778\uC99D\u00B7\uC554\uD638\uD654\u00B7HMAC \uB4F1 SDK \uC635\uC158\uC774 \uADF8\uB300\uB85C \uC801\uC6A9\uB429\uB2C8\uB2E4.\n *\n * @example\n * const res = await client.http.get<{ version: string }>(\"/api/v1/status\", false);\n * const res = await client.http.post<MyResponse>(\"/api/v1/custom\", { key: \"value\" });\n */\n get http() {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n return {\n get<T>(\n path: string,\n withAuth = true,\n extraHeaders?: Record<string, string>,\n requestConfig?: EntityRequestConfig,\n ): Promise<T> {\n return self\n .prepareRequest(withAuth)\n .then(() =>\n entityRequest<T>(\n self.reqOpts,\n \"GET\",\n path,\n undefined,\n withAuth,\n extraHeaders,\n requestConfig ?? true,\n ),\n );\n },\n post<T>(\n path: string,\n body?: unknown,\n withAuth = true,\n extraHeaders?: Record<string, string>,\n requestConfig?: EntityRequestConfig,\n ): Promise<T> {\n return self\n .prepareRequest(withAuth)\n .then(() =>\n entityRequest<T>(\n self.reqOpts,\n \"POST\",\n path,\n body,\n withAuth,\n extraHeaders,\n requestConfig ?? true,\n ),\n );\n },\n put<T>(\n path: string,\n body?: unknown,\n withAuth = true,\n extraHeaders?: Record<string, string>,\n requestConfig?: EntityRequestConfig,\n ): Promise<T> {\n return self\n .prepareRequest(withAuth)\n .then(() =>\n entityRequest<T>(\n self.reqOpts,\n \"PUT\",\n path,\n body,\n withAuth,\n extraHeaders,\n requestConfig ?? true,\n ),\n );\n },\n patch<T>(\n path: string,\n body?: unknown,\n withAuth = true,\n extraHeaders?: Record<string, string>,\n requestConfig?: EntityRequestConfig,\n ): Promise<T> {\n return self\n .prepareRequest(withAuth)\n .then(() =>\n entityRequest<T>(\n self.reqOpts,\n \"PATCH\",\n path,\n body,\n withAuth,\n extraHeaders,\n requestConfig ?? true,\n ),\n );\n },\n delete<T>(\n path: string,\n body?: unknown,\n withAuth = true,\n extraHeaders?: Record<string, string>,\n requestConfig?: EntityRequestConfig,\n ): Promise<T> {\n return self\n .prepareRequest(withAuth)\n .then(() =>\n entityRequest<T>(\n self.reqOpts,\n \"DELETE\",\n path,\n body,\n withAuth,\n extraHeaders,\n requestConfig ?? true,\n ),\n );\n },\n };\n }\n\n request<T>(\n method: string,\n path: string,\n body?: unknown,\n withAuth = true,\n extraHeaders?: Record<string, string>,\n requestConfig?: EntityRequestConfig,\n ): Promise<T> {\n return this.prepareRequest(withAuth).then(() =>\n entityRequest<T>(\n this.reqOpts,\n method,\n path,\n body,\n withAuth,\n extraHeaders,\n requestConfig ?? true,\n ),\n );\n }\n\n /** PNG/\uBC14\uC774\uB108\uB9AC \uC751\uB2F5\uC744 ArrayBuffer\uB85C \uBC18\uD658\uD569\uB2C8\uB2E4. (QR, \uBC14\uCF54\uB4DC \uB4F1) */\n async requestBinary(\n method: string,\n path: string,\n body?: unknown,\n withAuth = true,\n ): Promise<ArrayBuffer> {\n await this.prepareRequest(withAuth);\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (withAuth && this.token)\n headers[\"Authorization\"] = `Bearer ${this.token}`;\n if (this.apiKey) headers[\"X-API-Key\"] = this.apiKey;\n\n const res = await fetch(this.baseUrl + path, {\n method,\n headers,\n ...(body != null ? { body: JSON.stringify(body) } : {}),\n credentials: \"include\",\n });\n\n if (!res.ok) {\n const text = await res.text();\n const err = new Error(`HTTP ${res.status}: ${text}`);\n (err as { status?: number }).status = res.status;\n throw err;\n }\n\n return res.arrayBuffer();\n }\n\n /** multipart/form-data \uC694\uCCAD\uC744 \uBCF4\uB0C5\uB2C8\uB2E4. (\uD30C\uC77C \uC5C5\uB85C\uB4DC \uB4F1) */\n async requestForm<T>(\n method: string,\n path: string,\n form: FormData,\n withAuth = true,\n ): Promise<T> {\n const headers: Record<string, string> = {};\n if (withAuth && this.token)\n headers[\"Authorization\"] = `Bearer ${this.token}`;\n if (this.apiKey) headers[\"X-API-Key\"] = this.apiKey;\n\n const res = await fetch(this.baseUrl + path, {\n method,\n headers,\n body: form,\n credentials: \"include\",\n });\n\n const data = (await res.json()) as { ok?: boolean; message?: string };\n if (!data.ok) {\n const err = new Error(\n data.message ?? `EntityServer error (HTTP ${res.status})`,\n );\n (err as { status?: number }).status = res.status;\n throw err;\n }\n return data as T;\n }\n\n /** multipart/form-data \uC694\uCCAD\uC744 \uBCF4\uB0B4\uACE0 \uBC14\uC774\uB108\uB9AC(ArrayBuffer)\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\n async requestFormBinary(\n method: string,\n path: string,\n form: FormData,\n withAuth = true,\n ): Promise<ArrayBuffer> {\n const headers: Record<string, string> = {};\n if (withAuth && this.token)\n headers[\"Authorization\"] = `Bearer ${this.token}`;\n if (this.apiKey) headers[\"X-API-Key\"] = this.apiKey;\n\n const res = await fetch(this.baseUrl + path, {\n method,\n headers,\n body: form,\n credentials: \"include\",\n });\n\n if (!res.ok) {\n const text = await res.text();\n const err = new Error(`HTTP ${res.status}: ${text}`);\n (err as { status?: number }).status = res.status;\n throw err;\n }\n\n return res.arrayBuffer();\n }\n}\n", "import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../client/base.js\";\nimport { entityRequest } from \"../../client/request.js\";\n\nexport interface AuthLoginSuccessData {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n force_password_change?: boolean;\n password_expired?: boolean;\n password_expires_in_days?: number;\n}\n\nexport interface AuthLoginSuccessResponse {\n ok: true;\n data: AuthLoginSuccessData;\n requires_2fa?: false;\n}\n\nexport interface AuthLoginRequiresTwoFactorResponse {\n ok: true;\n requires_2fa: true;\n data: {\n two_factor_token: string;\n expires_in: number;\n };\n}\n\nexport interface AuthLoginSetupRequiredResponse {\n ok: false;\n error: \"2fa_setup_required\";\n message: string;\n data: {\n setup_token: string;\n expires_in: number;\n };\n}\n\nexport type AuthLoginResponse =\n | AuthLoginSuccessResponse\n | AuthLoginRequiresTwoFactorResponse\n | AuthLoginSetupRequiredResponse;\n\nexport function isAuthLoginSuccessResponse(\n response: AuthLoginResponse,\n): response is AuthLoginSuccessResponse {\n return (\n response.ok === true &&\n response.requires_2fa !== true &&\n typeof response.data === \"object\" &&\n response.data !== null &&\n \"access_token\" in response.data\n );\n}\n\nexport function AuthMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class AuthMixinClass extends Base {\n authBootstrapPromise: Promise<void> | null = null;\n authBootstrapToken = \"\";\n authBootstrapAnonymousCompleted = false;\n\n // health tick\uC774 \uCF1C\uC838 \uC788\uC73C\uBA74 keepSession \uC5EC\uBD80\uC5D0 \uB530\uB77C \uC138\uC158 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uAE4C\uC9C0 \uD568\uAED8 \uCC98\uB9AC\uD569\uB2C8\uB2E4.\n csrfRefresher = (): Promise<void> =>\n this.checkHealth(this.keepSession).then(() => {});\n\n // \u2500\u2500\u2500 \uC778\uC99D \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * \uC11C\uBC84 \uD5EC\uC2A4 \uCCB4\uD06C\uB97C \uC218\uD589\uD558\uACE0 \uD328\uD0B7 \uC554\uD638\uD654 \uD65C\uC131 \uC5EC\uBD80\uB97C \uC790\uB3D9\uC73C\uB85C \uAC10\uC9C0\uD569\uB2C8\uB2E4.\n *\n * \uC11C\uBC84\uAC00 `packet_encryption: true`\uB97C \uC751\uB2F5\uD558\uBA74 \uC774\uD6C4 \uBAA8\uB4E0 \uC694\uCCAD\uC5D0 \uC554\uD638\uD654\uAC00 \uC790\uB3D9 \uC801\uC6A9\uB429\uB2C8\uB2E4.\n *\n * ```ts\n * await client.checkHealth();\n * await client.login(email, password);\n * ```\n */\n async checkHealth(bootstrapAuth = false): Promise<{\n status: string;\n authenticated?: boolean;\n packet_encryption?: boolean;\n }> {\n try {\n const previousToken = this.token;\n const headers: Record<string, string> = {};\n if (bootstrapAuth) {\n headers[\"X-Session-Bootstrap\"] = \"1\";\n }\n\n const res = await fetch(`${this.baseUrl}/v1/health`, {\n signal: AbortSignal.timeout(3000),\n credentials: \"include\",\n headers,\n });\n const data = (await res.json()) as {\n status: string;\n authenticated?: boolean;\n packet_encryption?: boolean;\n };\n\n const accessToken = res.headers.get(\"X-Access-Token\");\n if (accessToken) {\n this.token = accessToken;\n if (bootstrapAuth && accessToken !== previousToken) {\n this.onTokenRefreshed?.(accessToken, 0);\n }\n if (\n bootstrapAuth &&\n data.authenticated === true &&\n this.realtimeEnabled &&\n this.realtimeAutoConnect\n ) {\n this.connectRealtime().catch(() => {});\n }\n }\n\n // \uD328\uD0B7 \uC554\uD638\uD654\uB294 health \uC751\uB2F5\uC774 \uBA85\uC2DC\uC801\uC73C\uB85C \uD65C\uC131\uC774\uB77C\uACE0 \uC54C\uB824\uC904 \uB54C\uB9CC \uC790\uB3D9 \uD65C\uC131\uD654\uD55C\uB2E4.\n const anonToken = this.readCookie(\"anon_token\");\n if (data.packet_encryption === true && anonToken) {\n this.anonymousPacketToken = anonToken;\n this.encryptRequests = true;\n }\n\n this.applyCsrfHealth();\n this.onHealthChange?.(true);\n if (\n bootstrapAuth &&\n data.authenticated === false &&\n previousToken\n ) {\n this.disconnectRealtime(\"session_expired\");\n this.onSessionExpired?.(new Error(\"Session expired\"));\n }\n return data;\n } catch (error) {\n this.onHealthChange?.(false);\n throw error;\n }\n }\n\n /** document.cookie \uB610\uB294 Node \uD658\uACBD\uC5D0\uC11C \uCFE0\uD0A4 \uAC12 \uC77D\uAE30 (SSR \uB300\uC751) */\n readCookie(name: string): string | null {\n if (typeof document === \"undefined\") return null;\n const match = document.cookie\n .split(\";\")\n .map((c) => c.trim())\n .find((c) => c.startsWith(`${name}=`));\n if (!match) return null;\n try {\n return decodeURIComponent(match.slice(name.length + 1));\n } catch {\n return match.slice(name.length + 1);\n }\n }\n\n async ensurePublicAuthBootstrap(): Promise<void> {\n if (typeof document === \"undefined\") {\n return;\n }\n\n if (this.apiKey && this.hmacSecret) {\n return;\n }\n\n const hasAnonymousPacketToken =\n !!this.anonymousPacketToken || !!this.readCookie(\"anon_token\");\n const hasCsrfCookie = !!this.readCookie(this.csrfCookieName);\n\n if (hasAnonymousPacketToken && hasCsrfCookie && this.csrfEnabled) {\n return;\n }\n\n await this.checkHealth(false);\n }\n\n // \uC778\uC99D \uC694\uCCAD \uC804\uC5D0 health \uAE30\uBC18 \uC138\uC158 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uC744 \uD55C \uBC88 \uBCF4\uC7A5\uD569\uB2C8\uB2E4.\n async ensureAuthenticatedRequestBootstrap(): Promise<void> {\n if (typeof document === \"undefined\") {\n return;\n }\n\n if (this.apiKey && this.hmacSecret) {\n return;\n }\n\n if (this.token) {\n if (this.authBootstrapToken === this.token) {\n return;\n }\n } else if (this.authBootstrapAnonymousCompleted) {\n return;\n }\n\n if (this.authBootstrapPromise) {\n return this.authBootstrapPromise;\n }\n\n this.authBootstrapPromise = this.checkHealth(true)\n .then(() => {\n if (this.token) {\n this.authBootstrapToken = this.token;\n } else {\n this.authBootstrapAnonymousCompleted = true;\n }\n })\n .finally(() => {\n this.authBootstrapPromise = null;\n });\n\n return this.authBootstrapPromise;\n }\n\n // \uC778\uC99D \uC694\uCCAD \uC804 \uC790\uB3D9 health \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uC744 \uC218\uD589\uD569\uB2C8\uB2E4.\n override async prepareRequest(withAuth: boolean): Promise<void> {\n await super.prepareRequest(withAuth);\n if (!withAuth) {\n return;\n }\n\n await this.ensureAuthenticatedRequestBootstrap();\n }\n\n /** \uB85C\uADF8\uC778 \uC751\uB2F5\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. \uC131\uACF5 \uC2DC\uC5D0\uB9CC `access_token`\uC744 \uB0B4\uBD80 \uC0C1\uD0DC\uC5D0 \uC800\uC7A5\uD569\uB2C8\uB2E4. */\n async login(\n email: string,\n password: string,\n ): Promise<AuthLoginResponse> {\n await this.ensurePublicAuthBootstrap();\n\n const response = await entityRequest<AuthLoginResponse>(\n this.reqOpts,\n \"POST\",\n \"/v1/auth/login\",\n { email, passwd: password },\n false,\n {},\n { requireOkShape: false, allowStatuses: [403] },\n );\n\n if (isAuthLoginSuccessResponse(response)) {\n this.token = response.data.access_token;\n this.applyCsrfHealth();\n if (this.keepSession && this.healthTickTimer === null) {\n this.startHealthTick();\n }\n if (this.realtimeEnabled && this.realtimeAutoConnect) {\n this.connectRealtime().catch(() => {});\n }\n }\n\n return response;\n }\n\n /** HttpOnly refresh cookie\uB85C Access Token\uC744 \uC7AC\uBC1C\uAE09\uBC1B\uC544 \uB0B4\uBD80 \uD1A0\uD070\uC744 \uAD50\uCCB4\uD569\uB2C8\uB2E4. */\n async tokenRefresh(): Promise<{\n access_token: string;\n refresh_token: string;\n expires_in: number;\n }> {\n const data = await this.request<{\n data: {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n };\n }>(\"POST\", \"/v1/auth/token_refresh\", undefined, false);\n this.token = data.data.access_token;\n this.applyCsrfHealth();\n return data.data;\n }\n\n /** Refresh Token\uC73C\uB85C Access Token\uC744 \uC7AC\uBC1C\uAE09\uBC1B\uC544 \uB0B4\uBD80 \uD1A0\uD070\uC744 \uAD50\uCCB4\uD569\uB2C8\uB2E4. */\n async refreshToken(refreshToken?: string): Promise<{\n access_token: string;\n refresh_token?: string;\n expires_in: number;\n }> {\n if (!refreshToken) {\n return this.tokenRefresh();\n }\n\n const data = await this.request<{\n data: {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n };\n }>(\n \"POST\",\n \"/v1/auth/refresh\",\n { refresh_token: refreshToken },\n false,\n );\n this.token = data.data.access_token;\n this.applyCsrfHealth();\n return data.data;\n }\n\n /**\n * \uC11C\uBC84\uC5D0 \uB85C\uADF8\uC544\uC6C3\uC744 \uC694\uCCAD\uD558\uACE0 \uB0B4\uBD80 \uD1A0\uD070\uC744 \uCD08\uAE30\uD654\uD569\uB2C8\uB2E4.\n * refresh_token\uC744 \uC11C\uBC84\uC5D0 \uC804\uB2EC\uD574 \uBB34\uD6A8\uD654\uD569\uB2C8\uB2E4.\n */\n async logout(refreshToken?: string): Promise<{ ok: boolean }> {\n this.stopKeepSession();\n this.stopHealthTick();\n this.disconnectRealtime(\"logout\");\n const data = await this.request<{ ok: boolean }>(\n \"POST\",\n \"/v1/auth/logout\",\n refreshToken ? { refresh_token: refreshToken } : undefined,\n false,\n );\n this.token = \"\";\n this.applyCsrfHealth();\n return data;\n }\n\n /** \uD604\uC7AC \uB85C\uADF8\uC778\uB41C \uC0AC\uC6A9\uC790 \uC815\uBCF4\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\n me<T = Record<string, unknown>>(): Promise<{ ok: boolean; data: T }> {\n return this.request(\"GET\", \"/v1/auth/me\");\n }\n\n /** \uD68C\uC6D0 \uD0C8\uD1F4\uB97C \uC694\uCCAD\uD569\uB2C8\uB2E4. */\n withdraw(passwd?: string): Promise<{ ok: boolean }> {\n return this.request(\n \"POST\",\n \"/v1/auth/withdraw\",\n passwd ? { passwd } : {},\n );\n }\n };\n}\n", "import type {\n EntityHistoryRecord,\n EntityListParams,\n EntityListResult,\n EntityQueryRequest,\n} from \"../../types.js\";\nimport { buildQuery } from \"../../client/utils.js\";\nimport type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../client/base.js\";\n\nexport function EntityMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class EntityMixinClass extends Base {\n // \u2500\u2500\u2500 \uD2B8\uB79C\uC7AD\uC158 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** \uD2B8\uB79C\uC7AD\uC158\uC744 \uC2DC\uC791\uD558\uACE0 \uD65C\uC131 \uD2B8\uB79C\uC7AD\uC158 ID\uB97C \uC800\uC7A5\uD569\uB2C8\uB2E4. */\n async transStart(): Promise<string> {\n const res = await this.request<{\n ok: boolean;\n transaction_id: string;\n }>(\"POST\", \"/v1/transaction/start\", undefined, false);\n this.activeTxId = res.transaction_id;\n return this.activeTxId;\n }\n\n /** \uD65C\uC131 \uD2B8\uB79C\uC7AD\uC158(\uB610\uB294 \uC804\uB2EC\uB41C transactionId)\uC744 \uB864\uBC31\uD569\uB2C8\uB2E4. */\n transRollback(transactionId?: string): Promise<{ ok: boolean }> {\n const txId = transactionId ?? this.activeTxId;\n if (!txId)\n return Promise.reject(\n new Error(\n \"No active transaction. Call transStart() first.\",\n ),\n );\n this.activeTxId = null;\n return this.request(\"POST\", `/v1/transaction/rollback/${txId}`);\n }\n\n /**\n * \uD65C\uC131 \uD2B8\uB79C\uC7AD\uC158(\uB610\uB294 \uC804\uB2EC\uB41C transactionId)\uC744 \uCEE4\uBC0B\uD569\uB2C8\uB2E4.\n *\n * @returns `results` \uBC30\uC5F4: commit\uB41C \uAC01 \uC791\uC5C5\uC758 `entity`, `action`, `seq`\n */\n transCommit(transactionId?: string): Promise<{\n ok: boolean;\n results: Array<{ entity: string; action: string; seq: number }>;\n }> {\n const txId = transactionId ?? this.activeTxId;\n if (!txId)\n return Promise.reject(\n new Error(\n \"No active transaction. Call transStart() first.\",\n ),\n );\n this.activeTxId = null;\n return this.request(\"POST\", `/v1/transaction/commit/${txId}`);\n }\n\n // \u2500\u2500\u2500 \uC5D4\uD2F0\uD2F0 CRUD \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** \uC5D4\uD2F0\uD2F0 \uC124\uC815 \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\n meta<T = unknown>(entity: string): Promise<{ ok: boolean; data: T }> {\n return this.request(\"POST\", `/v1/entity/${entity}/meta`, {});\n }\n\n /** \uC5D4\uD2F0\uD2F0 \uB370\uC774\uD130\uB97C \uC800\uC7A5 \uC5C6\uC774 \uAC80\uC99D\uD569\uB2C8\uB2E4. */\n validate<T = unknown>(\n entity: string,\n data: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(`/v1/entity/${entity}/validate`, data);\n }\n\n /** \uC2DC\uD000\uC2A4 ID\uB85C \uC5D4\uD2F0\uD2F0 \uB2E8\uAC74\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n get<T = unknown>(\n entity: string,\n seq: number,\n opts: { skipHooks?: boolean } = {},\n ): Promise<{ ok: boolean; data: T }> {\n const q = opts.skipHooks ? \"?skipHooks=true\" : \"\";\n return this.request(\"GET\", `/v1/entity/${entity}/${seq}${q}`);\n }\n\n /** \uC870\uAC74\uC73C\uB85C \uC5D4\uD2F0\uD2F0 \uB2E8\uAC74\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. data \uCEEC\uB7FC\uC744 \uC644\uC804\uD788 \uBCF5\uD638\uD654\uD558\uC5EC \uBC18\uD658\uD569\uB2C8\uB2E4. */\n find<T = unknown>(\n entity: string,\n conditions?: Record<string, unknown>,\n opts: { skipHooks?: boolean } = {},\n ): Promise<{ ok: boolean; data: T }> {\n const q = opts.skipHooks ? \"?skipHooks=true\" : \"\";\n return this.request(\n \"POST\",\n `/v1/entity/${entity}/find${q}`,\n conditions ?? {},\n );\n }\n\n /** \uD398\uC774\uC9C0\uB124\uC774\uC158/\uC815\uB82C/\uD544\uD130 \uC870\uAC74\uC73C\uB85C \uC5D4\uD2F0\uD2F0 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n list<T = unknown>(\n entity: string,\n params: EntityListParams = {},\n ): Promise<{ ok: boolean; data: EntityListResult<T> }> {\n const { conditions, fields, orderDir, orderBy, ...rest } = params;\n const queryObj: Record<string, unknown> = {\n page: 1,\n limit: 20,\n ...rest,\n };\n if (orderBy)\n queryObj.orderBy =\n orderDir === \"DESC\" ? `-${orderBy}` : orderBy;\n if (fields?.length) queryObj.fields = fields.join(\",\");\n return this.request(\n \"POST\",\n `/v1/entity/${entity}/list?${buildQuery(queryObj)}`,\n conditions ?? {},\n );\n }\n\n /**\n * \uC5D4\uD2F0\uD2F0 \uCD1D \uAC74\uC218\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4.\n *\n * @param conditions \uD544\uD130 \uC870\uAC74 (\uC608: `{ status: \"active\" }`)\n */\n count(\n entity: string,\n conditions?: Record<string, unknown>,\n ): Promise<{ ok: boolean; count: number }> {\n return this.request(\n \"POST\",\n `/v1/entity/${entity}/count`,\n conditions ?? {},\n );\n }\n\n /**\n * \uCEE4\uC2A4\uD140 SQL\uB85C \uC5D4\uD2F0\uD2F0\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4.\n *\n * SELECT \uC804\uC6A9\uC774\uBA70 \uC778\uB371\uC2A4 \uD14C\uC774\uBE14\uB9CC \uC870\uD68C \uAC00\uB2A5\uD569\uB2C8\uB2E4. JOIN \uC9C0\uC6D0.\n */\n query<T = unknown>(\n entity: string,\n req: EntityQueryRequest,\n ): Promise<{ ok: boolean; data: { items: T[]; count: number } }> {\n return this.request(\"POST\", `/v1/entity/${entity}/query`, req);\n }\n\n /** \uC5D4\uD2F0\uD2F0 \uB370\uC774\uD130\uB97C \uC0DD\uC131/\uC218\uC815(Submit)\uD569\uB2C8\uB2E4. `seq`\uAC00 \uC5C6\uC73C\uBA74 INSERT, \uC788\uC73C\uBA74 UPDATE\uC785\uB2C8\uB2E4. */\n submit(\n entity: string,\n data: Record<string, unknown>,\n opts: { transactionId?: string; skipHooks?: boolean } = {},\n ): Promise<{ ok: boolean; seq: number }> {\n const txId = opts.transactionId ?? this.activeTxId;\n const extraHeaders = txId\n ? { \"X-Transaction-ID\": txId }\n : undefined;\n const q = opts.skipHooks ? \"?skipHooks=true\" : \"\";\n return this.request(\n \"POST\",\n `/v1/entity/${entity}/submit${q}`,\n data,\n true,\n extraHeaders,\n );\n }\n\n /** \uC2DC\uD000\uC2A4 ID\uB85C \uC5D4\uD2F0\uD2F0\uB97C \uC0AD\uC81C\uD569\uB2C8\uB2E4(`hard=true`\uBA74 \uD558\uB4DC \uC0AD\uC81C, \uAE30\uBCF8\uC740 \uC18C\uD504\uD2B8 \uC0AD\uC81C). */\n delete(\n entity: string,\n seq: number,\n opts: {\n transactionId?: string;\n hard?: boolean;\n skipHooks?: boolean;\n } = {},\n ): Promise<{ ok: boolean; deleted: number }> {\n const params = new URLSearchParams();\n if (opts.hard) params.set(\"hard\", \"true\");\n if (opts.skipHooks) params.set(\"skipHooks\", \"true\");\n const q = params.size ? `?${params}` : \"\";\n const txId = opts.transactionId ?? this.activeTxId;\n const extraHeaders = txId\n ? { \"X-Transaction-ID\": txId }\n : undefined;\n return this.request(\n \"POST\",\n `/v1/entity/${entity}/delete/${seq}${q}`,\n undefined,\n true,\n extraHeaders,\n );\n }\n\n /** \uC5D4\uD2F0\uD2F0 \uB2E8\uAC74\uC758 \uBCC0\uACBD \uC774\uB825\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n history<T = unknown>(\n entity: string,\n seq: number,\n params: Pick<EntityListParams, \"page\" | \"limit\"> = {},\n ): Promise<{\n ok: boolean;\n data: EntityListResult<EntityHistoryRecord<T>>;\n }> {\n return this.request(\n \"GET\",\n `/v1/entity/${entity}/history/${seq}?${buildQuery({ page: 1, limit: 50, ...params })}`,\n );\n }\n\n /** \uD2B9\uC815 \uC774\uB825 \uC2DC\uC810\uC73C\uB85C \uC5D4\uD2F0\uD2F0\uB97C \uB864\uBC31\uD569\uB2C8\uB2E4. */\n rollback(entity: string, historySeq: number): Promise<{ ok: boolean }> {\n return this.request(\n \"POST\",\n `/v1/entity/${entity}/rollback/${historySeq}`,\n );\n }\n };\n}\n", "import type {\n FileMeta,\n FileUploadOptions,\n StorageMeta,\n StorageUploadOptions,\n} from \"../../types.js\";\nimport type { GConstructor, EntityServerClientBase } from \"../../client/base.js\";\n\nexport function FileMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class FileMixinClass extends Base {\n // \u2500\u2500\u2500 \uD30C\uC77C \uAD00\uB9AC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * \uD30C\uC77C\uC744 \uC5C5\uB85C\uB4DC\uD569\uB2C8\uB2E4. (multipart/form-data)\n *\n * ```ts\n * const input = document.querySelector('input[type=\"file\"]');\n * const result = await client.fileUpload(\"product\", input.files[0]);\n * console.log(result.data.uuid);\n * ```\n */\n async fileUpload(\n entity: string,\n file: File | Blob,\n opts: FileUploadOptions = {},\n ): Promise<{ ok: boolean; uuid: string; data: FileMeta }> {\n const form = new FormData();\n form.append(\n \"file\",\n file,\n file instanceof File ? file.name : \"upload\",\n );\n if (opts.refSeq != null)\n form.append(\"ref_seq\", String(opts.refSeq));\n if (opts.isPublic != null)\n form.append(\"is_public\", opts.isPublic ? \"true\" : \"false\");\n return this.requestForm(\n \"POST\",\n `/v1/files/${entity}/upload`,\n form,\n );\n }\n\n /** \uD30C\uC77C\uC744 \uB2E4\uC6B4\uB85C\uB4DC\uD569\uB2C8\uB2E4. `ArrayBuffer`\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\n fileDownload(entity: string, uuid: string): Promise<ArrayBuffer> {\n return this.requestBinary(\n \"POST\",\n `/v1/files/${entity}/download/${uuid}`,\n {},\n );\n }\n\n /** \uD30C\uC77C\uC744 \uC0AD\uC81C\uD569\uB2C8\uB2E4. */\n fileDelete(\n entity: string,\n uuid: string,\n ): Promise<{ ok: boolean; uuid: string; deleted: boolean }> {\n return this.request(\n \"POST\",\n `/v1/files/${entity}/delete/${uuid}`,\n {},\n );\n }\n\n /** \uC5D4\uD2F0\uD2F0\uC5D0 \uC5F0\uACB0\uB41C \uD30C\uC77C \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n fileList(\n entity: string,\n opts: { refSeq?: number } = {},\n ): Promise<{\n ok: boolean;\n data: { items: FileMeta[]; total: number };\n }> {\n return this.request(\n \"POST\",\n `/v1/files/${entity}/list`,\n opts.refSeq ? { ref_seq: opts.refSeq } : {},\n );\n }\n\n /** \uD30C\uC77C \uBA54\uD0C0 \uC815\uBCF4\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\n fileMeta(\n entity: string,\n uuid: string,\n ): Promise<{ ok: boolean; data: FileMeta }> {\n return this.request(\n \"POST\",\n `/v1/files/${entity}/meta/${uuid}`,\n {},\n );\n }\n\n /** \uC784\uC2DC \uD30C\uC77C \uC811\uADFC \uD1A0\uD070\uC744 \uBC1C\uAE09\uD569\uB2C8\uB2E4. */\n fileToken(uuid: string): Promise<{ ok: boolean; token: string }> {\n return this.request(\"POST\", `/v1/files/token/${uuid}`, {});\n }\n\n /** \uD30C\uC77C \uC778\uB77C\uC778 \uBDF0/\uB2E4\uC6B4\uB85C\uB4DC URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\n fileViewUrl(uuid: string, opts: { download?: boolean } = {}): string {\n const qs = opts.download ? \"?download=true\" : \"\";\n return `${this.baseUrl}/v1/files/${uuid}${qs}`;\n }\n\n /** \uD30C\uC77C \uC778\uB77C\uC778 \uBDF0 URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. (fetch \uC5C6\uC74C, URL \uC870\uD569\uB9CC) */\n fileUrl(uuid: string): string {\n return `${this.baseUrl}/v1/files/${uuid}`;\n }\n\n // \u2500\u2500\u2500 \uC2A4\uD1A0\uB9AC\uC9C0 \uB77C\uC6B0\uD2B8 \uBCC4\uCE6D \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uC5C5\uB85C\uB4DC \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\n storageUpload(\n entity: string,\n file: File | Blob,\n opts: StorageUploadOptions = {},\n ): Promise<{ ok: boolean; uuid: string; data: StorageMeta }> {\n return this.fileUpload(entity, file, opts);\n }\n\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uB2E4\uC6B4\uB85C\uB4DC \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\n storageDownload(entity: string, uuid: string): Promise<ArrayBuffer> {\n return this.fileDownload(entity, uuid);\n }\n\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uC0AD\uC81C \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\n storageDelete(\n entity: string,\n uuid: string,\n ): Promise<{ ok: boolean; uuid: string; deleted: boolean }> {\n return this.fileDelete(entity, uuid);\n }\n\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uBAA9\uB85D \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\n storageList(\n entity: string,\n opts: { refSeq?: number } = {},\n ): Promise<{\n ok: boolean;\n data: { items: StorageMeta[]; total: number };\n }> {\n return this.fileList(entity, opts);\n }\n\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uBA54\uD0C0 \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\n storageMeta(\n entity: string,\n uuid: string,\n ): Promise<{ ok: boolean; data: StorageMeta }> {\n return this.fileMeta(entity, uuid);\n }\n\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uC784\uC2DC \uD1A0\uD070 \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\n storageToken(uuid: string): Promise<{ ok: boolean; token: string }> {\n return this.fileToken(uuid);\n }\n\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uC778\uB77C\uC778 \uBDF0/\uB2E4\uC6B4\uB85C\uB4DC URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\n storageViewUrl(uuid: string, opts: { download?: boolean } = {}): string {\n return this.fileViewUrl(uuid, opts);\n }\n\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uB2E4\uC6B4\uB85C\uB4DC URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\n storageDownloadUrl(uuid: string): string {\n return this.fileViewUrl(uuid, { download: true });\n }\n\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uC778\uB77C\uC778 \uBDF0 URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\n storageUrl(uuid: string): string {\n return this.fileUrl(uuid);\n }\n };\n}\n", "import type {\n EntityListParams,\n EntityListResult,\n RegisterPushDeviceOptions,\n} from \"../../types.js\";\nimport type { GConstructor, EntityServerClientBase } from \"../../client/base.js\";\n\n// entity submit\uC744 \uAC00\uC9C4 base \uD0C0\uC785 (EntityMixin \uC801\uC6A9 \uD6C4)\ntype WithSubmit = EntityServerClientBase & {\n submit(\n entity: string,\n data: Record<string, unknown>,\n opts?: { transactionId?: string; skipHooks?: boolean },\n ): Promise<{ ok: boolean; seq: number }>;\n list<T = unknown>(\n entity: string,\n params?: EntityListParams,\n ): Promise<{ ok: boolean; data: EntityListResult<T> }>;\n};\n\nexport function PushMixin<TBase extends GConstructor<WithSubmit>>(Base: TBase) {\n return class PushMixinClass extends Base {\n // \u2500\u2500\u2500 \uD478\uC2DC submit \uB798\uD37C \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * \uD478\uC2DC \uAD00\uB828 \uC5D4\uD2F0\uD2F0\uB85C payload\uB97C \uC804\uC1A1(Submit)\uD569\uB2C8\uB2E4.\n * \uB0B4\uBD80\uC801\uC73C\uB85C `submit()` \uBA54\uC11C\uB4DC\uB97C \uD638\uCD9C\uD569\uB2C8\uB2E4.\n */\n push(\n pushEntity: string,\n payload: Record<string, unknown>,\n opts: { transactionId?: string } = {},\n ): Promise<{ ok: boolean; seq: number }> {\n return this.submit(pushEntity, payload, opts);\n }\n\n // \u2500\u2500\u2500 \uD478\uC2DC \uB514\uBC14\uC774\uC2A4 \uAD00\uB9AC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** \uD478\uC2DC \uB85C\uADF8 \uC5D4\uD2F0\uD2F0 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n pushLogList<T = unknown>(\n params: EntityListParams = {},\n ): Promise<{ ok: boolean; data: EntityListResult<T> }> {\n return this.list<T>(\"push_log\", params);\n }\n\n /** \uACC4\uC815\uC758 \uD478\uC2DC \uB514\uBC14\uC774\uC2A4\uB97C \uB4F1\uB85D\uD569\uB2C8\uB2E4. */\n registerPushDevice(\n accountSeq: number,\n deviceId: string,\n pushToken: string,\n opts: RegisterPushDeviceOptions = {},\n ): Promise<{ ok: boolean; seq: number }> {\n const {\n platform,\n deviceType,\n browser,\n browserVersion,\n pushEnabled = true,\n transactionId,\n } = opts;\n return this.submit(\n \"account_device\",\n {\n id: deviceId,\n account_seq: accountSeq,\n push_token: pushToken,\n push_enabled: pushEnabled,\n ...(platform ? { platform } : {}),\n ...(deviceType ? { device_type: deviceType } : {}),\n ...(browser ? { browser } : {}),\n ...(browserVersion\n ? { browser_version: browserVersion }\n : {}),\n },\n { transactionId },\n );\n }\n\n /** \uB514\uBC14\uC774\uC2A4 \uB808\uCF54\uB4DC\uC758 \uD478\uC2DC \uD1A0\uD070\uC744 \uAC31\uC2E0\uD569\uB2C8\uB2E4. */\n updatePushDeviceToken(\n deviceSeq: number,\n pushToken: string,\n opts: { pushEnabled?: boolean; transactionId?: string } = {},\n ): Promise<{ ok: boolean; seq: number }> {\n const { pushEnabled = true, transactionId } = opts;\n return this.submit(\n \"account_device\",\n {\n seq: deviceSeq,\n push_token: pushToken,\n push_enabled: pushEnabled,\n },\n { transactionId },\n );\n }\n\n /** \uB514\uBC14\uC774\uC2A4\uC758 \uD478\uC2DC \uC218\uC2E0\uC744 \uBE44\uD65C\uC131\uD654\uD569\uB2C8\uB2E4. */\n disablePushDevice(\n deviceSeq: number,\n opts: { transactionId?: string } = {},\n ): Promise<{ ok: boolean; seq: number }> {\n return this.submit(\n \"account_device\",\n { seq: deviceSeq, push_enabled: false },\n { transactionId: opts.transactionId },\n );\n }\n };\n}\n", "import type { SmtpSendRequest } from \"../../types.js\";\nimport type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../client/base.js\";\n\nexport function SmtpMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class SmtpMixinClass extends Base {\n // \u2500\u2500\u2500 SMTP \uBA54\uC77C \uBC1C\uC1A1 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** SMTP\uB85C \uBA54\uC77C\uC744 \uBC1C\uC1A1\uD569\uB2C8\uB2E4. */\n smtpSend(req: SmtpSendRequest): Promise<{ ok: boolean; seq: number }> {\n return this.request(\"POST\", \"/v1/smtp/send\", req);\n }\n\n /** SMTP \uBC1C\uC1A1 \uC0C1\uD0DC\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\n smtpStatus(seq: number): Promise<{ ok: boolean; status: string }> {\n return this.request(\"POST\", `/v1/smtp/status/${seq}`, {});\n }\n\n /** SMTP \uD15C\uD50C\uB9BF \uBBF8\uB9AC\uBCF4\uAE30 HTML\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\n smtpTemplatePreview(templatePath: string): Promise<string> {\n const encoded = templatePath\n .split(\"/\")\n .map(encodeURIComponent)\n .join(\"/\");\n return fetch(`${this.baseUrl}/v1/smtp/template/${encoded}`, {\n credentials: \"include\",\n }).then((r) => r.text());\n }\n };\n}\n", "import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../client/base.js\";\n\nexport function TransactionMixin<\n TBase extends GConstructor<EntityServerClientBase>,\n>(Base: TBase) {\n return class TransactionMixinClass extends Base {\n /** \uD2B8\uB79C\uC7AD\uC158\uC744 \uC2DC\uC791\uD558\uACE0 transaction_id\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\n transactionStart<T = unknown>(\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.request(\"POST\", \"/v1/transaction/start\", body ?? {});\n }\n\n /** \uC9C0\uC815\uD55C \uD2B8\uB79C\uC7AD\uC158\uC744 \uCEE4\uBC0B\uD569\uB2C8\uB2E4. */\n transactionCommit<T = unknown>(transactionId: string): Promise<T> {\n return this.request(\n \"POST\",\n `/v1/transaction/commit/${encodeURIComponent(transactionId)}`,\n {},\n );\n }\n\n /** \uC9C0\uC815\uD55C \uD2B8\uB79C\uC7AD\uC158\uC744 \uB864\uBC31\uD569\uB2C8\uB2E4. */\n transactionRollback<T = unknown>(transactionId: string): Promise<T> {\n return this.request(\n \"POST\",\n `/v1/transaction/rollback/${encodeURIComponent(transactionId)}`,\n {},\n );\n }\n };\n}\n", "import type {\n QRCodeOptions,\n BarcodeOptions,\n Pdf2PngOptions,\n} from \"../../types.js\";\nimport type { GConstructor, EntityServerClientBase } from \"../../client/base.js\";\n\nexport function UtilsMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class UtilsMixinClass extends Base {\n addressSido<T = unknown>(): Promise<T> {\n return this.http.get(\n \"/v1/utils/address/sido\",\n false,\n );\n }\n\n addressSigungu<T = unknown>(query: { sido: string }): Promise<T> {\n const qs = new URLSearchParams({ sido: query.sido }).toString();\n return this.http.get(\n `/v1/utils/address/sigungu?${qs}`,\n false,\n );\n }\n\n addressDong<T = unknown>(query: {\n sido: string;\n sigungu: string;\n }): Promise<T> {\n const qs = new URLSearchParams({\n sido: query.sido,\n sigungu: query.sigungu,\n }).toString();\n return this.http.get(\n `/v1/utils/address/dong?${qs}`,\n false,\n );\n }\n\n addressClean<T = unknown>(query: { q: string }): Promise<T> {\n const qs = new URLSearchParams({ q: query.q }).toString();\n return this.http.get(\n `/v1/utils/address/clean?${qs}`,\n false,\n );\n }\n\n // \u2500\u2500\u2500 Utils (QR / \uBC14\uCF54\uB4DC) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * QR \uCF54\uB4DC PNG\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4. `ArrayBuffer`\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.\n *\n * ```ts\n * const buf = await client.qrcode(\"https://example.com\");\n * const blob = new Blob([buf], { type: \"image/png\" });\n * img.src = URL.createObjectURL(blob);\n * ```\n */\n qrcode(\n content: string,\n opts: QRCodeOptions = {},\n ): Promise<ArrayBuffer> {\n return this.requestBinary(\"POST\", \"/v1/utils/qrcode\", {\n content,\n ...opts,\n });\n }\n\n /**\n * QR \uCF54\uB4DC\uB97C base64/data URI JSON\uC73C\uB85C \uBC18\uD658\uD569\uB2C8\uB2E4.\n *\n * ```ts\n * const { data_uri } = await client.qrcodeBase64(\"https://example.com\");\n * img.src = data_uri;\n * ```\n */\n qrcodeBase64(\n content: string,\n opts: QRCodeOptions = {},\n ): Promise<{ ok: boolean; data: string; data_uri: string }> {\n return this.request(\"POST\", \"/v1/utils/qrcode/base64\", {\n content,\n ...opts,\n });\n }\n\n /** QR \uCF54\uB4DC\uB97C ASCII \uC544\uD2B8 \uD14D\uC2A4\uD2B8\uB85C \uBC18\uD658\uD569\uB2C8\uB2E4. */\n qrcodeText(\n content: string,\n opts: QRCodeOptions = {},\n ): Promise<{ ok: boolean; text: string }> {\n return this.request(\"POST\", \"/v1/utils/qrcode/text\", {\n content,\n ...opts,\n });\n }\n\n /**\n * \uBC14\uCF54\uB4DC PNG\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4. `ArrayBuffer`\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.\n *\n * ```ts\n * const buf = await client.barcode(\"1234567890128\", { type: \"ean13\" });\n * ```\n */\n barcode(\n content: string,\n opts: BarcodeOptions = {},\n ): Promise<ArrayBuffer> {\n return this.requestBinary(\"POST\", \"/v1/utils/barcode\", {\n content,\n ...opts,\n });\n }\n\n /**\n * PDF\uB97C PNG \uC774\uBBF8\uC9C0\uB85C \uBCC0\uD658\uD569\uB2C8\uB2E4.\n *\n * \uB2E8\uC77C \uD398\uC774\uC9C0 \uC694\uCCAD\uC774\uBA74 `image/png` ArrayBuffer,\n * \uB2E4\uC911 \uD398\uC774\uC9C0 \uC694\uCCAD\uC774\uBA74 `application/zip` ArrayBuffer\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.\n *\n * ```ts\n * const buf = await client.pdf2png(pdfArrayBuffer, { dpi: 200 });\n * ```\n */\n pdf2png(\n pdfData: ArrayBuffer | Uint8Array<ArrayBuffer>,\n opts: Pdf2PngOptions = {},\n ): Promise<ArrayBuffer> {\n const form = new FormData();\n form.append(\n \"file\",\n new Blob([pdfData], { type: \"application/pdf\" }),\n \"document.pdf\",\n );\n const params = new URLSearchParams();\n if (opts.dpi != null) params.set(\"dpi\", String(opts.dpi));\n if (opts.firstPage != null)\n params.set(\"first_page\", String(opts.firstPage));\n if (opts.lastPage != null)\n params.set(\"last_page\", String(opts.lastPage));\n const qs = params.toString();\n const path = \"/v1/utils/pdf2png\" + (qs ? `?${qs}` : \"\");\n return this.requestFormBinary(\"POST\", path, form);\n }\n\n pdf2pngByFileSeq(\n fileSeq: number,\n opts: Pdf2PngOptions = {},\n ): Promise<ArrayBuffer> {\n return this.requestBinary(\n \"POST\",\n `/v1/utils/pdf2png/${fileSeq}`,\n opts,\n );\n }\n\n pdf2jpg(\n pdfData: ArrayBuffer | Uint8Array<ArrayBuffer>,\n opts: Pdf2PngOptions = {},\n ): Promise<ArrayBuffer> {\n const form = new FormData();\n form.append(\n \"file\",\n new Blob([pdfData], { type: \"application/pdf\" }),\n \"document.pdf\",\n );\n const params = new URLSearchParams();\n if (opts.dpi != null) params.set(\"dpi\", String(opts.dpi));\n if (opts.firstPage != null)\n params.set(\"first_page\", String(opts.firstPage));\n if (opts.lastPage != null)\n params.set(\"last_page\", String(opts.lastPage));\n const qs = params.toString();\n const path = \"/v1/utils/pdf2jpg\" + (qs ? `?${qs}` : \"\");\n return this.requestFormBinary(\"POST\", path, form);\n }\n\n pdf2jpgByFileSeq(\n fileSeq: number,\n opts: Pdf2PngOptions = {},\n ): Promise<ArrayBuffer> {\n return this.requestBinary(\n \"POST\",\n `/v1/utils/pdf2jpg/${fileSeq}`,\n opts,\n );\n }\n };\n}\n", "import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../client/base.js\";\n\nexport function AdminMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class AdminMixinClass extends Base {\n adminPath(path: string): string {\n return `/v1/admin${path}`;\n }\n\n adminGet<T>(path: string): Promise<T> {\n return this.http.get(this.adminPath(path));\n }\n\n adminPost<T>(path: string, body?: unknown): Promise<T> {\n return this.http.post(this.adminPath(path), body);\n }\n\n adminPut<T>(path: string, body?: unknown): Promise<T> {\n return this.http.put(this.adminPath(path), body);\n }\n\n adminPatch<T>(path: string, body?: unknown): Promise<T> {\n return this.http.patch(this.adminPath(path), body);\n }\n\n adminDelete<T>(path: string, body?: unknown): Promise<T> {\n return this.http.delete(this.adminPath(path), body);\n }\n\n listAdminEntities<T = unknown>(): Promise<T> {\n return this.adminGet(\"/entities\");\n }\n\n getAdminErdSchema<T = unknown>(): Promise<T> {\n return this.adminGet(\"/erd/schema\");\n }\n\n batchEnsureAdminEntities<T = unknown>(configs: unknown[]): Promise<T> {\n return this.adminPost(\"/entities/batch-ensure\", configs);\n }\n\n createAdminEntityConfig<T = unknown>(\n entity: string,\n config: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(`/${entity}/create`, config);\n }\n\n getAdminEntityConfig<T = unknown>(entity: string): Promise<T> {\n return this.adminGet(`/${entity}/config`);\n }\n\n updateAdminEntityConfig<T = unknown>(\n entity: string,\n config: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPut(`/${entity}/config`, config);\n }\n\n validateAdminEntityConfig<T = unknown>(\n config: Record<string, unknown>,\n entity?: string,\n ): Promise<T> {\n return this.adminPost(\n entity ? `/${entity}/validate` : \"/entity/validate\",\n config,\n );\n }\n\n normalizeAdminEntityConfig<T = unknown>(\n config: Record<string, unknown>,\n entity?: string,\n ): Promise<T> {\n return this.adminPost(\n entity ? `/${entity}/normalize` : \"/entity/normalize\",\n config,\n );\n }\n\n getAdminEntityStats<T = unknown>(\n entity: string,\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(`/${entity}/stats`, body);\n }\n\n reindexAdminEntity<T = unknown>(entity: string): Promise<T> {\n return this.adminPost(`/${entity}/reindex`);\n }\n\n syncAdminEntitySchema<T = unknown>(entity: string): Promise<T> {\n return this.adminPost(`/${entity}/sync-schema`);\n }\n\n resetAdminEntity<T = unknown>(entity: string): Promise<T> {\n return this.adminPost(`/${entity}/reset`);\n }\n\n truncateAdminEntity<T = unknown>(entity: string): Promise<T> {\n return this.adminPost(`/${entity}/truncate`);\n }\n\n dropAdminEntity<T = unknown>(entity: string): Promise<T> {\n return this.adminPost(`/${entity}/drop`);\n }\n\n resetAllAdmin<T = unknown>(body?: Record<string, unknown>): Promise<T> {\n return this.adminPost(\"/reset-all\", body);\n }\n\n listAdminConfigs<T = unknown>(): Promise<T> {\n return this.adminGet(\"/configs\");\n }\n\n getAdminConfig<T = unknown>(domain: string): Promise<T> {\n return this.adminGet(`/configs/${domain}`);\n }\n\n updateAdminConfig<T = unknown>(\n domain: string,\n patch: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPatch(`/configs/${domain}`, patch);\n }\n\n listAdminRoles<T = unknown>(): Promise<T> {\n return this.adminGet(\"/roles\");\n }\n\n createAdminRole<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/roles\", body);\n }\n\n getAdminRole<T = unknown>(seq: number): Promise<T> {\n return this.adminGet(`/roles/${seq}`);\n }\n\n updateAdminRole<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPatch(`/roles/${seq}`, body);\n }\n\n deleteAdminRole<T = unknown>(seq: number): Promise<T> {\n return this.adminDelete(`/roles/${seq}`);\n }\n\n listAdminApiKeys<T = unknown>(): Promise<T> {\n return this.adminGet(\"/api-keys\");\n }\n\n createAdminApiKey<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/api-keys\", body);\n }\n\n getAdminApiKey<T = unknown>(seq: number): Promise<T> {\n return this.adminGet(`/api-keys/${seq}`);\n }\n\n updateAdminApiKey<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPatch(`/api-keys/${seq}`, body);\n }\n\n deleteAdminApiKey<T = unknown>(seq: number): Promise<T> {\n return this.adminDelete(`/api-keys/${seq}`);\n }\n\n regenerateAdminApiKeySecret<T = unknown>(seq: number): Promise<T> {\n return this.adminPost(`/api-keys/${seq}/regenerate-secret`);\n }\n\n listAdminAccounts<T = unknown>(): Promise<T> {\n return this.adminGet(\"/accounts\");\n }\n\n createAdminAccount<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/accounts\", body);\n }\n\n getAdminAccount<T = unknown>(seq: number): Promise<T> {\n return this.adminGet(`/accounts/${seq}`);\n }\n\n updateAdminAccount<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPatch(`/accounts/${seq}`, body);\n }\n\n deleteAdminAccount<T = unknown>(seq: number): Promise<T> {\n return this.adminDelete(`/accounts/${seq}`);\n }\n\n listAdminLicenses<T = unknown>(): Promise<T> {\n return this.adminGet(\"/licenses\");\n }\n\n createAdminLicense<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/licenses\", body);\n }\n\n getAdminLicense<T = unknown>(seq: number): Promise<T> {\n return this.adminGet(`/licenses/${seq}`);\n }\n\n updateAdminLicense<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPatch(`/licenses/${seq}`, body);\n }\n\n deleteAdminLicense<T = unknown>(seq: number): Promise<T> {\n return this.adminDelete(`/licenses/${seq}`);\n }\n\n runAdminBackup<T = unknown>(\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/backup/run\", body);\n }\n\n getAdminBackupStatus<T = unknown>(\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/backup/status\", body);\n }\n\n listAdminBackups<T = unknown>(\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/backup/list\", body);\n }\n\n restoreAdminBackup<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/backup/restore\", body);\n }\n\n deleteAdminBackup<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/backup/delete\", body);\n }\n\n disableAdminAccountTwoFactor<T = unknown>(seq: number): Promise<T> {\n return this.adminDelete(`/accounts/${seq}/2fa`);\n }\n };\n}\n", "/**\n * @file EntityServerApi.ts\n * entity-server core route\uC6A9 Mixin \uC870\uD569 \uD074\uB77C\uC774\uC5B8\uD2B8.\n *\n * \uC808(section)\uBCC4 \uAD6C\uD604:\n * src/client/base.ts \u2014 \uC0C1\uD0DC\u00B7\uC0DD\uC131\uC790\u00B7\uACF5\uD1B5 \uD5EC\uD37C\n * src/mixins/server/* \u2014 entity-server core route mixin\n * src/mixins/app/* \u2014 entity-app-server plugin mixin\n */\nimport { EntityServerClientBase } from \"./client/base.js\";\nimport {\n AdminMixin,\n AuthMixin,\n EntityMixin,\n FileMixin,\n PushMixin,\n SmtpMixin,\n TransactionMixin,\n UtilsMixin,\n} from \"./mixins/server/index.js\";\n\n// \u2500\u2500\u2500 Composed class \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class EntityServerApi extends UtilsMixin(\n TransactionMixin(\n FileMixin(\n SmtpMixin(\n PushMixin(\n AdminMixin(EntityMixin(AuthMixin(EntityServerClientBase))),\n ),\n ),\n ),\n ),\n) {}\n", "import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function AccountAppMixin<\n TBase extends GConstructor<EntityServerClientBase>,\n>(Base: TBase) {\n return class AccountAppMixinClass extends Base {\n accountRegister<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/account/register\",\n body,\n false,\n );\n }\n\n accountWithdraw<T = unknown>(\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\"/v1/account/withdraw\", body);\n }\n\n accountChangePassword<T = unknown>(body: {\n current_password: string;\n new_password: string;\n }): Promise<T> {\n return this.http.post(\n \"/v1/account/change-password\",\n body,\n );\n }\n\n accountReactivate<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/account/reactivate\",\n body,\n false,\n );\n }\n\n listAccountBiometrics<T = unknown>(): Promise<T> {\n return this.http.get(\"/v1/account/biometric\");\n }\n\n registerAccountBiometric<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\"/v1/account/biometric\", body);\n }\n\n deleteAccountBiometric<T = unknown>(seq: number): Promise<T> {\n return this.http.delete(`/v1/account/biometric/${seq}`);\n }\n };\n}\n", "import { buildQuery } from \"../../../client/utils.js\";\nimport type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function BoardMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class BoardMixinClass extends Base {\n listBoardCategories<T = unknown>(\n query: Record<string, unknown> = {},\n ): Promise<T> {\n const qs = buildQuery(query);\n return this.http.get(\n `/v1/board/categories${qs ? `?${qs}` : \"\"}`,\n false,\n );\n }\n\n getBoardCategory<T = unknown>(seq: number): Promise<T> {\n return this.http.get(\n `/v1/board/categories/${seq}`,\n false,\n );\n }\n\n createBoardCategory<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\"/v1/board/categories\", body);\n }\n\n updateBoardCategory<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.put(`/v1/board/categories/${seq}`, body);\n }\n\n deleteBoardCategory<T = unknown>(seq: number): Promise<T> {\n return this.http.delete(`/v1/board/categories/${seq}`);\n }\n\n listBoardPosts<T = unknown>(\n category: string,\n query: Record<string, unknown> = {},\n ): Promise<T> {\n const qs = buildQuery(query);\n return this.http.get(`/v1/board/${category}/list${qs ? `?${qs}` : \"\"}`);\n }\n\n getBoardPost<T = unknown>(seq: number): Promise<T> {\n return this.http.get(`/v1/board/posts/${seq}`);\n }\n\n createBoardPost<T = unknown>(\n category: string,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n `/v1/board/${category}/submit`,\n body,\n );\n }\n\n updateBoardPost<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.put(`/v1/board/posts/${seq}`, body);\n }\n\n deleteBoardPost<T = unknown>(seq: number): Promise<T> {\n return this.http.delete(`/v1/board/posts/${seq}`);\n }\n\n listBoardComments<T = unknown>(\n postSeq: number,\n query: Record<string, unknown> = {},\n ): Promise<T> {\n const qs = buildQuery(query);\n return this.http.get(\n `/v1/board/posts/${postSeq}/comments${qs ? `?${qs}` : \"\"}`,\n false,\n );\n }\n\n createBoardComment<T = unknown>(\n postSeq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n `/v1/board/posts/${postSeq}/comments/submit`,\n body,\n );\n }\n\n updateBoardComment<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.put(`/v1/board/comments/${seq}`, body);\n }\n\n deleteBoardComment<T = unknown>(seq: number): Promise<T> {\n return this.http.delete(`/v1/board/comments/${seq}`);\n }\n\n listBoardFiles<T = unknown>(postSeq: number): Promise<T> {\n return this.http.get(\n `/v1/board/posts/${postSeq}/files`,\n false,\n );\n }\n\n async uploadBoardFile<T = unknown>(\n postSeq: number,\n file: File | Blob,\n ): Promise<T> {\n const form = new FormData();\n form.append(\n \"file\",\n file,\n file instanceof File ? file.name : \"upload\",\n );\n return this.requestForm(\n \"POST\",\n `/v1/board/posts/${postSeq}/files`,\n form,\n );\n }\n\n boardFileUrl(uuid: string): string {\n return `${this.baseUrl}/v1/board/files/${uuid}`;\n }\n\n deleteBoardFile<T = unknown>(uuid: string): Promise<T> {\n return this.http.delete(`/v1/board/files/${uuid}`);\n }\n\n createBoardGuestPost<T = unknown>(\n category: string,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n `/v1/board/${category}/guest-submit`,\n body,\n false,\n );\n }\n\n authenticateBoardGuestPost<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n `/v1/board/posts/${seq}/guest-auth`,\n body,\n false,\n );\n }\n\n toggleBoardPostLike<T = unknown>(seq: number): Promise<T> {\n return this.http.post(`/v1/board/posts/${seq}/like`, {});\n }\n\n acceptBoardPost<T = unknown>(seq: number): Promise<T> {\n return this.http.post(\n `/v1/board/posts/${seq}/accept`,\n {},\n );\n }\n\n rateBoardPost<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n `/v1/board/posts/${seq}/rating`,\n body,\n );\n }\n\n rateBoardComment<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n `/v1/board/comments/${seq}/rating`,\n body,\n );\n }\n\n listBoardTags<T = unknown>(\n query: Record<string, unknown> = {},\n ): Promise<T> {\n const qs = buildQuery(query);\n return this.http.get(\n `/v1/board/tags${qs ? `?${qs}` : \"\"}`,\n false,\n );\n }\n\n setBoardPostTags<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.put(`/v1/board/posts/${seq}/tags`, body);\n }\n\n reportBoardPost<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n `/v1/board/posts/${seq}/report`,\n body,\n );\n }\n\n reportBoardComment<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n `/v1/board/comments/${seq}/report`,\n body,\n );\n }\n\n listBoardReports<T = unknown>(\n query: Record<string, unknown> = {},\n ): Promise<T> {\n const qs = buildQuery(query);\n return this.http.get(\n `/v1/board/admin/reports${qs ? `?${qs}` : \"\"}`,\n );\n }\n\n updateBoardReport<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.patch(\n `/v1/board/admin/reports/${seq}`,\n body,\n );\n }\n\n markBoardPostRead<T = unknown>(seq: number): Promise<T> {\n return this.http.post(`/v1/board/posts/${seq}/read`, {});\n }\n\n listBoardMentions<T = unknown>(\n query: Record<string, unknown> = {},\n ): Promise<T> {\n const qs = buildQuery(query);\n return this.http.get(\n `/v1/board/mentions${qs ? `?${qs}` : \"\"}`,\n );\n }\n\n markBoardMentionRead<T = unknown>(seq: number): Promise<T> {\n return this.http.patch(\n `/v1/board/mentions/${seq}/read`,\n {},\n );\n }\n };\n}\n", "import { buildQuery } from \"../../../client/utils.js\";\nimport type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function EmailVerifyMixin<\n TBase extends GConstructor<EntityServerClientBase>,\n>(Base: TBase) {\n return class EmailVerifyMixinClass extends Base {\n sendEmailVerification<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/email-verify/send\",\n body,\n false,\n );\n }\n\n confirmEmailVerification<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/email-verify/confirm\",\n body,\n false,\n );\n }\n\n activateEmailVerification<T = unknown>(\n query: Record<string, unknown>,\n ): Promise<T> {\n const qs = buildQuery(query);\n return this.http.get(\n `/v1/email-verify/activate${qs ? `?${qs}` : \"\"}`,\n false,\n );\n }\n\n getEmailVerificationStatus<T = unknown>(): Promise<T> {\n return this.http.get(\"/v1/email-verify/status\");\n }\n\n changeVerifiedEmail<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\"/v1/email-verify/change\", body);\n }\n };\n}\n", "import { buildQuery } from \"../../../client/utils.js\";\nimport type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function OAuthMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class OAuthMixinClass extends Base {\n oauthAuthorizeUrl(\n provider: string,\n query: Record<string, unknown> = {},\n ): string {\n const qs = buildQuery(query);\n return `${this.baseUrl}/v1/oauth/${provider}${qs ? `?${qs}` : \"\"}`;\n }\n\n oauthCallback<T = unknown>(\n provider: string,\n payload?: Record<string, unknown>,\n method: \"GET\" | \"POST\" = \"POST\",\n ): Promise<T> {\n if (method === \"GET\") {\n const qs = buildQuery(payload ?? {});\n return this.http.get(\n `/v1/oauth/${provider}/callback${qs ? `?${qs}` : \"\"}`,\n false,\n );\n }\n\n return this.http.post(\n `/v1/oauth/${provider}/callback`,\n payload,\n false,\n );\n }\n\n linkOAuthAccount<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\"/v1/account/oauth/link\", body);\n }\n\n unlinkOAuthAccount<T = unknown>(provider: string): Promise<T> {\n return this.http.delete(\n `/v1/account/oauth/link/${provider}`,\n );\n }\n\n listOAuthProviders<T = unknown>(): Promise<T> {\n return this.http.get(\"/v1/account/oauth/providers\");\n }\n\n refreshOAuthProviderToken<T = unknown>(\n provider: string,\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n `/v1/account/oauth/refresh/${provider}`,\n body,\n );\n }\n };\n}\n", "import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function PasswordResetMixin<\n TBase extends GConstructor<EntityServerClientBase>,\n>(Base: TBase) {\n return class PasswordResetMixinClass extends Base {\n requestPasswordReset<T = unknown>(\n body: { email: string } | Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/password-reset/request\",\n body,\n false,\n );\n }\n\n validatePasswordResetToken<T = unknown>(token: string): Promise<T> {\n return this.http.get(\n `/v1/password-reset/validate/${encodeURIComponent(token)}`,\n false,\n );\n }\n\n verifyPasswordReset<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/password-reset/verify\",\n body,\n false,\n );\n }\n };\n}\n", "import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function TwoFactorMixin<\n TBase extends GConstructor<EntityServerClientBase>,\n>(Base: TBase) {\n return class TwoFactorMixinClass extends Base {\n setupTwoFactor<T = unknown>(\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\"/v1/account/2fa/setup\", body);\n }\n\n verifyTwoFactorSetup<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/account/2fa/setup/verify\",\n body,\n false,\n );\n }\n\n disableTwoFactor<T = unknown>(): Promise<T> {\n return this.http.delete(\"/v1/account/2fa\");\n }\n\n getTwoFactorStatus<T = unknown>(): Promise<T> {\n return this.http.get(\"/v1/account/2fa/status\");\n }\n\n regenerateTwoFactorRecoveryCodes<T = unknown>(): Promise<T> {\n return this.http.post(\n \"/v1/account/2fa/recovery/regenerate\",\n );\n }\n\n verifyTwoFactor<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/account/2fa/verify\",\n body,\n false,\n );\n }\n\n recoverTwoFactorAccess<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/account/2fa/recovery\",\n body,\n false,\n );\n }\n };\n}\n", "import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function AlimtalkMixin<\n TBase extends GConstructor<EntityServerClientBase>,\n>(Base: TBase) {\n return class AlimtalkMixinClass extends Base {\n /** \uC54C\uB9BC\uD1A1\uC744 \uBC1C\uC1A1\uD569\uB2C8\uB2E4. */\n alimtalkSend<T = unknown>(body: Record<string, unknown>): Promise<T> {\n return this.http.post(\"/v1/alimtalk/send\", body);\n }\n\n /** \uC54C\uB9BC\uD1A1 \uBC1C\uC1A1 \uC0C1\uD0DC\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\n alimtalkStatus<T = unknown>(seq: number): Promise<T> {\n return this.http.get(\n `/v1/alimtalk/status/${seq}`,\n false,\n );\n }\n\n /** \uC54C\uB9BC\uD1A1 \uD15C\uD50C\uB9BF \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n listAlimtalkTemplates<T = unknown>(): Promise<T> {\n return this.http.get(\n \"/v1/alimtalk/templates\",\n false,\n );\n }\n\n /** \uC54C\uB9BC\uD1A1 \uC6F9\uD6C5\uC744 \uC218\uC2E0\uD569\uB2C8\uB2E4. */\n alimtalkWebhook<T = unknown>(\n provider: string,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n `/v1/alimtalk/webhook/${encodeURIComponent(provider)}`,\n body,\n false,\n );\n }\n };\n}\n", "import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function FriendtalkMixin<\n TBase extends GConstructor<EntityServerClientBase>,\n>(Base: TBase) {\n return class FriendtalkMixinClass extends Base {\n /** \uCE5C\uAD6C\uD1A1\uC744 \uBC1C\uC1A1\uD569\uB2C8\uB2E4. */\n friendtalkSend<T = unknown>(body: Record<string, unknown>): Promise<T> {\n return this.http.post(\"/v1/friendtalk/send\", body);\n }\n };\n}\n", "import { buildQuery } from \"../../../client/utils.js\";\nimport type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function HolidaysMixin<\n TBase extends GConstructor<EntityServerClientBase>,\n>(Base: TBase) {\n return class HolidaysMixinClass extends Base {\n /** \uACF5\uD734\uC77C \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n listHolidays<T = unknown>(\n query: {\n year?: number;\n month?: number;\n is_holiday?: \"Y\" | \"N\";\n } = {},\n ): Promise<T> {\n const qs = buildQuery(query as Record<string, unknown>);\n return this.http.get(\n `/v1/holidays${qs ? `?${qs}` : \"\"}`,\n false,\n );\n }\n\n /** \uD2B9\uC815 \uB0A0\uC9DC\uC758 \uACF5\uD734\uC77C \uC815\uBCF4\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. (e.g. \"20250101\") */\n getHolidayByDate<T = unknown>(locdate: string): Promise<T> {\n return this.http.get(\n `/v1/holidays/${encodeURIComponent(locdate)}`,\n false,\n );\n }\n\n /** \uACF5\uD734\uC77C \uB370\uC774\uD130\uB97C \uB3D9\uAE30\uD654\uD569\uB2C8\uB2E4. (\uAD00\uB9AC\uC790 \uC804\uC6A9) */\n syncHolidays<T = unknown>(body?: Record<string, unknown>): Promise<T> {\n return this.http.post(\"/v1/holidays/sync\", body);\n }\n };\n}\n", "import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function IdentityMixin<\n TBase extends GConstructor<EntityServerClientBase>,\n>(Base: TBase) {\n return class IdentityMixinClass extends Base {\n /** \uBCF8\uC778\uC778\uC99D \uC694\uCCAD\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4. */\n identityRequest<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/identity/request\",\n body,\n false,\n );\n }\n\n /** \uBCF8\uC778\uC778\uC99D \uC911\uACC4\uC0AC \uCF5C\uBC31\uC744 \uC218\uC2E0\uD569\uB2C8\uB2E4. */\n identityCallback<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/identity/callback\",\n body,\n false,\n );\n }\n\n /** \uBCF8\uC778\uC778\uC99D \uACB0\uACFC\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\n identityResult<T = unknown>(requestId: string): Promise<T> {\n return this.http.get(\n `/v1/identity/result/${encodeURIComponent(requestId)}`,\n false,\n );\n }\n\n /** CI \uC911\uBCF5 \uC5EC\uBD80\uB97C \uD655\uC778\uD569\uB2C8\uB2E4. (JWT \uD544\uC694) */\n identityVerifyCI<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\"/v1/identity/verify-ci\", body);\n }\n };\n}\n", "import { buildQuery } from \"../../../client/utils.js\";\nimport type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function LlmMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class LlmMixinClass extends Base {\n // \u2500\u2500 \uCC44\uD305 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** LLM \uCC44\uD305 \uC751\uB2F5\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\n llmChat<T = unknown>(body: Record<string, unknown>): Promise<T> {\n return this.http.post(\"/v1/llm/chat\", body);\n }\n\n /** LLM \uCC44\uD305 \uC2A4\uD2B8\uB9BC \uC751\uB2F5\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\n llmChatStream<T = unknown>(body: Record<string, unknown>): Promise<T> {\n return this.http.post(\"/v1/llm/chat/stream\", body);\n }\n\n // \u2500\u2500 \uB300\uD654 \uC138\uC158 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** \uB300\uD654 \uC138\uC158\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4. */\n createLlmConversation<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\"/v1/llm/conversations\", body);\n }\n\n /** \uB300\uD654 \uC138\uC158\uC5D0 \uBA54\uC2DC\uC9C0\uB97C \uC804\uC1A1\uD569\uB2C8\uB2E4. */\n sendLlmMessage<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n `/v1/llm/conversations/${seq}/messages`,\n body,\n );\n }\n\n /** \uB300\uD654 \uC138\uC158 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n listLlmConversations<T = unknown>(\n query: Record<string, unknown> = {},\n ): Promise<T> {\n const qs = buildQuery(query);\n return this.http.get(\n `/v1/llm/conversations${qs ? `?${qs}` : \"\"}`,\n );\n }\n\n /** \uB300\uD654 \uC138\uC158 \uC0C1\uC138\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\n getLlmConversation<T = unknown>(seq: number): Promise<T> {\n return this.http.get(`/v1/llm/conversations/${seq}`);\n }\n\n /** \uB300\uD654 \uC138\uC158\uC744 \uC218\uC815\uD569\uB2C8\uB2E4. */\n updateLlmConversation<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.patch(\n `/v1/llm/conversations/${seq}`,\n body,\n );\n }\n\n /** \uB300\uD654 \uC138\uC158\uC744 \uC0AD\uC81C\uD569\uB2C8\uB2E4. */\n deleteLlmConversation<T = unknown>(seq: number): Promise<T> {\n return this.http.delete(`/v1/llm/conversations/${seq}`);\n }\n\n // \u2500\u2500 RAG \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** RAG \uBB38\uC11C\uB97C \uC5C5\uB85C\uB4DC\uD569\uB2C8\uB2E4. */\n ragUploadDocument<T = unknown>(form: FormData): Promise<T> {\n return this.requestForm(\"POST\", \"/v1/llm/rag/documents\", form);\n }\n\n /** RAG \uBB38\uC11C \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n ragListDocuments<T = unknown>(\n query: Record<string, unknown> = {},\n ): Promise<T> {\n const qs = buildQuery(query);\n return this.http.get(\n `/v1/llm/rag/documents${qs ? `?${qs}` : \"\"}`,\n );\n }\n\n /** RAG \uBB38\uC11C\uB97C \uC0AD\uC81C\uD569\uB2C8\uB2E4. */\n ragDeleteDocument<T = unknown>(id: string): Promise<T> {\n return this.http.delete(\n `/v1/llm/rag/documents/${encodeURIComponent(id)}`,\n );\n }\n\n /** RAG \uAC80\uC0C9\uC744 \uC218\uD589\uD569\uB2C8\uB2E4. */\n ragSearch<T = unknown>(body: Record<string, unknown>): Promise<T> {\n return this.http.post(\"/v1/llm/rag/search\", body);\n }\n\n /** RAG \uAE30\uBC18 \uCC44\uD305 \uC751\uB2F5\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\n ragChat<T = unknown>(body: Record<string, unknown>): Promise<T> {\n return this.http.post(\"/v1/llm/rag/chat\", body);\n }\n\n /** RAG \uAE30\uBC18 \uCC44\uD305 \uC2A4\uD2B8\uB9BC \uC751\uB2F5\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\n ragChatStream<T = unknown>(body: Record<string, unknown>): Promise<T> {\n return this.http.post(\"/v1/llm/rag/chat/stream\", body);\n }\n\n /** RAG \uC778\uB371\uC2A4\uB97C \uC7AC\uAD6C\uCD95\uD569\uB2C8\uB2E4. */\n ragRebuildIndex<T = unknown>(\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\"/v1/llm/rag/rebuild-index\", body);\n }\n\n // \u2500\u2500 \uD504\uB85C\uBC14\uC774\uB354 / \uC0AC\uC6A9\uB7C9 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** LLM \uD504\uB85C\uBC14\uC774\uB354 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n listLlmProviders<T = unknown>(): Promise<T> {\n return this.http.get(\"/v1/llm/providers\");\n }\n\n /** LLM \uC0AC\uC6A9\uB7C9\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n getLlmUsage<T = unknown>(\n query: Record<string, unknown> = {},\n ): Promise<T> {\n const qs = buildQuery(query);\n return this.http.get(\n `/v1/llm/usage${qs ? `?${qs}` : \"\"}`,\n );\n }\n\n /** LLM \uC0AC\uC6A9\uB7C9 \uC694\uC57D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n getLlmUsageSummary<T = unknown>(\n query: Record<string, unknown> = {},\n ): Promise<T> {\n const qs = buildQuery(query);\n return this.http.get(\n `/v1/llm/usage/summary${qs ? `?${qs}` : \"\"}`,\n );\n }\n\n // \u2500\u2500 \uCE90\uC2DC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** LLM \uCE90\uC2DC \uD1B5\uACC4\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\n getLlmCacheStats<T = unknown>(): Promise<T> {\n return this.http.get(\"/v1/llm/cache/stats\");\n }\n\n /** LLM \uCE90\uC2DC\uB97C \uCD08\uAE30\uD654\uD569\uB2C8\uB2E4. */\n clearLlmCache<T = unknown>(): Promise<T> {\n return this.http.delete(\"/v1/llm/cache\");\n }\n\n // \u2500\u2500 \uD504\uB86C\uD504\uD2B8 \uD15C\uD50C\uB9BF \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** \uD504\uB86C\uD504\uD2B8 \uD15C\uD50C\uB9BF \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n listLlmTemplates<T = unknown>(): Promise<T> {\n return this.http.get(\"/v1/llm/templates\");\n }\n\n /** \uD15C\uD50C\uB9BF \uAE30\uBC18 \uCC44\uD305 \uC751\uB2F5\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\n llmTemplateChat<T = unknown>(\n name: string,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n `/v1/llm/${encodeURIComponent(name)}/chat`,\n body,\n );\n }\n\n /** \uD15C\uD50C\uB9BF \uAE30\uBC18 \uCC44\uD305 \uC2A4\uD2B8\uB9BC \uC751\uB2F5\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\n llmTemplateChatStream<T = unknown>(\n name: string,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n `/v1/llm/${encodeURIComponent(name)}/chat/stream`,\n body,\n );\n }\n\n // \u2500\u2500 \uCC57\uBD07 \uAD00\uB9AC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** \uCC57\uBD07 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n listLlmChatbots<T = unknown>(\n query: Record<string, unknown> = {},\n ): Promise<T> {\n const qs = buildQuery(query);\n return this.http.get(\n `/v1/llm/chatbots${qs ? `?${qs}` : \"\"}`,\n );\n }\n\n /** \uCC57\uBD07\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4. */\n createLlmChatbot<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\"/v1/llm/chatbots\", body);\n }\n\n /** \uCC57\uBD07 \uC0C1\uC138\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\n getLlmChatbot<T = unknown>(seq: number): Promise<T> {\n return this.http.get(`/v1/llm/chatbots/${seq}`);\n }\n\n /** \uCC57\uBD07\uC744 \uC218\uC815\uD569\uB2C8\uB2E4. */\n updateLlmChatbot<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.patch(`/v1/llm/chatbots/${seq}`, body);\n }\n\n /** \uCC57\uBD07\uC744 \uC0AD\uC81C\uD569\uB2C8\uB2E4. */\n deleteLlmChatbot<T = unknown>(seq: number): Promise<T> {\n return this.http.delete(`/v1/llm/chatbots/${seq}`);\n }\n\n // \u2500\u2500 \uCC57\uBD07 \uCC44\uD305 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** \uCC57\uBD07\uACFC \uCC44\uD305\uD569\uB2C8\uB2E4. */\n llmChatbotChat<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n `/v1/llm/chatbots/${seq}/chat`,\n body,\n );\n }\n\n /** \uCC57\uBD07\uACFC \uCC44\uD305 \uC2A4\uD2B8\uB9BC \uC751\uB2F5\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\n llmChatbotChatStream<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n `/v1/llm/chatbots/${seq}/chat/stream`,\n body,\n );\n }\n\n // \u2500\u2500 \uCC57\uBD07 \uC138\uC158 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** \uCC57\uBD07 \uC138\uC158 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n listLlmChatbotSessions<T = unknown>(\n seq: number,\n query: Record<string, unknown> = {},\n ): Promise<T> {\n const qs = buildQuery(query);\n return this.http.get(\n `/v1/llm/chatbots/${seq}/sessions${qs ? `?${qs}` : \"\"}`,\n );\n }\n\n /** \uCC57\uBD07 \uC138\uC158\uC744 \uC0AD\uC81C\uD569\uB2C8\uB2E4. */\n deleteLlmChatbotSession<T = unknown>(\n seq: number,\n sessionSeq: number,\n ): Promise<T> {\n return this.http.delete(\n `/v1/llm/chatbots/${seq}/sessions/${sessionSeq}`,\n );\n }\n\n // \u2500\u2500 Profile Memory \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** \uD504\uB85C\uD544 \uBA54\uBAA8\uB9AC \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n listLlmProfiles<T = unknown>(\n query: Record<string, unknown> = {},\n ): Promise<T> {\n const qs = buildQuery(query);\n return this.http.get(\n `/v1/llm/profiles${qs ? `?${qs}` : \"\"}`,\n );\n }\n\n /** \uD504\uB85C\uD544 \uBA54\uBAA8\uB9AC\uB97C upsert\uD569\uB2C8\uB2E4. */\n upsertLlmProfile<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\"/v1/llm/profiles\", body);\n }\n\n /** \uD504\uB85C\uD544 \uBA54\uBAA8\uB9AC\uB97C \uC0AD\uC81C\uD569\uB2C8\uB2E4. */\n deleteLlmProfile<T = unknown>(seq: number): Promise<T> {\n return this.http.delete(`/v1/llm/profiles/${seq}`);\n }\n };\n}\n", "import { buildQuery } from \"../../../client/utils.js\";\nimport type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function OcrMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class OcrMixinClass extends Base {\n /** OCR \uC778\uC2DD\uC744 \uC218\uD589\uD569\uB2C8\uB2E4. */\n ocrRecognize<T = unknown>(form: FormData): Promise<T> {\n return this.requestForm(\"POST\", \"/v1/ocr/recognize\", form);\n }\n\n /** OCR \uC778\uC2DD\uC744 \uBE44\uB3D9\uAE30\uB85C \uC694\uCCAD\uD569\uB2C8\uB2E4. */\n ocrRecognizeAsync<T = unknown>(form: FormData): Promise<T> {\n return this.requestForm(\"POST\", \"/v1/ocr/recognize/async\", form);\n }\n\n /** \uBB38\uC11C \uC720\uD615\uBCC4 OCR \uC778\uC2DD\uC744 \uC218\uD589\uD569\uB2C8\uB2E4. */\n ocrRecognizeByDocType<T = unknown>(\n docType: string,\n form: FormData,\n ): Promise<T> {\n return this.requestForm(\n \"POST\",\n `/v1/ocr/${encodeURIComponent(docType)}`,\n form,\n );\n }\n\n /** OCR \uACB0\uACFC \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n listOcrResults<T = unknown>(\n query: Record<string, unknown> = {},\n ): Promise<T> {\n const qs = buildQuery(query);\n return this.http.get(\n `/v1/ocr/results${qs ? `?${qs}` : \"\"}`,\n );\n }\n\n /** OCR \uACB0\uACFC \uC0C1\uC138\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\n getOcrResult<T = unknown>(id: string): Promise<T> {\n return this.http.get(\n `/v1/ocr/results/${encodeURIComponent(id)}`,\n );\n }\n\n /** OCR \uACB0\uACFC \uD14D\uC2A4\uD2B8\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\n getOcrResultText<T = unknown>(id: string): Promise<T> {\n return this.http.get(\n `/v1/ocr/results/${encodeURIComponent(id)}/text`,\n );\n }\n\n /** OCR \uACB0\uACFC\uB97C \uC0AD\uC81C\uD569\uB2C8\uB2E4. */\n deleteOcrResult<T = unknown>(id: string): Promise<T> {\n return this.http.delete(\n `/v1/ocr/results/${encodeURIComponent(id)}`,\n );\n }\n\n /** OCR \uC0AC\uC6A9 \uD560\uB2F9\uB7C9\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n getOcrQuota<T = unknown>(): Promise<T> {\n return this.http.get(\"/v1/ocr/quota\");\n }\n };\n}\n", "import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function PgMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class PgMixinClass extends Base {\n /** \uC8FC\uBB38\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4. */\n pgCreateOrder<T = unknown>(body: Record<string, unknown>): Promise<T> {\n return this.http.post(\"/v1/pg/orders\", body);\n }\n\n /** \uC8FC\uBB38\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n pgGetOrder<T = unknown>(orderId: string): Promise<T> {\n return this.http.get(\n `/v1/pg/orders/${encodeURIComponent(orderId)}`,\n );\n }\n\n /** \uACB0\uC81C\uB97C \uC2B9\uC778\uD569\uB2C8\uB2E4. */\n pgConfirmPayment<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\"/v1/pg/confirm\", body);\n }\n\n /** \uACB0\uC81C\uB97C \uCDE8\uC18C\uD569\uB2C8\uB2E4. */\n pgCancelPayment<T = unknown>(\n orderId: string,\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n `/v1/pg/orders/${encodeURIComponent(orderId)}/cancel`,\n body,\n );\n }\n\n /** \uACB0\uC81C \uC0C1\uD0DC\uB97C \uB3D9\uAE30\uD654\uD569\uB2C8\uB2E4. (\uAD00\uB9AC\uC790\uC6A9) */\n pgSyncPaymentStatus<T = unknown>(\n orderId: string,\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n `/v1/pg/orders/${encodeURIComponent(orderId)}/sync`,\n body,\n );\n }\n\n /** PG\uC0AC \uC6F9\uD6C5\uC744 \uC218\uC2E0\uD569\uB2C8\uB2E4. */\n pgWebhook<T = unknown>(body: Record<string, unknown>): Promise<T> {\n return this.http.post(\"/v1/pg/webhook\", body, false);\n }\n\n /** \uD074\uB77C\uC774\uC5B8\uD2B8 SDK \uC124\uC815\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n pgGetClientConfig<T = unknown>(): Promise<T> {\n return this.http.get(\"/v1/pg/config\", false);\n }\n };\n}\n", "import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function AppPushMixin<\n TBase extends GConstructor<EntityServerClientBase>,\n>(Base: TBase) {\n return class AppPushMixinClass extends Base {\n /** \uB2E8\uC77C \uACC4\uC815\uC5D0 \uD478\uC2DC \uC54C\uB9BC\uC744 \uBC1C\uC1A1\uD569\uB2C8\uB2E4. */\n appPushSend<T = unknown>(body: Record<string, unknown>): Promise<T> {\n return this.http.post(\"/v1/push/send\", body);\n }\n\n /** \uB2E4\uC911 \uACC4\uC815\uC5D0 \uD478\uC2DC \uC54C\uB9BC\uC744 \uBE0C\uB85C\uB4DC\uCE90\uC2A4\uD2B8\uD569\uB2C8\uB2E4. */\n appPushBroadcast<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\"/v1/push/broadcast\", body);\n }\n\n /** \uD478\uC2DC \uBC1C\uC1A1 \uC0C1\uD0DC\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\n appPushStatus<T = unknown>(seq: number): Promise<T> {\n return this.http.get(`/v1/push/status/${seq}`);\n }\n\n /** \uB514\uBC14\uC774\uC2A4 \uD1A0\uD070\uC744 \uB4F1\uB85D/\uAC31\uC2E0\uD569\uB2C8\uB2E4. */\n appPushRegisterDevice<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\"/v1/push/device\", body);\n }\n\n /** \uB514\uBC14\uC774\uC2A4 \uD478\uC2DC \uC218\uC2E0\uC744 \uBE44\uD65C\uC131\uD654\uD569\uB2C8\uB2E4. */\n appPushUnregisterDevice<T = unknown>(seq: number): Promise<T> {\n return this.http.delete(`/v1/push/device/${seq}`);\n }\n };\n}\n", "import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function SmsMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class SmsMixinClass extends Base {\n /** SMS/LMS/MMS\uB97C \uBC1C\uC1A1\uD569\uB2C8\uB2E4. */\n smsSend<T = unknown>(body: Record<string, unknown>): Promise<T> {\n return this.http.post(\"/v1/sms/send\", body);\n }\n\n /** SMS \uBC1C\uC1A1 \uC0C1\uD0DC\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\n smsStatus<T = unknown>(seq: number): Promise<T> {\n return this.http.get(\n `/v1/sms/status/${seq}`,\n false,\n );\n }\n\n /** SMS \uC778\uC99D\uBC88\uD638\uB97C \uBC1C\uC1A1\uD569\uB2C8\uB2E4. */\n smsVerificationSend<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/sms/verification/send\",\n body,\n false,\n );\n }\n\n /** SMS \uC778\uC99D\uBC88\uD638\uB97C \uAC80\uC99D\uD569\uB2C8\uB2E4. */\n smsVerificationVerify<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/sms/verification/verify\",\n body,\n false,\n );\n }\n };\n}\n", "import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function TaxinvoiceMixin<\n TBase extends GConstructor<EntityServerClientBase>,\n>(Base: TBase) {\n return class TaxinvoiceMixinClass extends Base {\n /** \uC804\uC790\uC138\uAE08\uACC4\uC0B0\uC11C\uB97C \uC989\uC2DC \uB4F1\uB85D\u00B7\uBC1C\uD589\uD569\uB2C8\uB2E4. */\n taxinvoiceRegistIssue<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\"/v1/taxinvoice\", body);\n }\n\n /** \uC804\uC790\uC138\uAE08\uACC4\uC0B0\uC11C\uB97C \uC784\uC2DC \uB4F1\uB85D\uD569\uB2C8\uB2E4. */\n taxinvoiceRegister<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\"/v1/taxinvoice/register\", body);\n }\n\n /** \uC784\uC2DC \uC800\uC7A5\uB41C \uC804\uC790\uC138\uAE08\uACC4\uC0B0\uC11C\uB97C \uBC1C\uD589\uD569\uB2C8\uB2E4. */\n taxinvoiceIssue<T = unknown>(seq: number): Promise<T> {\n return this.http.post(`/v1/taxinvoice/${seq}/issue`, {});\n }\n\n /** \uC804\uC790\uC138\uAE08\uACC4\uC0B0\uC11C \uBC1C\uD589\uC744 \uCDE8\uC18C\uD569\uB2C8\uB2E4. */\n taxinvoiceCancelIssue<T = unknown>(\n seq: number,\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n `/v1/taxinvoice/${seq}/cancel`,\n body,\n );\n }\n\n /** \uC804\uC790\uC138\uAE08\uACC4\uC0B0\uC11C \uAD6D\uC138\uCCAD \uC804\uC1A1 \uC0C1\uD0DC\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\n taxinvoiceGetState<T = unknown>(seq: number): Promise<T> {\n return this.http.get(`/v1/taxinvoice/${seq}/state`);\n }\n\n /** \uC804\uC790\uC138\uAE08\uACC4\uC0B0\uC11C \uC0C1\uC138 \uC815\uBCF4\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\n taxinvoiceGetDetail<T = unknown>(seq: number): Promise<T> {\n return this.http.get(`/v1/taxinvoice/${seq}`);\n }\n };\n}\n", "import { EntityServerApi } from \"./EntityServerApi.js\";\nimport {\n AccountAppMixin,\n BoardMixin,\n EmailVerifyMixin,\n OAuthMixin,\n PasswordResetMixin,\n TwoFactorMixin,\n} from \"./mixins/app/index.js\";\nimport {\n AlimtalkMixin,\n AppPushMixin,\n FriendtalkMixin,\n HolidaysMixin,\n IdentityMixin,\n LlmMixin,\n OcrMixin,\n PgMixin,\n SmsMixin,\n TaxinvoiceMixin,\n} from \"./mixins/app/plugins/index.js\";\n\nexport class EntityAppServerApi extends AlimtalkMixin(\n FriendtalkMixin(\n SmsMixin(\n AppPushMixin(\n PgMixin(\n TaxinvoiceMixin(\n OcrMixin(\n LlmMixin(\n IdentityMixin(\n HolidaysMixin(\n OAuthMixin(\n TwoFactorMixin(\n PasswordResetMixin(\n EmailVerifyMixin(\n BoardMixin(\n AccountAppMixin(\n EntityServerApi,\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n) {}\n", "export * from \"./types.js\";\nexport * from \"./EntityServerApi.js\";\nexport * from \"./EntityAppServerApi.js\";\nexport * from \"./mixins/server/index.js\";\nexport * from \"./mixins/app/index.js\";\nexport * from \"./packet.js\";\n\nimport { EntityServerApi } from \"./EntityServerApi.js\";\nimport { EntityAppServerApi } from \"./EntityAppServerApi.js\";\n\nexport const entityServer = new EntityServerApi();\nexport const entityAppServer = new EntityAppServerApi();\n"],
5
+ "mappings": "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",
6
+ "names": ["readEnv", "name", "meta", "_proc", "buildQuery", "params", "value", "key", "xchacha20poly1305", "sha256", "hkdf", "PACKET_KEY_SIZE", "PACKET_MAGIC_MIN", "PACKET_MAGIC_RANGE", "PACKET_NONCE_SIZE", "PACKET_TAG_SIZE", "PACKET_HKDF_SALT", "PACKET_INFO_LABEL", "toUint8Array", "data", "derivePacketKey", "source", "infoLabel", "packetMagicLenFromKey", "key", "magicMin", "magicRange", "keyBytes", "encryptPacket", "plaintext", "plaintextBytes", "magicLen", "magic", "nonce", "ciphertext", "result", "decryptPacket", "buffer", "derivePacketKey", "hmacSecret", "token", "encryptPacket", "plaintext", "key", "decryptPacket", "buffer", "parseRequestBody", "body", "contentType", "requireEncrypted", "isEncrypted", "sliced", "sha256", "hmac", "buildHmacHeaders", "method", "path", "bodyBytes", "apiKey", "hmacSecret", "timestamp", "nonce", "prefix", "payload", "signature", "b", "resolvePacketSource", "opts", "resolveResponsePacketSource", "withAuth", "anonymousPacketToken", "maskPacketSource", "value", "logPacketDecryptError", "details", "requiresCsrf", "method", "readCsrfCookie", "name", "chunk", "idx", "isCsrfError", "status", "message", "readErrorMessage", "res", "data", "entityRequest", "path", "body", "extraHeaders", "config", "requestConfig", "requireOkShape", "allowStatuses", "signal", "baseUrl", "token", "apiKey", "hmacSecret", "encryptRequests", "csrfEnabled", "csrfHeaderName", "csrfCookieName", "refreshCsrfCookie", "onAccessToken", "isHmacMode", "packetSource", "responsePacketSource", "shouldUseCsrf", "csrfToken", "requestContentType", "includeAnonymousPacketHeader", "fetchBody", "key", "derivePacketKey", "encryptPacket", "buildHeaders", "resolvedCsrfToken", "headers", "hasExplicitContentType", "bodyBytes", "buildHmacHeaders", "executeRequest", "err", "accessTokenHeader", "contentType", "encryptedBody", "decrypted", "decryptPacket", "error", "REALTIME_DEFAULT_PATH", "EntityServerClientBase", "options", "envBaseUrl", "readEnv", "token", "apiKey", "secret", "value", "enabled", "listener", "eventName", "key", "listeners", "socket", "resolve", "reject", "settled", "finalizeResolve", "finalizeReject", "error", "event", "reason", "message", "subscriptions", "intervalMs", "tick", "refreshToken", "expiresIn", "refreshFn", "delayMs", "result", "err", "normalized", "rawBaseUrl", "origin", "baseUrl", "url", "basePath", "realtimePath", "payload", "envelope", "status", "previousStatus", "chunk", "idx", "body", "contentType", "requireEncrypted", "derivePacketKey", "parseRequestBody", "_withAuth", "self", "path", "withAuth", "extraHeaders", "requestConfig", "entityRequest", "method", "headers", "res", "text", "form", "data", "isAuthLoginSuccessResponse", "response", "AuthMixin", "Base", "bootstrapAuth", "previousToken", "headers", "res", "data", "accessToken", "anonToken", "error", "name", "match", "c", "hasAnonymousPacketToken", "hasCsrfCookie", "withAuth", "email", "password", "entityRequest", "refreshToken", "passwd", "EntityMixin", "Base", "res", "transactionId", "txId", "entity", "data", "seq", "opts", "q", "conditions", "params", "fields", "orderDir", "orderBy", "rest", "queryObj", "buildQuery", "req", "extraHeaders", "historySeq", "FileMixin", "Base", "entity", "file", "opts", "form", "uuid", "qs", "PushMixin", "Base", "pushEntity", "payload", "opts", "params", "accountSeq", "deviceId", "pushToken", "platform", "deviceType", "browser", "browserVersion", "pushEnabled", "transactionId", "deviceSeq", "SmtpMixin", "Base", "req", "seq", "templatePath", "encoded", "r", "TransactionMixin", "Base", "body", "transactionId", "UtilsMixin", "Base", "query", "qs", "content", "opts", "pdfData", "form", "params", "path", "fileSeq", "AdminMixin", "Base", "path", "body", "configs", "entity", "config", "domain", "patch", "seq", "EntityServerApi", "UtilsMixin", "TransactionMixin", "FileMixin", "SmtpMixin", "PushMixin", "AdminMixin", "EntityMixin", "AuthMixin", "EntityServerClientBase", "AccountAppMixin", "Base", "body", "seq", "BoardMixin", "Base", "query", "qs", "buildQuery", "seq", "body", "category", "postSeq", "file", "form", "uuid", "EmailVerifyMixin", "Base", "body", "query", "qs", "buildQuery", "OAuthMixin", "Base", "provider", "query", "qs", "buildQuery", "payload", "method", "body", "PasswordResetMixin", "Base", "body", "token", "TwoFactorMixin", "Base", "body", "AlimtalkMixin", "Base", "body", "seq", "provider", "FriendtalkMixin", "Base", "body", "HolidaysMixin", "Base", "query", "qs", "buildQuery", "locdate", "body", "IdentityMixin", "Base", "body", "requestId", "LlmMixin", "Base", "body", "seq", "query", "qs", "buildQuery", "form", "id", "name", "sessionSeq", "OcrMixin", "Base", "form", "docType", "query", "qs", "buildQuery", "id", "PgMixin", "Base", "body", "orderId", "AppPushMixin", "Base", "body", "seq", "SmsMixin", "Base", "body", "seq", "TaxinvoiceMixin", "Base", "body", "seq", "EntityAppServerApi", "AlimtalkMixin", "FriendtalkMixin", "SmsMixin", "AppPushMixin", "PgMixin", "TaxinvoiceMixin", "OcrMixin", "LlmMixin", "IdentityMixin", "HolidaysMixin", "OAuthMixin", "TwoFactorMixin", "PasswordResetMixin", "EmailVerifyMixin", "BoardMixin", "AccountAppMixin", "EntityServerApi", "entityServer", "EntityServerApi", "entityAppServer", "EntityAppServerApi"]
7
7
  }