entity-client 1.0.7 → 1.0.9

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 (138) hide show
  1. package/README.md +362 -0
  2. package/dist/EntityAppServerApi.d.ts +1016 -0
  3. package/dist/EntityAppServerApi.js +2 -0
  4. package/dist/EntityAppServerApi.js.map +7 -0
  5. package/dist/{EntityServerClient.d.ts → EntityServerApi.d.ts} +160 -101
  6. package/dist/EntityServerApi.js +2 -0
  7. package/dist/EntityServerApi.js.map +7 -0
  8. package/dist/client/base.d.ts +29 -16
  9. package/dist/client/base.js +1 -1
  10. package/dist/client/base.js.map +3 -3
  11. package/dist/client/request.d.ts +2 -2
  12. package/dist/client/request.js +1 -1
  13. package/dist/client/request.js.map +3 -3
  14. package/dist/hooks/useEntityAppServer.d.ts +18 -0
  15. package/dist/hooks/useEntityAppServer.js +2 -0
  16. package/dist/hooks/useEntityAppServer.js.map +7 -0
  17. package/dist/hooks/useEntityClient.d.ts +74 -0
  18. package/dist/hooks/useEntityClient.js +2 -0
  19. package/dist/hooks/useEntityClient.js.map +7 -0
  20. package/dist/hooks/useEntityServer.d.ts +5 -88
  21. package/dist/hooks/useEntityServer.js +1 -1
  22. package/dist/hooks/useEntityServer.js.map +3 -3
  23. package/dist/index.d.ts +6 -6
  24. package/dist/index.js +1 -1
  25. package/dist/index.js.map +4 -4
  26. package/dist/mixins/app/index.d.ts +6 -6
  27. package/dist/mixins/app/index.js +1 -1
  28. package/dist/mixins/app/index.js.map +2 -2
  29. package/dist/mixins/app/plugins/alimtalk.d.ts +64 -0
  30. package/dist/mixins/app/plugins/alimtalk.js +2 -0
  31. package/dist/mixins/app/plugins/alimtalk.js.map +7 -0
  32. package/dist/mixins/app/plugins/friendtalk.d.ts +58 -0
  33. package/dist/mixins/app/plugins/friendtalk.js +2 -0
  34. package/dist/mixins/app/plugins/friendtalk.js.map +7 -0
  35. package/dist/mixins/app/plugins/holidays.d.ts +66 -0
  36. package/dist/mixins/app/plugins/holidays.js +2 -0
  37. package/dist/mixins/app/plugins/holidays.js.map +7 -0
  38. package/dist/mixins/app/plugins/identity.d.ts +64 -0
  39. package/dist/mixins/app/plugins/identity.js +2 -0
  40. package/dist/mixins/app/plugins/identity.js.map +7 -0
  41. package/dist/mixins/app/plugins/index.d.ts +10 -0
  42. package/dist/mixins/app/plugins/index.js +2 -0
  43. package/dist/mixins/app/plugins/index.js.map +7 -0
  44. package/dist/mixins/app/plugins/llm.d.ts +126 -0
  45. package/dist/mixins/app/plugins/llm.js +2 -0
  46. package/dist/mixins/app/plugins/llm.js.map +7 -0
  47. package/dist/mixins/app/plugins/ocr.d.ts +72 -0
  48. package/dist/mixins/app/plugins/ocr.js +2 -0
  49. package/dist/mixins/app/plugins/ocr.js.map +7 -0
  50. package/dist/mixins/app/plugins/pg.d.ts +70 -0
  51. package/dist/mixins/app/plugins/pg.js +2 -0
  52. package/dist/mixins/app/plugins/pg.js.map +7 -0
  53. package/dist/mixins/app/plugins/push.d.ts +66 -0
  54. package/dist/mixins/app/plugins/push.js +2 -0
  55. package/dist/mixins/app/plugins/push.js.map +7 -0
  56. package/dist/mixins/app/plugins/sms.d.ts +64 -0
  57. package/dist/mixins/app/plugins/sms.js +2 -0
  58. package/dist/mixins/app/plugins/sms.js.map +7 -0
  59. package/dist/mixins/app/plugins/taxinvoice.d.ts +68 -0
  60. package/dist/mixins/app/plugins/taxinvoice.js +2 -0
  61. package/dist/mixins/app/plugins/taxinvoice.js.map +7 -0
  62. package/dist/mixins/app/{account.d.ts → routes/account.d.ts} +17 -15
  63. package/dist/mixins/app/routes/account.js +2 -0
  64. package/dist/mixins/app/routes/account.js.map +7 -0
  65. package/dist/mixins/app/{board.d.ts → routes/board.d.ts} +17 -15
  66. package/dist/mixins/app/routes/board.js +2 -0
  67. package/dist/mixins/app/routes/board.js.map +7 -0
  68. package/dist/mixins/app/{email-verify.d.ts → routes/email-verify.d.ts} +17 -15
  69. package/dist/mixins/app/routes/email-verify.js +2 -0
  70. package/dist/mixins/app/routes/email-verify.js.map +7 -0
  71. package/dist/mixins/app/{oauth.d.ts → routes/oauth.d.ts} +17 -15
  72. package/dist/mixins/app/routes/oauth.js +2 -0
  73. package/dist/mixins/app/routes/oauth.js.map +7 -0
  74. package/dist/mixins/app/{password-reset.d.ts → routes/password-reset.d.ts} +17 -15
  75. package/dist/mixins/app/routes/password-reset.js +2 -0
  76. package/dist/mixins/app/routes/password-reset.js.map +7 -0
  77. package/dist/mixins/app/{two-factor.d.ts → routes/two-factor.d.ts} +17 -15
  78. package/dist/mixins/app/routes/two-factor.js +2 -0
  79. package/dist/mixins/app/routes/two-factor.js.map +7 -0
  80. package/dist/mixins/server/admin.d.ts +14 -12
  81. package/dist/mixins/server/admin.js +1 -1
  82. package/dist/mixins/server/admin.js.map +2 -2
  83. package/dist/mixins/{auth.d.ts → server/auth.d.ts} +18 -33
  84. package/dist/mixins/server/auth.js +2 -0
  85. package/dist/mixins/server/auth.js.map +7 -0
  86. package/dist/mixins/{entity.d.ts → server/entity.d.ts} +18 -16
  87. package/dist/mixins/server/entity.js +2 -0
  88. package/dist/mixins/server/entity.js.map +7 -0
  89. package/dist/mixins/{file.d.ts → server/file.d.ts} +18 -16
  90. package/dist/mixins/server/file.js.map +7 -0
  91. package/dist/mixins/server/index.d.ts +7 -6
  92. package/dist/mixins/server/index.js +1 -1
  93. package/dist/mixins/server/index.js.map +3 -3
  94. package/dist/mixins/{push.d.ts → server/push.d.ts} +18 -16
  95. package/dist/mixins/server/push.js.map +7 -0
  96. package/dist/mixins/{smtp.d.ts → server/smtp.d.ts} +20 -16
  97. package/dist/mixins/server/smtp.js +2 -0
  98. package/dist/mixins/server/smtp.js.map +7 -0
  99. package/dist/mixins/server/transaction.d.ts +62 -0
  100. package/dist/mixins/server/transaction.js +2 -0
  101. package/dist/mixins/server/transaction.js.map +7 -0
  102. package/dist/mixins/{utils.d.ts → server/utils.d.ts} +18 -16
  103. package/dist/mixins/server/utils.js +2 -0
  104. package/dist/mixins/server/utils.js.map +7 -0
  105. package/dist/react.d.ts +2 -0
  106. package/dist/react.js +1 -1
  107. package/dist/react.js.map +4 -4
  108. package/dist/types.d.ts +17 -10
  109. package/package.json +2 -2
  110. package/dist/EntityAppServerClient.d.ts +0 -383
  111. package/dist/EntityAppServerClient.js +0 -2
  112. package/dist/EntityAppServerClient.js.map +0 -7
  113. package/dist/EntityServerClient.js +0 -2
  114. package/dist/EntityServerClient.js.map +0 -7
  115. package/dist/mixins/app/account.js +0 -2
  116. package/dist/mixins/app/account.js.map +0 -7
  117. package/dist/mixins/app/board.js +0 -2
  118. package/dist/mixins/app/board.js.map +0 -7
  119. package/dist/mixins/app/email-verify.js +0 -2
  120. package/dist/mixins/app/email-verify.js.map +0 -7
  121. package/dist/mixins/app/oauth.js +0 -2
  122. package/dist/mixins/app/oauth.js.map +0 -7
  123. package/dist/mixins/app/password-reset.js +0 -2
  124. package/dist/mixins/app/password-reset.js.map +0 -7
  125. package/dist/mixins/app/two-factor.js +0 -2
  126. package/dist/mixins/app/two-factor.js.map +0 -7
  127. package/dist/mixins/auth.js +0 -2
  128. package/dist/mixins/auth.js.map +0 -7
  129. package/dist/mixins/entity.js +0 -2
  130. package/dist/mixins/entity.js.map +0 -7
  131. package/dist/mixins/file.js.map +0 -7
  132. package/dist/mixins/push.js.map +0 -7
  133. package/dist/mixins/smtp.js +0 -2
  134. package/dist/mixins/smtp.js.map +0 -7
  135. package/dist/mixins/utils.js +0 -2
  136. package/dist/mixins/utils.js.map +0 -7
  137. /package/dist/mixins/{file.js → server/file.js} +0 -0
  138. /package/dist/mixins/{push.js → server/push.js} +0 -0
@@ -1,6 +1,7 @@
1
- import type { GConstructor, EntityServerClientBase } from "../client/base.js";
1
+ import type { GConstructor, EntityServerClientBase } from "../../client/base.js";
2
2
  export declare function AuthMixin<TBase extends GConstructor<EntityServerClientBase>>(Base: TBase): {
3
3
  new (...args: any[]): {
4
+ _csrfRefresher: () => Promise<void>;
4
5
  /**
5
6
  * 서버 헬스 체크를 수행하고 패킷 암호화 활성 여부를 자동으로 감지합니다.
6
7
  *
@@ -12,11 +13,8 @@ export declare function AuthMixin<TBase extends GConstructor<EntityServerClientB
12
13
  * ```
13
14
  */
14
15
  checkHealth(): Promise<{
15
- ok: boolean;
16
- packet_encryption?: boolean;
17
- packet_mode?: string;
16
+ status: string;
18
17
  packet_token?: string;
19
- csrf?: import("../types").EntityServerClientHealthCsrf;
20
18
  }>;
21
19
  /** 로그인 후 `access_token`을 내부 상태에 저장합니다. */
22
20
  login(email: string, password: string): Promise<{
@@ -48,20 +46,6 @@ export declare function AuthMixin<TBase extends GConstructor<EntityServerClientB
48
46
  withdraw(passwd?: string): Promise<{
49
47
  ok: boolean;
50
48
  }>;
51
- /**
52
- * 휴면 계정을 재활성화합니다.
53
- * 비밀번호 또는 OAuth(provider + code)로 본인 확인합니다.
54
- */
55
- reactivate(params: {
56
- email: string;
57
- passwd?: string;
58
- provider?: string;
59
- code?: string;
60
- }): Promise<{
61
- access_token: string;
62
- refresh_token: string;
63
- expires_in: number;
64
- }>;
65
49
  baseUrl: string;
66
50
  token: string;
67
51
  anonymousPacketToken: string;
@@ -69,10 +53,8 @@ export declare function AuthMixin<TBase extends GConstructor<EntityServerClientB
69
53
  hmacSecret: string;
70
54
  encryptRequests: boolean;
71
55
  csrfEnabled: boolean;
72
- csrfToken: string;
73
56
  csrfHeaderName: string;
74
- csrfRefreshPath: string;
75
- csrfRefreshBuffer: number;
57
+ csrfCookieName: string;
76
58
  activeTxId: string | null;
77
59
  keepSession: boolean;
78
60
  refreshBuffer: number;
@@ -80,30 +62,33 @@ export declare function AuthMixin<TBase extends GConstructor<EntityServerClientB
80
62
  onSessionExpired?: (error: Error) => void;
81
63
  _sessionRefreshToken: string | null;
82
64
  _refreshTimer: ReturnType<typeof setTimeout> | null;
83
- _csrfRefreshTimer: ReturnType<typeof setTimeout> | null;
84
- _csrfRefreshPromise: Promise<string> | null;
85
- configure(options: Partial<import("../types").EntityServerClientOptions>): void;
65
+ _healthTickTimer: ReturnType<typeof setInterval> | null;
66
+ _healthTickPromise: Promise<unknown> | null;
67
+ configure(options: Partial<import("../../types.js").EntityServerClientOptions>): void;
86
68
  setToken(token: string): void;
87
69
  setAnonymousPacketToken(token: string): void;
88
70
  setApiKey(apiKey: string): void;
89
71
  setHmacSecret(secret: string): void;
90
72
  setEncryptRequests(value: boolean): void;
91
- setCsrfToken(token: string): void;
92
73
  setCsrfEnabled(enabled: boolean): void;
74
+ startHealthTick(intervalMs?: number): void;
75
+ stopHealthTick(): void;
93
76
  _scheduleKeepSession(refreshToken: string, expiresIn: number, refreshFn: (rt: string) => Promise<{
94
77
  access_token: string;
95
78
  expires_in: number;
96
79
  }>): void;
97
80
  _clearRefreshTimer(): void;
98
81
  stopKeepSession(): void;
99
- _clearCsrfRefreshTimer(): void;
100
- stopCsrfRefresh(): void;
101
- _scheduleCsrfRefresh(expiresIn: number): void;
102
- refreshCsrfToken(): Promise<string>;
103
- _applyCsrfHealth(csrf?: import("../types").EntityServerClientHealthCsrf | null): void;
82
+ _applyCsrfHealth(): void;
104
83
  readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
105
- get _reqOpts(): import("../client/request.js").RequestOptions;
106
- requestJson<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
84
+ get _reqOpts(): import("../../client/request.js").RequestOptions;
85
+ get http(): {
86
+ get<T>(path: string, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
87
+ post<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
88
+ put<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
89
+ patch<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
90
+ delete<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
91
+ };
107
92
  requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
108
93
  requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
109
94
  requestFormBinary(method: string, path: string, form: FormData, withAuth?: boolean): Promise<ArrayBuffer>;
@@ -0,0 +1,2 @@
1
+ function o(n){return class extends n{_csrfRefresher=()=>this.checkHealth().then(()=>{});async checkHealth(){const e=await(await fetch(`${this.baseUrl}/v1/health`,{signal:AbortSignal.timeout(3e3),credentials:"include"})).json();return typeof e.packet_token=="string"&&(this.anonymousPacketToken=e.packet_token),this._applyCsrfHealth(),e}async login(s,e){const t=await this._request("POST","/v1/auth/login",{email:s,passwd:e},!1);return this.token=t.data.access_token,this.keepSession&&this._scheduleKeepSession(t.data.refresh_token,t.data.expires_in,r=>this.refreshToken(r)),t.data}async refreshToken(s){const e=await this._request("POST","/v1/auth/refresh",{refresh_token:s},!1);return this.token=e.data.access_token,this.keepSession&&this._scheduleKeepSession(s,e.data.expires_in,t=>this.refreshToken(t)),e.data}async logout(s){this.stopKeepSession();const e=await this._request("POST","/v1/auth/logout",{refresh_token:s},!1);return this.token="",e}me(){return this._request("GET","/v1/auth/me")}withdraw(s){return this._request("POST","/v1/auth/withdraw",s?{passwd:s}:{})}}}export{o as AuthMixin};
2
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/mixins/server/auth.ts"],
4
+ "sourcesContent": ["import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../client/base.js\";\n\nexport function AuthMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class AuthMixinClass extends Base {\n // AuthMixin \uCD08\uAE30\uD654: CSRF \uCFE0\uD0A4 \uAC31\uC2E0\uC744 \uC704\uD574 checkHealth\uB97C _csrfRefresher\uB85C \uB4F1\uB85D\n _csrfRefresher = (): Promise<void> => this.checkHealth().then(() => {});\n\n // \u2500\u2500\u2500 \uC778\uC99D \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * \uC11C\uBC84 \uD5EC\uC2A4 \uCCB4\uD06C\uB97C \uC218\uD589\uD558\uACE0 \uD328\uD0B7 \uC554\uD638\uD654 \uD65C\uC131 \uC5EC\uBD80\uB97C \uC790\uB3D9\uC73C\uB85C \uAC10\uC9C0\uD569\uB2C8\uB2E4.\n *\n * \uC11C\uBC84\uAC00 `packet_encryption: true`\uB97C \uC751\uB2F5\uD558\uBA74 \uC774\uD6C4 \uBAA8\uB4E0 \uC694\uCCAD\uC5D0 \uC554\uD638\uD654\uAC00 \uC790\uB3D9 \uC801\uC6A9\uB429\uB2C8\uB2E4.\n *\n * ```ts\n * await client.checkHealth();\n * await client.login(email, password);\n * ```\n */\n async checkHealth(): Promise<{\n status: string;\n packet_token?: string;\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 status: string;\n packet_token?: string;\n };\n if (typeof data.packet_token === \"string\") {\n this.anonymousPacketToken = data.packet_token;\n }\n this._applyCsrfHealth();\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"],
5
+ "mappings": "AAKO,SAASA,EACZC,EACF,CACE,OAAO,cAA6BA,CAAK,CAErC,eAAiB,IAAqB,KAAK,YAAY,EAAE,KAAK,IAAM,CAAC,CAAC,EActE,MAAM,aAGH,CAKC,MAAMC,EAAQ,MAJF,MAAM,MAAM,GAAG,KAAK,OAAO,aAAc,CACjD,OAAQ,YAAY,QAAQ,GAAI,EAChC,YAAa,SACjB,CAAC,GACuB,KAAK,EAI7B,OAAI,OAAOA,EAAK,cAAiB,WAC7B,KAAK,qBAAuBA,EAAK,cAErC,KAAK,iBAAiB,EACfA,CACX,CAGA,MAAM,MACFC,EACAC,EAQD,CACC,MAAMF,EAAO,MAAM,KAAK,SASrB,OAAQ,iBAAkB,CAAE,MAAAC,EAAO,OAAQC,CAAS,EAAG,EAAK,EAC/D,YAAK,MAAQF,EAAK,KAAK,aACnB,KAAK,aACL,KAAK,qBACDA,EAAK,KAAK,cACVA,EAAK,KAAK,WACTG,GAAO,KAAK,aAAaA,CAAE,CAChC,EACGH,EAAK,IAChB,CAGA,MAAM,aACFI,EACqD,CACrD,MAAMJ,EAAO,MAAM,KAAK,SAGpB,OACA,mBACA,CAAE,cAAeI,CAAa,EAC9B,EACJ,EACA,YAAK,MAAQJ,EAAK,KAAK,aACnB,KAAK,aACL,KAAK,qBACDI,EACAJ,EAAK,KAAK,WACTG,GAAO,KAAK,aAAaA,CAAE,CAChC,EACGH,EAAK,IAChB,CAMA,MAAM,OAAOI,EAAgD,CACzD,KAAK,gBAAgB,EACrB,MAAMJ,EAAO,MAAM,KAAK,SACpB,OACA,kBACA,CAAE,cAAeI,CAAa,EAC9B,EACJ,EACA,YAAK,MAAQ,GACNJ,CACX,CAGA,IAAqE,CACjE,OAAO,KAAK,SAAS,MAAO,aAAa,CAC7C,CAGA,SAASK,EAA2C,CAChD,OAAO,KAAK,SACR,OACA,oBACAA,EAAS,CAAE,OAAAA,CAAO,EAAI,CAAC,CAC3B,CACJ,CACJ,CACJ",
6
+ "names": ["AuthMixin", "Base", "data", "email", "password", "rt", "refreshToken", "passwd"]
7
+ }
@@ -1,5 +1,5 @@
1
- import type { EntityHistoryRecord, EntityListParams, EntityListResult, EntityQueryRequest } from "../types.js";
2
- import type { GConstructor, EntityServerClientBase } from "../client/base.js";
1
+ import type { EntityHistoryRecord, EntityListParams, EntityListResult, EntityQueryRequest } from "../../types.js";
2
+ import type { GConstructor, EntityServerClientBase } from "../../client/base.js";
3
3
  export declare function EntityMixin<TBase extends GConstructor<EntityServerClientBase>>(Base: TBase): {
4
4
  new (...args: any[]): {
5
5
  /** 트랜잭션을 시작하고 활성 트랜잭션 ID를 저장합니다. */
@@ -101,10 +101,9 @@ export declare function EntityMixin<TBase extends GConstructor<EntityServerClien
101
101
  hmacSecret: string;
102
102
  encryptRequests: boolean;
103
103
  csrfEnabled: boolean;
104
- csrfToken: string;
105
104
  csrfHeaderName: string;
106
- csrfRefreshPath: string;
107
- csrfRefreshBuffer: number;
105
+ csrfCookieName: string;
106
+ _csrfRefresher: (() => Promise<void>) | null;
108
107
  activeTxId: string | null;
109
108
  keepSession: boolean;
110
109
  refreshBuffer: number;
@@ -112,30 +111,33 @@ export declare function EntityMixin<TBase extends GConstructor<EntityServerClien
112
111
  onSessionExpired?: (error: Error) => void;
113
112
  _sessionRefreshToken: string | null;
114
113
  _refreshTimer: ReturnType<typeof setTimeout> | null;
115
- _csrfRefreshTimer: ReturnType<typeof setTimeout> | null;
116
- _csrfRefreshPromise: Promise<string> | null;
117
- configure(options: Partial<import("../types.js").EntityServerClientOptions>): void;
114
+ _healthTickTimer: ReturnType<typeof setInterval> | null;
115
+ _healthTickPromise: Promise<unknown> | null;
116
+ configure(options: Partial<import("../../types.js").EntityServerClientOptions>): void;
118
117
  setToken(token: string): void;
119
118
  setAnonymousPacketToken(token: string): void;
120
119
  setApiKey(apiKey: string): void;
121
120
  setHmacSecret(secret: string): void;
122
121
  setEncryptRequests(value: boolean): void;
123
- setCsrfToken(token: string): void;
124
122
  setCsrfEnabled(enabled: boolean): void;
123
+ startHealthTick(intervalMs?: number): void;
124
+ stopHealthTick(): void;
125
125
  _scheduleKeepSession(refreshToken: string, expiresIn: number, refreshFn: (rt: string) => Promise<{
126
126
  access_token: string;
127
127
  expires_in: number;
128
128
  }>): void;
129
129
  _clearRefreshTimer(): void;
130
130
  stopKeepSession(): void;
131
- _clearCsrfRefreshTimer(): void;
132
- stopCsrfRefresh(): void;
133
- _scheduleCsrfRefresh(expiresIn: number): void;
134
- refreshCsrfToken(): Promise<string>;
135
- _applyCsrfHealth(csrf?: import("../types.js").EntityServerClientHealthCsrf | null): void;
131
+ _applyCsrfHealth(): void;
136
132
  readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
137
- get _reqOpts(): import("../client/request.js").RequestOptions;
138
- requestJson<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
133
+ get _reqOpts(): import("../../client/request.js").RequestOptions;
134
+ get http(): {
135
+ get<T>(path: string, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
136
+ post<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
137
+ put<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
138
+ patch<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
139
+ delete<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
140
+ };
139
141
  requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
140
142
  requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
141
143
  requestFormBinary(method: string, path: string, form: FormData, withAuth?: boolean): Promise<ArrayBuffer>;
@@ -0,0 +1,2 @@
1
+ import{buildQuery as u}from"../../client/utils.js";function m(c){return class extends c{async transStart(){const t=await this._request("POST","/v1/transaction/start",void 0,!1);return this.activeTxId=t.transaction_id,this.activeTxId}transRollback(t){const n=t??this.activeTxId;return n?(this.activeTxId=null,this._request("POST",`/v1/transaction/rollback/${n}`)):Promise.reject(new Error("No active transaction. Call transStart() first."))}transCommit(t){const n=t??this.activeTxId;return n?(this.activeTxId=null,this._request("POST",`/v1/transaction/commit/${n}`)):Promise.reject(new Error("No active transaction. Call transStart() first."))}meta(t){return this._request("POST",`/v1/entity/${t}/meta`,{})}validate(t,n){return this.http.post(`/v1/entity/${t}/validate`,n)}get(t,n,e={}){const r=e.skipHooks?"?skipHooks=true":"";return this._request("GET",`/v1/entity/${t}/${n}${r}`)}find(t,n,e={}){const r=e.skipHooks?"?skipHooks=true":"";return this._request("POST",`/v1/entity/${t}/find${r}`,n??{})}list(t,n={}){const{conditions:e,fields:r,orderDir:i,orderBy:s,...o}=n,a={page:1,limit:20,...o};return s&&(a.orderBy=i==="DESC"?`-${s}`:s),r?.length&&(a.fields=r.join(",")),this._request("POST",`/v1/entity/${t}/list?${u(a)}`,e??{})}count(t,n){return this._request("POST",`/v1/entity/${t}/count`,n??{})}query(t,n){return this._request("POST",`/v1/entity/${t}/query`,n)}submit(t,n,e={}){const r=e.transactionId??this.activeTxId,i=r?{"X-Transaction-ID":r}:void 0,s=e.skipHooks?"?skipHooks=true":"";return this._request("POST",`/v1/entity/${t}/submit${s}`,n,!0,i)}delete(t,n,e={}){const r=new URLSearchParams;e.hard&&r.set("hard","true"),e.skipHooks&&r.set("skipHooks","true");const i=r.size?`?${r}`:"",s=e.transactionId??this.activeTxId,o=s?{"X-Transaction-ID":s}:void 0;return this._request("POST",`/v1/entity/${t}/delete/${n}${i}`,void 0,!0,o)}history(t,n,e={}){return this._request("GET",`/v1/entity/${t}/history/${n}?${u({page:1,limit:50,...e})}`)}rollback(t,n){return this._request("POST",`/v1/entity/${t}/rollback/${n}`)}}}export{m as EntityMixin};
2
+ //# sourceMappingURL=entity.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/mixins/server/entity.ts"],
4
+ "sourcesContent": ["import type {\n EntityHistoryRecord,\n EntityListParams,\n EntityListResult,\n EntityQueryRequest,\n} from \"../../types.js\";\nimport { buildQuery } from \"../../client/utils.js\";\nimport type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../client/base.js\";\n\nexport function EntityMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class EntityMixinClass extends Base {\n // \u2500\u2500\u2500 \uD2B8\uB79C\uC7AD\uC158 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** \uD2B8\uB79C\uC7AD\uC158\uC744 \uC2DC\uC791\uD558\uACE0 \uD65C\uC131 \uD2B8\uB79C\uC7AD\uC158 ID\uB97C \uC800\uC7A5\uD569\uB2C8\uB2E4. */\n async transStart(): Promise<string> {\n const res = await this._request<{\n ok: boolean;\n transaction_id: string;\n }>(\"POST\", \"/v1/transaction/start\", undefined, false);\n this.activeTxId = res.transaction_id;\n return this.activeTxId;\n }\n\n /** \uD65C\uC131 \uD2B8\uB79C\uC7AD\uC158(\uB610\uB294 \uC804\uB2EC\uB41C transactionId)\uC744 \uB864\uBC31\uD569\uB2C8\uB2E4. */\n transRollback(transactionId?: string): Promise<{ ok: boolean }> {\n const txId = transactionId ?? this.activeTxId;\n if (!txId)\n return Promise.reject(\n new Error(\n \"No active transaction. Call transStart() first.\",\n ),\n );\n this.activeTxId = null;\n return this._request(\"POST\", `/v1/transaction/rollback/${txId}`);\n }\n\n /**\n * \uD65C\uC131 \uD2B8\uB79C\uC7AD\uC158(\uB610\uB294 \uC804\uB2EC\uB41C transactionId)\uC744 \uCEE4\uBC0B\uD569\uB2C8\uB2E4.\n *\n * @returns `results` \uBC30\uC5F4: commit\uB41C \uAC01 \uC791\uC5C5\uC758 `entity`, `action`, `seq`\n */\n transCommit(transactionId?: string): Promise<{\n ok: boolean;\n results: Array<{ entity: string; action: string; seq: number }>;\n }> {\n const txId = transactionId ?? this.activeTxId;\n if (!txId)\n return Promise.reject(\n new Error(\n \"No active transaction. Call transStart() first.\",\n ),\n );\n this.activeTxId = null;\n return this._request(\"POST\", `/v1/transaction/commit/${txId}`);\n }\n\n // \u2500\u2500\u2500 \uC5D4\uD2F0\uD2F0 CRUD \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** \uC5D4\uD2F0\uD2F0 \uC124\uC815 \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\n meta<T = unknown>(entity: string): Promise<{ ok: boolean; data: T }> {\n return this._request(\"POST\", `/v1/entity/${entity}/meta`, {});\n }\n\n /** \uC5D4\uD2F0\uD2F0 \uB370\uC774\uD130\uB97C \uC800\uC7A5 \uC5C6\uC774 \uAC80\uC99D\uD569\uB2C8\uB2E4. */\n validate<T = unknown>(\n entity: string,\n data: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(`/v1/entity/${entity}/validate`, data);\n }\n\n /** \uC2DC\uD000\uC2A4 ID\uB85C \uC5D4\uD2F0\uD2F0 \uB2E8\uAC74\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n get<T = unknown>(\n entity: string,\n seq: number,\n opts: { skipHooks?: boolean } = {},\n ): Promise<{ ok: boolean; data: T }> {\n const q = opts.skipHooks ? \"?skipHooks=true\" : \"\";\n return this._request(\"GET\", `/v1/entity/${entity}/${seq}${q}`);\n }\n\n /** \uC870\uAC74\uC73C\uB85C \uC5D4\uD2F0\uD2F0 \uB2E8\uAC74\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. data \uCEEC\uB7FC\uC744 \uC644\uC804\uD788 \uBCF5\uD638\uD654\uD558\uC5EC \uBC18\uD658\uD569\uB2C8\uB2E4. */\n find<T = unknown>(\n entity: string,\n conditions?: Record<string, unknown>,\n opts: { skipHooks?: boolean } = {},\n ): Promise<{ ok: boolean; data: T }> {\n const q = opts.skipHooks ? \"?skipHooks=true\" : \"\";\n return this._request(\n \"POST\",\n `/v1/entity/${entity}/find${q}`,\n conditions ?? {},\n );\n }\n\n /** \uD398\uC774\uC9C0\uB124\uC774\uC158/\uC815\uB82C/\uD544\uD130 \uC870\uAC74\uC73C\uB85C \uC5D4\uD2F0\uD2F0 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n list<T = unknown>(\n entity: string,\n params: EntityListParams = {},\n ): Promise<{ ok: boolean; data: EntityListResult<T> }> {\n const { conditions, fields, orderDir, orderBy, ...rest } = params;\n const queryObj: Record<string, unknown> = {\n page: 1,\n limit: 20,\n ...rest,\n };\n if (orderBy)\n queryObj.orderBy =\n orderDir === \"DESC\" ? `-${orderBy}` : orderBy;\n if (fields?.length) queryObj.fields = fields.join(\",\");\n return this._request(\n \"POST\",\n `/v1/entity/${entity}/list?${buildQuery(queryObj)}`,\n conditions ?? {},\n );\n }\n\n /**\n * \uC5D4\uD2F0\uD2F0 \uCD1D \uAC74\uC218\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4.\n *\n * @param conditions \uD544\uD130 \uC870\uAC74 (\uC608: `{ status: \"active\" }`)\n */\n count(\n entity: string,\n conditions?: Record<string, unknown>,\n ): Promise<{ ok: boolean; count: number }> {\n return this._request(\n \"POST\",\n `/v1/entity/${entity}/count`,\n conditions ?? {},\n );\n }\n\n /**\n * \uCEE4\uC2A4\uD140 SQL\uB85C \uC5D4\uD2F0\uD2F0\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4.\n *\n * SELECT \uC804\uC6A9\uC774\uBA70 \uC778\uB371\uC2A4 \uD14C\uC774\uBE14\uB9CC \uC870\uD68C \uAC00\uB2A5\uD569\uB2C8\uB2E4. JOIN \uC9C0\uC6D0.\n */\n query<T = unknown>(\n entity: string,\n req: EntityQueryRequest,\n ): Promise<{ ok: boolean; data: { items: T[]; count: number } }> {\n return this._request(\"POST\", `/v1/entity/${entity}/query`, req);\n }\n\n /** \uC5D4\uD2F0\uD2F0 \uB370\uC774\uD130\uB97C \uC0DD\uC131/\uC218\uC815(Submit)\uD569\uB2C8\uB2E4. `seq`\uAC00 \uC5C6\uC73C\uBA74 INSERT, \uC788\uC73C\uBA74 UPDATE\uC785\uB2C8\uB2E4. */\n submit(\n entity: string,\n data: Record<string, unknown>,\n opts: { transactionId?: string; skipHooks?: boolean } = {},\n ): Promise<{ ok: boolean; seq: number }> {\n const txId = opts.transactionId ?? this.activeTxId;\n const extraHeaders = txId\n ? { \"X-Transaction-ID\": txId }\n : undefined;\n const q = opts.skipHooks ? \"?skipHooks=true\" : \"\";\n return this._request(\n \"POST\",\n `/v1/entity/${entity}/submit${q}`,\n data,\n true,\n extraHeaders,\n );\n }\n\n /** \uC2DC\uD000\uC2A4 ID\uB85C \uC5D4\uD2F0\uD2F0\uB97C \uC0AD\uC81C\uD569\uB2C8\uB2E4(`hard=true`\uBA74 \uD558\uB4DC \uC0AD\uC81C, \uAE30\uBCF8\uC740 \uC18C\uD504\uD2B8 \uC0AD\uC81C). */\n delete(\n entity: string,\n seq: number,\n opts: {\n transactionId?: string;\n hard?: boolean;\n skipHooks?: boolean;\n } = {},\n ): Promise<{ ok: boolean; deleted: number }> {\n const params = new URLSearchParams();\n if (opts.hard) params.set(\"hard\", \"true\");\n if (opts.skipHooks) params.set(\"skipHooks\", \"true\");\n const q = params.size ? `?${params}` : \"\";\n const txId = opts.transactionId ?? this.activeTxId;\n const extraHeaders = txId\n ? { \"X-Transaction-ID\": txId }\n : undefined;\n return this._request(\n \"POST\",\n `/v1/entity/${entity}/delete/${seq}${q}`,\n undefined,\n true,\n extraHeaders,\n );\n }\n\n /** \uC5D4\uD2F0\uD2F0 \uB2E8\uAC74\uC758 \uBCC0\uACBD \uC774\uB825\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n history<T = unknown>(\n entity: string,\n seq: number,\n params: Pick<EntityListParams, \"page\" | \"limit\"> = {},\n ): Promise<{\n ok: boolean;\n data: EntityListResult<EntityHistoryRecord<T>>;\n }> {\n return this._request(\n \"GET\",\n `/v1/entity/${entity}/history/${seq}?${buildQuery({ page: 1, limit: 50, ...params })}`,\n );\n }\n\n /** \uD2B9\uC815 \uC774\uB825 \uC2DC\uC810\uC73C\uB85C \uC5D4\uD2F0\uD2F0\uB97C \uB864\uBC31\uD569\uB2C8\uB2E4. */\n rollback(entity: string, historySeq: number): Promise<{ ok: boolean }> {\n return this._request(\n \"POST\",\n `/v1/entity/${entity}/rollback/${historySeq}`,\n );\n }\n };\n}\n"],
5
+ "mappings": "AAMA,OAAS,cAAAA,MAAkB,wBAMpB,SAASC,EACZC,EACF,CACE,OAAO,cAA+BA,CAAK,CAIvC,MAAM,YAA8B,CAChC,MAAMC,EAAM,MAAM,KAAK,SAGpB,OAAQ,wBAAyB,OAAW,EAAK,EACpD,YAAK,WAAaA,EAAI,eACf,KAAK,UAChB,CAGA,cAAcC,EAAkD,CAC5D,MAAMC,EAAOD,GAAiB,KAAK,WACnC,OAAKC,GAML,KAAK,WAAa,KACX,KAAK,SAAS,OAAQ,4BAA4BA,CAAI,EAAE,GANpD,QAAQ,OACX,IAAI,MACA,iDACJ,CACJ,CAGR,CAOA,YAAYD,EAGT,CACC,MAAMC,EAAOD,GAAiB,KAAK,WACnC,OAAKC,GAML,KAAK,WAAa,KACX,KAAK,SAAS,OAAQ,0BAA0BA,CAAI,EAAE,GANlD,QAAQ,OACX,IAAI,MACA,iDACJ,CACJ,CAGR,CAKA,KAAkBC,EAAmD,CACjE,OAAO,KAAK,SAAS,OAAQ,cAAcA,CAAM,QAAS,CAAC,CAAC,CAChE,CAGA,SACIA,EACAC,EACU,CACV,OAAO,KAAK,KAAK,KAAK,cAAcD,CAAM,YAAaC,CAAI,CAC/D,CAGA,IACID,EACAE,EACAC,EAAgC,CAAC,EACA,CACjC,MAAMC,EAAID,EAAK,UAAY,kBAAoB,GAC/C,OAAO,KAAK,SAAS,MAAO,cAAcH,CAAM,IAAIE,CAAG,GAAGE,CAAC,EAAE,CACjE,CAGA,KACIJ,EACAK,EACAF,EAAgC,CAAC,EACA,CACjC,MAAMC,EAAID,EAAK,UAAY,kBAAoB,GAC/C,OAAO,KAAK,SACR,OACA,cAAcH,CAAM,QAAQI,CAAC,GAC7BC,GAAc,CAAC,CACnB,CACJ,CAGA,KACIL,EACAM,EAA2B,CAAC,EACuB,CACnD,KAAM,CAAE,WAAAD,EAAY,OAAAE,EAAQ,SAAAC,EAAU,QAAAC,EAAS,GAAGC,CAAK,EAAIJ,EACrDK,EAAoC,CACtC,KAAM,EACN,MAAO,GACP,GAAGD,CACP,EACA,OAAID,IACAE,EAAS,QACLH,IAAa,OAAS,IAAIC,CAAO,GAAKA,GAC1CF,GAAQ,SAAQI,EAAS,OAASJ,EAAO,KAAK,GAAG,GAC9C,KAAK,SACR,OACA,cAAcP,CAAM,SAASN,EAAWiB,CAAQ,CAAC,GACjDN,GAAc,CAAC,CACnB,CACJ,CAOA,MACIL,EACAK,EACuC,CACvC,OAAO,KAAK,SACR,OACA,cAAcL,CAAM,SACpBK,GAAc,CAAC,CACnB,CACJ,CAOA,MACIL,EACAY,EAC6D,CAC7D,OAAO,KAAK,SAAS,OAAQ,cAAcZ,CAAM,SAAUY,CAAG,CAClE,CAGA,OACIZ,EACAC,EACAE,EAAwD,CAAC,EACpB,CACrC,MAAMJ,EAAOI,EAAK,eAAiB,KAAK,WAClCU,EAAed,EACf,CAAE,mBAAoBA,CAAK,EAC3B,OACAK,EAAID,EAAK,UAAY,kBAAoB,GAC/C,OAAO,KAAK,SACR,OACA,cAAcH,CAAM,UAAUI,CAAC,GAC/BH,EACA,GACAY,CACJ,CACJ,CAGA,OACIb,EACAE,EACAC,EAII,CAAC,EACoC,CACzC,MAAMG,EAAS,IAAI,gBACfH,EAAK,MAAMG,EAAO,IAAI,OAAQ,MAAM,EACpCH,EAAK,WAAWG,EAAO,IAAI,YAAa,MAAM,EAClD,MAAMF,EAAIE,EAAO,KAAO,IAAIA,CAAM,GAAK,GACjCP,EAAOI,EAAK,eAAiB,KAAK,WAClCU,EAAed,EACf,CAAE,mBAAoBA,CAAK,EAC3B,OACN,OAAO,KAAK,SACR,OACA,cAAcC,CAAM,WAAWE,CAAG,GAAGE,CAAC,GACtC,OACA,GACAS,CACJ,CACJ,CAGA,QACIb,EACAE,EACAI,EAAmD,CAAC,EAIrD,CACC,OAAO,KAAK,SACR,MACA,cAAcN,CAAM,YAAYE,CAAG,IAAIR,EAAW,CAAE,KAAM,EAAG,MAAO,GAAI,GAAGY,CAAO,CAAC,CAAC,EACxF,CACJ,CAGA,SAASN,EAAgBc,EAA8C,CACnE,OAAO,KAAK,SACR,OACA,cAAcd,CAAM,aAAac,CAAU,EAC/C,CACJ,CACJ,CACJ",
6
+ "names": ["buildQuery", "EntityMixin", "Base", "res", "transactionId", "txId", "entity", "data", "seq", "opts", "q", "conditions", "params", "fields", "orderDir", "orderBy", "rest", "queryObj", "req", "extraHeaders", "historySeq"]
7
+ }
@@ -1,5 +1,5 @@
1
- import type { FileMeta, FileUploadOptions } from "../types.js";
2
- import type { GConstructor, EntityServerClientBase } from "../client/base.js";
1
+ import type { FileMeta, FileUploadOptions } from "../../types.js";
2
+ import type { GConstructor, EntityServerClientBase } from "../../client/base.js";
3
3
  export declare function FileMixin<TBase extends GConstructor<EntityServerClientBase>>(Base: TBase): {
4
4
  new (...args: any[]): {
5
5
  /**
@@ -57,10 +57,9 @@ export declare function FileMixin<TBase extends GConstructor<EntityServerClientB
57
57
  hmacSecret: string;
58
58
  encryptRequests: boolean;
59
59
  csrfEnabled: boolean;
60
- csrfToken: string;
61
60
  csrfHeaderName: string;
62
- csrfRefreshPath: string;
63
- csrfRefreshBuffer: number;
61
+ csrfCookieName: string;
62
+ _csrfRefresher: (() => Promise<void>) | null;
64
63
  activeTxId: string | null;
65
64
  keepSession: boolean;
66
65
  refreshBuffer: number;
@@ -68,30 +67,33 @@ export declare function FileMixin<TBase extends GConstructor<EntityServerClientB
68
67
  onSessionExpired?: (error: Error) => void;
69
68
  _sessionRefreshToken: string | null;
70
69
  _refreshTimer: ReturnType<typeof setTimeout> | null;
71
- _csrfRefreshTimer: ReturnType<typeof setTimeout> | null;
72
- _csrfRefreshPromise: Promise<string> | null;
73
- configure(options: Partial<import("../types.js").EntityServerClientOptions>): void;
70
+ _healthTickTimer: ReturnType<typeof setInterval> | null;
71
+ _healthTickPromise: Promise<unknown> | null;
72
+ configure(options: Partial<import("../../types.js").EntityServerClientOptions>): void;
74
73
  setToken(token: string): void;
75
74
  setAnonymousPacketToken(token: string): void;
76
75
  setApiKey(apiKey: string): void;
77
76
  setHmacSecret(secret: string): void;
78
77
  setEncryptRequests(value: boolean): void;
79
- setCsrfToken(token: string): void;
80
78
  setCsrfEnabled(enabled: boolean): void;
79
+ startHealthTick(intervalMs?: number): void;
80
+ stopHealthTick(): void;
81
81
  _scheduleKeepSession(refreshToken: string, expiresIn: number, refreshFn: (rt: string) => Promise<{
82
82
  access_token: string;
83
83
  expires_in: number;
84
84
  }>): void;
85
85
  _clearRefreshTimer(): void;
86
86
  stopKeepSession(): void;
87
- _clearCsrfRefreshTimer(): void;
88
- stopCsrfRefresh(): void;
89
- _scheduleCsrfRefresh(expiresIn: number): void;
90
- refreshCsrfToken(): Promise<string>;
91
- _applyCsrfHealth(csrf?: import("../types.js").EntityServerClientHealthCsrf | null): void;
87
+ _applyCsrfHealth(): void;
92
88
  readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
93
- get _reqOpts(): import("../client/request.js").RequestOptions;
94
- requestJson<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
89
+ get _reqOpts(): import("../../client/request.js").RequestOptions;
90
+ get http(): {
91
+ get<T>(path: string, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
92
+ post<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
93
+ put<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
94
+ patch<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
95
+ delete<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
96
+ };
95
97
  requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
96
98
  requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
97
99
  requestFormBinary(method: string, path: string, form: FormData, withAuth?: boolean): Promise<ArrayBuffer>;
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/mixins/server/file.ts"],
4
+ "sourcesContent": ["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"],
5
+ "mappings": "AAGO,SAASA,EACZC,EACF,CACE,OAAO,cAA6BA,CAAK,CAYrC,MAAM,WACFC,EACAC,EACAC,EAA0B,CAAC,EAC2B,CACtD,MAAMC,EAAO,IAAI,SACjB,OAAAA,EAAK,OACD,OACAF,EACAA,aAAgB,KAAOA,EAAK,KAAO,QACvC,EACIC,EAAK,QAAU,MACfC,EAAK,OAAO,UAAW,OAAOD,EAAK,MAAM,CAAC,EAC1CA,EAAK,UAAY,MACjBC,EAAK,OAAO,YAAaD,EAAK,SAAW,OAAS,OAAO,EACtD,KAAK,aACR,OACA,aAAaF,CAAM,UACnBG,CACJ,CACJ,CAGA,aAAaH,EAAgBI,EAAoC,CAC7D,OAAO,KAAK,eACR,OACA,aAAaJ,CAAM,aAAaI,CAAI,GACpC,CAAC,CACL,CACJ,CAGA,WACIJ,EACAI,EACwD,CACxD,OAAO,KAAK,SACR,OACA,aAAaJ,CAAM,WAAWI,CAAI,GAClC,CAAC,CACL,CACJ,CAGA,SACIJ,EACAE,EAA4B,CAAC,EAI9B,CACC,OAAO,KAAK,SACR,OACA,aAAaF,CAAM,QACnBE,EAAK,OAAS,CAAE,QAASA,EAAK,MAAO,EAAI,CAAC,CAC9C,CACJ,CAGA,SACIF,EACAI,EACwC,CACxC,OAAO,KAAK,SACR,OACA,aAAaJ,CAAM,SAASI,CAAI,GAChC,CAAC,CACL,CACJ,CAGA,UAAUA,EAAuD,CAC7D,OAAO,KAAK,SAAS,OAAQ,mBAAmBA,CAAI,GAAI,CAAC,CAAC,CAC9D,CAGA,YAAYA,EAAcF,EAA+B,CAAC,EAAW,CACjE,MAAMG,EAAKH,EAAK,SAAW,iBAAmB,GAC9C,MAAO,GAAG,KAAK,OAAO,aAAaE,CAAI,GAAGC,CAAE,EAChD,CAGA,QAAQD,EAAsB,CAC1B,MAAO,GAAG,KAAK,OAAO,aAAaA,CAAI,EAC3C,CACJ,CACJ",
6
+ "names": ["FileMixin", "Base", "entity", "file", "opts", "form", "uuid", "qs"]
7
+ }
@@ -1,7 +1,8 @@
1
- export { AuthMixin } from "../auth.js";
2
- export { EntityMixin } from "../entity.js";
3
- export { FileMixin } from "../file.js";
4
- export { PushMixin } from "../push.js";
5
- export { SmtpMixin } from "../smtp.js";
6
- export { UtilsMixin } from "../utils.js";
1
+ export { AuthMixin } from "./auth.js";
2
+ export { EntityMixin } from "./entity.js";
3
+ export { FileMixin } from "./file.js";
4
+ export { PushMixin } from "./push.js";
5
+ export { SmtpMixin } from "./smtp.js";
6
+ export { TransactionMixin } from "./transaction.js";
7
+ export { UtilsMixin } from "./utils.js";
7
8
  export { AdminMixin } from "./admin.js";
@@ -1,2 +1,2 @@
1
- import{AuthMixin as r}from"../auth.js";import{EntityMixin as t}from"../entity.js";import{FileMixin as n}from"../file.js";import{PushMixin as p}from"../push.js";import{SmtpMixin as M}from"../smtp.js";import{UtilsMixin as l}from"../utils.js";import{AdminMixin as u}from"./admin.js";export{u as AdminMixin,r as AuthMixin,t as EntityMixin,n as FileMixin,p as PushMixin,M as SmtpMixin,l as UtilsMixin};
1
+ import{AuthMixin as r}from"./auth.js";import{EntityMixin as t}from"./entity.js";import{FileMixin as m}from"./file.js";import{PushMixin as p}from"./push.js";import{SmtpMixin as M}from"./smtp.js";import{TransactionMixin as a}from"./transaction.js";import{UtilsMixin as l}from"./utils.js";import{AdminMixin as A}from"./admin.js";export{A as AdminMixin,r as AuthMixin,t as EntityMixin,m as FileMixin,p as PushMixin,M as SmtpMixin,a as TransactionMixin,l as UtilsMixin};
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/mixins/server/index.ts"],
4
- "sourcesContent": ["export { AuthMixin } from \"../auth.js\";\nexport { EntityMixin } from \"../entity.js\";\nexport { FileMixin } from \"../file.js\";\nexport { PushMixin } from \"../push.js\";\nexport { SmtpMixin } from \"../smtp.js\";\nexport { UtilsMixin } from \"../utils.js\";\nexport { AdminMixin } from \"./admin.js\";\n"],
5
- "mappings": "AAAA,OAAS,aAAAA,MAAiB,aAC1B,OAAS,eAAAC,MAAmB,eAC5B,OAAS,aAAAC,MAAiB,aAC1B,OAAS,aAAAC,MAAiB,aAC1B,OAAS,aAAAC,MAAiB,aAC1B,OAAS,cAAAC,MAAkB,cAC3B,OAAS,cAAAC,MAAkB",
6
- "names": ["AuthMixin", "EntityMixin", "FileMixin", "PushMixin", "SmtpMixin", "UtilsMixin", "AdminMixin"]
4
+ "sourcesContent": ["export { AuthMixin } from \"./auth.js\";\nexport { EntityMixin } from \"./entity.js\";\nexport { FileMixin } from \"./file.js\";\nexport { PushMixin } from \"./push.js\";\nexport { SmtpMixin } from \"./smtp.js\";\nexport { TransactionMixin } from \"./transaction.js\";\nexport { UtilsMixin } from \"./utils.js\";\nexport { AdminMixin } from \"./admin.js\";\n"],
5
+ "mappings": "AAAA,OAAS,aAAAA,MAAiB,YAC1B,OAAS,eAAAC,MAAmB,cAC5B,OAAS,aAAAC,MAAiB,YAC1B,OAAS,aAAAC,MAAiB,YAC1B,OAAS,aAAAC,MAAiB,YAC1B,OAAS,oBAAAC,MAAwB,mBACjC,OAAS,cAAAC,MAAkB,aAC3B,OAAS,cAAAC,MAAkB",
6
+ "names": ["AuthMixin", "EntityMixin", "FileMixin", "PushMixin", "SmtpMixin", "TransactionMixin", "UtilsMixin", "AdminMixin"]
7
7
  }
@@ -1,5 +1,5 @@
1
- import type { EntityListParams, EntityListResult, RegisterPushDeviceOptions } from "../types.js";
2
- import type { GConstructor, EntityServerClientBase } from "../client/base.js";
1
+ import type { EntityListParams, EntityListResult, RegisterPushDeviceOptions } from "../../types.js";
2
+ import type { GConstructor, EntityServerClientBase } from "../../client/base.js";
3
3
  type WithSubmit = EntityServerClientBase & {
4
4
  submit(entity: string, data: Record<string, unknown>, opts?: {
5
5
  transactionId?: string;
@@ -57,10 +57,9 @@ export declare function PushMixin<TBase extends GConstructor<WithSubmit>>(Base:
57
57
  hmacSecret: string;
58
58
  encryptRequests: boolean;
59
59
  csrfEnabled: boolean;
60
- csrfToken: string;
61
60
  csrfHeaderName: string;
62
- csrfRefreshPath: string;
63
- csrfRefreshBuffer: number;
61
+ csrfCookieName: string;
62
+ _csrfRefresher: (() => Promise<void>) | null;
64
63
  activeTxId: string | null;
65
64
  keepSession: boolean;
66
65
  refreshBuffer: number;
@@ -68,30 +67,33 @@ export declare function PushMixin<TBase extends GConstructor<WithSubmit>>(Base:
68
67
  onSessionExpired?: (error: Error) => void;
69
68
  _sessionRefreshToken: string | null;
70
69
  _refreshTimer: ReturnType<typeof setTimeout> | null;
71
- _csrfRefreshTimer: ReturnType<typeof setTimeout> | null;
72
- _csrfRefreshPromise: Promise<string> | null;
73
- configure(options: Partial<import("../types.js").EntityServerClientOptions>): void;
70
+ _healthTickTimer: ReturnType<typeof setInterval> | null;
71
+ _healthTickPromise: Promise<unknown> | null;
72
+ configure(options: Partial<import("../../types.js").EntityServerClientOptions>): void;
74
73
  setToken(token: string): void;
75
74
  setAnonymousPacketToken(token: string): void;
76
75
  setApiKey(apiKey: string): void;
77
76
  setHmacSecret(secret: string): void;
78
77
  setEncryptRequests(value: boolean): void;
79
- setCsrfToken(token: string): void;
80
78
  setCsrfEnabled(enabled: boolean): void;
79
+ startHealthTick(intervalMs?: number): void;
80
+ stopHealthTick(): void;
81
81
  _scheduleKeepSession(refreshToken: string, expiresIn: number, refreshFn: (rt: string) => Promise<{
82
82
  access_token: string;
83
83
  expires_in: number;
84
84
  }>): void;
85
85
  _clearRefreshTimer(): void;
86
86
  stopKeepSession(): void;
87
- _clearCsrfRefreshTimer(): void;
88
- stopCsrfRefresh(): void;
89
- _scheduleCsrfRefresh(expiresIn: number): void;
90
- refreshCsrfToken(): Promise<string>;
91
- _applyCsrfHealth(csrf?: import("../types.js").EntityServerClientHealthCsrf | null): void;
87
+ _applyCsrfHealth(): void;
92
88
  readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
93
- get _reqOpts(): import("../client/request.js").RequestOptions;
94
- requestJson<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
89
+ get _reqOpts(): import("../../client/request.js").RequestOptions;
90
+ get http(): {
91
+ get<T>(path: string, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
92
+ post<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
93
+ put<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
94
+ patch<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
95
+ delete<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
96
+ };
95
97
  requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
96
98
  requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
97
99
  requestFormBinary(method: string, path: string, form: FormData, withAuth?: boolean): Promise<ArrayBuffer>;
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/mixins/server/push.ts"],
4
+ "sourcesContent": ["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"],
5
+ "mappings": "AAoBO,SAASA,EAAkDC,EAAa,CAC3E,OAAO,cAA6BA,CAAK,CAOrC,KACIC,EACAC,EACAC,EAAmC,CAAC,EACC,CACrC,OAAO,KAAK,OAAOF,EAAYC,EAASC,CAAI,CAChD,CAKA,YACIC,EAA2B,CAAC,EACuB,CACnD,OAAO,KAAK,KAAQ,WAAYA,CAAM,CAC1C,CAGA,mBACIC,EACAC,EACAC,EACAJ,EAAkC,CAAC,EACE,CACrC,KAAM,CACF,SAAAK,EACA,WAAAC,EACA,QAAAC,EACA,eAAAC,EACA,YAAAC,EAAc,GACd,cAAAC,CACJ,EAAIV,EACJ,OAAO,KAAK,OACR,iBACA,CACI,GAAIG,EACJ,YAAaD,EACb,WAAYE,EACZ,aAAcK,EACd,GAAIJ,EAAW,CAAE,SAAAA,CAAS,EAAI,CAAC,EAC/B,GAAIC,EAAa,CAAE,YAAaA,CAAW,EAAI,CAAC,EAChD,GAAIC,EAAU,CAAE,QAAAA,CAAQ,EAAI,CAAC,EAC7B,GAAIC,EACE,CAAE,gBAAiBA,CAAe,EAClC,CAAC,CACX,EACA,CAAE,cAAAE,CAAc,CACpB,CACJ,CAGA,sBACIC,EACAP,EACAJ,EAA0D,CAAC,EACtB,CACrC,KAAM,CAAE,YAAAS,EAAc,GAAM,cAAAC,CAAc,EAAIV,EAC9C,OAAO,KAAK,OACR,iBACA,CACI,IAAKW,EACL,WAAYP,EACZ,aAAcK,CAClB,EACA,CAAE,cAAAC,CAAc,CACpB,CACJ,CAGA,kBACIC,EACAX,EAAmC,CAAC,EACC,CACrC,OAAO,KAAK,OACR,iBACA,CAAE,IAAKW,EAAW,aAAc,EAAM,EACtC,CAAE,cAAeX,EAAK,aAAc,CACxC,CACJ,CACJ,CACJ",
6
+ "names": ["PushMixin", "Base", "pushEntity", "payload", "opts", "params", "accountSeq", "deviceId", "pushToken", "platform", "deviceType", "browser", "browserVersion", "pushEnabled", "transactionId", "deviceSeq"]
7
+ }
@@ -1,5 +1,5 @@
1
- import type { SmtpSendRequest } from "../types.js";
2
- import type { GConstructor, EntityServerClientBase } from "../client/base.js";
1
+ import type { SmtpSendRequest } from "../../types.js";
2
+ import type { GConstructor, EntityServerClientBase } from "../../client/base.js";
3
3
  export declare function SmtpMixin<TBase extends GConstructor<EntityServerClientBase>>(Base: TBase): {
4
4
  new (...args: any[]): {
5
5
  /** SMTP로 메일을 발송합니다. */
@@ -12,6 +12,8 @@ export declare function SmtpMixin<TBase extends GConstructor<EntityServerClientB
12
12
  ok: boolean;
13
13
  status: string;
14
14
  }>;
15
+ /** SMTP 템플릿 미리보기 HTML을 반환합니다. */
16
+ smtpTemplatePreview(templatePath: string): Promise<string>;
15
17
  baseUrl: string;
16
18
  token: string;
17
19
  anonymousPacketToken: string;
@@ -19,10 +21,9 @@ export declare function SmtpMixin<TBase extends GConstructor<EntityServerClientB
19
21
  hmacSecret: string;
20
22
  encryptRequests: boolean;
21
23
  csrfEnabled: boolean;
22
- csrfToken: string;
23
24
  csrfHeaderName: string;
24
- csrfRefreshPath: string;
25
- csrfRefreshBuffer: number;
25
+ csrfCookieName: string;
26
+ _csrfRefresher: (() => Promise<void>) | null;
26
27
  activeTxId: string | null;
27
28
  keepSession: boolean;
28
29
  refreshBuffer: number;
@@ -30,30 +31,33 @@ export declare function SmtpMixin<TBase extends GConstructor<EntityServerClientB
30
31
  onSessionExpired?: (error: Error) => void;
31
32
  _sessionRefreshToken: string | null;
32
33
  _refreshTimer: ReturnType<typeof setTimeout> | null;
33
- _csrfRefreshTimer: ReturnType<typeof setTimeout> | null;
34
- _csrfRefreshPromise: Promise<string> | null;
35
- configure(options: Partial<import("../types.js").EntityServerClientOptions>): void;
34
+ _healthTickTimer: ReturnType<typeof setInterval> | null;
35
+ _healthTickPromise: Promise<unknown> | null;
36
+ configure(options: Partial<import("../../types.js").EntityServerClientOptions>): void;
36
37
  setToken(token: string): void;
37
38
  setAnonymousPacketToken(token: string): void;
38
39
  setApiKey(apiKey: string): void;
39
40
  setHmacSecret(secret: string): void;
40
41
  setEncryptRequests(value: boolean): void;
41
- setCsrfToken(token: string): void;
42
42
  setCsrfEnabled(enabled: boolean): void;
43
+ startHealthTick(intervalMs?: number): void;
44
+ stopHealthTick(): void;
43
45
  _scheduleKeepSession(refreshToken: string, expiresIn: number, refreshFn: (rt: string) => Promise<{
44
46
  access_token: string;
45
47
  expires_in: number;
46
48
  }>): void;
47
49
  _clearRefreshTimer(): void;
48
50
  stopKeepSession(): void;
49
- _clearCsrfRefreshTimer(): void;
50
- stopCsrfRefresh(): void;
51
- _scheduleCsrfRefresh(expiresIn: number): void;
52
- refreshCsrfToken(): Promise<string>;
53
- _applyCsrfHealth(csrf?: import("../types.js").EntityServerClientHealthCsrf | null): void;
51
+ _applyCsrfHealth(): void;
54
52
  readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
55
- get _reqOpts(): import("../client/request.js").RequestOptions;
56
- requestJson<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
53
+ get _reqOpts(): import("../../client/request.js").RequestOptions;
54
+ get http(): {
55
+ get<T>(path: string, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
56
+ post<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
57
+ put<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
58
+ patch<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
59
+ delete<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
60
+ };
57
61
  requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
58
62
  requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
59
63
  requestFormBinary(method: string, path: string, form: FormData, withAuth?: boolean): Promise<ArrayBuffer>;
@@ -0,0 +1,2 @@
1
+ function o(t){return class extends t{smtpSend(e){return this._request("POST","/v1/smtp/send",e)}smtpStatus(e){return this._request("POST",`/v1/smtp/status/${e}`,{})}smtpTemplatePreview(e){const s=e.split("/").map(encodeURIComponent).join("/");return fetch(`${this.baseUrl}/v1/smtp/template/${s}`,{credentials:"include"}).then(n=>n.text())}}}export{o as SmtpMixin};
2
+ //# sourceMappingURL=smtp.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/mixins/server/smtp.ts"],
4
+ "sourcesContent": ["import type { SmtpSendRequest } from \"../../types.js\";\nimport type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../client/base.js\";\n\nexport function SmtpMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class SmtpMixinClass extends Base {\n // \u2500\u2500\u2500 SMTP \uBA54\uC77C \uBC1C\uC1A1 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** SMTP\uB85C \uBA54\uC77C\uC744 \uBC1C\uC1A1\uD569\uB2C8\uB2E4. */\n smtpSend(req: SmtpSendRequest): Promise<{ ok: boolean; seq: number }> {\n return this._request(\"POST\", \"/v1/smtp/send\", req);\n }\n\n /** SMTP \uBC1C\uC1A1 \uC0C1\uD0DC\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\n smtpStatus(seq: number): Promise<{ ok: boolean; status: string }> {\n return this._request(\"POST\", `/v1/smtp/status/${seq}`, {});\n }\n\n /** SMTP \uD15C\uD50C\uB9BF \uBBF8\uB9AC\uBCF4\uAE30 HTML\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\n smtpTemplatePreview(templatePath: string): Promise<string> {\n const encoded = templatePath\n .split(\"/\")\n .map(encodeURIComponent)\n .join(\"/\");\n return fetch(`${this.baseUrl}/v1/smtp/template/${encoded}`, {\n credentials: \"include\",\n }).then((r) => r.text());\n }\n };\n}\n"],
5
+ "mappings": "AAMO,SAASA,EACZC,EACF,CACE,OAAO,cAA6BA,CAAK,CAIrC,SAASC,EAA6D,CAClE,OAAO,KAAK,SAAS,OAAQ,gBAAiBA,CAAG,CACrD,CAGA,WAAWC,EAAuD,CAC9D,OAAO,KAAK,SAAS,OAAQ,mBAAmBA,CAAG,GAAI,CAAC,CAAC,CAC7D,CAGA,oBAAoBC,EAAuC,CACvD,MAAMC,EAAUD,EACX,MAAM,GAAG,EACT,IAAI,kBAAkB,EACtB,KAAK,GAAG,EACb,OAAO,MAAM,GAAG,KAAK,OAAO,qBAAqBC,CAAO,GAAI,CACxD,YAAa,SACjB,CAAC,EAAE,KAAMC,GAAMA,EAAE,KAAK,CAAC,CAC3B,CACJ,CACJ",
6
+ "names": ["SmtpMixin", "Base", "req", "seq", "templatePath", "encoded", "r"]
7
+ }
@@ -0,0 +1,62 @@
1
+ import type { GConstructor, EntityServerClientBase } from "../../client/base.js";
2
+ export declare function TransactionMixin<TBase extends GConstructor<EntityServerClientBase>>(Base: TBase): {
3
+ new (...args: any[]): {
4
+ /** 트랜잭션을 시작하고 transaction_id를 반환합니다. */
5
+ transactionStart<T = unknown>(body?: Record<string, unknown>): Promise<T>;
6
+ /** 지정한 트랜잭션을 커밋합니다. */
7
+ transactionCommit<T = unknown>(transactionId: string): Promise<T>;
8
+ /** 지정한 트랜잭션을 롤백합니다. */
9
+ transactionRollback<T = unknown>(transactionId: string): Promise<T>;
10
+ baseUrl: string;
11
+ token: string;
12
+ anonymousPacketToken: string;
13
+ apiKey: string;
14
+ hmacSecret: string;
15
+ encryptRequests: boolean;
16
+ csrfEnabled: boolean;
17
+ csrfHeaderName: string;
18
+ csrfCookieName: string;
19
+ _csrfRefresher: (() => Promise<void>) | null;
20
+ activeTxId: string | null;
21
+ keepSession: boolean;
22
+ refreshBuffer: number;
23
+ onTokenRefreshed?: (accessToken: string, expiresIn: number) => void;
24
+ onSessionExpired?: (error: Error) => void;
25
+ _sessionRefreshToken: string | null;
26
+ _refreshTimer: ReturnType<typeof setTimeout> | null;
27
+ _healthTickTimer: ReturnType<typeof setInterval> | null;
28
+ _healthTickPromise: Promise<unknown> | null;
29
+ configure(options: Partial<import("../../types.js").EntityServerClientOptions>): void;
30
+ setToken(token: string): void;
31
+ setAnonymousPacketToken(token: string): void;
32
+ setApiKey(apiKey: string): void;
33
+ setHmacSecret(secret: string): void;
34
+ setEncryptRequests(value: boolean): void;
35
+ setCsrfEnabled(enabled: boolean): void;
36
+ startHealthTick(intervalMs?: number): void;
37
+ stopHealthTick(): void;
38
+ _scheduleKeepSession(refreshToken: string, expiresIn: number, refreshFn: (rt: string) => Promise<{
39
+ access_token: string;
40
+ expires_in: number;
41
+ }>): void;
42
+ _clearRefreshTimer(): void;
43
+ stopKeepSession(): void;
44
+ _applyCsrfHealth(): void;
45
+ readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
46
+ get _reqOpts(): import("../../client/request.js").RequestOptions;
47
+ get http(): {
48
+ get<T>(path: string, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
49
+ post<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
50
+ put<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
51
+ patch<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
52
+ delete<T>(path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
53
+ };
54
+ requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
55
+ requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
56
+ requestFormBinary(method: string, path: string, form: FormData, withAuth?: boolean): Promise<ArrayBuffer>;
57
+ _request<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
58
+ _requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
59
+ _requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
60
+ _requestFormBinary(method: string, path: string, form: FormData, withAuth?: boolean): Promise<ArrayBuffer>;
61
+ };
62
+ } & TBase;