entity-client 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/EntityAppServerClient.d.ts +383 -0
- package/dist/EntityAppServerClient.js +2 -0
- package/dist/EntityAppServerClient.js.map +7 -0
- package/dist/EntityServerClient.d.ts +638 -0
- package/dist/EntityServerClient.js +2 -0
- package/dist/EntityServerClient.js.map +7 -0
- package/dist/client/base.d.ts +98 -0
- package/dist/client/base.js +2 -0
- package/dist/client/base.js.map +7 -0
- package/dist/client/hmac.d.ts +8 -0
- package/dist/client/hmac.js +2 -0
- package/dist/client/hmac.js.map +7 -0
- package/dist/client/packet.d.ts +24 -0
- package/dist/client/packet.js +2 -0
- package/dist/client/packet.js.map +7 -0
- package/dist/client/request.d.ts +20 -0
- package/dist/client/request.js +2 -0
- package/dist/client/request.js.map +7 -0
- package/dist/client/utils.d.ts +8 -0
- package/dist/client/utils.js +2 -0
- package/dist/client/utils.js.map +7 -0
- package/dist/hooks/useEntityServer.d.ts +104 -0
- package/dist/hooks/useEntityServer.js +2 -0
- package/dist/hooks/useEntityServer.js.map +7 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +7 -0
- package/dist/mixins/app/account.d.ts +64 -0
- package/dist/mixins/app/account.js +2 -0
- package/dist/mixins/app/account.js.map +7 -0
- package/dist/mixins/app/board.d.ts +87 -0
- package/dist/mixins/app/board.js +2 -0
- package/dist/mixins/app/board.js.map +7 -0
- package/dist/mixins/app/email-verify.d.ts +59 -0
- package/dist/mixins/app/email-verify.js +2 -0
- package/dist/mixins/app/email-verify.js.map +7 -0
- package/dist/mixins/app/index.d.ts +6 -0
- package/dist/mixins/app/index.js +2 -0
- package/dist/mixins/app/index.js.map +7 -0
- package/dist/mixins/app/oauth.d.ts +60 -0
- package/dist/mixins/app/oauth.js +2 -0
- package/dist/mixins/app/oauth.js.map +7 -0
- package/dist/mixins/app/password-reset.d.ts +59 -0
- package/dist/mixins/app/password-reset.js +2 -0
- package/dist/mixins/app/password-reset.js.map +7 -0
- package/dist/mixins/app/two-factor.d.ts +61 -0
- package/dist/mixins/app/two-factor.js +2 -0
- package/dist/mixins/app/two-factor.js.map +7 -0
- package/dist/mixins/auth.d.ts +115 -0
- package/dist/mixins/auth.js +2 -0
- package/dist/mixins/auth.js.map +7 -0
- package/dist/mixins/entity.d.ts +147 -0
- package/dist/mixins/entity.js +2 -0
- package/dist/mixins/entity.js.map +7 -0
- package/dist/mixins/file.d.ts +103 -0
- package/dist/mixins/file.js +2 -0
- package/dist/mixins/file.js.map +7 -0
- package/dist/mixins/push.d.ts +115 -0
- package/dist/mixins/push.js +2 -0
- package/dist/mixins/push.js.map +7 -0
- package/dist/mixins/server/admin.d.ts +105 -0
- package/dist/mixins/server/admin.js +2 -0
- package/dist/mixins/server/admin.js.map +7 -0
- package/dist/mixins/server/index.d.ts +7 -0
- package/dist/mixins/server/index.js +2 -0
- package/dist/mixins/server/index.js.map +7 -0
- package/dist/mixins/smtp.d.ts +65 -0
- package/dist/mixins/smtp.js +2 -0
- package/dist/mixins/smtp.js.map +7 -0
- package/dist/mixins/utils.d.ts +116 -0
- package/dist/mixins/utils.js +2 -0
- package/dist/mixins/utils.js.map +7 -0
- package/dist/packet.d.ts +11 -0
- package/dist/packet.js +2 -0
- package/dist/packet.js.map +7 -0
- package/dist/react.d.ts +1 -0
- package/dist/react.js +2 -0
- package/dist/react.js.map +7 -0
- package/dist/types.d.ts +250 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +7 -0
- package/package.json +57 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 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/auth.ts", "../src/mixins/entity.ts", "../src/mixins/file.ts", "../src/mixins/push.ts", "../src/mixins/smtp.ts", "../src/mixins/utils.ts", "../src/mixins/server/admin.ts", "../src/EntityServerClient.ts", "../src/mixins/app/account.ts", "../src/mixins/app/board.ts", "../src/mixins/app/email-verify.ts", "../src/mixins/app/oauth.ts", "../src/mixins/app/password-reset.ts", "../src/mixins/app/two-factor.ts", "../src/EntityAppServerClient.ts", "../src/index.ts"],
|
|
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 csrfToken: string;\n csrfHeaderName: string;\n refreshCsrfToken: (() => Promise<string>) | null;\n}\n\nfunction resolvePacketSource(opts: RequestOptions): string {\n return opts.hmacSecret || opts.token || opts.anonymousPacketToken;\n}\n\nfunction requiresCsrf(method: string): boolean {\n return method !== \"GET\" && method !== \"HEAD\" && method !== \"OPTIONS\";\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 requireOkShape = true,\n): Promise<T> {\n const {\n baseUrl,\n token,\n apiKey,\n hmacSecret,\n encryptRequests,\n anonymousPacketToken,\n csrfEnabled,\n csrfHeaderName,\n refreshCsrfToken,\n } = opts;\n const isHmacMode = withAuth && !!(apiKey && hmacSecret);\n const packetSource = resolvePacketSource(opts);\n const shouldUseCsrf = csrfEnabled && requiresCsrf(method) && !isHmacMode;\n let csrfToken = opts.csrfToken;\n let requestContentType = \"application/json\";\n const includeAnonymousPacketHeader =\n !token && !isHmacMode && !!anonymousPacketToken;\n\n let fetchBody: string | Uint8Array | null = null;\n if (body != null) {\n const shouldEncrypt =\n encryptRequests &&\n !!packetSource &&\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> = {\n \"Content-Type\": requestContentType,\n ...extraHeaders,\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 && refreshCsrfToken) {\n csrfToken = await refreshCsrfToken();\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 });\n\n let res = await executeRequest(csrfToken);\n\n if (!res.ok) {\n const message = await readErrorMessage(res.clone());\n if (\n shouldUseCsrf &&\n refreshCsrfToken &&\n isCsrfError(res.status, message)\n ) {\n csrfToken = await refreshCsrfToken();\n res = await executeRequest(csrfToken);\n } else {\n const err = new Error(message);\n (err as { status?: number }).status = res.status;\n throw err;\n }\n }\n\n if (!res.ok) {\n const err = new Error(await readErrorMessage(res));\n (err as { status?: number }).status = res.status;\n throw err;\n }\n\n const contentType = res.headers.get(\"Content-Type\") ?? \"\";\n if (contentType.includes(\"application/octet-stream\")) {\n const key = derivePacketKey(hmacSecret, token || anonymousPacketToken);\n return decryptPacket<T>(await res.arrayBuffer(), key);\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) {\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 EntityServerClientHealthCsrf,\n EntityServerClientOptions,\n} from \"../types.js\";\nimport { readEnv } from \"./utils.js\";\nimport { derivePacketKey, parseRequestBody } from \"./packet.js\";\nimport { entityRequest, type RequestOptions } from \"./request.js\";\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 csrfToken: string;\n csrfHeaderName: string;\n csrfRefreshPath: string;\n csrfRefreshBuffer: number;\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 _sessionRefreshToken: string | null = null;\n _refreshTimer: ReturnType<typeof setTimeout> | null = null;\n _csrfRefreshTimer: ReturnType<typeof setTimeout> | null = null;\n _csrfRefreshPromise: Promise<string> | null = null;\n\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.csrfToken = options.csrfToken ?? \"\";\n this.csrfHeaderName = options.csrfHeaderName ?? \"x-csrf-token\";\n this.csrfRefreshPath = options.csrfRefreshPath ?? \"/v1/csrf-token\";\n this.csrfRefreshBuffer = options.csrfRefreshBuffer ?? 60;\n this.keepSession = options.keepSession ?? false;\n this.refreshBuffer = options.refreshBuffer ?? 60;\n this.onTokenRefreshed = options.onTokenRefreshed;\n this.onSessionExpired = options.onSessionExpired;\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 if (!options.csrfEnabled) {\n this.csrfToken = \"\";\n this.stopCsrfRefresh();\n }\n }\n if (typeof options.csrfToken === \"string\")\n this.csrfToken = options.csrfToken;\n if (typeof options.csrfHeaderName === \"string\") {\n this.csrfHeaderName = options.csrfHeaderName;\n }\n if (typeof options.csrfRefreshPath === \"string\") {\n this.csrfRefreshPath = options.csrfRefreshPath;\n }\n if (typeof options.csrfRefreshBuffer === \"number\") {\n this.csrfRefreshBuffer = options.csrfRefreshBuffer;\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 }\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 }\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 setCsrfToken(token: string): void {\n this.csrfToken = token;\n }\n\n setCsrfEnabled(enabled: boolean): void {\n this.csrfEnabled = enabled;\n if (!enabled) {\n this.csrfToken = \"\";\n this.stopCsrfRefresh();\n }\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 /** @internal \uC790\uB3D9 \uD1A0\uD070 \uAC31\uC2E0 \uD0C0\uC774\uBA38\uB97C \uC2DC\uC791\uD569\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 /** @internal \uC790\uB3D9 \uAC31\uC2E0 \uD0C0\uC774\uBA38\uB97C \uC815\uB9AC\uD569\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 \uC720\uC9C0 \uD0C0\uC774\uBA38\uB97C \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 _clearCsrfRefreshTimer(): void {\n if (this._csrfRefreshTimer !== null) {\n clearTimeout(this._csrfRefreshTimer);\n this._csrfRefreshTimer = null;\n }\n }\n\n stopCsrfRefresh(): void {\n this._clearCsrfRefreshTimer();\n this._csrfRefreshPromise = null;\n }\n\n _scheduleCsrfRefresh(expiresIn: number): void {\n this._clearCsrfRefreshTimer();\n if (!this.csrfEnabled || !this.csrfRefreshPath) {\n return;\n }\n\n const delayMs = Math.max(\n (expiresIn - this.csrfRefreshBuffer) * 1000,\n 0,\n );\n this._csrfRefreshTimer = setTimeout(() => {\n void this.refreshCsrfToken().catch(() => {\n this._clearCsrfRefreshTimer();\n });\n }, delayMs);\n }\n\n async refreshCsrfToken(): Promise<string> {\n if (!this.csrfEnabled || !this.csrfRefreshPath) {\n return \"\";\n }\n\n if (!this._csrfRefreshPromise) {\n this._csrfRefreshPromise = (async () => {\n const res = await fetch(\n `${this.baseUrl}${this.csrfRefreshPath}`,\n {\n method: \"GET\",\n credentials: \"include\",\n },\n );\n\n if (!res.ok) {\n const message = await res.text().catch(() => \"\");\n const err = new Error(message || `HTTP ${res.status}`);\n (err as { status?: number }).status = res.status;\n throw err;\n }\n\n const payload = (await res.json().catch(() => null)) as\n | { data?: EntityServerClientHealthCsrf | null }\n | EntityServerClientHealthCsrf\n | null;\n const csrf = (\n payload && typeof payload === \"object\" && \"data\" in payload\n ? (payload.data ?? null)\n : payload\n ) as EntityServerClientHealthCsrf | null;\n\n if (!csrf?.enabled || typeof csrf.token !== \"string\") {\n throw new Error(\"CSRF token refresh failed\");\n }\n\n this._applyCsrfHealth(csrf);\n return this.csrfToken;\n })().finally(() => {\n this._csrfRefreshPromise = null;\n });\n }\n\n return this._csrfRefreshPromise;\n }\n\n _applyCsrfHealth(csrf?: EntityServerClientHealthCsrf | null): void {\n if (!csrf?.enabled) {\n this.setCsrfEnabled(false);\n return;\n }\n\n this.csrfEnabled = true;\n if (typeof csrf.token === \"string\") {\n this.csrfToken = csrf.token;\n }\n if (typeof csrf.headerName === \"string\") {\n this.csrfHeaderName = csrf.headerName;\n }\n if (typeof csrf.refreshPath === \"string\") {\n this.csrfRefreshPath = csrf.refreshPath;\n }\n if (typeof csrf.expiresIn === \"number\" && csrf.expiresIn > 0) {\n this._scheduleCsrfRefresh(csrf.expiresIn);\n }\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 csrfToken: this.csrfToken,\n csrfHeaderName: this.csrfHeaderName,\n refreshCsrfToken: this.csrfEnabled\n ? () => this.refreshCsrfToken()\n : null,\n };\n }\n\n /**\n * \uC784\uC758 \uACBD\uB85C\uC5D0 JSON \uC694\uCCAD\uC744 \uBCF4\uB0C5\uB2C8\uB2E4. \uC751\uB2F5\uC774 JSON\uC774\uBA74 \uD30C\uC2F1, octet-stream\uC774\uBA74 \uC790\uB3D9 \uBCF5\uD638\uD654\uD569\uB2C8\uB2E4.\n * `ok` \uD544\uB4DC\uB97C \uAC15\uC81C\uD558\uC9C0 \uC54A\uC544 go\uC11C\uBC84/\uC571\uC11C\uBC84 \uC2E0\uADDC \uB77C\uC6B0\uD2B8 \uB4F1 \uC790\uC720 \uC751\uB2F5 \uD3EC\uB9F7\uC5D0 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.\n * `encryptRequests: true`\uC774\uBA74 \uC694\uCCAD \uBC14\uB514\uB3C4 \uC790\uB3D9 \uC554\uD638\uD654\uB429\uB2C8\uB2E4.\n */\n requestJson<T>(\n method: string,\n path: string,\n body?: unknown,\n withAuth = true,\n extraHeaders?: Record<string, string>,\n ): Promise<T> {\n return entityRequest<T>(\n this._reqOpts,\n method,\n path,\n body,\n withAuth,\n extraHeaders,\n false,\n );\n }\n\n /**\n * \uC784\uC758 \uACBD\uB85C\uC5D0 \uC694\uCCAD\uC744 \uBCF4\uB0B4\uACE0 \uBC14\uC774\uB108\uB9AC(ArrayBuffer)\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.\n * \uC774\uBBF8\uC9C0, PDF, \uC555\uCD95 \uD30C\uC77C \uB4F1 \uBC14\uC774\uB108\uB9AC \uC751\uB2F5\uC774 \uC624\uB294 \uC5D4\uB4DC\uD3EC\uC778\uD2B8\uC5D0 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.\n */\n requestBinary(\n method: string,\n path: string,\n body?: unknown,\n withAuth = true,\n ): Promise<ArrayBuffer> {\n return this._requestBinary(method, path, body, withAuth);\n }\n\n /**\n * multipart/form-data \uC694\uCCAD\uC744 \uBCF4\uB0C5\uB2C8\uB2E4. \uD30C\uC77C \uC5C5\uB85C\uB4DC \uB4F1\uC5D0 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.\n * \uC751\uB2F5\uC740 JSON\uC73C\uB85C \uD30C\uC2F1\uD558\uC5EC \uBC18\uD658\uD569\uB2C8\uB2E4.\n */\n requestForm<T>(\n method: string,\n path: string,\n form: FormData,\n withAuth = true,\n ): Promise<T> {\n return this._requestForm<T>(method, path, form, withAuth);\n }\n\n /**\n * multipart/form-data \uC694\uCCAD\uC744 \uBCF4\uB0B4\uACE0 \uBC14\uC774\uB108\uB9AC(ArrayBuffer)\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.\n */\n requestFormBinary(\n method: string,\n path: string,\n form: FormData,\n withAuth = true,\n ): Promise<ArrayBuffer> {\n return this._requestFormBinary(method, path, form, withAuth);\n }\n\n _request<T>(\n method: string,\n path: string,\n body?: unknown,\n withAuth = true,\n extraHeaders?: Record<string, string>,\n ): Promise<T> {\n return entityRequest<T>(\n this._reqOpts,\n method,\n path,\n body,\n withAuth,\n extraHeaders,\n true,\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 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 { GConstructor, EntityServerClientBase } from \"../client/base.js\";\n\nexport function AuthMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class AuthMixinClass extends Base {\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(): Promise<{\n ok: boolean;\n packet_encryption?: boolean;\n packet_mode?: string;\n packet_token?: string;\n csrf?: import(\"../types\").EntityServerClientHealthCsrf;\n }> {\n const res = await fetch(`${this.baseUrl}/v1/health`, {\n signal: AbortSignal.timeout(3000),\n credentials: \"include\",\n });\n const data = (await res.json()) as {\n ok: boolean;\n packet_encryption?: boolean;\n packet_mode?: string;\n packet_token?: string;\n csrf?: import(\"../types\").EntityServerClientHealthCsrf;\n };\n if (data.packet_encryption) this.encryptRequests = true;\n if (typeof data.packet_token === \"string\") {\n this.anonymousPacketToken = data.packet_token;\n }\n this._applyCsrfHealth(data.csrf);\n return data;\n }\n\n /** \uB85C\uADF8\uC778 \uD6C4 `access_token`\uC744 \uB0B4\uBD80 \uC0C1\uD0DC\uC5D0 \uC800\uC7A5\uD569\uB2C8\uB2E4. */\n async login(\n email: string,\n password: string,\n ): Promise<{\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 const data = await this._request<{\n data: {\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 }>(\"POST\", \"/v1/auth/login\", { email, passwd: password }, false);\n this.token = data.data.access_token;\n if (this.keepSession)\n this._scheduleKeepSession(\n data.data.refresh_token,\n data.data.expires_in,\n (rt) => this.refreshToken(rt),\n );\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(\n refreshToken: string,\n ): Promise<{ access_token: string; expires_in: number }> {\n const data = await this._request<{\n data: { access_token: string; expires_in: number };\n }>(\n \"POST\",\n \"/v1/auth/refresh\",\n { refresh_token: refreshToken },\n false,\n );\n this.token = data.data.access_token;\n if (this.keepSession)\n this._scheduleKeepSession(\n refreshToken,\n data.data.expires_in,\n (rt) => this.refreshToken(rt),\n );\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 const data = await this._request<{ ok: boolean }>(\n \"POST\",\n \"/v1/auth/logout\",\n { refresh_token: refreshToken },\n false,\n );\n this.token = \"\";\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 * \uD734\uBA74 \uACC4\uC815\uC744 \uC7AC\uD65C\uC131\uD654\uD569\uB2C8\uB2E4.\n * \uBE44\uBC00\uBC88\uD638 \uB610\uB294 OAuth(provider + code)\uB85C \uBCF8\uC778 \uD655\uC778\uD569\uB2C8\uB2E4.\n */\n reactivate(params: {\n email: string;\n passwd?: string;\n provider?: string;\n code?: string;\n }): Promise<{\n access_token: string;\n refresh_token: string;\n expires_in: number;\n }> {\n return this._request(\"POST\", \"/v1/auth/reactivate\", params, false);\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 { GConstructor, EntityServerClientBase } 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.requestJson(\n \"POST\",\n `/v1/entity/${entity}/validate`,\n data,\n );\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 { FileMeta, FileUploadOptions } 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}\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 { GConstructor, EntityServerClientBase } 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}\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.requestJson(\n \"GET\",\n \"/v1/utils/address/sido\",\n undefined,\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.requestJson(\n \"GET\",\n `/v1/utils/address/sigungu?${qs}`,\n undefined,\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.requestJson(\n \"GET\",\n `/v1/utils/address/dong?${qs}`,\n undefined,\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.requestJson(\n \"GET\",\n `/v1/utils/address/clean?${qs}`,\n undefined,\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.requestJson(\"GET\", this._adminPath(path));\n }\n\n _adminPost<T>(path: string, body?: unknown): Promise<T> {\n return this.requestJson(\"POST\", this._adminPath(path), body);\n }\n\n _adminPut<T>(path: string, body?: unknown): Promise<T> {\n return this.requestJson(\"PUT\", this._adminPath(path), body);\n }\n\n _adminPatch<T>(path: string, body?: unknown): Promise<T> {\n return this.requestJson(\"PATCH\", this._adminPath(path), body);\n }\n\n _adminDelete<T>(path: string, body?: unknown): Promise<T> {\n return this.requestJson(\"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 EntityServerClient.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 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 EntityServerClient extends UtilsMixin(\n FileMixin(\n SmtpMixin(\n PushMixin(\n AdminMixin(EntityMixin(AuthMixin(EntityServerClientBase))),\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.requestJson(\n \"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.requestJson(\"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.requestJson(\n \"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.requestJson(\n \"POST\",\n \"/v1/account/reactivate\",\n body,\n false,\n );\n }\n\n listAccountBiometrics<T = unknown>(): Promise<T> {\n return this.requestJson(\"GET\", \"/v1/account/biometric\");\n }\n\n registerAccountBiometric<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.requestJson(\"POST\", \"/v1/account/biometric\", body);\n }\n\n deleteAccountBiometric<T = unknown>(seq: number): Promise<T> {\n return this.requestJson(\"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.requestJson(\n \"GET\",\n `/v1/board/categories${qs ? `?${qs}` : \"\"}`,\n undefined,\n false,\n );\n }\n\n getBoardCategory<T = unknown>(seq: number): Promise<T> {\n return this.requestJson(\n \"GET\",\n `/v1/board/categories/${seq}`,\n undefined,\n false,\n );\n }\n\n createBoardCategory<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.requestJson(\"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.requestJson(\"PUT\", `/v1/board/categories/${seq}`, body);\n }\n\n deleteBoardCategory<T = unknown>(seq: number): Promise<T> {\n return this.requestJson(\"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.requestJson(\n \"GET\",\n `/v1/board/${category}/list${qs ? `?${qs}` : \"\"}`,\n undefined,\n false,\n );\n }\n\n getBoardPost<T = unknown>(seq: number): Promise<T> {\n return this.requestJson(\n \"GET\",\n `/v1/board/posts/${seq}`,\n undefined,\n false,\n );\n }\n\n createBoardPost<T = unknown>(\n category: string,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.requestJson(\n \"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.requestJson(\"PUT\", `/v1/board/posts/${seq}`, body);\n }\n\n deleteBoardPost<T = unknown>(seq: number): Promise<T> {\n return this.requestJson(\"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.requestJson(\n \"GET\",\n `/v1/board/posts/${postSeq}/comments${qs ? `?${qs}` : \"\"}`,\n undefined,\n false,\n );\n }\n\n createBoardComment<T = unknown>(\n postSeq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.requestJson(\n \"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.requestJson(\"PUT\", `/v1/board/comments/${seq}`, body);\n }\n\n deleteBoardComment<T = unknown>(seq: number): Promise<T> {\n return this.requestJson(\"DELETE\", `/v1/board/comments/${seq}`);\n }\n\n listBoardFiles<T = unknown>(postSeq: number): Promise<T> {\n return this.requestJson(\n \"GET\",\n `/v1/board/posts/${postSeq}/files`,\n undefined,\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.requestJson(\"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.requestJson(\n \"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.requestJson(\n \"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.requestJson(\"POST\", `/v1/board/posts/${seq}/like`, {});\n }\n\n acceptBoardPost<T = unknown>(seq: number): Promise<T> {\n return this.requestJson(\n \"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.requestJson(\n \"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.requestJson(\n \"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.requestJson(\n \"GET\",\n `/v1/board/tags${qs ? `?${qs}` : \"\"}`,\n undefined,\n false,\n );\n }\n\n setBoardPostTags<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.requestJson(\"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.requestJson(\n \"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.requestJson(\n \"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.requestJson(\n \"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.requestJson(\n \"PATCH\",\n `/v1/board/admin/reports/${seq}`,\n body,\n );\n }\n\n markBoardPostRead<T = unknown>(seq: number): Promise<T> {\n return this.requestJson(\"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.requestJson(\n \"GET\",\n `/v1/board/mentions${qs ? `?${qs}` : \"\"}`,\n );\n }\n\n markBoardMentionRead<T = unknown>(seq: number): Promise<T> {\n return this.requestJson(\n \"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.requestJson(\n \"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.requestJson(\n \"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.requestJson(\n \"GET\",\n `/v1/email-verify/activate${qs ? `?${qs}` : \"\"}`,\n undefined,\n false,\n );\n }\n\n getEmailVerificationStatus<T = unknown>(): Promise<T> {\n return this.requestJson(\"GET\", \"/v1/email-verify/status\");\n }\n\n changeVerifiedEmail<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.requestJson(\"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.requestJson(\n \"GET\",\n `/v1/oauth/${provider}/callback${qs ? `?${qs}` : \"\"}`,\n undefined,\n false,\n );\n }\n\n return this.requestJson(\n \"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.requestJson(\"POST\", \"/v1/account/oauth/link\", body);\n }\n\n unlinkOAuthAccount<T = unknown>(provider: string): Promise<T> {\n return this.requestJson(\n \"DELETE\",\n `/v1/account/oauth/link/${provider}`,\n );\n }\n\n listOAuthProviders<T = unknown>(): Promise<T> {\n return this.requestJson(\"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.requestJson(\n \"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.requestJson(\n \"POST\",\n \"/v1/password-reset/request\",\n body,\n false,\n );\n }\n\n validatePasswordResetToken<T = unknown>(token: string): Promise<T> {\n return this.requestJson(\n \"GET\",\n `/v1/password-reset/validate/${encodeURIComponent(token)}`,\n undefined,\n false,\n );\n }\n\n verifyPasswordReset<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.requestJson(\n \"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.requestJson(\"POST\", \"/v1/account/2fa/setup\", body);\n }\n\n verifyTwoFactorSetup<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.requestJson(\n \"POST\",\n \"/v1/account/2fa/setup/verify\",\n body,\n false,\n );\n }\n\n disableTwoFactor<T = unknown>(): Promise<T> {\n return this.requestJson(\"DELETE\", \"/v1/account/2fa\");\n }\n\n getTwoFactorStatus<T = unknown>(): Promise<T> {\n return this.requestJson(\"GET\", \"/v1/account/2fa/status\");\n }\n\n regenerateTwoFactorRecoveryCodes<T = unknown>(): Promise<T> {\n return this.requestJson(\n \"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.requestJson(\n \"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.requestJson(\n \"POST\",\n \"/v1/account/2fa/recovery\",\n body,\n false,\n );\n }\n };\n}\n", "import { EntityServerClient } from \"./EntityServerClient.js\";\nimport {\n AccountAppMixin,\n BoardMixin,\n EmailVerifyMixin,\n OAuthMixin,\n PasswordResetMixin,\n TwoFactorMixin,\n} from \"./mixins/app/index.js\";\n\nexport class EntityAppServerClient extends OAuthMixin(\n TwoFactorMixin(\n PasswordResetMixin(\n EmailVerifyMixin(BoardMixin(AccountAppMixin(EntityServerClient))),\n ),\n ),\n) {}\n", "export * from \"./types.js\";\nexport * from \"./EntityServerClient.js\";\nexport * from \"./EntityAppServerClient.js\";\nexport * from \"./mixins/server/index.js\";\nexport * from \"./mixins/app/index.js\";\nexport * from \"./packet.js\";\n\nimport { EntityServerClient } from \"./EntityServerClient.js\";\nimport { EntityAppServerClient } from \"./EntityAppServerClient.js\";\n\nexport const entityServer = new EntityServerClient();\nexport const entityAppServer = new EntityAppServerClient();\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", "requiresCsrf", "method", "isCsrfError", "status", "message", "readErrorMessage", "res", "data", "entityRequest", "path", "body", "withAuth", "extraHeaders", "requireOkShape", "baseUrl", "token", "apiKey", "hmacSecret", "encryptRequests", "anonymousPacketToken", "csrfEnabled", "csrfHeaderName", "refreshCsrfToken", "isHmacMode", "packetSource", "shouldUseCsrf", "csrfToken", "requestContentType", "includeAnonymousPacketHeader", "fetchBody", "key", "derivePacketKey", "encryptPacket", "buildHeaders", "resolvedCsrfToken", "headers", "bodyBytes", "buildHmacHeaders", "executeRequest", "err", "contentType", "decryptPacket", "EntityServerClientBase", "options", "envBaseUrl", "readEnv", "token", "apiKey", "secret", "value", "enabled", "refreshToken", "expiresIn", "refreshFn", "delayMs", "result", "err", "res", "message", "payload", "csrf", "body", "contentType", "requireEncrypted", "key", "derivePacketKey", "parseRequestBody", "method", "path", "withAuth", "extraHeaders", "entityRequest", "form", "headers", "text", "data", "AuthMixin", "Base", "data", "email", "password", "rt", "refreshToken", "passwd", "params", "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", "UtilsMixin", "Base", "query", "qs", "content", "opts", "pdfData", "form", "params", "path", "fileSeq", "AdminMixin", "Base", "path", "body", "configs", "entity", "config", "domain", "patch", "seq", "EntityServerClient", "UtilsMixin", "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", "EntityAppServerClient", "OAuthMixin", "TwoFactorMixin", "PasswordResetMixin", "EmailVerifyMixin", "BoardMixin", "AccountAppMixin", "EntityServerClient", "entityServer", "EntityServerClient", "entityAppServer", "EntityAppServerClient"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { GConstructor, EntityServerClientBase } from "../../client/base.js";
|
|
2
|
+
export declare function AccountAppMixin<TBase extends GConstructor<EntityServerClientBase>>(Base: TBase): {
|
|
3
|
+
new (...args: any[]): {
|
|
4
|
+
accountRegister<T = unknown>(body: Record<string, unknown>): Promise<T>;
|
|
5
|
+
accountWithdraw<T = unknown>(body?: Record<string, unknown>): Promise<T>;
|
|
6
|
+
accountChangePassword<T = unknown>(body: {
|
|
7
|
+
current_password: string;
|
|
8
|
+
new_password: string;
|
|
9
|
+
}): Promise<T>;
|
|
10
|
+
accountReactivate<T = unknown>(body: Record<string, unknown>): Promise<T>;
|
|
11
|
+
listAccountBiometrics<T = unknown>(): Promise<T>;
|
|
12
|
+
registerAccountBiometric<T = unknown>(body: Record<string, unknown>): Promise<T>;
|
|
13
|
+
deleteAccountBiometric<T = unknown>(seq: number): Promise<T>;
|
|
14
|
+
baseUrl: string;
|
|
15
|
+
token: string;
|
|
16
|
+
anonymousPacketToken: string;
|
|
17
|
+
apiKey: string;
|
|
18
|
+
hmacSecret: string;
|
|
19
|
+
encryptRequests: boolean;
|
|
20
|
+
csrfEnabled: boolean;
|
|
21
|
+
csrfToken: string;
|
|
22
|
+
csrfHeaderName: string;
|
|
23
|
+
csrfRefreshPath: string;
|
|
24
|
+
csrfRefreshBuffer: number;
|
|
25
|
+
activeTxId: string | null;
|
|
26
|
+
keepSession: boolean;
|
|
27
|
+
refreshBuffer: number;
|
|
28
|
+
onTokenRefreshed?: (accessToken: string, expiresIn: number) => void;
|
|
29
|
+
onSessionExpired?: (error: Error) => void;
|
|
30
|
+
_sessionRefreshToken: string | null;
|
|
31
|
+
_refreshTimer: ReturnType<typeof setTimeout> | null;
|
|
32
|
+
_csrfRefreshTimer: ReturnType<typeof setTimeout> | null;
|
|
33
|
+
_csrfRefreshPromise: Promise<string> | null;
|
|
34
|
+
configure(options: Partial<import("../../types.js").EntityServerClientOptions>): void;
|
|
35
|
+
setToken(token: string): void;
|
|
36
|
+
setAnonymousPacketToken(token: string): void;
|
|
37
|
+
setApiKey(apiKey: string): void;
|
|
38
|
+
setHmacSecret(secret: string): void;
|
|
39
|
+
setEncryptRequests(value: boolean): void;
|
|
40
|
+
setCsrfToken(token: string): void;
|
|
41
|
+
setCsrfEnabled(enabled: boolean): void;
|
|
42
|
+
_scheduleKeepSession(refreshToken: string, expiresIn: number, refreshFn: (rt: string) => Promise<{
|
|
43
|
+
access_token: string;
|
|
44
|
+
expires_in: number;
|
|
45
|
+
}>): void;
|
|
46
|
+
_clearRefreshTimer(): void;
|
|
47
|
+
stopKeepSession(): void;
|
|
48
|
+
_clearCsrfRefreshTimer(): void;
|
|
49
|
+
stopCsrfRefresh(): void;
|
|
50
|
+
_scheduleCsrfRefresh(expiresIn: number): void;
|
|
51
|
+
refreshCsrfToken(): Promise<string>;
|
|
52
|
+
_applyCsrfHealth(csrf?: import("../../types.js").EntityServerClientHealthCsrf | null): void;
|
|
53
|
+
readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
|
|
54
|
+
get _reqOpts(): import("../../client/request.js").RequestOptions;
|
|
55
|
+
requestJson<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
|
|
56
|
+
requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
|
|
57
|
+
requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
|
|
58
|
+
requestFormBinary(method: string, path: string, form: FormData, withAuth?: boolean): Promise<ArrayBuffer>;
|
|
59
|
+
_request<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
|
|
60
|
+
_requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
|
|
61
|
+
_requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
|
|
62
|
+
_requestFormBinary(method: string, path: string, form: FormData, withAuth?: boolean): Promise<ArrayBuffer>;
|
|
63
|
+
};
|
|
64
|
+
} & TBase;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function o(t){return class extends t{accountRegister(n){return this.requestJson("POST","/v1/account/register",n,!1)}accountWithdraw(n){return this.requestJson("POST","/v1/account/withdraw",n)}accountChangePassword(n){return this.requestJson("POST","/v1/account/change-password",n)}accountReactivate(n){return this.requestJson("POST","/v1/account/reactivate",n,!1)}listAccountBiometrics(){return this.requestJson("GET","/v1/account/biometric")}registerAccountBiometric(n){return this.requestJson("POST","/v1/account/biometric",n)}deleteAccountBiometric(n){return this.requestJson("DELETE",`/v1/account/biometric/${n}`)}}}export{o as AccountAppMixin};
|
|
2
|
+
//# sourceMappingURL=account.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/mixins/app/account.ts"],
|
|
4
|
+
"sourcesContent": ["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.requestJson(\n \"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.requestJson(\"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.requestJson(\n \"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.requestJson(\n \"POST\",\n \"/v1/account/reactivate\",\n body,\n false,\n );\n }\n\n listAccountBiometrics<T = unknown>(): Promise<T> {\n return this.requestJson(\"GET\", \"/v1/account/biometric\");\n }\n\n registerAccountBiometric<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.requestJson(\"POST\", \"/v1/account/biometric\", body);\n }\n\n deleteAccountBiometric<T = unknown>(seq: number): Promise<T> {\n return this.requestJson(\"DELETE\", `/v1/account/biometric/${seq}`);\n }\n };\n}\n"],
|
|
5
|
+
"mappings": "AAKO,SAASA,EAEdC,EAAa,CACX,OAAO,cAAmCA,CAAK,CAC3C,gBACIC,EACU,CACV,OAAO,KAAK,YACR,OACA,uBACAA,EACA,EACJ,CACJ,CAEA,gBACIA,EACU,CACV,OAAO,KAAK,YAAY,OAAQ,uBAAwBA,CAAI,CAChE,CAEA,sBAAmCA,EAGpB,CACX,OAAO,KAAK,YACR,OACA,8BACAA,CACJ,CACJ,CAEA,kBACIA,EACU,CACV,OAAO,KAAK,YACR,OACA,yBACAA,EACA,EACJ,CACJ,CAEA,uBAAiD,CAC7C,OAAO,KAAK,YAAY,MAAO,uBAAuB,CAC1D,CAEA,yBACIA,EACU,CACV,OAAO,KAAK,YAAY,OAAQ,wBAAyBA,CAAI,CACjE,CAEA,uBAAoCC,EAAyB,CACzD,OAAO,KAAK,YAAY,SAAU,yBAAyBA,CAAG,EAAE,CACpE,CACJ,CACJ",
|
|
6
|
+
"names": ["AccountAppMixin", "Base", "body", "seq"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { GConstructor, EntityServerClientBase } from "../../client/base.js";
|
|
2
|
+
export declare function BoardMixin<TBase extends GConstructor<EntityServerClientBase>>(Base: TBase): {
|
|
3
|
+
new (...args: any[]): {
|
|
4
|
+
listBoardCategories<T = unknown>(query?: Record<string, unknown>): Promise<T>;
|
|
5
|
+
getBoardCategory<T = unknown>(seq: number): Promise<T>;
|
|
6
|
+
createBoardCategory<T = unknown>(body: Record<string, unknown>): Promise<T>;
|
|
7
|
+
updateBoardCategory<T = unknown>(seq: number, body: Record<string, unknown>): Promise<T>;
|
|
8
|
+
deleteBoardCategory<T = unknown>(seq: number): Promise<T>;
|
|
9
|
+
listBoardPosts<T = unknown>(category: string, query?: Record<string, unknown>): Promise<T>;
|
|
10
|
+
getBoardPost<T = unknown>(seq: number): Promise<T>;
|
|
11
|
+
createBoardPost<T = unknown>(category: string, body: Record<string, unknown>): Promise<T>;
|
|
12
|
+
updateBoardPost<T = unknown>(seq: number, body: Record<string, unknown>): Promise<T>;
|
|
13
|
+
deleteBoardPost<T = unknown>(seq: number): Promise<T>;
|
|
14
|
+
listBoardComments<T = unknown>(postSeq: number, query?: Record<string, unknown>): Promise<T>;
|
|
15
|
+
createBoardComment<T = unknown>(postSeq: number, body: Record<string, unknown>): Promise<T>;
|
|
16
|
+
updateBoardComment<T = unknown>(seq: number, body: Record<string, unknown>): Promise<T>;
|
|
17
|
+
deleteBoardComment<T = unknown>(seq: number): Promise<T>;
|
|
18
|
+
listBoardFiles<T = unknown>(postSeq: number): Promise<T>;
|
|
19
|
+
uploadBoardFile<T = unknown>(postSeq: number, file: File | Blob): Promise<T>;
|
|
20
|
+
boardFileUrl(uuid: string): string;
|
|
21
|
+
deleteBoardFile<T = unknown>(uuid: string): Promise<T>;
|
|
22
|
+
createBoardGuestPost<T = unknown>(category: string, body: Record<string, unknown>): Promise<T>;
|
|
23
|
+
authenticateBoardGuestPost<T = unknown>(seq: number, body: Record<string, unknown>): Promise<T>;
|
|
24
|
+
toggleBoardPostLike<T = unknown>(seq: number): Promise<T>;
|
|
25
|
+
acceptBoardPost<T = unknown>(seq: number): Promise<T>;
|
|
26
|
+
rateBoardPost<T = unknown>(seq: number, body: Record<string, unknown>): Promise<T>;
|
|
27
|
+
rateBoardComment<T = unknown>(seq: number, body: Record<string, unknown>): Promise<T>;
|
|
28
|
+
listBoardTags<T = unknown>(query?: Record<string, unknown>): Promise<T>;
|
|
29
|
+
setBoardPostTags<T = unknown>(seq: number, body: Record<string, unknown>): Promise<T>;
|
|
30
|
+
reportBoardPost<T = unknown>(seq: number, body: Record<string, unknown>): Promise<T>;
|
|
31
|
+
reportBoardComment<T = unknown>(seq: number, body: Record<string, unknown>): Promise<T>;
|
|
32
|
+
listBoardReports<T = unknown>(query?: Record<string, unknown>): Promise<T>;
|
|
33
|
+
updateBoardReport<T = unknown>(seq: number, body: Record<string, unknown>): Promise<T>;
|
|
34
|
+
markBoardPostRead<T = unknown>(seq: number): Promise<T>;
|
|
35
|
+
listBoardMentions<T = unknown>(query?: Record<string, unknown>): Promise<T>;
|
|
36
|
+
markBoardMentionRead<T = unknown>(seq: number): Promise<T>;
|
|
37
|
+
baseUrl: string;
|
|
38
|
+
token: string;
|
|
39
|
+
anonymousPacketToken: string;
|
|
40
|
+
apiKey: string;
|
|
41
|
+
hmacSecret: string;
|
|
42
|
+
encryptRequests: boolean;
|
|
43
|
+
csrfEnabled: boolean;
|
|
44
|
+
csrfToken: string;
|
|
45
|
+
csrfHeaderName: string;
|
|
46
|
+
csrfRefreshPath: string;
|
|
47
|
+
csrfRefreshBuffer: number;
|
|
48
|
+
activeTxId: string | null;
|
|
49
|
+
keepSession: boolean;
|
|
50
|
+
refreshBuffer: number;
|
|
51
|
+
onTokenRefreshed?: (accessToken: string, expiresIn: number) => void;
|
|
52
|
+
onSessionExpired?: (error: Error) => void;
|
|
53
|
+
_sessionRefreshToken: string | null;
|
|
54
|
+
_refreshTimer: ReturnType<typeof setTimeout> | null;
|
|
55
|
+
_csrfRefreshTimer: ReturnType<typeof setTimeout> | null;
|
|
56
|
+
_csrfRefreshPromise: Promise<string> | null;
|
|
57
|
+
configure(options: Partial<import("../../types.js").EntityServerClientOptions>): void;
|
|
58
|
+
setToken(token: string): void;
|
|
59
|
+
setAnonymousPacketToken(token: string): void;
|
|
60
|
+
setApiKey(apiKey: string): void;
|
|
61
|
+
setHmacSecret(secret: string): void;
|
|
62
|
+
setEncryptRequests(value: boolean): void;
|
|
63
|
+
setCsrfToken(token: string): void;
|
|
64
|
+
setCsrfEnabled(enabled: boolean): void;
|
|
65
|
+
_scheduleKeepSession(refreshToken: string, expiresIn: number, refreshFn: (rt: string) => Promise<{
|
|
66
|
+
access_token: string;
|
|
67
|
+
expires_in: number;
|
|
68
|
+
}>): void;
|
|
69
|
+
_clearRefreshTimer(): void;
|
|
70
|
+
stopKeepSession(): void;
|
|
71
|
+
_clearCsrfRefreshTimer(): void;
|
|
72
|
+
stopCsrfRefresh(): void;
|
|
73
|
+
_scheduleCsrfRefresh(expiresIn: number): void;
|
|
74
|
+
refreshCsrfToken(): Promise<string>;
|
|
75
|
+
_applyCsrfHealth(csrf?: import("../../types.js").EntityServerClientHealthCsrf | null): void;
|
|
76
|
+
readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
|
|
77
|
+
get _reqOpts(): import("../../client/request.js").RequestOptions;
|
|
78
|
+
requestJson<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
|
|
79
|
+
requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
|
|
80
|
+
requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
|
|
81
|
+
requestFormBinary(method: string, path: string, form: FormData, withAuth?: boolean): Promise<ArrayBuffer>;
|
|
82
|
+
_request<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
|
|
83
|
+
_requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
|
|
84
|
+
_requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
|
|
85
|
+
_requestFormBinary(method: string, path: string, form: FormData, withAuth?: boolean): Promise<ArrayBuffer>;
|
|
86
|
+
};
|
|
87
|
+
} & TBase;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{buildQuery as o}from"../../client/utils.js";function a(s){return class extends s{listBoardCategories(n={}){const r=o(n);return this.requestJson("GET",`/v1/board/categories${r?`?${r}`:""}`,void 0,!1)}getBoardCategory(n){return this.requestJson("GET",`/v1/board/categories/${n}`,void 0,!1)}createBoardCategory(n){return this.requestJson("POST","/v1/board/categories",n)}updateBoardCategory(n,r){return this.requestJson("PUT",`/v1/board/categories/${n}`,r)}deleteBoardCategory(n){return this.requestJson("DELETE",`/v1/board/categories/${n}`)}listBoardPosts(n,r={}){const e=o(r);return this.requestJson("GET",`/v1/board/${n}/list${e?`?${e}`:""}`,void 0,!1)}getBoardPost(n){return this.requestJson("GET",`/v1/board/posts/${n}`,void 0,!1)}createBoardPost(n,r){return this.requestJson("POST",`/v1/board/${n}/submit`,r)}updateBoardPost(n,r){return this.requestJson("PUT",`/v1/board/posts/${n}`,r)}deleteBoardPost(n){return this.requestJson("DELETE",`/v1/board/posts/${n}`)}listBoardComments(n,r={}){const e=o(r);return this.requestJson("GET",`/v1/board/posts/${n}/comments${e?`?${e}`:""}`,void 0,!1)}createBoardComment(n,r){return this.requestJson("POST",`/v1/board/posts/${n}/comments/submit`,r)}updateBoardComment(n,r){return this.requestJson("PUT",`/v1/board/comments/${n}`,r)}deleteBoardComment(n){return this.requestJson("DELETE",`/v1/board/comments/${n}`)}listBoardFiles(n){return this.requestJson("GET",`/v1/board/posts/${n}/files`,void 0,!1)}async uploadBoardFile(n,r){const e=new FormData;return e.append("file",r,r instanceof File?r.name:"upload"),this.requestForm("POST",`/v1/board/posts/${n}/files`,e)}boardFileUrl(n){return`${this.baseUrl}/v1/board/files/${n}`}deleteBoardFile(n){return this.requestJson("DELETE",`/v1/board/files/${n}`)}createBoardGuestPost(n,r){return this.requestJson("POST",`/v1/board/${n}/guest-submit`,r,!1)}authenticateBoardGuestPost(n,r){return this.requestJson("POST",`/v1/board/posts/${n}/guest-auth`,r,!1)}toggleBoardPostLike(n){return this.requestJson("POST",`/v1/board/posts/${n}/like`,{})}acceptBoardPost(n){return this.requestJson("POST",`/v1/board/posts/${n}/accept`,{})}rateBoardPost(n,r){return this.requestJson("POST",`/v1/board/posts/${n}/rating`,r)}rateBoardComment(n,r){return this.requestJson("POST",`/v1/board/comments/${n}/rating`,r)}listBoardTags(n={}){const r=o(n);return this.requestJson("GET",`/v1/board/tags${r?`?${r}`:""}`,void 0,!1)}setBoardPostTags(n,r){return this.requestJson("PUT",`/v1/board/posts/${n}/tags`,r)}reportBoardPost(n,r){return this.requestJson("POST",`/v1/board/posts/${n}/report`,r)}reportBoardComment(n,r){return this.requestJson("POST",`/v1/board/comments/${n}/report`,r)}listBoardReports(n={}){const r=o(n);return this.requestJson("GET",`/v1/board/admin/reports${r?`?${r}`:""}`)}updateBoardReport(n,r){return this.requestJson("PATCH",`/v1/board/admin/reports/${n}`,r)}markBoardPostRead(n){return this.requestJson("POST",`/v1/board/posts/${n}/read`,{})}listBoardMentions(n={}){const r=o(n);return this.requestJson("GET",`/v1/board/mentions${r?`?${r}`:""}`)}markBoardMentionRead(n){return this.requestJson("PATCH",`/v1/board/mentions/${n}/read`,{})}}}export{a as BoardMixin};
|
|
2
|
+
//# sourceMappingURL=board.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/mixins/app/board.ts"],
|
|
4
|
+
"sourcesContent": ["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.requestJson(\n \"GET\",\n `/v1/board/categories${qs ? `?${qs}` : \"\"}`,\n undefined,\n false,\n );\n }\n\n getBoardCategory<T = unknown>(seq: number): Promise<T> {\n return this.requestJson(\n \"GET\",\n `/v1/board/categories/${seq}`,\n undefined,\n false,\n );\n }\n\n createBoardCategory<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.requestJson(\"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.requestJson(\"PUT\", `/v1/board/categories/${seq}`, body);\n }\n\n deleteBoardCategory<T = unknown>(seq: number): Promise<T> {\n return this.requestJson(\"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.requestJson(\n \"GET\",\n `/v1/board/${category}/list${qs ? `?${qs}` : \"\"}`,\n undefined,\n false,\n );\n }\n\n getBoardPost<T = unknown>(seq: number): Promise<T> {\n return this.requestJson(\n \"GET\",\n `/v1/board/posts/${seq}`,\n undefined,\n false,\n );\n }\n\n createBoardPost<T = unknown>(\n category: string,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.requestJson(\n \"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.requestJson(\"PUT\", `/v1/board/posts/${seq}`, body);\n }\n\n deleteBoardPost<T = unknown>(seq: number): Promise<T> {\n return this.requestJson(\"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.requestJson(\n \"GET\",\n `/v1/board/posts/${postSeq}/comments${qs ? `?${qs}` : \"\"}`,\n undefined,\n false,\n );\n }\n\n createBoardComment<T = unknown>(\n postSeq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.requestJson(\n \"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.requestJson(\"PUT\", `/v1/board/comments/${seq}`, body);\n }\n\n deleteBoardComment<T = unknown>(seq: number): Promise<T> {\n return this.requestJson(\"DELETE\", `/v1/board/comments/${seq}`);\n }\n\n listBoardFiles<T = unknown>(postSeq: number): Promise<T> {\n return this.requestJson(\n \"GET\",\n `/v1/board/posts/${postSeq}/files`,\n undefined,\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.requestJson(\"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.requestJson(\n \"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.requestJson(\n \"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.requestJson(\"POST\", `/v1/board/posts/${seq}/like`, {});\n }\n\n acceptBoardPost<T = unknown>(seq: number): Promise<T> {\n return this.requestJson(\n \"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.requestJson(\n \"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.requestJson(\n \"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.requestJson(\n \"GET\",\n `/v1/board/tags${qs ? `?${qs}` : \"\"}`,\n undefined,\n false,\n );\n }\n\n setBoardPostTags<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.requestJson(\"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.requestJson(\n \"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.requestJson(\n \"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.requestJson(\n \"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.requestJson(\n \"PATCH\",\n `/v1/board/admin/reports/${seq}`,\n body,\n );\n }\n\n markBoardPostRead<T = unknown>(seq: number): Promise<T> {\n return this.requestJson(\"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.requestJson(\n \"GET\",\n `/v1/board/mentions${qs ? `?${qs}` : \"\"}`,\n );\n }\n\n markBoardMentionRead<T = unknown>(seq: number): Promise<T> {\n return this.requestJson(\n \"PATCH\",\n `/v1/board/mentions/${seq}/read`,\n {},\n );\n }\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["buildQuery", "BoardMixin", "Base", "query", "qs", "seq", "body", "category", "postSeq", "file", "form", "uuid"]
|
|
7
|
+
}
|