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.
Files changed (82) hide show
  1. package/dist/EntityAppServerClient.d.ts +383 -0
  2. package/dist/EntityAppServerClient.js +2 -0
  3. package/dist/EntityAppServerClient.js.map +7 -0
  4. package/dist/EntityServerClient.d.ts +638 -0
  5. package/dist/EntityServerClient.js +2 -0
  6. package/dist/EntityServerClient.js.map +7 -0
  7. package/dist/client/base.d.ts +98 -0
  8. package/dist/client/base.js +2 -0
  9. package/dist/client/base.js.map +7 -0
  10. package/dist/client/hmac.d.ts +8 -0
  11. package/dist/client/hmac.js +2 -0
  12. package/dist/client/hmac.js.map +7 -0
  13. package/dist/client/packet.d.ts +24 -0
  14. package/dist/client/packet.js +2 -0
  15. package/dist/client/packet.js.map +7 -0
  16. package/dist/client/request.d.ts +20 -0
  17. package/dist/client/request.js +2 -0
  18. package/dist/client/request.js.map +7 -0
  19. package/dist/client/utils.d.ts +8 -0
  20. package/dist/client/utils.js +2 -0
  21. package/dist/client/utils.js.map +7 -0
  22. package/dist/hooks/useEntityServer.d.ts +104 -0
  23. package/dist/hooks/useEntityServer.js +2 -0
  24. package/dist/hooks/useEntityServer.js.map +7 -0
  25. package/dist/index.d.ts +10 -0
  26. package/dist/index.js +2 -0
  27. package/dist/index.js.map +7 -0
  28. package/dist/mixins/app/account.d.ts +64 -0
  29. package/dist/mixins/app/account.js +2 -0
  30. package/dist/mixins/app/account.js.map +7 -0
  31. package/dist/mixins/app/board.d.ts +87 -0
  32. package/dist/mixins/app/board.js +2 -0
  33. package/dist/mixins/app/board.js.map +7 -0
  34. package/dist/mixins/app/email-verify.d.ts +59 -0
  35. package/dist/mixins/app/email-verify.js +2 -0
  36. package/dist/mixins/app/email-verify.js.map +7 -0
  37. package/dist/mixins/app/index.d.ts +6 -0
  38. package/dist/mixins/app/index.js +2 -0
  39. package/dist/mixins/app/index.js.map +7 -0
  40. package/dist/mixins/app/oauth.d.ts +60 -0
  41. package/dist/mixins/app/oauth.js +2 -0
  42. package/dist/mixins/app/oauth.js.map +7 -0
  43. package/dist/mixins/app/password-reset.d.ts +59 -0
  44. package/dist/mixins/app/password-reset.js +2 -0
  45. package/dist/mixins/app/password-reset.js.map +7 -0
  46. package/dist/mixins/app/two-factor.d.ts +61 -0
  47. package/dist/mixins/app/two-factor.js +2 -0
  48. package/dist/mixins/app/two-factor.js.map +7 -0
  49. package/dist/mixins/auth.d.ts +115 -0
  50. package/dist/mixins/auth.js +2 -0
  51. package/dist/mixins/auth.js.map +7 -0
  52. package/dist/mixins/entity.d.ts +147 -0
  53. package/dist/mixins/entity.js +2 -0
  54. package/dist/mixins/entity.js.map +7 -0
  55. package/dist/mixins/file.d.ts +103 -0
  56. package/dist/mixins/file.js +2 -0
  57. package/dist/mixins/file.js.map +7 -0
  58. package/dist/mixins/push.d.ts +115 -0
  59. package/dist/mixins/push.js +2 -0
  60. package/dist/mixins/push.js.map +7 -0
  61. package/dist/mixins/server/admin.d.ts +105 -0
  62. package/dist/mixins/server/admin.js +2 -0
  63. package/dist/mixins/server/admin.js.map +7 -0
  64. package/dist/mixins/server/index.d.ts +7 -0
  65. package/dist/mixins/server/index.js +2 -0
  66. package/dist/mixins/server/index.js.map +7 -0
  67. package/dist/mixins/smtp.d.ts +65 -0
  68. package/dist/mixins/smtp.js +2 -0
  69. package/dist/mixins/smtp.js.map +7 -0
  70. package/dist/mixins/utils.d.ts +116 -0
  71. package/dist/mixins/utils.js +2 -0
  72. package/dist/mixins/utils.js.map +7 -0
  73. package/dist/packet.d.ts +11 -0
  74. package/dist/packet.js +2 -0
  75. package/dist/packet.js.map +7 -0
  76. package/dist/react.d.ts +1 -0
  77. package/dist/react.js +2 -0
  78. package/dist/react.js.map +7 -0
  79. package/dist/types.d.ts +250 -0
  80. package/dist/types.js +1 -0
  81. package/dist/types.js.map +7 -0
  82. package/package.json +57 -0
@@ -0,0 +1,116 @@
1
+ import type { QRCodeOptions, BarcodeOptions, Pdf2PngOptions } from "../types.js";
2
+ import type { GConstructor, EntityServerClientBase } from "../client/base.js";
3
+ export declare function UtilsMixin<TBase extends GConstructor<EntityServerClientBase>>(Base: TBase): {
4
+ new (...args: any[]): {
5
+ addressSido<T = unknown>(): Promise<T>;
6
+ addressSigungu<T = unknown>(query: {
7
+ sido: string;
8
+ }): Promise<T>;
9
+ addressDong<T = unknown>(query: {
10
+ sido: string;
11
+ sigungu: string;
12
+ }): Promise<T>;
13
+ addressClean<T = unknown>(query: {
14
+ q: string;
15
+ }): Promise<T>;
16
+ /**
17
+ * QR 코드 PNG를 생성합니다. `ArrayBuffer`를 반환합니다.
18
+ *
19
+ * ```ts
20
+ * const buf = await client.qrcode("https://example.com");
21
+ * const blob = new Blob([buf], { type: "image/png" });
22
+ * img.src = URL.createObjectURL(blob);
23
+ * ```
24
+ */
25
+ qrcode(content: string, opts?: QRCodeOptions): Promise<ArrayBuffer>;
26
+ /**
27
+ * QR 코드를 base64/data URI JSON으로 반환합니다.
28
+ *
29
+ * ```ts
30
+ * const { data_uri } = await client.qrcodeBase64("https://example.com");
31
+ * img.src = data_uri;
32
+ * ```
33
+ */
34
+ qrcodeBase64(content: string, opts?: QRCodeOptions): Promise<{
35
+ ok: boolean;
36
+ data: string;
37
+ data_uri: string;
38
+ }>;
39
+ /** QR 코드를 ASCII 아트 텍스트로 반환합니다. */
40
+ qrcodeText(content: string, opts?: QRCodeOptions): Promise<{
41
+ ok: boolean;
42
+ text: string;
43
+ }>;
44
+ /**
45
+ * 바코드 PNG를 생성합니다. `ArrayBuffer`를 반환합니다.
46
+ *
47
+ * ```ts
48
+ * const buf = await client.barcode("1234567890128", { type: "ean13" });
49
+ * ```
50
+ */
51
+ barcode(content: string, opts?: BarcodeOptions): Promise<ArrayBuffer>;
52
+ /**
53
+ * PDF를 PNG 이미지로 변환합니다.
54
+ *
55
+ * 단일 페이지 요청이면 `image/png` ArrayBuffer,
56
+ * 다중 페이지 요청이면 `application/zip` ArrayBuffer를 반환합니다.
57
+ *
58
+ * ```ts
59
+ * const buf = await client.pdf2png(pdfArrayBuffer, { dpi: 200 });
60
+ * ```
61
+ */
62
+ pdf2png(pdfData: ArrayBuffer | Uint8Array<ArrayBuffer>, opts?: Pdf2PngOptions): Promise<ArrayBuffer>;
63
+ pdf2pngByFileSeq(fileSeq: number, opts?: Pdf2PngOptions): Promise<ArrayBuffer>;
64
+ pdf2jpg(pdfData: ArrayBuffer | Uint8Array<ArrayBuffer>, opts?: Pdf2PngOptions): Promise<ArrayBuffer>;
65
+ pdf2jpgByFileSeq(fileSeq: number, opts?: Pdf2PngOptions): Promise<ArrayBuffer>;
66
+ baseUrl: string;
67
+ token: string;
68
+ anonymousPacketToken: string;
69
+ apiKey: string;
70
+ hmacSecret: string;
71
+ encryptRequests: boolean;
72
+ csrfEnabled: boolean;
73
+ csrfToken: string;
74
+ csrfHeaderName: string;
75
+ csrfRefreshPath: string;
76
+ csrfRefreshBuffer: number;
77
+ activeTxId: string | null;
78
+ keepSession: boolean;
79
+ refreshBuffer: number;
80
+ onTokenRefreshed?: (accessToken: string, expiresIn: number) => void;
81
+ onSessionExpired?: (error: Error) => void;
82
+ _sessionRefreshToken: string | null;
83
+ _refreshTimer: ReturnType<typeof setTimeout> | null;
84
+ _csrfRefreshTimer: ReturnType<typeof setTimeout> | null;
85
+ _csrfRefreshPromise: Promise<string> | null;
86
+ configure(options: Partial<import("../types.js").EntityServerClientOptions>): void;
87
+ setToken(token: string): void;
88
+ setAnonymousPacketToken(token: string): void;
89
+ setApiKey(apiKey: string): void;
90
+ setHmacSecret(secret: string): void;
91
+ setEncryptRequests(value: boolean): void;
92
+ setCsrfToken(token: string): void;
93
+ setCsrfEnabled(enabled: boolean): void;
94
+ _scheduleKeepSession(refreshToken: string, expiresIn: number, refreshFn: (rt: string) => Promise<{
95
+ access_token: string;
96
+ expires_in: number;
97
+ }>): void;
98
+ _clearRefreshTimer(): void;
99
+ stopKeepSession(): void;
100
+ _clearCsrfRefreshTimer(): void;
101
+ stopCsrfRefresh(): void;
102
+ _scheduleCsrfRefresh(expiresIn: number): void;
103
+ refreshCsrfToken(): Promise<string>;
104
+ _applyCsrfHealth(csrf?: import("../types.js").EntityServerClientHealthCsrf | null): void;
105
+ readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
106
+ get _reqOpts(): import("../client/request.js").RequestOptions;
107
+ requestJson<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
108
+ requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
109
+ requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
110
+ requestFormBinary(method: string, path: string, form: FormData, withAuth?: boolean): Promise<ArrayBuffer>;
111
+ _request<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
112
+ _requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
113
+ _requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
114
+ _requestFormBinary(method: string, path: string, form: FormData, withAuth?: boolean): Promise<ArrayBuffer>;
115
+ };
116
+ } & TBase;
@@ -0,0 +1,2 @@
1
+ function u(a){return class extends a{addressSido(){return this.requestJson("GET","/v1/utils/address/sido",void 0,!1)}addressSigungu(e){const r=new URLSearchParams({sido:e.sido}).toString();return this.requestJson("GET",`/v1/utils/address/sigungu?${r}`,void 0,!1)}addressDong(e){const r=new URLSearchParams({sido:e.sido,sigungu:e.sigungu}).toString();return this.requestJson("GET",`/v1/utils/address/dong?${r}`,void 0,!1)}addressClean(e){const r=new URLSearchParams({q:e.q}).toString();return this.requestJson("GET",`/v1/utils/address/clean?${r}`,void 0,!1)}qrcode(e,r={}){return this._requestBinary("POST","/v1/utils/qrcode",{content:e,...r})}qrcodeBase64(e,r={}){return this._request("POST","/v1/utils/qrcode/base64",{content:e,...r})}qrcodeText(e,r={}){return this._request("POST","/v1/utils/qrcode/text",{content:e,...r})}barcode(e,r={}){return this._requestBinary("POST","/v1/utils/barcode",{content:e,...r})}pdf2png(e,r={}){const t=new FormData;t.append("file",new Blob([e],{type:"application/pdf"}),"document.pdf");const s=new URLSearchParams;r.dpi!=null&&s.set("dpi",String(r.dpi)),r.firstPage!=null&&s.set("first_page",String(r.firstPage)),r.lastPage!=null&&s.set("last_page",String(r.lastPage));const n=s.toString(),i="/v1/utils/pdf2png"+(n?`?${n}`:"");return this._requestFormBinary("POST",i,t)}pdf2pngByFileSeq(e,r={}){return this.requestBinary("POST",`/v1/utils/pdf2png/${e}`,r)}pdf2jpg(e,r={}){const t=new FormData;t.append("file",new Blob([e],{type:"application/pdf"}),"document.pdf");const s=new URLSearchParams;r.dpi!=null&&s.set("dpi",String(r.dpi)),r.firstPage!=null&&s.set("first_page",String(r.firstPage)),r.lastPage!=null&&s.set("last_page",String(r.lastPage));const n=s.toString(),i="/v1/utils/pdf2jpg"+(n?`?${n}`:"");return this._requestFormBinary("POST",i,t)}pdf2jpgByFileSeq(e,r={}){return this.requestBinary("POST",`/v1/utils/pdf2jpg/${e}`,r)}}}export{u as UtilsMixin};
2
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/mixins/utils.ts"],
4
+ "sourcesContent": ["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"],
5
+ "mappings": "AAOO,SAASA,EACZC,EACF,CACE,OAAO,cAA8BA,CAAK,CACtC,aAAuC,CACnC,OAAO,KAAK,YACR,MACA,yBACA,OACA,EACJ,CACJ,CAEA,eAA4BC,EAAqC,CAC7D,MAAMC,EAAK,IAAI,gBAAgB,CAAE,KAAMD,EAAM,IAAK,CAAC,EAAE,SAAS,EAC9D,OAAO,KAAK,YACR,MACA,6BAA6BC,CAAE,GAC/B,OACA,EACJ,CACJ,CAEA,YAAyBD,EAGV,CACX,MAAMC,EAAK,IAAI,gBAAgB,CAC3B,KAAMD,EAAM,KACZ,QAASA,EAAM,OACnB,CAAC,EAAE,SAAS,EACZ,OAAO,KAAK,YACR,MACA,0BAA0BC,CAAE,GAC5B,OACA,EACJ,CACJ,CAEA,aAA0BD,EAAkC,CACxD,MAAMC,EAAK,IAAI,gBAAgB,CAAE,EAAGD,EAAM,CAAE,CAAC,EAAE,SAAS,EACxD,OAAO,KAAK,YACR,MACA,2BAA2BC,CAAE,GAC7B,OACA,EACJ,CACJ,CAaA,OACIC,EACAC,EAAsB,CAAC,EACH,CACpB,OAAO,KAAK,eAAe,OAAQ,mBAAoB,CACnD,QAAAD,EACA,GAAGC,CACP,CAAC,CACL,CAUA,aACID,EACAC,EAAsB,CAAC,EACiC,CACxD,OAAO,KAAK,SAAS,OAAQ,0BAA2B,CACpD,QAAAD,EACA,GAAGC,CACP,CAAC,CACL,CAGA,WACID,EACAC,EAAsB,CAAC,EACe,CACtC,OAAO,KAAK,SAAS,OAAQ,wBAAyB,CAClD,QAAAD,EACA,GAAGC,CACP,CAAC,CACL,CASA,QACID,EACAC,EAAuB,CAAC,EACJ,CACpB,OAAO,KAAK,eAAe,OAAQ,oBAAqB,CACpD,QAAAD,EACA,GAAGC,CACP,CAAC,CACL,CAYA,QACIC,EACAD,EAAuB,CAAC,EACJ,CACpB,MAAME,EAAO,IAAI,SACjBA,EAAK,OACD,OACA,IAAI,KAAK,CAACD,CAAO,EAAG,CAAE,KAAM,iBAAkB,CAAC,EAC/C,cACJ,EACA,MAAME,EAAS,IAAI,gBACfH,EAAK,KAAO,MAAMG,EAAO,IAAI,MAAO,OAAOH,EAAK,GAAG,CAAC,EACpDA,EAAK,WAAa,MAClBG,EAAO,IAAI,aAAc,OAAOH,EAAK,SAAS,CAAC,EAC/CA,EAAK,UAAY,MACjBG,EAAO,IAAI,YAAa,OAAOH,EAAK,QAAQ,CAAC,EACjD,MAAMF,EAAKK,EAAO,SAAS,EACrBC,EAAO,qBAAuBN,EAAK,IAAIA,CAAE,GAAK,IACpD,OAAO,KAAK,mBAAmB,OAAQM,EAAMF,CAAI,CACrD,CAEA,iBACIG,EACAL,EAAuB,CAAC,EACJ,CACpB,OAAO,KAAK,cACR,OACA,qBAAqBK,CAAO,GAC5BL,CACJ,CACJ,CAEA,QACIC,EACAD,EAAuB,CAAC,EACJ,CACpB,MAAME,EAAO,IAAI,SACjBA,EAAK,OACD,OACA,IAAI,KAAK,CAACD,CAAO,EAAG,CAAE,KAAM,iBAAkB,CAAC,EAC/C,cACJ,EACA,MAAME,EAAS,IAAI,gBACfH,EAAK,KAAO,MAAMG,EAAO,IAAI,MAAO,OAAOH,EAAK,GAAG,CAAC,EACpDA,EAAK,WAAa,MAClBG,EAAO,IAAI,aAAc,OAAOH,EAAK,SAAS,CAAC,EAC/CA,EAAK,UAAY,MACjBG,EAAO,IAAI,YAAa,OAAOH,EAAK,QAAQ,CAAC,EACjD,MAAMF,EAAKK,EAAO,SAAS,EACrBC,EAAO,qBAAuBN,EAAK,IAAIA,CAAE,GAAK,IACpD,OAAO,KAAK,mBAAmB,OAAQM,EAAMF,CAAI,CACrD,CAEA,iBACIG,EACAL,EAAuB,CAAC,EACJ,CACpB,OAAO,KAAK,cACR,OACA,qBAAqBK,CAAO,GAC5BL,CACJ,CACJ,CACJ,CACJ",
6
+ "names": ["UtilsMixin", "Base", "query", "qs", "content", "opts", "pdfData", "form", "params", "path", "fileSeq"]
7
+ }
@@ -0,0 +1,11 @@
1
+ export declare const PACKET_KEY_SIZE = 32;
2
+ export declare const PACKET_MAGIC_MIN = 2;
3
+ export declare const PACKET_MAGIC_RANGE = 14;
4
+ export declare const PACKET_NONCE_SIZE = 24;
5
+ export declare const PACKET_TAG_SIZE = 16;
6
+ export declare const PACKET_HKDF_SALT = "entity-server:hkdf:v1";
7
+ export declare const PACKET_INFO_LABEL = "entity-server:packet-encryption";
8
+ export declare function derivePacketKey(source: string, infoLabel?: string): Uint8Array;
9
+ export declare function packetMagicLenFromKey(key: ArrayBuffer | Uint8Array, magicMin?: number, magicRange?: number): number;
10
+ export declare function encryptPacket(plaintext: ArrayBuffer | Uint8Array, key: ArrayBuffer | Uint8Array, magicMin?: number, magicRange?: number): Uint8Array;
11
+ export declare function decryptPacket(buffer: ArrayBuffer | Uint8Array, key: ArrayBuffer | Uint8Array, magicMin?: number, magicRange?: number): Uint8Array;
package/dist/packet.js ADDED
@@ -0,0 +1,2 @@
1
+ import{xchacha20poly1305 as h}from"@noble/ciphers/chacha";import{sha256 as d}from"@noble/hashes/sha2";import{hkdf as m}from"@noble/hashes/hkdf";var f=32,u=2,E=14,o=24,T=16,k="entity-server:hkdf:v1",B="entity-server:packet-encryption";function s(r){return r instanceof Uint8Array?r:new Uint8Array(r)}function P(r,e=B){return m(d,new TextEncoder().encode(r),new TextEncoder().encode(k),new TextEncoder().encode(e),f)}function U(r,e=u,c=E){let n=s(r);return n.length<f?e:e+n[f-1]%c}function g(r,e,c=u,n=E){let i=s(r),y=s(e),t=U(y,c,n),p=crypto.getRandomValues(new Uint8Array(t)),a=crypto.getRandomValues(new Uint8Array(o)),x=h(y,a).encrypt(i),A=new Uint8Array(t+o+x.length);return A.set(p,0),A.set(a,t),A.set(x,t+o),A}function w(r,e,c=u,n=E){let i=s(r),y=s(e),t=U(y,c,n);if(i.length<t+o+T)throw new Error("Encrypted packet too short");let p=i.slice(t,t+o),a=i.slice(t+o);return h(y,p).decrypt(a)}export{k as PACKET_HKDF_SALT,B as PACKET_INFO_LABEL,f as PACKET_KEY_SIZE,u as PACKET_MAGIC_MIN,E as PACKET_MAGIC_RANGE,o as PACKET_NONCE_SIZE,T as PACKET_TAG_SIZE,w as decryptPacket,P as derivePacketKey,g as encryptPacket,U as packetMagicLenFromKey};
2
+ //# sourceMappingURL=packet.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/packet.ts"],
4
+ "sourcesContent": ["// @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"],
5
+ "mappings": "AACA,OAAS,qBAAAA,MAAyB,wBAElC,OAAS,UAAAC,MAAc,qBAEvB,OAAS,QAAAC,MAAY,qBAEd,IAAMC,EAAkB,GAClBC,EAAmB,EACnBC,EAAqB,GACrBC,EAAoB,GACpBC,EAAkB,GAClBC,EAAmB,wBACnBC,EAAoB,kCAEjC,SAASC,EAAaC,EAA4C,CAC9D,OAAOA,aAAgB,WAAaA,EAAO,IAAI,WAAWA,CAAI,CAClE,CAEO,SAASC,EACZC,EACAC,EAAYL,EACF,CACV,OAAOP,EACHD,EACA,IAAI,YAAY,EAAE,OAAOY,CAAM,EAC/B,IAAI,YAAY,EAAE,OAAOL,CAAgB,EACzC,IAAI,YAAY,EAAE,OAAOM,CAAS,EAClCX,CACJ,CACJ,CAEO,SAASY,EACZC,EACAC,EAAWb,EACXc,EAAab,EACP,CACN,IAAMc,EAAWT,EAAaM,CAAG,EACjC,OAAIG,EAAS,OAAShB,EAAwBc,EACvCA,EAAYE,EAAShB,EAAkB,CAAC,EAAKe,CACxD,CAEO,SAASE,EACZC,EACAL,EACAC,EAAWb,EACXc,EAAab,EACH,CACV,IAAMiB,EAAiBZ,EAAaW,CAAS,EACvCF,EAAWT,EAAaM,CAAG,EAC3BO,EAAWR,EAAsBI,EAAUF,EAAUC,CAAU,EAC/DM,EAAQ,OAAO,gBAAgB,IAAI,WAAWD,CAAQ,CAAC,EACvDE,EAAQ,OAAO,gBAAgB,IAAI,WAAWnB,CAAiB,CAAC,EAEhEoB,EADS1B,EAAkBmB,EAAUM,CAAK,EACtB,QAAQH,CAAc,EAC1CK,EAAS,IAAI,WACfJ,EAAWjB,EAAoBoB,EAAW,MAC9C,EAEA,OAAAC,EAAO,IAAIH,EAAO,CAAC,EACnBG,EAAO,IAAIF,EAAOF,CAAQ,EAC1BI,EAAO,IAAID,EAAYH,EAAWjB,CAAiB,EAC5CqB,CACX,CAEO,SAASC,EACZC,EACAb,EACAC,EAAWb,EACXc,EAAab,EACH,CACV,IAAMM,EAAOD,EAAamB,CAAM,EAC1BV,EAAWT,EAAaM,CAAG,EAC3BO,EAAWR,EAAsBI,EAAUF,EAAUC,CAAU,EAErE,GAAIP,EAAK,OAASY,EAAWjB,EAAoBC,EAC7C,MAAM,IAAI,MAAM,4BAA4B,EAGhD,IAAMkB,EAAQd,EAAK,MAAMY,EAAUA,EAAWjB,CAAiB,EACzDoB,EAAaf,EAAK,MAAMY,EAAWjB,CAAiB,EAE1D,OADeN,EAAkBmB,EAAUM,CAAK,EAClC,QAAQC,CAAU,CACpC",
6
+ "names": ["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"]
7
+ }
@@ -0,0 +1 @@
1
+ export * from "./hooks/useEntityServer.js";
package/dist/react.js ADDED
@@ -0,0 +1,2 @@
1
+ import{useCallback as C,useEffect as fe,useMemo as qe,useRef as Te,useState as he}from"react";function te(r){let n=import.meta;if(n?.env?.[r]!=null)return n.env[r];let e=globalThis.process;if(e?.env?.[r]!=null)return e.env[r]}function T(r){return Object.entries(r).filter(([,n])=>n!=null).map(([n,e])=>`${encodeURIComponent(n==="orderBy"?"order_by":n)}=${encodeURIComponent(String(e))}`).join("&")}import{xchacha20poly1305 as ne}from"@noble/ciphers/chacha";import{sha256 as ye}from"@noble/hashes/sha2";import{hkdf as Pe}from"@noble/hashes/hkdf";var G=32,J=2,M=14,S=24,we=16,be="entity-server:hkdf:v1",ve="entity-server:packet-encryption";function x(r){return r instanceof Uint8Array?r:new Uint8Array(r)}function re(r,n=ve){return Pe(ye,new TextEncoder().encode(r),new TextEncoder().encode(be),new TextEncoder().encode(n),G)}function se(r,n=J,e=M){let t=x(r);return t.length<G?n:n+t[G-1]%e}function ie(r,n,e=J,t=M){let s=x(r),i=x(n),o=se(i,e,t),a=crypto.getRandomValues(new Uint8Array(o)),u=crypto.getRandomValues(new Uint8Array(S)),f=ne(i,u).encrypt(s),d=new Uint8Array(o+S+f.length);return d.set(a,0),d.set(u,o),d.set(f,o+S),d}function oe(r,n,e=J,t=M){let s=x(r),i=x(n),o=se(i,e,t);if(s.length<o+S+we)throw new Error("Encrypted packet too short");let a=s.slice(o,o+S),u=s.slice(o+S);return ne(i,a).decrypt(u)}function q(r,n){return re(r||n)}function ae(r,n){return ie(r,n)}function A(r,n){let e=oe(r,n);return JSON.parse(new TextDecoder().decode(e))}function ue(r,n,e,t){let s=n.toLowerCase().includes("application/octet-stream");if(e&&!s)throw new Error("Encrypted request required: Content-Type must be application/octet-stream");if(s){if(r==null)throw new Error("Encrypted request body is empty");if(r instanceof ArrayBuffer)return A(r,t);if(r instanceof Uint8Array){let i=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);return A(i,t)}throw new Error("Encrypted request body must be ArrayBuffer or Uint8Array")}return r==null||r===""?{}:typeof r=="string"?JSON.parse(r):r}import{sha256 as Ee}from"@noble/hashes/sha2";import{hmac as Se}from"@noble/hashes/hmac";function ce(r,n,e,t,s){let i=String(Math.floor(Date.now()/1e3)),o=crypto.randomUUID(),a=new TextEncoder().encode(`${r}|${n}|${i}|${o}|`),u=new Uint8Array(a.length+e.length);u.set(a,0),u.set(e,a.length);let f=[...Se(Ee,new TextEncoder().encode(s),u)].map(d=>d.toString(16).padStart(2,"0")).join("");return{"X-API-Key":t,"X-Timestamp":i,"X-Nonce":o,"X-Signature":f}}function Re(r){return r.hmacSecret||r.token||r.anonymousPacketToken}function _e(r){return r!=="GET"&&r!=="HEAD"&&r!=="OPTIONS"}function xe(r,n){return r===403&&/csrf/i.test(n)?!0:/csrf/i.test(n)&&/expired|token validation failed/i.test(n)}async function de(r){if((r.headers.get("Content-Type")??"").includes("application/json")){let t=await r.json().catch(()=>null);if(t?.error)return t.error;if(t?.message)return t.message}return await r.text().catch(()=>"")||`HTTP ${r.status}`}async function H(r,n,e,t,s=!0,i={},o=!0){let{baseUrl:a,token:u,apiKey:h,hmacSecret:f,encryptRequests:d,anonymousPacketToken:p,csrfEnabled:$,csrfHeaderName:y,refreshCsrfToken:v}=r,E=s&&!!(h&&f),O=Re(r),_=$&&_e(n)&&!E,c=r.csrfToken,l="application/json",P=!u&&!E&&!!p,w=null;if(t!=null)if(d&&!!O&&n!=="GET"&&n!=="HEAD"){let g=q(f,u||p);w=ae(new TextEncoder().encode(JSON.stringify(t)),g),l="application/octet-stream"}else w=JSON.stringify(t);let ke=m=>{let g={"Content-Type":l,...i};if(!E&&s&&u&&(g.Authorization=`Bearer ${u}`),P&&(g["X-Packet-Token"]=p),_&&m&&(g[y]=m),E){let ge=w instanceof Uint8Array?w:typeof w=="string"?new TextEncoder().encode(w):new Uint8Array(0);Object.assign(g,ce(n,e,ge,h,f))}return g};_&&!c&&v&&(c=await v());let Y=m=>fetch(a+e,{method:n,headers:ke(m),...w!=null?{body:w}:{},credentials:"include"}),k=await Y(c);if(!k.ok){let m=await de(k.clone());if(_&&v&&xe(k.status,m))c=await v(),k=await Y(c);else{let g=new Error(m);throw g.status=k.status,g}}if(!k.ok){let m=new Error(await de(k));throw m.status=k.status,m}let ee=k.headers.get("Content-Type")??"";if(ee.includes("application/octet-stream")){let m=q(f,u||p);return A(await k.arrayBuffer(),m)}if(!ee.includes("application/json"))return await k.text();let U=await k.json();if(o&&!U.ok){let m=new Error(U.message??`EntityServer error (HTTP ${k.status})`);throw m.status=k.status,m}return U}var B=class{baseUrl;token;anonymousPacketToken;apiKey;hmacSecret;encryptRequests;csrfEnabled;csrfToken;csrfHeaderName;csrfRefreshPath;csrfRefreshBuffer;activeTxId=null;keepSession;refreshBuffer;onTokenRefreshed;onSessionExpired;_sessionRefreshToken=null;_refreshTimer=null;_csrfRefreshTimer=null;_csrfRefreshPromise=null;constructor(n={}){let e=te("VITE_ENTITY_SERVER_URL");this.baseUrl=(n.baseUrl??e??"").replace(/\/$/,""),this.token=n.token??"",this.anonymousPacketToken=n.anonymousPacketToken??"",this.apiKey=n.apiKey??"",this.hmacSecret=n.hmacSecret??"",this.encryptRequests=n.encryptRequests??!1,this.csrfEnabled=n.csrfEnabled??!1,this.csrfToken=n.csrfToken??"",this.csrfHeaderName=n.csrfHeaderName??"x-csrf-token",this.csrfRefreshPath=n.csrfRefreshPath??"/v1/csrf-token",this.csrfRefreshBuffer=n.csrfRefreshBuffer??60,this.keepSession=n.keepSession??!1,this.refreshBuffer=n.refreshBuffer??60,this.onTokenRefreshed=n.onTokenRefreshed,this.onSessionExpired=n.onSessionExpired}configure(n){typeof n.baseUrl=="string"&&(this.baseUrl=n.baseUrl.replace(/\/$/,"")),typeof n.token=="string"&&(this.token=n.token),typeof n.anonymousPacketToken=="string"&&(this.anonymousPacketToken=n.anonymousPacketToken),typeof n.encryptRequests=="boolean"&&(this.encryptRequests=n.encryptRequests),typeof n.csrfEnabled=="boolean"&&(this.csrfEnabled=n.csrfEnabled,n.csrfEnabled||(this.csrfToken="",this.stopCsrfRefresh())),typeof n.csrfToken=="string"&&(this.csrfToken=n.csrfToken),typeof n.csrfHeaderName=="string"&&(this.csrfHeaderName=n.csrfHeaderName),typeof n.csrfRefreshPath=="string"&&(this.csrfRefreshPath=n.csrfRefreshPath),typeof n.csrfRefreshBuffer=="number"&&(this.csrfRefreshBuffer=n.csrfRefreshBuffer),typeof n.apiKey=="string"&&(this.apiKey=n.apiKey),typeof n.hmacSecret=="string"&&(this.hmacSecret=n.hmacSecret),typeof n.keepSession=="boolean"&&(this.keepSession=n.keepSession),typeof n.refreshBuffer=="number"&&(this.refreshBuffer=n.refreshBuffer),n.onTokenRefreshed&&(this.onTokenRefreshed=n.onTokenRefreshed),n.onSessionExpired&&(this.onSessionExpired=n.onSessionExpired)}setToken(n){this.token=n}setAnonymousPacketToken(n){this.anonymousPacketToken=n}setApiKey(n){this.apiKey=n}setHmacSecret(n){this.hmacSecret=n}setEncryptRequests(n){this.encryptRequests=n}setCsrfToken(n){this.csrfToken=n}setCsrfEnabled(n){this.csrfEnabled=n,n||(this.csrfToken="",this.stopCsrfRefresh())}_scheduleKeepSession(n,e,t){this._clearRefreshTimer(),this._sessionRefreshToken=n;let s=Math.max((e-this.refreshBuffer)*1e3,0);this._refreshTimer=setTimeout(async()=>{if(this._sessionRefreshToken)try{let i=await t(this._sessionRefreshToken);this.onTokenRefreshed?.(i.access_token,i.expires_in),this._scheduleKeepSession(this._sessionRefreshToken,i.expires_in,t)}catch(i){this._clearRefreshTimer(),this.onSessionExpired?.(i instanceof Error?i:new Error(String(i)))}},s)}_clearRefreshTimer(){this._refreshTimer!==null&&(clearTimeout(this._refreshTimer),this._refreshTimer=null)}stopKeepSession(){this._clearRefreshTimer(),this._sessionRefreshToken=null}_clearCsrfRefreshTimer(){this._csrfRefreshTimer!==null&&(clearTimeout(this._csrfRefreshTimer),this._csrfRefreshTimer=null)}stopCsrfRefresh(){this._clearCsrfRefreshTimer(),this._csrfRefreshPromise=null}_scheduleCsrfRefresh(n){if(this._clearCsrfRefreshTimer(),!this.csrfEnabled||!this.csrfRefreshPath)return;let e=Math.max((n-this.csrfRefreshBuffer)*1e3,0);this._csrfRefreshTimer=setTimeout(()=>{this.refreshCsrfToken().catch(()=>{this._clearCsrfRefreshTimer()})},e)}async refreshCsrfToken(){return!this.csrfEnabled||!this.csrfRefreshPath?"":(this._csrfRefreshPromise||(this._csrfRefreshPromise=(async()=>{let n=await fetch(`${this.baseUrl}${this.csrfRefreshPath}`,{method:"GET",credentials:"include"});if(!n.ok){let s=await n.text().catch(()=>""),i=new Error(s||`HTTP ${n.status}`);throw i.status=n.status,i}let e=await n.json().catch(()=>null),t=e&&typeof e=="object"&&"data"in e?e.data??null:e;if(!t?.enabled||typeof t.token!="string")throw new Error("CSRF token refresh failed");return this._applyCsrfHealth(t),this.csrfToken})().finally(()=>{this._csrfRefreshPromise=null})),this._csrfRefreshPromise)}_applyCsrfHealth(n){if(!n?.enabled){this.setCsrfEnabled(!1);return}this.csrfEnabled=!0,typeof n.token=="string"&&(this.csrfToken=n.token),typeof n.headerName=="string"&&(this.csrfHeaderName=n.headerName),typeof n.refreshPath=="string"&&(this.csrfRefreshPath=n.refreshPath),typeof n.expiresIn=="number"&&n.expiresIn>0&&this._scheduleCsrfRefresh(n.expiresIn)}readRequestBody(n,e="application/json",t=!1){let s=q(this.hmacSecret,this.token||this.anonymousPacketToken);return ue(n,e,t,s)}get _reqOpts(){return{baseUrl:this.baseUrl,token:this.token,anonymousPacketToken:this.anonymousPacketToken,apiKey:this.apiKey,hmacSecret:this.hmacSecret,encryptRequests:this.encryptRequests,csrfEnabled:this.csrfEnabled,csrfToken:this.csrfToken,csrfHeaderName:this.csrfHeaderName,refreshCsrfToken:this.csrfEnabled?()=>this.refreshCsrfToken():null}}requestJson(n,e,t,s=!0,i){return H(this._reqOpts,n,e,t,s,i,!1)}requestBinary(n,e,t,s=!0){return this._requestBinary(n,e,t,s)}requestForm(n,e,t,s=!0){return this._requestForm(n,e,t,s)}requestFormBinary(n,e,t,s=!0){return this._requestFormBinary(n,e,t,s)}_request(n,e,t,s=!0,i){return H(this._reqOpts,n,e,t,s,i,!0)}async _requestBinary(n,e,t,s=!0){let i={"Content-Type":"application/json"};s&&this.token&&(i.Authorization=`Bearer ${this.token}`),this.apiKey&&(i["X-API-Key"]=this.apiKey);let o=await fetch(this.baseUrl+e,{method:n,headers:i,...t!=null?{body:JSON.stringify(t)}:{},credentials:"include"});if(!o.ok){let a=await o.text(),u=new Error(`HTTP ${o.status}: ${a}`);throw u.status=o.status,u}return o.arrayBuffer()}async _requestForm(n,e,t,s=!0){let i={};s&&this.token&&(i.Authorization=`Bearer ${this.token}`),this.apiKey&&(i["X-API-Key"]=this.apiKey);let o=await fetch(this.baseUrl+e,{method:n,headers:i,body:t,credentials:"include"}),a=await o.json();if(!a.ok){let u=new Error(a.message??`EntityServer error (HTTP ${o.status})`);throw u.status=o.status,u}return a}async _requestFormBinary(n,e,t,s=!0){let i={};s&&this.token&&(i.Authorization=`Bearer ${this.token}`),this.apiKey&&(i["X-API-Key"]=this.apiKey);let o=await fetch(this.baseUrl+e,{method:n,headers:i,body:t,credentials:"include"});if(!o.ok){let a=await o.text(),u=new Error(`HTTP ${o.status}: ${a}`);throw u.status=o.status,u}return o.arrayBuffer()}};function I(r){return class extends r{async checkHealth(){let t=await(await fetch(`${this.baseUrl}/v1/health`,{signal:AbortSignal.timeout(3e3),credentials:"include"})).json();return t.packet_encryption&&(this.encryptRequests=!0),typeof t.packet_token=="string"&&(this.anonymousPacketToken=t.packet_token),this._applyCsrfHealth(t.csrf),t}async login(e,t){let s=await this._request("POST","/v1/auth/login",{email:e,passwd:t},!1);return this.token=s.data.access_token,this.keepSession&&this._scheduleKeepSession(s.data.refresh_token,s.data.expires_in,i=>this.refreshToken(i)),s.data}async refreshToken(e){let t=await this._request("POST","/v1/auth/refresh",{refresh_token:e},!1);return this.token=t.data.access_token,this.keepSession&&this._scheduleKeepSession(e,t.data.expires_in,s=>this.refreshToken(s)),t.data}async logout(e){this.stopKeepSession();let t=await this._request("POST","/v1/auth/logout",{refresh_token:e},!1);return this.token="",t}me(){return this._request("GET","/v1/auth/me")}withdraw(e){return this._request("POST","/v1/auth/withdraw",e?{passwd:e}:{})}reactivate(e){return this._request("POST","/v1/auth/reactivate",e,!1)}}}function F(r){return class extends r{async transStart(){let e=await this._request("POST","/v1/transaction/start",void 0,!1);return this.activeTxId=e.transaction_id,this.activeTxId}transRollback(e){let t=e??this.activeTxId;return t?(this.activeTxId=null,this._request("POST",`/v1/transaction/rollback/${t}`)):Promise.reject(new Error("No active transaction. Call transStart() first."))}transCommit(e){let t=e??this.activeTxId;return t?(this.activeTxId=null,this._request("POST",`/v1/transaction/commit/${t}`)):Promise.reject(new Error("No active transaction. Call transStart() first."))}meta(e){return this._request("POST",`/v1/entity/${e}/meta`,{})}validate(e,t){return this.requestJson("POST",`/v1/entity/${e}/validate`,t)}get(e,t,s={}){let i=s.skipHooks?"?skipHooks=true":"";return this._request("GET",`/v1/entity/${e}/${t}${i}`)}find(e,t,s={}){let i=s.skipHooks?"?skipHooks=true":"";return this._request("POST",`/v1/entity/${e}/find${i}`,t??{})}list(e,t={}){let{conditions:s,fields:i,orderDir:o,orderBy:a,...u}=t,h={page:1,limit:20,...u};return a&&(h.orderBy=o==="DESC"?`-${a}`:a),i?.length&&(h.fields=i.join(",")),this._request("POST",`/v1/entity/${e}/list?${T(h)}`,s??{})}count(e,t){return this._request("POST",`/v1/entity/${e}/count`,t??{})}query(e,t){return this._request("POST",`/v1/entity/${e}/query`,t)}submit(e,t,s={}){let i=s.transactionId??this.activeTxId,o=i?{"X-Transaction-ID":i}:void 0,a=s.skipHooks?"?skipHooks=true":"";return this._request("POST",`/v1/entity/${e}/submit${a}`,t,!0,o)}delete(e,t,s={}){let i=new URLSearchParams;s.hard&&i.set("hard","true"),s.skipHooks&&i.set("skipHooks","true");let o=i.size?`?${i}`:"",a=s.transactionId??this.activeTxId,u=a?{"X-Transaction-ID":a}:void 0;return this._request("POST",`/v1/entity/${e}/delete/${t}${o}`,void 0,!0,u)}history(e,t,s={}){return this._request("GET",`/v1/entity/${e}/history/${t}?${T({page:1,limit:50,...s})}`)}rollback(e,t){return this._request("POST",`/v1/entity/${e}/rollback/${t}`)}}}function K(r){return class extends r{async fileUpload(e,t,s={}){let i=new FormData;return i.append("file",t,t instanceof File?t.name:"upload"),s.refSeq!=null&&i.append("ref_seq",String(s.refSeq)),s.isPublic!=null&&i.append("is_public",s.isPublic?"true":"false"),this._requestForm("POST",`/v1/files/${e}/upload`,i)}fileDownload(e,t){return this._requestBinary("POST",`/v1/files/${e}/download/${t}`,{})}fileDelete(e,t){return this._request("POST",`/v1/files/${e}/delete/${t}`,{})}fileList(e,t={}){return this._request("POST",`/v1/files/${e}/list`,t.refSeq?{ref_seq:t.refSeq}:{})}fileMeta(e,t){return this._request("POST",`/v1/files/${e}/meta/${t}`,{})}fileToken(e){return this._request("POST",`/v1/files/token/${e}`,{})}fileViewUrl(e,t={}){let s=t.download?"?download=true":"";return`${this.baseUrl}/v1/files/${e}${s}`}fileUrl(e){return`${this.baseUrl}/v1/files/${e}`}}}function L(r){return class extends r{push(e,t,s={}){return this.submit(e,t,s)}pushLogList(e={}){return this.list("push_log",e)}registerPushDevice(e,t,s,i={}){let{platform:o,deviceType:a,browser:u,browserVersion:h,pushEnabled:f=!0,transactionId:d}=i;return this.submit("account_device",{id:t,account_seq:e,push_token:s,push_enabled:f,...o?{platform:o}:{},...a?{device_type:a}:{},...u?{browser:u}:{},...h?{browser_version:h}:{}},{transactionId:d})}updatePushDeviceToken(e,t,s={}){let{pushEnabled:i=!0,transactionId:o}=s;return this.submit("account_device",{seq:e,push_token:t,push_enabled:i},{transactionId:o})}disablePushDevice(e,t={}){return this.submit("account_device",{seq:e,push_enabled:!1},{transactionId:t.transactionId})}}}function j(r){return class extends r{smtpSend(e){return this._request("POST","/v1/smtp/send",e)}smtpStatus(e){return this._request("POST",`/v1/smtp/status/${e}`,{})}}}function D(r){return class extends r{addressSido(){return this.requestJson("GET","/v1/utils/address/sido",void 0,!1)}addressSigungu(e){let t=new URLSearchParams({sido:e.sido}).toString();return this.requestJson("GET",`/v1/utils/address/sigungu?${t}`,void 0,!1)}addressDong(e){let t=new URLSearchParams({sido:e.sido,sigungu:e.sigungu}).toString();return this.requestJson("GET",`/v1/utils/address/dong?${t}`,void 0,!1)}addressClean(e){let t=new URLSearchParams({q:e.q}).toString();return this.requestJson("GET",`/v1/utils/address/clean?${t}`,void 0,!1)}qrcode(e,t={}){return this._requestBinary("POST","/v1/utils/qrcode",{content:e,...t})}qrcodeBase64(e,t={}){return this._request("POST","/v1/utils/qrcode/base64",{content:e,...t})}qrcodeText(e,t={}){return this._request("POST","/v1/utils/qrcode/text",{content:e,...t})}barcode(e,t={}){return this._requestBinary("POST","/v1/utils/barcode",{content:e,...t})}pdf2png(e,t={}){let s=new FormData;s.append("file",new Blob([e],{type:"application/pdf"}),"document.pdf");let i=new URLSearchParams;t.dpi!=null&&i.set("dpi",String(t.dpi)),t.firstPage!=null&&i.set("first_page",String(t.firstPage)),t.lastPage!=null&&i.set("last_page",String(t.lastPage));let o=i.toString(),a="/v1/utils/pdf2png"+(o?`?${o}`:"");return this._requestFormBinary("POST",a,s)}pdf2pngByFileSeq(e,t={}){return this.requestBinary("POST",`/v1/utils/pdf2png/${e}`,t)}pdf2jpg(e,t={}){let s=new FormData;s.append("file",new Blob([e],{type:"application/pdf"}),"document.pdf");let i=new URLSearchParams;t.dpi!=null&&i.set("dpi",String(t.dpi)),t.firstPage!=null&&i.set("first_page",String(t.firstPage)),t.lastPage!=null&&i.set("last_page",String(t.lastPage));let o=i.toString(),a="/v1/utils/pdf2jpg"+(o?`?${o}`:"");return this._requestFormBinary("POST",a,s)}pdf2jpgByFileSeq(e,t={}){return this.requestBinary("POST",`/v1/utils/pdf2jpg/${e}`,t)}}}function N(r){return class extends r{_adminPath(e){return`/v1/admin${e}`}_adminGet(e){return this.requestJson("GET",this._adminPath(e))}_adminPost(e,t){return this.requestJson("POST",this._adminPath(e),t)}_adminPut(e,t){return this.requestJson("PUT",this._adminPath(e),t)}_adminPatch(e,t){return this.requestJson("PATCH",this._adminPath(e),t)}_adminDelete(e,t){return this.requestJson("DELETE",this._adminPath(e),t)}listAdminEntities(){return this._adminGet("/entities")}getAdminErdSchema(){return this._adminGet("/erd/schema")}batchEnsureAdminEntities(e){return this._adminPost("/entities/batch-ensure",e)}createAdminEntityConfig(e,t){return this._adminPost(`/${e}/create`,t)}getAdminEntityConfig(e){return this._adminGet(`/${e}/config`)}updateAdminEntityConfig(e,t){return this._adminPut(`/${e}/config`,t)}validateAdminEntityConfig(e,t){return this._adminPost(t?`/${t}/validate`:"/entity/validate",e)}normalizeAdminEntityConfig(e,t){return this._adminPost(t?`/${t}/normalize`:"/entity/normalize",e)}getAdminEntityStats(e,t){return this._adminPost(`/${e}/stats`,t)}reindexAdminEntity(e){return this._adminPost(`/${e}/reindex`)}syncAdminEntitySchema(e){return this._adminPost(`/${e}/sync-schema`)}resetAdminEntity(e){return this._adminPost(`/${e}/reset`)}truncateAdminEntity(e){return this._adminPost(`/${e}/truncate`)}dropAdminEntity(e){return this._adminPost(`/${e}/drop`)}resetAllAdmin(e){return this._adminPost("/reset-all",e)}listAdminConfigs(){return this._adminGet("/configs")}getAdminConfig(e){return this._adminGet(`/configs/${e}`)}updateAdminConfig(e,t){return this._adminPatch(`/configs/${e}`,t)}listAdminRoles(){return this._adminGet("/roles")}createAdminRole(e){return this._adminPost("/roles",e)}getAdminRole(e){return this._adminGet(`/roles/${e}`)}updateAdminRole(e,t){return this._adminPatch(`/roles/${e}`,t)}deleteAdminRole(e){return this._adminDelete(`/roles/${e}`)}listAdminApiKeys(){return this._adminGet("/api-keys")}createAdminApiKey(e){return this._adminPost("/api-keys",e)}getAdminApiKey(e){return this._adminGet(`/api-keys/${e}`)}updateAdminApiKey(e,t){return this._adminPatch(`/api-keys/${e}`,t)}deleteAdminApiKey(e){return this._adminDelete(`/api-keys/${e}`)}regenerateAdminApiKeySecret(e){return this._adminPost(`/api-keys/${e}/regenerate-secret`)}listAdminAccounts(){return this._adminGet("/accounts")}createAdminAccount(e){return this._adminPost("/accounts",e)}getAdminAccount(e){return this._adminGet(`/accounts/${e}`)}updateAdminAccount(e,t){return this._adminPatch(`/accounts/${e}`,t)}deleteAdminAccount(e){return this._adminDelete(`/accounts/${e}`)}listAdminLicenses(){return this._adminGet("/licenses")}createAdminLicense(e){return this._adminPost("/licenses",e)}getAdminLicense(e){return this._adminGet(`/licenses/${e}`)}updateAdminLicense(e,t){return this._adminPatch(`/licenses/${e}`,t)}deleteAdminLicense(e){return this._adminDelete(`/licenses/${e}`)}runAdminBackup(e){return this._adminPost("/backup/run",e)}getAdminBackupStatus(e){return this._adminPost("/backup/status",e)}listAdminBackups(e){return this._adminPost("/backup/list",e)}restoreAdminBackup(e){return this._adminPost("/backup/restore",e)}deleteAdminBackup(e){return this._adminPost("/backup/delete",e)}disableAdminAccountTwoFactor(e){return this._adminDelete(`/accounts/${e}/2fa`)}}}var b=class extends D(K(j(L(N(F(I(B))))))){};function V(r){return class extends r{accountRegister(e){return this.requestJson("POST","/v1/account/register",e,!1)}accountWithdraw(e){return this.requestJson("POST","/v1/account/withdraw",e)}accountChangePassword(e){return this.requestJson("POST","/v1/account/change-password",e)}accountReactivate(e){return this.requestJson("POST","/v1/account/reactivate",e,!1)}listAccountBiometrics(){return this.requestJson("GET","/v1/account/biometric")}registerAccountBiometric(e){return this.requestJson("POST","/v1/account/biometric",e)}deleteAccountBiometric(e){return this.requestJson("DELETE",`/v1/account/biometric/${e}`)}}}function Q(r){return class extends r{listBoardCategories(e={}){let t=T(e);return this.requestJson("GET",`/v1/board/categories${t?`?${t}`:""}`,void 0,!1)}getBoardCategory(e){return this.requestJson("GET",`/v1/board/categories/${e}`,void 0,!1)}createBoardCategory(e){return this.requestJson("POST","/v1/board/categories",e)}updateBoardCategory(e,t){return this.requestJson("PUT",`/v1/board/categories/${e}`,t)}deleteBoardCategory(e){return this.requestJson("DELETE",`/v1/board/categories/${e}`)}listBoardPosts(e,t={}){let s=T(t);return this.requestJson("GET",`/v1/board/${e}/list${s?`?${s}`:""}`,void 0,!1)}getBoardPost(e){return this.requestJson("GET",`/v1/board/posts/${e}`,void 0,!1)}createBoardPost(e,t){return this.requestJson("POST",`/v1/board/${e}/submit`,t)}updateBoardPost(e,t){return this.requestJson("PUT",`/v1/board/posts/${e}`,t)}deleteBoardPost(e){return this.requestJson("DELETE",`/v1/board/posts/${e}`)}listBoardComments(e,t={}){let s=T(t);return this.requestJson("GET",`/v1/board/posts/${e}/comments${s?`?${s}`:""}`,void 0,!1)}createBoardComment(e,t){return this.requestJson("POST",`/v1/board/posts/${e}/comments/submit`,t)}updateBoardComment(e,t){return this.requestJson("PUT",`/v1/board/comments/${e}`,t)}deleteBoardComment(e){return this.requestJson("DELETE",`/v1/board/comments/${e}`)}listBoardFiles(e){return this.requestJson("GET",`/v1/board/posts/${e}/files`,void 0,!1)}async uploadBoardFile(e,t){let s=new FormData;return s.append("file",t,t instanceof File?t.name:"upload"),this.requestForm("POST",`/v1/board/posts/${e}/files`,s)}boardFileUrl(e){return`${this.baseUrl}/v1/board/files/${e}`}deleteBoardFile(e){return this.requestJson("DELETE",`/v1/board/files/${e}`)}createBoardGuestPost(e,t){return this.requestJson("POST",`/v1/board/${e}/guest-submit`,t,!1)}authenticateBoardGuestPost(e,t){return this.requestJson("POST",`/v1/board/posts/${e}/guest-auth`,t,!1)}toggleBoardPostLike(e){return this.requestJson("POST",`/v1/board/posts/${e}/like`,{})}acceptBoardPost(e){return this.requestJson("POST",`/v1/board/posts/${e}/accept`,{})}rateBoardPost(e,t){return this.requestJson("POST",`/v1/board/posts/${e}/rating`,t)}rateBoardComment(e,t){return this.requestJson("POST",`/v1/board/comments/${e}/rating`,t)}listBoardTags(e={}){let t=T(e);return this.requestJson("GET",`/v1/board/tags${t?`?${t}`:""}`,void 0,!1)}setBoardPostTags(e,t){return this.requestJson("PUT",`/v1/board/posts/${e}/tags`,t)}reportBoardPost(e,t){return this.requestJson("POST",`/v1/board/posts/${e}/report`,t)}reportBoardComment(e,t){return this.requestJson("POST",`/v1/board/comments/${e}/report`,t)}listBoardReports(e={}){let t=T(e);return this.requestJson("GET",`/v1/board/admin/reports${t?`?${t}`:""}`)}updateBoardReport(e,t){return this.requestJson("PATCH",`/v1/board/admin/reports/${e}`,t)}markBoardPostRead(e){return this.requestJson("POST",`/v1/board/posts/${e}/read`,{})}listBoardMentions(e={}){let t=T(e);return this.requestJson("GET",`/v1/board/mentions${t?`?${t}`:""}`)}markBoardMentionRead(e){return this.requestJson("PATCH",`/v1/board/mentions/${e}/read`,{})}}}function X(r){return class extends r{sendEmailVerification(e){return this.requestJson("POST","/v1/email-verify/send",e,!1)}confirmEmailVerification(e){return this.requestJson("POST","/v1/email-verify/confirm",e,!1)}activateEmailVerification(e){let t=T(e);return this.requestJson("GET",`/v1/email-verify/activate${t?`?${t}`:""}`,void 0,!1)}getEmailVerificationStatus(){return this.requestJson("GET","/v1/email-verify/status")}changeVerifiedEmail(e){return this.requestJson("POST","/v1/email-verify/change",e)}}}function z(r){return class extends r{oauthAuthorizeUrl(e,t={}){let s=T(t);return`${this.baseUrl}/v1/oauth/${e}${s?`?${s}`:""}`}oauthCallback(e,t,s="POST"){if(s==="GET"){let i=T(t??{});return this.requestJson("GET",`/v1/oauth/${e}/callback${i?`?${i}`:""}`,void 0,!1)}return this.requestJson("POST",`/v1/oauth/${e}/callback`,t,!1)}linkOAuthAccount(e){return this.requestJson("POST","/v1/account/oauth/link",e)}unlinkOAuthAccount(e){return this.requestJson("DELETE",`/v1/account/oauth/link/${e}`)}listOAuthProviders(){return this.requestJson("GET","/v1/account/oauth/providers")}refreshOAuthProviderToken(e,t){return this.requestJson("POST",`/v1/account/oauth/refresh/${e}`,t)}}}function W(r){return class extends r{requestPasswordReset(e){return this.requestJson("POST","/v1/password-reset/request",e,!1)}validatePasswordResetToken(e){return this.requestJson("GET",`/v1/password-reset/validate/${encodeURIComponent(e)}`,void 0,!1)}verifyPasswordReset(e){return this.requestJson("POST","/v1/password-reset/verify",e,!1)}}}function Z(r){return class extends r{setupTwoFactor(e){return this.requestJson("POST","/v1/account/2fa/setup",e)}verifyTwoFactorSetup(e){return this.requestJson("POST","/v1/account/2fa/setup/verify",e,!1)}disableTwoFactor(){return this.requestJson("DELETE","/v1/account/2fa")}getTwoFactorStatus(){return this.requestJson("GET","/v1/account/2fa/status")}regenerateTwoFactorRecoveryCodes(){return this.requestJson("POST","/v1/account/2fa/recovery/regenerate")}verifyTwoFactor(e){return this.requestJson("POST","/v1/account/2fa/verify",e,!1)}recoverTwoFactorAccess(e){return this.requestJson("POST","/v1/account/2fa/recovery",e,!1)}}}var R=class extends z(Z(W(X(Q(V(b)))))){};var le=new b,me=new R;function pe(r,n){let{singleton:e=!0,tokenResolver:t,baseUrl:s,token:i,resumeSession:o}=r,[a,u]=he(!1),[h,f]=he(null),d=Te(!0);fe(()=>(d.current=!0,()=>{d.current=!1}),[]);let p=qe(()=>{let c=e?n.singletonInstance:new n.ClientClass({baseUrl:s,token:i});e&&c.configure({baseUrl:s,token:i});let l=t?.();return typeof l=="string"&&c.setToken(l),c},[e,t,s,i,n.ClientClass,n.singletonInstance]),$=Te(o);fe(()=>{let c=$.current;c&&p.refreshToken(c).catch(()=>{})},[p]);let y=C(async c=>{d.current&&(u(!0),f(null));try{return await c()}catch(l){let P=l instanceof Error?l:new Error(String(l));throw d.current&&f(P),P}finally{d.current&&u(!1)}},[]),v=C((c,l,P)=>y(()=>p.submit(c,l,P)),[p,y]),E=C((c,l,P)=>y(()=>p.delete(c,l,P)),[p,y]),O=C((c,l)=>y(()=>p.query(c,l)),[p,y]),_=C(()=>{u(!1),f(null)},[]);return{client:p,isPending:a,error:h,reset:_,submit:v,del:E,query:O}}function tn(r={}){return pe(r,{singletonInstance:le,ClientClass:b})}function nn(r={}){return pe(r,{singletonInstance:me,ClientClass:R})}export{nn as useEntityAppServer,tn as useEntityServer};
2
+ //# sourceMappingURL=react.js.map