entity-client 1.0.21 → 1.0.23

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 (76) hide show
  1. package/README.md +362 -362
  2. package/dist/EntityAppServerApi.d.ts +16 -16
  3. package/dist/EntityAppServerApi.js.map +1 -1
  4. package/dist/EntityServerApi.d.ts +8 -8
  5. package/dist/EntityServerApi.js.map +1 -1
  6. package/dist/client/base.d.ts +1 -1
  7. package/dist/client/base.js +1 -1
  8. package/dist/client/base.js.map +3 -3
  9. package/dist/client/hmac.js.map +1 -1
  10. package/dist/client/packet.js.map +1 -1
  11. package/dist/client/request.d.ts +2 -0
  12. package/dist/client/request.js +1 -1
  13. package/dist/client/request.js.map +3 -3
  14. package/dist/client/utils.js.map +1 -1
  15. package/dist/hooks/useEntityAppServer.js.map +1 -1
  16. package/dist/hooks/useEntityClient.js.map +1 -1
  17. package/dist/hooks/useEntityServer.js.map +1 -1
  18. package/dist/index.js +1 -1
  19. package/dist/index.js.map +3 -3
  20. package/dist/mixins/app/index.js.map +1 -1
  21. package/dist/mixins/app/plugins/alimtalk.d.ts +1 -1
  22. package/dist/mixins/app/plugins/alimtalk.js.map +1 -1
  23. package/dist/mixins/app/plugins/friendtalk.d.ts +1 -1
  24. package/dist/mixins/app/plugins/friendtalk.js.map +1 -1
  25. package/dist/mixins/app/plugins/holidays.d.ts +1 -1
  26. package/dist/mixins/app/plugins/holidays.js.map +1 -1
  27. package/dist/mixins/app/plugins/identity.d.ts +1 -1
  28. package/dist/mixins/app/plugins/identity.js.map +1 -1
  29. package/dist/mixins/app/plugins/index.js.map +1 -1
  30. package/dist/mixins/app/plugins/llm.d.ts +1 -1
  31. package/dist/mixins/app/plugins/llm.js.map +1 -1
  32. package/dist/mixins/app/plugins/ocr.d.ts +1 -1
  33. package/dist/mixins/app/plugins/ocr.js.map +1 -1
  34. package/dist/mixins/app/plugins/pg.d.ts +1 -1
  35. package/dist/mixins/app/plugins/pg.js.map +1 -1
  36. package/dist/mixins/app/plugins/push.d.ts +1 -1
  37. package/dist/mixins/app/plugins/push.js.map +1 -1
  38. package/dist/mixins/app/plugins/sms.d.ts +1 -1
  39. package/dist/mixins/app/plugins/sms.js.map +1 -1
  40. package/dist/mixins/app/plugins/taxinvoice.d.ts +1 -1
  41. package/dist/mixins/app/plugins/taxinvoice.js.map +1 -1
  42. package/dist/mixins/app/routes/account.d.ts +1 -1
  43. package/dist/mixins/app/routes/account.js.map +1 -1
  44. package/dist/mixins/app/routes/board.d.ts +1 -1
  45. package/dist/mixins/app/routes/board.js.map +1 -1
  46. package/dist/mixins/app/routes/email-verify.d.ts +1 -1
  47. package/dist/mixins/app/routes/email-verify.js.map +1 -1
  48. package/dist/mixins/app/routes/oauth.d.ts +1 -1
  49. package/dist/mixins/app/routes/oauth.js.map +1 -1
  50. package/dist/mixins/app/routes/password-reset.d.ts +1 -1
  51. package/dist/mixins/app/routes/password-reset.js.map +1 -1
  52. package/dist/mixins/app/routes/two-factor.d.ts +1 -1
  53. package/dist/mixins/app/routes/two-factor.js.map +1 -1
  54. package/dist/mixins/server/admin.d.ts +1 -1
  55. package/dist/mixins/server/admin.js.map +1 -1
  56. package/dist/mixins/server/auth.d.ts +1 -1
  57. package/dist/mixins/server/auth.js +1 -1
  58. package/dist/mixins/server/auth.js.map +2 -2
  59. package/dist/mixins/server/entity.d.ts +1 -1
  60. package/dist/mixins/server/entity.js.map +1 -1
  61. package/dist/mixins/server/file.d.ts +1 -1
  62. package/dist/mixins/server/file.js.map +1 -1
  63. package/dist/mixins/server/index.js.map +1 -1
  64. package/dist/mixins/server/push.d.ts +1 -1
  65. package/dist/mixins/server/push.js.map +1 -1
  66. package/dist/mixins/server/smtp.d.ts +1 -1
  67. package/dist/mixins/server/smtp.js.map +1 -1
  68. package/dist/mixins/server/transaction.d.ts +1 -1
  69. package/dist/mixins/server/transaction.js.map +1 -1
  70. package/dist/mixins/server/utils.d.ts +1 -1
  71. package/dist/mixins/server/utils.js.map +1 -1
  72. package/dist/packet.js.map +1 -1
  73. package/dist/react.js +1 -1
  74. package/dist/react.js.map +3 -3
  75. package/dist/types.d.ts +0 -1
  76. package/package.json +57 -57
@@ -16,6 +16,7 @@ export declare function EmailVerifyMixin<TBase extends GConstructor<EntityServer
16
16
  csrfHeaderName: string;
17
17
  csrfCookieName: string;
18
18
  csrfRefresher: (() => Promise<void>) | null;
19
+ requestAbortControllers: Map<string, AbortController>;
19
20
  activeTxId: string | null;
20
21
  keepSession: boolean;
21
22
  refreshBuffer: number;
@@ -28,7 +29,6 @@ export declare function EmailVerifyMixin<TBase extends GConstructor<EntityServer
28
29
  healthTickPromise: Promise<unknown> | null;
29
30
  realtimeEnabled: boolean;
30
31
  realtimePath: string;
31
- realtimeAutoConnect: boolean;
32
32
  realtimeAutoReconnect: boolean;
33
33
  realtimeReconnectDelayMs: number;
34
34
  realtimeStatus: import("../../../types.js").RealtimeConnectionStatus;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/mixins/app/routes/email-verify.ts"],
4
- "sourcesContent": ["import { buildQuery } from \"../../../client/utils.js\";\r\nimport type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function EmailVerifyMixin<\r\n TBase extends GConstructor<EntityServerClientBase>,\r\n>(Base: TBase) {\r\n return class EmailVerifyMixinClass extends Base {\r\n sendEmailVerification<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/email-verify/send\",\r\n body,\r\n false,\r\n );\r\n }\r\n\r\n confirmEmailVerification<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/email-verify/confirm\",\r\n body,\r\n false,\r\n );\r\n }\r\n\r\n activateEmailVerification<T = unknown>(\r\n query: Record<string, unknown>,\r\n ): Promise<T> {\r\n const qs = buildQuery(query);\r\n return this.http.get(\r\n `/v1/email-verify/activate${qs ? `?${qs}` : \"\"}`,\r\n false,\r\n );\r\n }\r\n\r\n getEmailVerificationStatus<T = unknown>(): Promise<T> {\r\n return this.http.get(\"/v1/email-verify/status\");\r\n }\r\n\r\n changeVerifiedEmail<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\"/v1/email-verify/change\", body);\r\n }\r\n };\r\n}\r\n"],
4
+ "sourcesContent": ["import { buildQuery } from \"../../../client/utils.js\";\nimport type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function EmailVerifyMixin<\n TBase extends GConstructor<EntityServerClientBase>,\n>(Base: TBase) {\n return class EmailVerifyMixinClass extends Base {\n sendEmailVerification<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/email-verify/send\",\n body,\n false,\n );\n }\n\n confirmEmailVerification<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/email-verify/confirm\",\n body,\n false,\n );\n }\n\n activateEmailVerification<T = unknown>(\n query: Record<string, unknown>,\n ): Promise<T> {\n const qs = buildQuery(query);\n return this.http.get(\n `/v1/email-verify/activate${qs ? `?${qs}` : \"\"}`,\n false,\n );\n }\n\n getEmailVerificationStatus<T = unknown>(): Promise<T> {\n return this.http.get(\"/v1/email-verify/status\");\n }\n\n changeVerifiedEmail<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\"/v1/email-verify/change\", body);\n }\n };\n}\n"],
5
5
  "mappings": "AAAA,OAAS,cAAAA,MAAkB,2BAMpB,SAASC,EAEdC,EAAa,CACX,OAAO,cAAoCA,CAAK,CAC5C,sBACIC,EACU,CACV,OAAO,KAAK,KAAK,KACb,wBACAA,EACA,EACJ,CACJ,CAEA,yBACIA,EACU,CACV,OAAO,KAAK,KAAK,KACb,2BACAA,EACA,EACJ,CACJ,CAEA,0BACIC,EACU,CACV,MAAMC,EAAKL,EAAWI,CAAK,EAC3B,OAAO,KAAK,KAAK,IACb,4BAA4BC,EAAK,IAAIA,CAAE,GAAK,EAAE,GAC9C,EACJ,CACJ,CAEA,4BAAsD,CAClD,OAAO,KAAK,KAAK,IAAI,yBAAyB,CAClD,CAEA,oBACIF,EACU,CACV,OAAO,KAAK,KAAK,KAAK,0BAA2BA,CAAI,CACzD,CACJ,CACJ",
6
6
  "names": ["buildQuery", "EmailVerifyMixin", "Base", "body", "query", "qs"]
7
7
  }
@@ -17,6 +17,7 @@ export declare function OAuthMixin<TBase extends GConstructor<EntityServerClient
17
17
  csrfHeaderName: string;
18
18
  csrfCookieName: string;
19
19
  csrfRefresher: (() => Promise<void>) | null;
20
+ requestAbortControllers: Map<string, AbortController>;
20
21
  activeTxId: string | null;
21
22
  keepSession: boolean;
22
23
  refreshBuffer: number;
@@ -29,7 +30,6 @@ export declare function OAuthMixin<TBase extends GConstructor<EntityServerClient
29
30
  healthTickPromise: Promise<unknown> | null;
30
31
  realtimeEnabled: boolean;
31
32
  realtimePath: string;
32
- realtimeAutoConnect: boolean;
33
33
  realtimeAutoReconnect: boolean;
34
34
  realtimeReconnectDelayMs: number;
35
35
  realtimeStatus: import("../../../types.js").RealtimeConnectionStatus;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/mixins/app/routes/oauth.ts"],
4
- "sourcesContent": ["import { buildQuery } from \"../../../client/utils.js\";\r\nimport type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function OAuthMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class OAuthMixinClass extends Base {\r\n oauthAuthorizeUrl(\r\n provider: string,\r\n query: Record<string, unknown> = {},\r\n ): string {\r\n const qs = buildQuery(query);\r\n return `${this.baseUrl}/v1/oauth/${provider}${qs ? `?${qs}` : \"\"}`;\r\n }\r\n\r\n oauthCallback<T = unknown>(\r\n provider: string,\r\n payload?: Record<string, unknown>,\r\n method: \"GET\" | \"POST\" = \"POST\",\r\n ): Promise<T> {\r\n if (method === \"GET\") {\r\n const qs = buildQuery(payload ?? {});\r\n return this.http.get(\r\n `/v1/oauth/${provider}/callback${qs ? `?${qs}` : \"\"}`,\r\n false,\r\n );\r\n }\r\n\r\n return this.http.post(\r\n `/v1/oauth/${provider}/callback`,\r\n payload,\r\n false,\r\n );\r\n }\r\n\r\n linkOAuthAccount<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\"/v1/account/oauth/link\", body);\r\n }\r\n\r\n unlinkOAuthAccount<T = unknown>(provider: string): Promise<T> {\r\n return this.http.delete(\r\n `/v1/account/oauth/link/${provider}`,\r\n );\r\n }\r\n\r\n listOAuthProviders<T = unknown>(): Promise<T> {\r\n return this.http.get(\"/v1/account/oauth/providers\");\r\n }\r\n\r\n refreshOAuthProviderToken<T = unknown>(\r\n provider: string,\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n `/v1/account/oauth/refresh/${provider}`,\r\n body,\r\n );\r\n }\r\n };\r\n}\r\n"],
4
+ "sourcesContent": ["import { buildQuery } from \"../../../client/utils.js\";\nimport type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function OAuthMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class OAuthMixinClass extends Base {\n oauthAuthorizeUrl(\n provider: string,\n query: Record<string, unknown> = {},\n ): string {\n const qs = buildQuery(query);\n return `${this.baseUrl}/v1/oauth/${provider}${qs ? `?${qs}` : \"\"}`;\n }\n\n oauthCallback<T = unknown>(\n provider: string,\n payload?: Record<string, unknown>,\n method: \"GET\" | \"POST\" = \"POST\",\n ): Promise<T> {\n if (method === \"GET\") {\n const qs = buildQuery(payload ?? {});\n return this.http.get(\n `/v1/oauth/${provider}/callback${qs ? `?${qs}` : \"\"}`,\n false,\n );\n }\n\n return this.http.post(\n `/v1/oauth/${provider}/callback`,\n payload,\n false,\n );\n }\n\n linkOAuthAccount<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\"/v1/account/oauth/link\", body);\n }\n\n unlinkOAuthAccount<T = unknown>(provider: string): Promise<T> {\n return this.http.delete(\n `/v1/account/oauth/link/${provider}`,\n );\n }\n\n listOAuthProviders<T = unknown>(): Promise<T> {\n return this.http.get(\"/v1/account/oauth/providers\");\n }\n\n refreshOAuthProviderToken<T = unknown>(\n provider: string,\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n `/v1/account/oauth/refresh/${provider}`,\n body,\n );\n }\n };\n}\n"],
5
5
  "mappings": "AAAA,OAAS,cAAAA,MAAkB,2BAMpB,SAASC,EACZC,EACF,CACE,OAAO,cAA8BA,CAAK,CACtC,kBACIC,EACAC,EAAiC,CAAC,EAC5B,CACN,MAAMC,EAAKL,EAAWI,CAAK,EAC3B,MAAO,GAAG,KAAK,OAAO,aAAaD,CAAQ,GAAGE,EAAK,IAAIA,CAAE,GAAK,EAAE,EACpE,CAEA,cACIF,EACAG,EACAC,EAAyB,OACf,CACV,GAAIA,IAAW,MAAO,CAClB,MAAMF,EAAKL,EAAWM,GAAW,CAAC,CAAC,EACnC,OAAO,KAAK,KAAK,IACb,aAAaH,CAAQ,YAAYE,EAAK,IAAIA,CAAE,GAAK,EAAE,GACnD,EACJ,CACJ,CAEA,OAAO,KAAK,KAAK,KACb,aAAaF,CAAQ,YACrBG,EACA,EACJ,CACJ,CAEA,iBACIE,EACU,CACV,OAAO,KAAK,KAAK,KAAK,yBAA0BA,CAAI,CACxD,CAEA,mBAAgCL,EAA8B,CAC1D,OAAO,KAAK,KAAK,OACb,0BAA0BA,CAAQ,EACtC,CACJ,CAEA,oBAA8C,CAC1C,OAAO,KAAK,KAAK,IAAI,6BAA6B,CACtD,CAEA,0BACIA,EACAK,EACU,CACV,OAAO,KAAK,KAAK,KACb,6BAA6BL,CAAQ,GACrCK,CACJ,CACJ,CACJ,CACJ",
6
6
  "names": ["buildQuery", "OAuthMixin", "Base", "provider", "query", "qs", "payload", "method", "body"]
7
7
  }
@@ -16,6 +16,7 @@ export declare function PasswordResetMixin<TBase extends GConstructor<EntityServ
16
16
  csrfHeaderName: string;
17
17
  csrfCookieName: string;
18
18
  csrfRefresher: (() => Promise<void>) | null;
19
+ requestAbortControllers: Map<string, AbortController>;
19
20
  activeTxId: string | null;
20
21
  keepSession: boolean;
21
22
  refreshBuffer: number;
@@ -28,7 +29,6 @@ export declare function PasswordResetMixin<TBase extends GConstructor<EntityServ
28
29
  healthTickPromise: Promise<unknown> | null;
29
30
  realtimeEnabled: boolean;
30
31
  realtimePath: string;
31
- realtimeAutoConnect: boolean;
32
32
  realtimeAutoReconnect: boolean;
33
33
  realtimeReconnectDelayMs: number;
34
34
  realtimeStatus: import("../../../types.js").RealtimeConnectionStatus;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/mixins/app/routes/password-reset.ts"],
4
- "sourcesContent": ["import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function PasswordResetMixin<\r\n TBase extends GConstructor<EntityServerClientBase>,\r\n>(Base: TBase) {\r\n return class PasswordResetMixinClass extends Base {\r\n requestPasswordReset<T = unknown>(\r\n body: { email: string } | Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/password-reset/request\",\r\n body,\r\n false,\r\n );\r\n }\r\n\r\n validatePasswordResetToken<T = unknown>(token: string): Promise<T> {\r\n return this.http.get(\r\n `/v1/password-reset/validate/${encodeURIComponent(token)}`,\r\n false,\r\n );\r\n }\r\n\r\n verifyPasswordReset<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/password-reset/verify\",\r\n body,\r\n false,\r\n );\r\n }\r\n };\r\n}\r\n"],
4
+ "sourcesContent": ["import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function PasswordResetMixin<\n TBase extends GConstructor<EntityServerClientBase>,\n>(Base: TBase) {\n return class PasswordResetMixinClass extends Base {\n requestPasswordReset<T = unknown>(\n body: { email: string } | Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/password-reset/request\",\n body,\n false,\n );\n }\n\n validatePasswordResetToken<T = unknown>(token: string): Promise<T> {\n return this.http.get(\n `/v1/password-reset/validate/${encodeURIComponent(token)}`,\n false,\n );\n }\n\n verifyPasswordReset<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/password-reset/verify\",\n body,\n false,\n );\n }\n };\n}\n"],
5
5
  "mappings": "AAKO,SAASA,EAEdC,EAAa,CACX,OAAO,cAAsCA,CAAK,CAC9C,qBACIC,EACU,CACV,OAAO,KAAK,KAAK,KACb,6BACAA,EACA,EACJ,CACJ,CAEA,2BAAwCC,EAA2B,CAC/D,OAAO,KAAK,KAAK,IACb,+BAA+B,mBAAmBA,CAAK,CAAC,GACxD,EACJ,CACJ,CAEA,oBACID,EACU,CACV,OAAO,KAAK,KAAK,KACb,4BACAA,EACA,EACJ,CACJ,CACJ,CACJ",
6
6
  "names": ["PasswordResetMixin", "Base", "body", "token"]
7
7
  }
@@ -18,6 +18,7 @@ export declare function TwoFactorMixin<TBase extends GConstructor<EntityServerCl
18
18
  csrfHeaderName: string;
19
19
  csrfCookieName: string;
20
20
  csrfRefresher: (() => Promise<void>) | null;
21
+ requestAbortControllers: Map<string, AbortController>;
21
22
  activeTxId: string | null;
22
23
  keepSession: boolean;
23
24
  refreshBuffer: number;
@@ -30,7 +31,6 @@ export declare function TwoFactorMixin<TBase extends GConstructor<EntityServerCl
30
31
  healthTickPromise: Promise<unknown> | null;
31
32
  realtimeEnabled: boolean;
32
33
  realtimePath: string;
33
- realtimeAutoConnect: boolean;
34
34
  realtimeAutoReconnect: boolean;
35
35
  realtimeReconnectDelayMs: number;
36
36
  realtimeStatus: import("../../../types.js").RealtimeConnectionStatus;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/mixins/app/routes/two-factor.ts"],
4
- "sourcesContent": ["import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../../client/base.js\";\r\n\r\nexport function TwoFactorMixin<\r\n TBase extends GConstructor<EntityServerClientBase>,\r\n>(Base: TBase) {\r\n return class TwoFactorMixinClass extends Base {\r\n setupTwoFactor<T = unknown>(\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\"/v1/account/2fa/setup\", body);\r\n }\r\n\r\n verifyTwoFactorSetup<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/account/2fa/setup/verify\",\r\n body,\r\n false,\r\n );\r\n }\r\n\r\n disableTwoFactor<T = unknown>(): Promise<T> {\r\n return this.http.delete(\"/v1/account/2fa\");\r\n }\r\n\r\n getTwoFactorStatus<T = unknown>(): Promise<T> {\r\n return this.http.get(\"/v1/account/2fa/status\");\r\n }\r\n\r\n regenerateTwoFactorRecoveryCodes<T = unknown>(): Promise<T> {\r\n return this.http.post(\r\n \"/v1/account/2fa/recovery/regenerate\",\r\n );\r\n }\r\n\r\n verifyTwoFactor<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/account/2fa/verify\",\r\n body,\r\n false,\r\n );\r\n }\r\n\r\n recoverTwoFactorAccess<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(\r\n \"/v1/account/2fa/recovery\",\r\n body,\r\n false,\r\n );\r\n }\r\n };\r\n}\r\n"],
4
+ "sourcesContent": ["import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../../client/base.js\";\n\nexport function TwoFactorMixin<\n TBase extends GConstructor<EntityServerClientBase>,\n>(Base: TBase) {\n return class TwoFactorMixinClass extends Base {\n setupTwoFactor<T = unknown>(\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\"/v1/account/2fa/setup\", body);\n }\n\n verifyTwoFactorSetup<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/account/2fa/setup/verify\",\n body,\n false,\n );\n }\n\n disableTwoFactor<T = unknown>(): Promise<T> {\n return this.http.delete(\"/v1/account/2fa\");\n }\n\n getTwoFactorStatus<T = unknown>(): Promise<T> {\n return this.http.get(\"/v1/account/2fa/status\");\n }\n\n regenerateTwoFactorRecoveryCodes<T = unknown>(): Promise<T> {\n return this.http.post(\n \"/v1/account/2fa/recovery/regenerate\",\n );\n }\n\n verifyTwoFactor<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/account/2fa/verify\",\n body,\n false,\n );\n }\n\n recoverTwoFactorAccess<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.http.post(\n \"/v1/account/2fa/recovery\",\n body,\n false,\n );\n }\n };\n}\n"],
5
5
  "mappings": "AAKO,SAASA,EAEdC,EAAa,CACX,OAAO,cAAkCA,CAAK,CAC1C,eACIC,EACU,CACV,OAAO,KAAK,KAAK,KAAK,wBAAyBA,CAAI,CACvD,CAEA,qBACIA,EACU,CACV,OAAO,KAAK,KAAK,KACb,+BACAA,EACA,EACJ,CACJ,CAEA,kBAA4C,CACxC,OAAO,KAAK,KAAK,OAAO,iBAAiB,CAC7C,CAEA,oBAA8C,CAC1C,OAAO,KAAK,KAAK,IAAI,wBAAwB,CACjD,CAEA,kCAA4D,CACxD,OAAO,KAAK,KAAK,KACb,qCACJ,CACJ,CAEA,gBACIA,EACU,CACV,OAAO,KAAK,KAAK,KACb,yBACAA,EACA,EACJ,CACJ,CAEA,uBACIA,EACU,CACV,OAAO,KAAK,KAAK,KACb,2BACAA,EACA,EACJ,CACJ,CACJ,CACJ",
6
6
  "names": ["TwoFactorMixin", "Base", "body"]
7
7
  }
@@ -62,6 +62,7 @@ export declare function AdminMixin<TBase extends GConstructor<EntityServerClient
62
62
  csrfHeaderName: string;
63
63
  csrfCookieName: string;
64
64
  csrfRefresher: (() => Promise<void>) | null;
65
+ requestAbortControllers: Map<string, AbortController>;
65
66
  activeTxId: string | null;
66
67
  keepSession: boolean;
67
68
  refreshBuffer: number;
@@ -74,7 +75,6 @@ export declare function AdminMixin<TBase extends GConstructor<EntityServerClient
74
75
  healthTickPromise: Promise<unknown> | null;
75
76
  realtimeEnabled: boolean;
76
77
  realtimePath: string;
77
- realtimeAutoConnect: boolean;
78
78
  realtimeAutoReconnect: boolean;
79
79
  realtimeReconnectDelayMs: number;
80
80
  realtimeStatus: import("../../types.js").RealtimeConnectionStatus;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/mixins/server/admin.ts"],
4
- "sourcesContent": ["import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../client/base.js\";\r\n\r\nexport function AdminMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class AdminMixinClass extends Base {\r\n adminPath(path: string): string {\r\n return `/v1/admin${path}`;\r\n }\r\n\r\n adminGet<T>(path: string): Promise<T> {\r\n return this.http.get(this.adminPath(path));\r\n }\r\n\r\n adminPost<T>(path: string, body?: unknown): Promise<T> {\r\n return this.http.post(this.adminPath(path), body);\r\n }\r\n\r\n adminPut<T>(path: string, body?: unknown): Promise<T> {\r\n return this.http.put(this.adminPath(path), body);\r\n }\r\n\r\n adminPatch<T>(path: string, body?: unknown): Promise<T> {\r\n return this.http.patch(this.adminPath(path), body);\r\n }\r\n\r\n adminDelete<T>(path: string, body?: unknown): Promise<T> {\r\n return this.http.delete(this.adminPath(path), body);\r\n }\r\n\r\n listAdminEntities<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/entities\");\r\n }\r\n\r\n getAdminErdSchema<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/erd/schema\");\r\n }\r\n\r\n batchEnsureAdminEntities<T = unknown>(configs: unknown[]): Promise<T> {\r\n return this.adminPost(\"/entities/batch-ensure\", configs);\r\n }\r\n\r\n createAdminEntityConfig<T = unknown>(\r\n entity: string,\r\n config: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(`/${entity}/create`, config);\r\n }\r\n\r\n getAdminEntityConfig<T = unknown>(entity: string): Promise<T> {\r\n return this.adminGet(`/${entity}/config`);\r\n }\r\n\r\n updateAdminEntityConfig<T = unknown>(\r\n entity: string,\r\n config: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPut(`/${entity}/config`, config);\r\n }\r\n\r\n validateAdminEntityConfig<T = unknown>(\r\n config: Record<string, unknown>,\r\n entity?: string,\r\n ): Promise<T> {\r\n return this.adminPost(\r\n entity ? `/${entity}/validate` : \"/entity/validate\",\r\n config,\r\n );\r\n }\r\n\r\n normalizeAdminEntityConfig<T = unknown>(\r\n config: Record<string, unknown>,\r\n entity?: string,\r\n ): Promise<T> {\r\n return this.adminPost(\r\n entity ? `/${entity}/normalize` : \"/entity/normalize\",\r\n config,\r\n );\r\n }\r\n\r\n getAdminEntityStats<T = unknown>(\r\n entity: string,\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(`/${entity}/stats`, body);\r\n }\r\n\r\n reindexAdminEntity<T = unknown>(entity: string): Promise<T> {\r\n return this.adminPost(`/${entity}/reindex`);\r\n }\r\n\r\n syncAdminEntitySchema<T = unknown>(entity: string): Promise<T> {\r\n return this.adminPost(`/${entity}/sync-schema`);\r\n }\r\n\r\n resetAdminEntity<T = unknown>(entity: string): Promise<T> {\r\n return this.adminPost(`/${entity}/reset`);\r\n }\r\n\r\n truncateAdminEntity<T = unknown>(entity: string): Promise<T> {\r\n return this.adminPost(`/${entity}/truncate`);\r\n }\r\n\r\n dropAdminEntity<T = unknown>(entity: string): Promise<T> {\r\n return this.adminPost(`/${entity}/drop`);\r\n }\r\n\r\n resetAllAdmin<T = unknown>(body?: Record<string, unknown>): Promise<T> {\r\n return this.adminPost(\"/reset-all\", body);\r\n }\r\n\r\n listAdminConfigs<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/configs\");\r\n }\r\n\r\n getAdminConfig<T = unknown>(domain: string): Promise<T> {\r\n return this.adminGet(`/configs/${domain}`);\r\n }\r\n\r\n updateAdminConfig<T = unknown>(\r\n domain: string,\r\n patch: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPatch(`/configs/${domain}`, patch);\r\n }\r\n\r\n listAdminRoles<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/roles\");\r\n }\r\n\r\n createAdminRole<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/roles\", body);\r\n }\r\n\r\n getAdminRole<T = unknown>(seq: number): Promise<T> {\r\n return this.adminGet(`/roles/${seq}`);\r\n }\r\n\r\n updateAdminRole<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPatch(`/roles/${seq}`, body);\r\n }\r\n\r\n deleteAdminRole<T = unknown>(seq: number): Promise<T> {\r\n return this.adminDelete(`/roles/${seq}`);\r\n }\r\n\r\n listAdminApiKeys<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/api-keys\");\r\n }\r\n\r\n createAdminApiKey<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/api-keys\", body);\r\n }\r\n\r\n getAdminApiKey<T = unknown>(seq: number): Promise<T> {\r\n return this.adminGet(`/api-keys/${seq}`);\r\n }\r\n\r\n updateAdminApiKey<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPatch(`/api-keys/${seq}`, body);\r\n }\r\n\r\n deleteAdminApiKey<T = unknown>(seq: number): Promise<T> {\r\n return this.adminDelete(`/api-keys/${seq}`);\r\n }\r\n\r\n regenerateAdminApiKeySecret<T = unknown>(seq: number): Promise<T> {\r\n return this.adminPost(`/api-keys/${seq}/regenerate-secret`);\r\n }\r\n\r\n listAdminAccounts<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/accounts\");\r\n }\r\n\r\n createAdminAccount<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/accounts\", body);\r\n }\r\n\r\n getAdminAccount<T = unknown>(seq: number): Promise<T> {\r\n return this.adminGet(`/accounts/${seq}`);\r\n }\r\n\r\n updateAdminAccount<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPatch(`/accounts/${seq}`, body);\r\n }\r\n\r\n deleteAdminAccount<T = unknown>(seq: number): Promise<T> {\r\n return this.adminDelete(`/accounts/${seq}`);\r\n }\r\n\r\n listAdminLicenses<T = unknown>(): Promise<T> {\r\n return this.adminGet(\"/licenses\");\r\n }\r\n\r\n createAdminLicense<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/licenses\", body);\r\n }\r\n\r\n getAdminLicense<T = unknown>(seq: number): Promise<T> {\r\n return this.adminGet(`/licenses/${seq}`);\r\n }\r\n\r\n updateAdminLicense<T = unknown>(\r\n seq: number,\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPatch(`/licenses/${seq}`, body);\r\n }\r\n\r\n deleteAdminLicense<T = unknown>(seq: number): Promise<T> {\r\n return this.adminDelete(`/licenses/${seq}`);\r\n }\r\n\r\n runAdminBackup<T = unknown>(\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/backup/run\", body);\r\n }\r\n\r\n getAdminBackupStatus<T = unknown>(\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/backup/status\", body);\r\n }\r\n\r\n listAdminBackups<T = unknown>(\r\n body?: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/backup/list\", body);\r\n }\r\n\r\n restoreAdminBackup<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/backup/restore\", body);\r\n }\r\n\r\n deleteAdminBackup<T = unknown>(\r\n body: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.adminPost(\"/backup/delete\", body);\r\n }\r\n\r\n disableAdminAccountTwoFactor<T = unknown>(seq: number): Promise<T> {\r\n return this.adminDelete(`/accounts/${seq}/2fa`);\r\n }\r\n };\r\n}\r\n"],
4
+ "sourcesContent": ["import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../client/base.js\";\n\nexport function AdminMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class AdminMixinClass extends Base {\n adminPath(path: string): string {\n return `/v1/admin${path}`;\n }\n\n adminGet<T>(path: string): Promise<T> {\n return this.http.get(this.adminPath(path));\n }\n\n adminPost<T>(path: string, body?: unknown): Promise<T> {\n return this.http.post(this.adminPath(path), body);\n }\n\n adminPut<T>(path: string, body?: unknown): Promise<T> {\n return this.http.put(this.adminPath(path), body);\n }\n\n adminPatch<T>(path: string, body?: unknown): Promise<T> {\n return this.http.patch(this.adminPath(path), body);\n }\n\n adminDelete<T>(path: string, body?: unknown): Promise<T> {\n return this.http.delete(this.adminPath(path), body);\n }\n\n listAdminEntities<T = unknown>(): Promise<T> {\n return this.adminGet(\"/entities\");\n }\n\n getAdminErdSchema<T = unknown>(): Promise<T> {\n return this.adminGet(\"/erd/schema\");\n }\n\n batchEnsureAdminEntities<T = unknown>(configs: unknown[]): Promise<T> {\n return this.adminPost(\"/entities/batch-ensure\", configs);\n }\n\n createAdminEntityConfig<T = unknown>(\n entity: string,\n config: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(`/${entity}/create`, config);\n }\n\n getAdminEntityConfig<T = unknown>(entity: string): Promise<T> {\n return this.adminGet(`/${entity}/config`);\n }\n\n updateAdminEntityConfig<T = unknown>(\n entity: string,\n config: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPut(`/${entity}/config`, config);\n }\n\n validateAdminEntityConfig<T = unknown>(\n config: Record<string, unknown>,\n entity?: string,\n ): Promise<T> {\n return this.adminPost(\n entity ? `/${entity}/validate` : \"/entity/validate\",\n config,\n );\n }\n\n normalizeAdminEntityConfig<T = unknown>(\n config: Record<string, unknown>,\n entity?: string,\n ): Promise<T> {\n return this.adminPost(\n entity ? `/${entity}/normalize` : \"/entity/normalize\",\n config,\n );\n }\n\n getAdminEntityStats<T = unknown>(\n entity: string,\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(`/${entity}/stats`, body);\n }\n\n reindexAdminEntity<T = unknown>(entity: string): Promise<T> {\n return this.adminPost(`/${entity}/reindex`);\n }\n\n syncAdminEntitySchema<T = unknown>(entity: string): Promise<T> {\n return this.adminPost(`/${entity}/sync-schema`);\n }\n\n resetAdminEntity<T = unknown>(entity: string): Promise<T> {\n return this.adminPost(`/${entity}/reset`);\n }\n\n truncateAdminEntity<T = unknown>(entity: string): Promise<T> {\n return this.adminPost(`/${entity}/truncate`);\n }\n\n dropAdminEntity<T = unknown>(entity: string): Promise<T> {\n return this.adminPost(`/${entity}/drop`);\n }\n\n resetAllAdmin<T = unknown>(body?: Record<string, unknown>): Promise<T> {\n return this.adminPost(\"/reset-all\", body);\n }\n\n listAdminConfigs<T = unknown>(): Promise<T> {\n return this.adminGet(\"/configs\");\n }\n\n getAdminConfig<T = unknown>(domain: string): Promise<T> {\n return this.adminGet(`/configs/${domain}`);\n }\n\n updateAdminConfig<T = unknown>(\n domain: string,\n patch: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPatch(`/configs/${domain}`, patch);\n }\n\n listAdminRoles<T = unknown>(): Promise<T> {\n return this.adminGet(\"/roles\");\n }\n\n createAdminRole<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/roles\", body);\n }\n\n getAdminRole<T = unknown>(seq: number): Promise<T> {\n return this.adminGet(`/roles/${seq}`);\n }\n\n updateAdminRole<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPatch(`/roles/${seq}`, body);\n }\n\n deleteAdminRole<T = unknown>(seq: number): Promise<T> {\n return this.adminDelete(`/roles/${seq}`);\n }\n\n listAdminApiKeys<T = unknown>(): Promise<T> {\n return this.adminGet(\"/api-keys\");\n }\n\n createAdminApiKey<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/api-keys\", body);\n }\n\n getAdminApiKey<T = unknown>(seq: number): Promise<T> {\n return this.adminGet(`/api-keys/${seq}`);\n }\n\n updateAdminApiKey<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPatch(`/api-keys/${seq}`, body);\n }\n\n deleteAdminApiKey<T = unknown>(seq: number): Promise<T> {\n return this.adminDelete(`/api-keys/${seq}`);\n }\n\n regenerateAdminApiKeySecret<T = unknown>(seq: number): Promise<T> {\n return this.adminPost(`/api-keys/${seq}/regenerate-secret`);\n }\n\n listAdminAccounts<T = unknown>(): Promise<T> {\n return this.adminGet(\"/accounts\");\n }\n\n createAdminAccount<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/accounts\", body);\n }\n\n getAdminAccount<T = unknown>(seq: number): Promise<T> {\n return this.adminGet(`/accounts/${seq}`);\n }\n\n updateAdminAccount<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPatch(`/accounts/${seq}`, body);\n }\n\n deleteAdminAccount<T = unknown>(seq: number): Promise<T> {\n return this.adminDelete(`/accounts/${seq}`);\n }\n\n listAdminLicenses<T = unknown>(): Promise<T> {\n return this.adminGet(\"/licenses\");\n }\n\n createAdminLicense<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/licenses\", body);\n }\n\n getAdminLicense<T = unknown>(seq: number): Promise<T> {\n return this.adminGet(`/licenses/${seq}`);\n }\n\n updateAdminLicense<T = unknown>(\n seq: number,\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPatch(`/licenses/${seq}`, body);\n }\n\n deleteAdminLicense<T = unknown>(seq: number): Promise<T> {\n return this.adminDelete(`/licenses/${seq}`);\n }\n\n runAdminBackup<T = unknown>(\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/backup/run\", body);\n }\n\n getAdminBackupStatus<T = unknown>(\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/backup/status\", body);\n }\n\n listAdminBackups<T = unknown>(\n body?: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/backup/list\", body);\n }\n\n restoreAdminBackup<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/backup/restore\", body);\n }\n\n deleteAdminBackup<T = unknown>(\n body: Record<string, unknown>,\n ): Promise<T> {\n return this.adminPost(\"/backup/delete\", body);\n }\n\n disableAdminAccountTwoFactor<T = unknown>(seq: number): Promise<T> {\n return this.adminDelete(`/accounts/${seq}/2fa`);\n }\n };\n}\n"],
5
5
  "mappings": "AAKO,SAASA,EACZC,EACF,CACE,OAAO,cAA8BA,CAAK,CACtC,UAAUC,EAAsB,CAC5B,MAAO,YAAYA,CAAI,EAC3B,CAEA,SAAYA,EAA0B,CAClC,OAAO,KAAK,KAAK,IAAI,KAAK,UAAUA,CAAI,CAAC,CAC7C,CAEA,UAAaA,EAAcC,EAA4B,CACnD,OAAO,KAAK,KAAK,KAAK,KAAK,UAAUD,CAAI,EAAGC,CAAI,CACpD,CAEA,SAAYD,EAAcC,EAA4B,CAClD,OAAO,KAAK,KAAK,IAAI,KAAK,UAAUD,CAAI,EAAGC,CAAI,CACnD,CAEA,WAAcD,EAAcC,EAA4B,CACpD,OAAO,KAAK,KAAK,MAAM,KAAK,UAAUD,CAAI,EAAGC,CAAI,CACrD,CAEA,YAAeD,EAAcC,EAA4B,CACrD,OAAO,KAAK,KAAK,OAAO,KAAK,UAAUD,CAAI,EAAGC,CAAI,CACtD,CAEA,mBAA6C,CACzC,OAAO,KAAK,SAAS,WAAW,CACpC,CAEA,mBAA6C,CACzC,OAAO,KAAK,SAAS,aAAa,CACtC,CAEA,yBAAsCC,EAAgC,CAClE,OAAO,KAAK,UAAU,yBAA0BA,CAAO,CAC3D,CAEA,wBACIC,EACAC,EACU,CACV,OAAO,KAAK,UAAU,IAAID,CAAM,UAAWC,CAAM,CACrD,CAEA,qBAAkCD,EAA4B,CAC1D,OAAO,KAAK,SAAS,IAAIA,CAAM,SAAS,CAC5C,CAEA,wBACIA,EACAC,EACU,CACV,OAAO,KAAK,SAAS,IAAID,CAAM,UAAWC,CAAM,CACpD,CAEA,0BACIA,EACAD,EACU,CACV,OAAO,KAAK,UACRA,EAAS,IAAIA,CAAM,YAAc,mBACjCC,CACJ,CACJ,CAEA,2BACIA,EACAD,EACU,CACV,OAAO,KAAK,UACRA,EAAS,IAAIA,CAAM,aAAe,oBAClCC,CACJ,CACJ,CAEA,oBACID,EACAF,EACU,CACV,OAAO,KAAK,UAAU,IAAIE,CAAM,SAAUF,CAAI,CAClD,CAEA,mBAAgCE,EAA4B,CACxD,OAAO,KAAK,UAAU,IAAIA,CAAM,UAAU,CAC9C,CAEA,sBAAmCA,EAA4B,CAC3D,OAAO,KAAK,UAAU,IAAIA,CAAM,cAAc,CAClD,CAEA,iBAA8BA,EAA4B,CACtD,OAAO,KAAK,UAAU,IAAIA,CAAM,QAAQ,CAC5C,CAEA,oBAAiCA,EAA4B,CACzD,OAAO,KAAK,UAAU,IAAIA,CAAM,WAAW,CAC/C,CAEA,gBAA6BA,EAA4B,CACrD,OAAO,KAAK,UAAU,IAAIA,CAAM,OAAO,CAC3C,CAEA,cAA2BF,EAA4C,CACnE,OAAO,KAAK,UAAU,aAAcA,CAAI,CAC5C,CAEA,kBAA4C,CACxC,OAAO,KAAK,SAAS,UAAU,CACnC,CAEA,eAA4BI,EAA4B,CACpD,OAAO,KAAK,SAAS,YAAYA,CAAM,EAAE,CAC7C,CAEA,kBACIA,EACAC,EACU,CACV,OAAO,KAAK,WAAW,YAAYD,CAAM,GAAIC,CAAK,CACtD,CAEA,gBAA0C,CACtC,OAAO,KAAK,SAAS,QAAQ,CACjC,CAEA,gBACIL,EACU,CACV,OAAO,KAAK,UAAU,SAAUA,CAAI,CACxC,CAEA,aAA0BM,EAAyB,CAC/C,OAAO,KAAK,SAAS,UAAUA,CAAG,EAAE,CACxC,CAEA,gBACIA,EACAN,EACU,CACV,OAAO,KAAK,WAAW,UAAUM,CAAG,GAAIN,CAAI,CAChD,CAEA,gBAA6BM,EAAyB,CAClD,OAAO,KAAK,YAAY,UAAUA,CAAG,EAAE,CAC3C,CAEA,kBAA4C,CACxC,OAAO,KAAK,SAAS,WAAW,CACpC,CAEA,kBACIN,EACU,CACV,OAAO,KAAK,UAAU,YAAaA,CAAI,CAC3C,CAEA,eAA4BM,EAAyB,CACjD,OAAO,KAAK,SAAS,aAAaA,CAAG,EAAE,CAC3C,CAEA,kBACIA,EACAN,EACU,CACV,OAAO,KAAK,WAAW,aAAaM,CAAG,GAAIN,CAAI,CACnD,CAEA,kBAA+BM,EAAyB,CACpD,OAAO,KAAK,YAAY,aAAaA,CAAG,EAAE,CAC9C,CAEA,4BAAyCA,EAAyB,CAC9D,OAAO,KAAK,UAAU,aAAaA,CAAG,oBAAoB,CAC9D,CAEA,mBAA6C,CACzC,OAAO,KAAK,SAAS,WAAW,CACpC,CAEA,mBACIN,EACU,CACV,OAAO,KAAK,UAAU,YAAaA,CAAI,CAC3C,CAEA,gBAA6BM,EAAyB,CAClD,OAAO,KAAK,SAAS,aAAaA,CAAG,EAAE,CAC3C,CAEA,mBACIA,EACAN,EACU,CACV,OAAO,KAAK,WAAW,aAAaM,CAAG,GAAIN,CAAI,CACnD,CAEA,mBAAgCM,EAAyB,CACrD,OAAO,KAAK,YAAY,aAAaA,CAAG,EAAE,CAC9C,CAEA,mBAA6C,CACzC,OAAO,KAAK,SAAS,WAAW,CACpC,CAEA,mBACIN,EACU,CACV,OAAO,KAAK,UAAU,YAAaA,CAAI,CAC3C,CAEA,gBAA6BM,EAAyB,CAClD,OAAO,KAAK,SAAS,aAAaA,CAAG,EAAE,CAC3C,CAEA,mBACIA,EACAN,EACU,CACV,OAAO,KAAK,WAAW,aAAaM,CAAG,GAAIN,CAAI,CACnD,CAEA,mBAAgCM,EAAyB,CACrD,OAAO,KAAK,YAAY,aAAaA,CAAG,EAAE,CAC9C,CAEA,eACIN,EACU,CACV,OAAO,KAAK,UAAU,cAAeA,CAAI,CAC7C,CAEA,qBACIA,EACU,CACV,OAAO,KAAK,UAAU,iBAAkBA,CAAI,CAChD,CAEA,iBACIA,EACU,CACV,OAAO,KAAK,UAAU,eAAgBA,CAAI,CAC9C,CAEA,mBACIA,EACU,CACV,OAAO,KAAK,UAAU,kBAAmBA,CAAI,CACjD,CAEA,kBACIA,EACU,CACV,OAAO,KAAK,UAAU,iBAAkBA,CAAI,CAChD,CAEA,6BAA0CM,EAAyB,CAC/D,OAAO,KAAK,YAAY,aAAaA,CAAG,MAAM,CAClD,CACJ,CACJ",
6
6
  "names": ["AdminMixin", "Base", "path", "body", "configs", "entity", "config", "domain", "patch", "seq"]
7
7
  }
@@ -98,6 +98,7 @@ export declare function AuthMixin<TBase extends GConstructor<EntityServerClientB
98
98
  csrfEnabled: boolean;
99
99
  csrfHeaderName: string;
100
100
  csrfCookieName: string;
101
+ requestAbortControllers: Map<string, AbortController>;
101
102
  activeTxId: string | null;
102
103
  keepSession: boolean;
103
104
  refreshBuffer: number;
@@ -110,7 +111,6 @@ export declare function AuthMixin<TBase extends GConstructor<EntityServerClientB
110
111
  healthTickPromise: Promise<unknown> | null;
111
112
  realtimeEnabled: boolean;
112
113
  realtimePath: string;
113
- realtimeAutoConnect: boolean;
114
114
  realtimeAutoReconnect: boolean;
115
115
  realtimeReconnectDelayMs: number;
116
116
  realtimeStatus: import("../../types.js").RealtimeConnectionStatus;
@@ -1,2 +1,2 @@
1
- import{entityRequest as h}from"../../client/request.js";function u(n){return n.ok===!0&&n.requires_2fa!==!0&&typeof n.data=="object"&&n.data!==null&&"access_token"in n.data}function d(n){return class extends n{authBootstrapPromise=null;authBootstrapToken="";authBootstrapAnonymousCompleted=!1;setAccessTokenFromResponse(e){super.setAccessTokenFromResponse(e),this.authBootstrapToken=e,this.authBootstrapAnonymousCompleted=!1}csrfRefresher=()=>this.checkHealth(this.keepSession).then(()=>{});async checkHealth(e=!1){try{const t=this.token,s={};e&&(s["X-Session-Bootstrap"]="1");const r=await fetch(`${this.baseUrl}/v1/health`,{signal:AbortSignal.timeout(3e3),credentials:"include",headers:s}),o=await r.json(),i=r.headers.get("X-Access-Token");i&&(this.token=i,e&&i!==t&&this.onTokenRefreshed?.(i,0),e&&o.authenticated===!0&&this.realtimeEnabled&&this.realtimeAutoConnect&&this.connectRealtime().catch(()=>{}));const a=this.readCookie("anon_token");return o.packet_encryption===!0&&a&&(this.anonymousPacketToken=a,this.encryptRequests=!0),this.applyCsrfHealth(),this.onHealthChange?.(!0),e&&o.authenticated===!1&&t&&(this.disconnectRealtime("session_expired"),this.onSessionExpired?.(new Error("Session expired"))),o}catch(t){throw this.onHealthChange?.(!1),t}}readCookie(e){if(typeof document>"u")return null;const t=document.cookie.split(";").map(s=>s.trim()).find(s=>s.startsWith(`${e}=`));if(!t)return null;try{return decodeURIComponent(t.slice(e.length+1))}catch{return t.slice(e.length+1)}}async ensurePublicAuthBootstrap(){if(typeof document>"u"||this.apiKey&&this.hmacSecret)return;const e=!!this.anonymousPacketToken||!!this.readCookie("anon_token"),t=!!this.readCookie(this.csrfCookieName);e&&t&&this.csrfEnabled||await this.checkHealth(!1)}async ensureAuthenticatedRequestBootstrap(){if(!(typeof document>"u")&&!(this.apiKey&&this.hmacSecret)){if(this.token){if(this.authBootstrapToken===this.token)return}else if(this.authBootstrapAnonymousCompleted)return;return this.authBootstrapPromise?this.authBootstrapPromise:(this.authBootstrapPromise=this.checkHealth(!0).then(()=>{this.token?this.authBootstrapToken=this.token:this.authBootstrapAnonymousCompleted=!0}).finally(()=>{this.authBootstrapPromise=null}),this.authBootstrapPromise)}}async prepareRequest(e){await super.prepareRequest(e),e&&await this.ensureAuthenticatedRequestBootstrap()}async login(e,t){await this.ensurePublicAuthBootstrap();const s=await h(this.reqOpts,"POST","/v1/auth/login",{email:e,passwd:t},!1,{},{requireOkShape:!1,allowStatuses:[403]});return u(s)&&(this.token=s.data.access_token,this.applyCsrfHealth(),this.keepSession&&this.healthTickTimer===null&&this.startHealthTick(),this.realtimeEnabled&&this.realtimeAutoConnect&&this.connectRealtime().catch(()=>{})),s}async tokenRefresh(){const e=await this.request("POST","/v1/auth/token_refresh",void 0,!1);return this.token=e.data.access_token,this.applyCsrfHealth(),e.data}async refreshToken(e){if(!e)return this.tokenRefresh();const t=await this.request("POST","/v1/auth/refresh",{refresh_token:e},!1);return this.token=t.data.access_token,this.applyCsrfHealth(),t.data}async logout(e){this.stopKeepSession(),this.stopHealthTick(),this.disconnectRealtime("logout");const t=await this.request("POST","/v1/auth/logout",e?{refresh_token:e}:void 0,!1);return this.token="",this.applyCsrfHealth(),t}me(){return this.request("GET","/v1/auth/me")}withdraw(e){return this.request("POST","/v1/auth/withdraw",e?{passwd:e}:{})}}}export{d as AuthMixin,u as isAuthLoginSuccessResponse};
1
+ import{entityRequest as u}from"../../client/request.js";function h(o){return o.ok===!0&&o.requires_2fa!==!0&&typeof o.data=="object"&&o.data!==null&&"access_token"in o.data}function d(o){return class extends o{authBootstrapPromise=null;authBootstrapToken="";authBootstrapAnonymousCompleted=!1;setAccessTokenFromResponse(e){super.setAccessTokenFromResponse(e),this.authBootstrapToken=e,this.authBootstrapAnonymousCompleted=!1}csrfRefresher=()=>this.checkHealth(this.keepSession).then(()=>{});async checkHealth(e=!1){try{const t=this.token,s={};e&&(s["X-Session-Bootstrap"]="1");const i=await fetch(`${this.baseUrl}/v1/health`,{signal:AbortSignal.timeout(3e3),credentials:"include",headers:s}),r=await i.json(),n=i.headers.get("X-Access-Token");n&&(this.token=n,e&&n!==t&&this.onTokenRefreshed?.(n,0));const a=this.readCookie("anon_token");return r.packet_encryption===!0&&a&&(this.anonymousPacketToken=a,this.encryptRequests=!0),this.applyCsrfHealth(),this.onHealthChange?.(!0),e&&r.authenticated===!1&&t&&(this.disconnectRealtime("session_expired"),this.onSessionExpired?.(new Error("Session expired"))),r}catch(t){throw this.onHealthChange?.(!1),t}}readCookie(e){if(typeof document>"u")return null;const t=document.cookie.split(";").map(s=>s.trim()).find(s=>s.startsWith(`${e}=`));if(!t)return null;try{return decodeURIComponent(t.slice(e.length+1))}catch{return t.slice(e.length+1)}}async ensurePublicAuthBootstrap(){if(typeof document>"u"||this.apiKey&&this.hmacSecret)return;const e=!!this.anonymousPacketToken||!!this.readCookie("anon_token"),t=!!this.readCookie(this.csrfCookieName);e&&t&&this.csrfEnabled||await this.checkHealth(!1)}async ensureAuthenticatedRequestBootstrap(){if(!(typeof document>"u")&&!(this.apiKey&&this.hmacSecret)){if(this.token){if(this.authBootstrapToken===this.token)return}else if(this.authBootstrapAnonymousCompleted)return;return this.authBootstrapPromise?this.authBootstrapPromise:(this.authBootstrapPromise=this.checkHealth(!0).then(()=>{this.token?this.authBootstrapToken=this.token:this.authBootstrapAnonymousCompleted=!0}).finally(()=>{this.authBootstrapPromise=null}),this.authBootstrapPromise)}}async prepareRequest(e){await super.prepareRequest(e),e&&await this.ensureAuthenticatedRequestBootstrap()}async login(e,t){await this.ensurePublicAuthBootstrap();const s=await u(this.reqOpts,"POST","/v1/auth/login",{email:e,passwd:t},!1,{},{requireOkShape:!1,allowStatuses:[403]});return h(s)&&(this.token=s.data.access_token,this.applyCsrfHealth(),this.keepSession&&this.healthTickTimer===null&&this.startHealthTick()),s}async tokenRefresh(){const e=await this.request("POST","/v1/auth/token_refresh",void 0,!1);return this.token=e.data.access_token,this.applyCsrfHealth(),e.data}async refreshToken(e){if(!e)return this.tokenRefresh();const t=await this.request("POST","/v1/auth/refresh",{refresh_token:e},!1);return this.token=t.data.access_token,this.applyCsrfHealth(),t.data}async logout(e){this.stopKeepSession(),this.stopHealthTick(),this.disconnectRealtime("logout");const t=await this.request("POST","/v1/auth/logout",e?{refresh_token:e}:void 0,!1);return this.token="",this.applyCsrfHealth(),t}me(){return this.request("GET","/v1/auth/me")}withdraw(e){return this.request("POST","/v1/auth/withdraw",e?{passwd:e}:{})}}}export{d as AuthMixin,h as isAuthLoginSuccessResponse};
2
2
  //# sourceMappingURL=auth.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/mixins/server/auth.ts"],
4
- "sourcesContent": ["import type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../client/base.js\";\r\nimport { entityRequest } from \"../../client/request.js\";\r\n\r\nexport interface AuthLoginSuccessData {\r\n access_token: string;\r\n refresh_token: string;\r\n expires_in: number;\r\n force_password_change?: boolean;\r\n password_expired?: boolean;\r\n password_expires_in_days?: number;\r\n}\r\n\r\nexport interface AuthLoginSuccessResponse {\r\n ok: true;\r\n data: AuthLoginSuccessData;\r\n requires_2fa?: false;\r\n}\r\n\r\nexport interface AuthLoginRequiresTwoFactorResponse {\r\n ok: true;\r\n requires_2fa: true;\r\n data: {\r\n two_factor_token: string;\r\n expires_in: number;\r\n };\r\n}\r\n\r\nexport interface AuthLoginSetupRequiredResponse {\r\n ok: false;\r\n error: \"2fa_setup_required\";\r\n message: string;\r\n data: {\r\n setup_token: string;\r\n expires_in: number;\r\n };\r\n}\r\n\r\nexport type AuthLoginResponse =\r\n | AuthLoginSuccessResponse\r\n | AuthLoginRequiresTwoFactorResponse\r\n | AuthLoginSetupRequiredResponse;\r\n\r\nexport function isAuthLoginSuccessResponse(\r\n response: AuthLoginResponse,\r\n): response is AuthLoginSuccessResponse {\r\n return (\r\n response.ok === true &&\r\n response.requires_2fa !== true &&\r\n typeof response.data === \"object\" &&\r\n response.data !== null &&\r\n \"access_token\" in response.data\r\n );\r\n}\r\n\r\nexport function AuthMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class AuthMixinClass extends Base {\r\n authBootstrapPromise: Promise<void> | null = null;\r\n authBootstrapToken = \"\";\r\n authBootstrapAnonymousCompleted = false;\r\n\r\n /** \uC751\uB2F5 \uD5E4\uB354 access token \uAC31\uC2E0 \uC2DC bootstrap \uAE30\uC900 \uD1A0\uD070\uB3C4 \uD568\uAED8 \uB9DE\uCD98\uB2E4. */\r\n override setAccessTokenFromResponse(token: string): void {\r\n super.setAccessTokenFromResponse(token);\r\n this.authBootstrapToken = token;\r\n this.authBootstrapAnonymousCompleted = false;\r\n }\r\n\r\n // health tick\uC774 \uCF1C\uC838 \uC788\uC73C\uBA74 keepSession \uC5EC\uBD80\uC5D0 \uB530\uB77C \uC138\uC158 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uAE4C\uC9C0 \uD568\uAED8 \uCC98\uB9AC\uD569\uB2C8\uB2E4.\r\n csrfRefresher = (): Promise<void> =>\r\n this.checkHealth(this.keepSession).then(() => {});\r\n\r\n // \u2500\u2500\u2500 \uC778\uC99D \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /**\r\n * \uC11C\uBC84 \uD5EC\uC2A4 \uCCB4\uD06C\uB97C \uC218\uD589\uD558\uACE0 \uD328\uD0B7 \uC554\uD638\uD654 \uD65C\uC131 \uC5EC\uBD80\uB97C \uC790\uB3D9\uC73C\uB85C \uAC10\uC9C0\uD569\uB2C8\uB2E4.\r\n *\r\n * \uC11C\uBC84\uAC00 `packet_encryption: true`\uB97C \uC751\uB2F5\uD558\uBA74 \uC774\uD6C4 \uBAA8\uB4E0 \uC694\uCCAD\uC5D0 \uC554\uD638\uD654\uAC00 \uC790\uB3D9 \uC801\uC6A9\uB429\uB2C8\uB2E4.\r\n *\r\n * ```ts\r\n * await client.checkHealth();\r\n * await client.login(email, password);\r\n * ```\r\n */\r\n async checkHealth(bootstrapAuth = false): Promise<{\r\n status: string;\r\n authenticated?: boolean;\r\n packet_encryption?: boolean;\r\n }> {\r\n try {\r\n const previousToken = this.token;\r\n const headers: Record<string, string> = {};\r\n if (bootstrapAuth) {\r\n headers[\"X-Session-Bootstrap\"] = \"1\";\r\n }\r\n\r\n const res = await fetch(`${this.baseUrl}/v1/health`, {\r\n signal: AbortSignal.timeout(3000),\r\n credentials: \"include\",\r\n headers,\r\n });\r\n const data = (await res.json()) as {\r\n status: string;\r\n authenticated?: boolean;\r\n packet_encryption?: boolean;\r\n };\r\n\r\n const accessToken = res.headers.get(\"X-Access-Token\");\r\n if (accessToken) {\r\n this.token = accessToken;\r\n if (bootstrapAuth && accessToken !== previousToken) {\r\n this.onTokenRefreshed?.(accessToken, 0);\r\n }\r\n if (\r\n bootstrapAuth &&\r\n data.authenticated === true &&\r\n this.realtimeEnabled &&\r\n this.realtimeAutoConnect\r\n ) {\r\n this.connectRealtime().catch(() => {});\r\n }\r\n }\r\n\r\n // \uD328\uD0B7 \uC554\uD638\uD654\uB294 health \uC751\uB2F5\uC774 \uBA85\uC2DC\uC801\uC73C\uB85C \uD65C\uC131\uC774\uB77C\uACE0 \uC54C\uB824\uC904 \uB54C\uB9CC \uC790\uB3D9 \uD65C\uC131\uD654\uD55C\uB2E4.\r\n const anonToken = this.readCookie(\"anon_token\");\r\n if (data.packet_encryption === true && anonToken) {\r\n this.anonymousPacketToken = anonToken;\r\n this.encryptRequests = true;\r\n }\r\n\r\n this.applyCsrfHealth();\r\n this.onHealthChange?.(true);\r\n if (\r\n bootstrapAuth &&\r\n data.authenticated === false &&\r\n previousToken\r\n ) {\r\n this.disconnectRealtime(\"session_expired\");\r\n this.onSessionExpired?.(new Error(\"Session expired\"));\r\n }\r\n return data;\r\n } catch (error) {\r\n this.onHealthChange?.(false);\r\n throw error;\r\n }\r\n }\r\n\r\n /** document.cookie \uB610\uB294 Node \uD658\uACBD\uC5D0\uC11C \uCFE0\uD0A4 \uAC12 \uC77D\uAE30 (SSR \uB300\uC751) */\r\n readCookie(name: string): string | null {\r\n if (typeof document === \"undefined\") return null;\r\n const match = document.cookie\r\n .split(\";\")\r\n .map((c) => c.trim())\r\n .find((c) => c.startsWith(`${name}=`));\r\n if (!match) return null;\r\n try {\r\n return decodeURIComponent(match.slice(name.length + 1));\r\n } catch {\r\n return match.slice(name.length + 1);\r\n }\r\n }\r\n\r\n async ensurePublicAuthBootstrap(): Promise<void> {\r\n if (typeof document === \"undefined\") {\r\n return;\r\n }\r\n\r\n if (this.apiKey && this.hmacSecret) {\r\n return;\r\n }\r\n\r\n const hasAnonymousPacketToken =\r\n !!this.anonymousPacketToken || !!this.readCookie(\"anon_token\");\r\n const hasCsrfCookie = !!this.readCookie(this.csrfCookieName);\r\n\r\n if (hasAnonymousPacketToken && hasCsrfCookie && this.csrfEnabled) {\r\n return;\r\n }\r\n\r\n await this.checkHealth(false);\r\n }\r\n\r\n // \uC778\uC99D \uC694\uCCAD \uC804\uC5D0 health \uAE30\uBC18 \uC138\uC158 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uC744 \uD55C \uBC88 \uBCF4\uC7A5\uD569\uB2C8\uB2E4.\r\n async ensureAuthenticatedRequestBootstrap(): Promise<void> {\r\n if (typeof document === \"undefined\") {\r\n return;\r\n }\r\n\r\n if (this.apiKey && this.hmacSecret) {\r\n return;\r\n }\r\n\r\n if (this.token) {\r\n if (this.authBootstrapToken === this.token) {\r\n return;\r\n }\r\n } else if (this.authBootstrapAnonymousCompleted) {\r\n return;\r\n }\r\n\r\n if (this.authBootstrapPromise) {\r\n return this.authBootstrapPromise;\r\n }\r\n\r\n this.authBootstrapPromise = this.checkHealth(true)\r\n .then(() => {\r\n if (this.token) {\r\n this.authBootstrapToken = this.token;\r\n } else {\r\n this.authBootstrapAnonymousCompleted = true;\r\n }\r\n })\r\n .finally(() => {\r\n this.authBootstrapPromise = null;\r\n });\r\n\r\n return this.authBootstrapPromise;\r\n }\r\n\r\n // \uC778\uC99D \uC694\uCCAD \uC804 \uC790\uB3D9 health \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uC744 \uC218\uD589\uD569\uB2C8\uB2E4.\r\n override async prepareRequest(withAuth: boolean): Promise<void> {\r\n await super.prepareRequest(withAuth);\r\n if (!withAuth) {\r\n return;\r\n }\r\n\r\n await this.ensureAuthenticatedRequestBootstrap();\r\n }\r\n\r\n /** \uB85C\uADF8\uC778 \uC751\uB2F5\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. \uC131\uACF5 \uC2DC\uC5D0\uB9CC `access_token`\uC744 \uB0B4\uBD80 \uC0C1\uD0DC\uC5D0 \uC800\uC7A5\uD569\uB2C8\uB2E4. */\r\n async login(\r\n email: string,\r\n password: string,\r\n ): Promise<AuthLoginResponse> {\r\n await this.ensurePublicAuthBootstrap();\r\n\r\n const response = await entityRequest<AuthLoginResponse>(\r\n this.reqOpts,\r\n \"POST\",\r\n \"/v1/auth/login\",\r\n { email, passwd: password },\r\n false,\r\n {},\r\n { requireOkShape: false, allowStatuses: [403] },\r\n );\r\n\r\n if (isAuthLoginSuccessResponse(response)) {\r\n this.token = response.data.access_token;\r\n this.applyCsrfHealth();\r\n if (this.keepSession && this.healthTickTimer === null) {\r\n this.startHealthTick();\r\n }\r\n if (this.realtimeEnabled && this.realtimeAutoConnect) {\r\n this.connectRealtime().catch(() => {});\r\n }\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /** HttpOnly refresh cookie\uB85C Access Token\uC744 \uC7AC\uBC1C\uAE09\uBC1B\uC544 \uB0B4\uBD80 \uD1A0\uD070\uC744 \uAD50\uCCB4\uD569\uB2C8\uB2E4. */\r\n async tokenRefresh(): Promise<{\r\n access_token: string;\r\n refresh_token: string;\r\n expires_in: number;\r\n }> {\r\n const data = await this.request<{\r\n data: {\r\n access_token: string;\r\n refresh_token: string;\r\n expires_in: number;\r\n };\r\n }>(\"POST\", \"/v1/auth/token_refresh\", undefined, false);\r\n this.token = data.data.access_token;\r\n this.applyCsrfHealth();\r\n return data.data;\r\n }\r\n\r\n /** Refresh Token\uC73C\uB85C Access Token\uC744 \uC7AC\uBC1C\uAE09\uBC1B\uC544 \uB0B4\uBD80 \uD1A0\uD070\uC744 \uAD50\uCCB4\uD569\uB2C8\uB2E4. */\r\n async refreshToken(refreshToken?: string): Promise<{\r\n access_token: string;\r\n refresh_token?: string;\r\n expires_in: number;\r\n }> {\r\n if (!refreshToken) {\r\n return this.tokenRefresh();\r\n }\r\n\r\n const data = await this.request<{\r\n data: {\r\n access_token: string;\r\n refresh_token: string;\r\n expires_in: number;\r\n };\r\n }>(\r\n \"POST\",\r\n \"/v1/auth/refresh\",\r\n { refresh_token: refreshToken },\r\n false,\r\n );\r\n this.token = data.data.access_token;\r\n this.applyCsrfHealth();\r\n return data.data;\r\n }\r\n\r\n /**\r\n * \uC11C\uBC84\uC5D0 \uB85C\uADF8\uC544\uC6C3\uC744 \uC694\uCCAD\uD558\uACE0 \uB0B4\uBD80 \uD1A0\uD070\uC744 \uCD08\uAE30\uD654\uD569\uB2C8\uB2E4.\r\n * refresh_token\uC744 \uC11C\uBC84\uC5D0 \uC804\uB2EC\uD574 \uBB34\uD6A8\uD654\uD569\uB2C8\uB2E4.\r\n */\r\n async logout(refreshToken?: string): Promise<{ ok: boolean }> {\r\n this.stopKeepSession();\r\n this.stopHealthTick();\r\n this.disconnectRealtime(\"logout\");\r\n const data = await this.request<{ ok: boolean }>(\r\n \"POST\",\r\n \"/v1/auth/logout\",\r\n refreshToken ? { refresh_token: refreshToken } : undefined,\r\n false,\r\n );\r\n this.token = \"\";\r\n this.applyCsrfHealth();\r\n return data;\r\n }\r\n\r\n /** \uD604\uC7AC \uB85C\uADF8\uC778\uB41C \uC0AC\uC6A9\uC790 \uC815\uBCF4\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n me<T = Record<string, unknown>>(): Promise<{ ok: boolean; data: T }> {\r\n return this.request(\"GET\", \"/v1/auth/me\");\r\n }\r\n\r\n /** \uD68C\uC6D0 \uD0C8\uD1F4\uB97C \uC694\uCCAD\uD569\uB2C8\uB2E4. */\r\n withdraw(passwd?: string): Promise<{ ok: boolean }> {\r\n return this.request(\r\n \"POST\",\r\n \"/v1/auth/withdraw\",\r\n passwd ? { passwd } : {},\r\n );\r\n }\r\n };\r\n}\r\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type {\n GConstructor,\n EntityServerClientBase,\n} from \"../../client/base.js\";\nimport { entityRequest } from \"../../client/request.js\";\n\nexport interface AuthLoginSuccessData {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n force_password_change?: boolean;\n password_expired?: boolean;\n password_expires_in_days?: number;\n}\n\nexport interface AuthLoginSuccessResponse {\n ok: true;\n data: AuthLoginSuccessData;\n requires_2fa?: false;\n}\n\nexport interface AuthLoginRequiresTwoFactorResponse {\n ok: true;\n requires_2fa: true;\n data: {\n two_factor_token: string;\n expires_in: number;\n };\n}\n\nexport interface AuthLoginSetupRequiredResponse {\n ok: false;\n error: \"2fa_setup_required\";\n message: string;\n data: {\n setup_token: string;\n expires_in: number;\n };\n}\n\nexport type AuthLoginResponse =\n | AuthLoginSuccessResponse\n | AuthLoginRequiresTwoFactorResponse\n | AuthLoginSetupRequiredResponse;\n\nexport function isAuthLoginSuccessResponse(\n response: AuthLoginResponse,\n): response is AuthLoginSuccessResponse {\n return (\n response.ok === true &&\n response.requires_2fa !== true &&\n typeof response.data === \"object\" &&\n response.data !== null &&\n \"access_token\" in response.data\n );\n}\n\nexport function AuthMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class AuthMixinClass extends Base {\n authBootstrapPromise: Promise<void> | null = null;\n authBootstrapToken = \"\";\n authBootstrapAnonymousCompleted = false;\n\n /** \uC751\uB2F5 \uD5E4\uB354 access token \uAC31\uC2E0 \uC2DC bootstrap \uAE30\uC900 \uD1A0\uD070\uB3C4 \uD568\uAED8 \uB9DE\uCD98\uB2E4. */\n override setAccessTokenFromResponse(token: string): void {\n super.setAccessTokenFromResponse(token);\n this.authBootstrapToken = token;\n this.authBootstrapAnonymousCompleted = false;\n }\n\n // health tick\uC774 \uCF1C\uC838 \uC788\uC73C\uBA74 keepSession \uC5EC\uBD80\uC5D0 \uB530\uB77C \uC138\uC158 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uAE4C\uC9C0 \uD568\uAED8 \uCC98\uB9AC\uD569\uB2C8\uB2E4.\n csrfRefresher = (): Promise<void> =>\n this.checkHealth(this.keepSession).then(() => {});\n\n // \u2500\u2500\u2500 \uC778\uC99D \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * \uC11C\uBC84 \uD5EC\uC2A4 \uCCB4\uD06C\uB97C \uC218\uD589\uD558\uACE0 \uD328\uD0B7 \uC554\uD638\uD654 \uD65C\uC131 \uC5EC\uBD80\uB97C \uC790\uB3D9\uC73C\uB85C \uAC10\uC9C0\uD569\uB2C8\uB2E4.\n *\n * \uC11C\uBC84\uAC00 `packet_encryption: true`\uB97C \uC751\uB2F5\uD558\uBA74 \uC774\uD6C4 \uBAA8\uB4E0 \uC694\uCCAD\uC5D0 \uC554\uD638\uD654\uAC00 \uC790\uB3D9 \uC801\uC6A9\uB429\uB2C8\uB2E4.\n *\n * ```ts\n * await client.checkHealth();\n * await client.login(email, password);\n * ```\n */\n async checkHealth(bootstrapAuth = false): Promise<{\n status: string;\n authenticated?: boolean;\n packet_encryption?: boolean;\n }> {\n try {\n const previousToken = this.token;\n const headers: Record<string, string> = {};\n if (bootstrapAuth) {\n headers[\"X-Session-Bootstrap\"] = \"1\";\n }\n\n const res = await fetch(`${this.baseUrl}/v1/health`, {\n signal: AbortSignal.timeout(3000),\n credentials: \"include\",\n headers,\n });\n const data = (await res.json()) as {\n status: string;\n authenticated?: boolean;\n packet_encryption?: boolean;\n };\n\n const accessToken = res.headers.get(\"X-Access-Token\");\n if (accessToken) {\n this.token = accessToken;\n if (bootstrapAuth && accessToken !== previousToken) {\n this.onTokenRefreshed?.(accessToken, 0);\n }\n }\n\n // \uD328\uD0B7 \uC554\uD638\uD654\uB294 health \uC751\uB2F5\uC774 \uBA85\uC2DC\uC801\uC73C\uB85C \uD65C\uC131\uC774\uB77C\uACE0 \uC54C\uB824\uC904 \uB54C\uB9CC \uC790\uB3D9 \uD65C\uC131\uD654\uD55C\uB2E4.\n const anonToken = this.readCookie(\"anon_token\");\n if (data.packet_encryption === true && anonToken) {\n this.anonymousPacketToken = anonToken;\n this.encryptRequests = true;\n }\n\n this.applyCsrfHealth();\n this.onHealthChange?.(true);\n if (\n bootstrapAuth &&\n data.authenticated === false &&\n previousToken\n ) {\n this.disconnectRealtime(\"session_expired\");\n this.onSessionExpired?.(new Error(\"Session expired\"));\n }\n return data;\n } catch (error) {\n this.onHealthChange?.(false);\n throw error;\n }\n }\n\n /** document.cookie \uB610\uB294 Node \uD658\uACBD\uC5D0\uC11C \uCFE0\uD0A4 \uAC12 \uC77D\uAE30 (SSR \uB300\uC751) */\n readCookie(name: string): string | null {\n if (typeof document === \"undefined\") return null;\n const match = document.cookie\n .split(\";\")\n .map((c) => c.trim())\n .find((c) => c.startsWith(`${name}=`));\n if (!match) return null;\n try {\n return decodeURIComponent(match.slice(name.length + 1));\n } catch {\n return match.slice(name.length + 1);\n }\n }\n\n async ensurePublicAuthBootstrap(): Promise<void> {\n if (typeof document === \"undefined\") {\n return;\n }\n\n if (this.apiKey && this.hmacSecret) {\n return;\n }\n\n const hasAnonymousPacketToken =\n !!this.anonymousPacketToken || !!this.readCookie(\"anon_token\");\n const hasCsrfCookie = !!this.readCookie(this.csrfCookieName);\n\n if (hasAnonymousPacketToken && hasCsrfCookie && this.csrfEnabled) {\n return;\n }\n\n await this.checkHealth(false);\n }\n\n // \uC778\uC99D \uC694\uCCAD \uC804\uC5D0 health \uAE30\uBC18 \uC138\uC158 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uC744 \uD55C \uBC88 \uBCF4\uC7A5\uD569\uB2C8\uB2E4.\n async ensureAuthenticatedRequestBootstrap(): Promise<void> {\n if (typeof document === \"undefined\") {\n return;\n }\n\n if (this.apiKey && this.hmacSecret) {\n return;\n }\n\n if (this.token) {\n if (this.authBootstrapToken === this.token) {\n return;\n }\n } else if (this.authBootstrapAnonymousCompleted) {\n return;\n }\n\n if (this.authBootstrapPromise) {\n return this.authBootstrapPromise;\n }\n\n this.authBootstrapPromise = this.checkHealth(true)\n .then(() => {\n if (this.token) {\n this.authBootstrapToken = this.token;\n } else {\n this.authBootstrapAnonymousCompleted = true;\n }\n })\n .finally(() => {\n this.authBootstrapPromise = null;\n });\n\n return this.authBootstrapPromise;\n }\n\n // \uC778\uC99D \uC694\uCCAD \uC804 \uC790\uB3D9 health \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uC744 \uC218\uD589\uD569\uB2C8\uB2E4.\n override async prepareRequest(withAuth: boolean): Promise<void> {\n await super.prepareRequest(withAuth);\n if (!withAuth) {\n return;\n }\n\n await this.ensureAuthenticatedRequestBootstrap();\n }\n\n /** \uB85C\uADF8\uC778 \uC751\uB2F5\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. \uC131\uACF5 \uC2DC\uC5D0\uB9CC `access_token`\uC744 \uB0B4\uBD80 \uC0C1\uD0DC\uC5D0 \uC800\uC7A5\uD569\uB2C8\uB2E4. */\n async login(\n email: string,\n password: string,\n ): Promise<AuthLoginResponse> {\n await this.ensurePublicAuthBootstrap();\n\n const response = await entityRequest<AuthLoginResponse>(\n this.reqOpts,\n \"POST\",\n \"/v1/auth/login\",\n { email, passwd: password },\n false,\n {},\n { requireOkShape: false, allowStatuses: [403] },\n );\n\n if (isAuthLoginSuccessResponse(response)) {\n this.token = response.data.access_token;\n this.applyCsrfHealth();\n if (this.keepSession && this.healthTickTimer === null) {\n this.startHealthTick();\n }\n }\n\n return response;\n }\n\n /** HttpOnly refresh cookie\uB85C Access Token\uC744 \uC7AC\uBC1C\uAE09\uBC1B\uC544 \uB0B4\uBD80 \uD1A0\uD070\uC744 \uAD50\uCCB4\uD569\uB2C8\uB2E4. */\n async tokenRefresh(): Promise<{\n access_token: string;\n refresh_token: string;\n expires_in: number;\n }> {\n const data = await this.request<{\n data: {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n };\n }>(\"POST\", \"/v1/auth/token_refresh\", undefined, false);\n this.token = data.data.access_token;\n this.applyCsrfHealth();\n return data.data;\n }\n\n /** Refresh Token\uC73C\uB85C Access Token\uC744 \uC7AC\uBC1C\uAE09\uBC1B\uC544 \uB0B4\uBD80 \uD1A0\uD070\uC744 \uAD50\uCCB4\uD569\uB2C8\uB2E4. */\n async refreshToken(refreshToken?: string): Promise<{\n access_token: string;\n refresh_token?: string;\n expires_in: number;\n }> {\n if (!refreshToken) {\n return this.tokenRefresh();\n }\n\n const data = await this.request<{\n data: {\n access_token: string;\n refresh_token: string;\n expires_in: number;\n };\n }>(\n \"POST\",\n \"/v1/auth/refresh\",\n { refresh_token: refreshToken },\n false,\n );\n this.token = data.data.access_token;\n this.applyCsrfHealth();\n return data.data;\n }\n\n /**\n * \uC11C\uBC84\uC5D0 \uB85C\uADF8\uC544\uC6C3\uC744 \uC694\uCCAD\uD558\uACE0 \uB0B4\uBD80 \uD1A0\uD070\uC744 \uCD08\uAE30\uD654\uD569\uB2C8\uB2E4.\n * refresh_token\uC744 \uC11C\uBC84\uC5D0 \uC804\uB2EC\uD574 \uBB34\uD6A8\uD654\uD569\uB2C8\uB2E4.\n */\n async logout(refreshToken?: string): Promise<{ ok: boolean }> {\n this.stopKeepSession();\n this.stopHealthTick();\n this.disconnectRealtime(\"logout\");\n const data = await this.request<{ ok: boolean }>(\n \"POST\",\n \"/v1/auth/logout\",\n refreshToken ? { refresh_token: refreshToken } : undefined,\n false,\n );\n this.token = \"\";\n this.applyCsrfHealth();\n return data;\n }\n\n /** \uD604\uC7AC \uB85C\uADF8\uC778\uB41C \uC0AC\uC6A9\uC790 \uC815\uBCF4\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\n me<T = Record<string, unknown>>(): Promise<{ ok: boolean; data: T }> {\n return this.request(\"GET\", \"/v1/auth/me\");\n }\n\n /** \uD68C\uC6D0 \uD0C8\uD1F4\uB97C \uC694\uCCAD\uD569\uB2C8\uB2E4. */\n withdraw(passwd?: string): Promise<{ ok: boolean }> {\n return this.request(\n \"POST\",\n \"/v1/auth/withdraw\",\n passwd ? { passwd } : {},\n );\n }\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["entityRequest", "isAuthLoginSuccessResponse", "response", "AuthMixin", "Base", "token", "bootstrapAuth", "previousToken", "headers", "res", "data", "accessToken", "anonToken", "error", "name", "match", "c", "hasAnonymousPacketToken", "hasCsrfCookie", "withAuth", "email", "password", "refreshToken", "passwd"]
7
7
  }
@@ -104,6 +104,7 @@ export declare function EntityMixin<TBase extends GConstructor<EntityServerClien
104
104
  csrfHeaderName: string;
105
105
  csrfCookieName: string;
106
106
  csrfRefresher: (() => Promise<void>) | null;
107
+ requestAbortControllers: Map<string, AbortController>;
107
108
  activeTxId: string | null;
108
109
  keepSession: boolean;
109
110
  refreshBuffer: number;
@@ -116,7 +117,6 @@ export declare function EntityMixin<TBase extends GConstructor<EntityServerClien
116
117
  healthTickPromise: Promise<unknown> | null;
117
118
  realtimeEnabled: boolean;
118
119
  realtimePath: string;
119
- realtimeAutoConnect: boolean;
120
120
  realtimeAutoReconnect: boolean;
121
121
  realtimeReconnectDelayMs: number;
122
122
  realtimeStatus: import("../../types.js").RealtimeConnectionStatus;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/mixins/server/entity.ts"],
4
- "sourcesContent": ["import type {\r\n EntityHistoryRecord,\r\n EntityListParams,\r\n EntityListResult,\r\n EntityQueryRequest,\r\n} from \"../../types.js\";\r\nimport { buildQuery } from \"../../client/utils.js\";\r\nimport type {\r\n GConstructor,\r\n EntityServerClientBase,\r\n} from \"../../client/base.js\";\r\n\r\nexport function EntityMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class EntityMixinClass extends Base {\r\n // \u2500\u2500\u2500 \uD2B8\uB79C\uC7AD\uC158 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** \uD2B8\uB79C\uC7AD\uC158\uC744 \uC2DC\uC791\uD558\uACE0 \uD65C\uC131 \uD2B8\uB79C\uC7AD\uC158 ID\uB97C \uC800\uC7A5\uD569\uB2C8\uB2E4. */\r\n async transStart(): Promise<string> {\r\n const res = await this.request<{\r\n ok: boolean;\r\n transaction_id: string;\r\n }>(\"POST\", \"/v1/transaction/start\", undefined, false);\r\n this.activeTxId = res.transaction_id;\r\n return this.activeTxId;\r\n }\r\n\r\n /** \uD65C\uC131 \uD2B8\uB79C\uC7AD\uC158(\uB610\uB294 \uC804\uB2EC\uB41C transactionId)\uC744 \uB864\uBC31\uD569\uB2C8\uB2E4. */\r\n transRollback(transactionId?: string): Promise<{ ok: boolean }> {\r\n const txId = transactionId ?? this.activeTxId;\r\n if (!txId)\r\n return Promise.reject(\r\n new Error(\r\n \"No active transaction. Call transStart() first.\",\r\n ),\r\n );\r\n this.activeTxId = null;\r\n return this.request(\"POST\", `/v1/transaction/rollback/${txId}`);\r\n }\r\n\r\n /**\r\n * \uD65C\uC131 \uD2B8\uB79C\uC7AD\uC158(\uB610\uB294 \uC804\uB2EC\uB41C transactionId)\uC744 \uCEE4\uBC0B\uD569\uB2C8\uB2E4.\r\n *\r\n * @returns `results` \uBC30\uC5F4: commit\uB41C \uAC01 \uC791\uC5C5\uC758 `entity`, `action`, `seq`\r\n */\r\n transCommit(transactionId?: string): Promise<{\r\n ok: boolean;\r\n results: Array<{ entity: string; action: string; seq: number }>;\r\n }> {\r\n const txId = transactionId ?? this.activeTxId;\r\n if (!txId)\r\n return Promise.reject(\r\n new Error(\r\n \"No active transaction. Call transStart() first.\",\r\n ),\r\n );\r\n this.activeTxId = null;\r\n return this.request(\"POST\", `/v1/transaction/commit/${txId}`);\r\n }\r\n\r\n // \u2500\u2500\u2500 \uC5D4\uD2F0\uD2F0 CRUD \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** \uC5D4\uD2F0\uD2F0 \uC124\uC815 \uBA54\uD0C0\uB370\uC774\uD130\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n meta<T = unknown>(entity: string): Promise<{ ok: boolean; data: T }> {\r\n return this.request(\"POST\", `/v1/entity/${entity}/meta`, {});\r\n }\r\n\r\n /** \uC5D4\uD2F0\uD2F0 \uB370\uC774\uD130\uB97C \uC800\uC7A5 \uC5C6\uC774 \uAC80\uC99D\uD569\uB2C8\uB2E4. */\r\n validate<T = unknown>(\r\n entity: string,\r\n data: Record<string, unknown>,\r\n ): Promise<T> {\r\n return this.http.post(`/v1/entity/${entity}/validate`, data);\r\n }\r\n\r\n /** \uC2DC\uD000\uC2A4 ID\uB85C \uC5D4\uD2F0\uD2F0 \uB2E8\uAC74\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n get<T = unknown>(\r\n entity: string,\r\n seq: number,\r\n opts: { skipHooks?: boolean } = {},\r\n ): Promise<{ ok: boolean; data: T }> {\r\n const q = opts.skipHooks ? \"?skipHooks=true\" : \"\";\r\n return this.request(\"GET\", `/v1/entity/${entity}/${seq}${q}`);\r\n }\r\n\r\n /** \uC870\uAC74\uC73C\uB85C \uC5D4\uD2F0\uD2F0 \uB2E8\uAC74\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. data \uCEEC\uB7FC\uC744 \uC644\uC804\uD788 \uBCF5\uD638\uD654\uD558\uC5EC \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n find<T = unknown>(\r\n entity: string,\r\n conditions?: Record<string, unknown>,\r\n opts: { skipHooks?: boolean } = {},\r\n ): Promise<{ ok: boolean; data: T }> {\r\n const q = opts.skipHooks ? \"?skipHooks=true\" : \"\";\r\n return this.request(\r\n \"POST\",\r\n `/v1/entity/${entity}/find${q}`,\r\n conditions ?? {},\r\n );\r\n }\r\n\r\n /** \uD398\uC774\uC9C0\uB124\uC774\uC158/\uC815\uB82C/\uD544\uD130 \uC870\uAC74\uC73C\uB85C \uC5D4\uD2F0\uD2F0 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n list<T = unknown>(\r\n entity: string,\r\n params: EntityListParams = {},\r\n ): Promise<{ ok: boolean; data: EntityListResult<T> }> {\r\n const { conditions, fields, orderDir, orderBy, ...rest } = params;\r\n const queryObj: Record<string, unknown> = {\r\n page: 1,\r\n limit: 20,\r\n ...rest,\r\n };\r\n if (orderBy)\r\n queryObj.orderBy =\r\n orderDir === \"DESC\" ? `-${orderBy}` : orderBy;\r\n if (fields?.length) queryObj.fields = fields.join(\",\");\r\n return this.request(\r\n \"POST\",\r\n `/v1/entity/${entity}/list?${buildQuery(queryObj)}`,\r\n conditions ?? {},\r\n );\r\n }\r\n\r\n /**\r\n * \uC5D4\uD2F0\uD2F0 \uCD1D \uAC74\uC218\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4.\r\n *\r\n * @param conditions \uD544\uD130 \uC870\uAC74 (\uC608: `{ status: \"active\" }`)\r\n */\r\n count(\r\n entity: string,\r\n conditions?: Record<string, unknown>,\r\n ): Promise<{ ok: boolean; count: number }> {\r\n return this.request(\r\n \"POST\",\r\n `/v1/entity/${entity}/count`,\r\n conditions ?? {},\r\n );\r\n }\r\n\r\n /**\r\n * \uCEE4\uC2A4\uD140 SQL\uB85C \uC5D4\uD2F0\uD2F0\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4.\r\n *\r\n * SELECT \uC804\uC6A9\uC774\uBA70 \uC778\uB371\uC2A4 \uD14C\uC774\uBE14\uB9CC \uC870\uD68C \uAC00\uB2A5\uD569\uB2C8\uB2E4. JOIN \uC9C0\uC6D0.\r\n */\r\n query<T = unknown>(\r\n entity: string,\r\n req: EntityQueryRequest,\r\n ): Promise<{ ok: boolean; data: { items: T[]; count: number } }> {\r\n return this.request(\"POST\", `/v1/entity/${entity}/query`, req);\r\n }\r\n\r\n /** \uC5D4\uD2F0\uD2F0 \uB370\uC774\uD130\uB97C \uC0DD\uC131/\uC218\uC815(Submit)\uD569\uB2C8\uB2E4. `seq`\uAC00 \uC5C6\uC73C\uBA74 INSERT, \uC788\uC73C\uBA74 UPDATE\uC785\uB2C8\uB2E4. */\r\n submit(\r\n entity: string,\r\n data: Record<string, unknown>,\r\n opts: { transactionId?: string; skipHooks?: boolean } = {},\r\n ): Promise<{ ok: boolean; seq: number }> {\r\n const txId = opts.transactionId ?? this.activeTxId;\r\n const extraHeaders = txId\r\n ? { \"X-Transaction-ID\": txId }\r\n : undefined;\r\n const q = opts.skipHooks ? \"?skipHooks=true\" : \"\";\r\n return this.request(\r\n \"POST\",\r\n `/v1/entity/${entity}/submit${q}`,\r\n data,\r\n true,\r\n extraHeaders,\r\n );\r\n }\r\n\r\n /** \uC2DC\uD000\uC2A4 ID\uB85C \uC5D4\uD2F0\uD2F0\uB97C \uC0AD\uC81C\uD569\uB2C8\uB2E4(`hard=true`\uBA74 \uD558\uB4DC \uC0AD\uC81C, \uAE30\uBCF8\uC740 \uC18C\uD504\uD2B8 \uC0AD\uC81C). */\r\n delete(\r\n entity: string,\r\n seq: number,\r\n opts: {\r\n transactionId?: string;\r\n hard?: boolean;\r\n skipHooks?: boolean;\r\n } = {},\r\n ): Promise<{ ok: boolean; deleted: number }> {\r\n const params = new URLSearchParams();\r\n if (opts.hard) params.set(\"hard\", \"true\");\r\n if (opts.skipHooks) params.set(\"skipHooks\", \"true\");\r\n const q = params.size ? `?${params}` : \"\";\r\n const txId = opts.transactionId ?? this.activeTxId;\r\n const extraHeaders = txId\r\n ? { \"X-Transaction-ID\": txId }\r\n : undefined;\r\n return this.request(\r\n \"POST\",\r\n `/v1/entity/${entity}/delete/${seq}${q}`,\r\n undefined,\r\n true,\r\n extraHeaders,\r\n );\r\n }\r\n\r\n /** \uC5D4\uD2F0\uD2F0 \uB2E8\uAC74\uC758 \uBCC0\uACBD \uC774\uB825\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n history<T = unknown>(\r\n entity: string,\r\n seq: number,\r\n params: Pick<EntityListParams, \"page\" | \"limit\"> = {},\r\n ): Promise<{\r\n ok: boolean;\r\n data: EntityListResult<EntityHistoryRecord<T>>;\r\n }> {\r\n return this.request(\r\n \"GET\",\r\n `/v1/entity/${entity}/history/${seq}?${buildQuery({ page: 1, limit: 50, ...params })}`,\r\n );\r\n }\r\n\r\n /** \uD2B9\uC815 \uC774\uB825 \uC2DC\uC810\uC73C\uB85C \uC5D4\uD2F0\uD2F0\uB97C \uB864\uBC31\uD569\uB2C8\uB2E4. */\r\n rollback(entity: string, historySeq: number): Promise<{ ok: boolean }> {\r\n return this.request(\r\n \"POST\",\r\n `/v1/entity/${entity}/rollback/${historySeq}`,\r\n );\r\n }\r\n };\r\n}\r\n"],
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
5
  "mappings": "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",
6
6
  "names": ["buildQuery", "EntityMixin", "Base", "res", "transactionId", "txId", "entity", "data", "seq", "opts", "q", "conditions", "params", "fields", "orderDir", "orderBy", "rest", "queryObj", "req", "extraHeaders", "historySeq"]
7
7
  }
@@ -102,6 +102,7 @@ export declare function FileMixin<TBase extends GConstructor<EntityServerClientB
102
102
  csrfHeaderName: string;
103
103
  csrfCookieName: string;
104
104
  csrfRefresher: (() => Promise<void>) | null;
105
+ requestAbortControllers: Map<string, AbortController>;
105
106
  activeTxId: string | null;
106
107
  keepSession: boolean;
107
108
  refreshBuffer: number;
@@ -114,7 +115,6 @@ export declare function FileMixin<TBase extends GConstructor<EntityServerClientB
114
115
  healthTickPromise: Promise<unknown> | null;
115
116
  realtimeEnabled: boolean;
116
117
  realtimePath: string;
117
- realtimeAutoConnect: boolean;
118
118
  realtimeAutoReconnect: boolean;
119
119
  realtimeReconnectDelayMs: number;
120
120
  realtimeStatus: import("../../types.js").RealtimeConnectionStatus;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/mixins/server/file.ts"],
4
- "sourcesContent": ["import type {\r\n FileMeta,\r\n FileUploadOptions,\r\n StorageMeta,\r\n StorageUploadOptions,\r\n} from \"../../types.js\";\r\nimport type { GConstructor, EntityServerClientBase } from \"../../client/base.js\";\r\n\r\nexport function FileMixin<TBase extends GConstructor<EntityServerClientBase>>(\r\n Base: TBase,\r\n) {\r\n return class FileMixinClass extends Base {\r\n // \u2500\u2500\u2500 \uD30C\uC77C \uAD00\uB9AC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /**\r\n * \uD30C\uC77C\uC744 \uC5C5\uB85C\uB4DC\uD569\uB2C8\uB2E4. (multipart/form-data)\r\n *\r\n * ```ts\r\n * const input = document.querySelector('input[type=\"file\"]');\r\n * const result = await client.fileUpload(\"product\", input.files[0]);\r\n * console.log(result.data.uuid);\r\n * ```\r\n */\r\n async fileUpload(\r\n entity: string,\r\n file: File | Blob,\r\n opts: FileUploadOptions = {},\r\n ): Promise<{ ok: boolean; uuid: string; data: FileMeta }> {\r\n const form = new FormData();\r\n form.append(\r\n \"file\",\r\n file,\r\n file instanceof File ? file.name : \"upload\",\r\n );\r\n if (opts.refSeq != null)\r\n form.append(\"ref_seq\", String(opts.refSeq));\r\n if (opts.isPublic != null)\r\n form.append(\"is_public\", opts.isPublic ? \"true\" : \"false\");\r\n return this.requestForm(\r\n \"POST\",\r\n `/v1/files/${entity}/upload`,\r\n form,\r\n );\r\n }\r\n\r\n /** \uD30C\uC77C\uC744 \uB2E4\uC6B4\uB85C\uB4DC\uD569\uB2C8\uB2E4. `ArrayBuffer`\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n fileDownload(entity: string, uuid: string): Promise<ArrayBuffer> {\r\n return this.requestBinary(\r\n \"POST\",\r\n `/v1/files/${entity}/download/${uuid}`,\r\n {},\r\n );\r\n }\r\n\r\n /** \uD30C\uC77C\uC744 \uC0AD\uC81C\uD569\uB2C8\uB2E4. */\r\n fileDelete(\r\n entity: string,\r\n uuid: string,\r\n ): Promise<{ ok: boolean; uuid: string; deleted: boolean }> {\r\n return this.request(\r\n \"POST\",\r\n `/v1/files/${entity}/delete/${uuid}`,\r\n {},\r\n );\r\n }\r\n\r\n /** \uC5D4\uD2F0\uD2F0\uC5D0 \uC5F0\uACB0\uB41C \uD30C\uC77C \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n fileList(\r\n entity: string,\r\n opts: { refSeq?: number } = {},\r\n ): Promise<{\r\n ok: boolean;\r\n data: { items: FileMeta[]; total: number };\r\n }> {\r\n return this.request(\r\n \"POST\",\r\n `/v1/files/${entity}/list`,\r\n opts.refSeq ? { ref_seq: opts.refSeq } : {},\r\n );\r\n }\r\n\r\n /** \uD30C\uC77C \uBA54\uD0C0 \uC815\uBCF4\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n fileMeta(\r\n entity: string,\r\n uuid: string,\r\n ): Promise<{ ok: boolean; data: FileMeta }> {\r\n return this.request(\r\n \"POST\",\r\n `/v1/files/${entity}/meta/${uuid}`,\r\n {},\r\n );\r\n }\r\n\r\n /** \uC784\uC2DC \uD30C\uC77C \uC811\uADFC \uD1A0\uD070\uC744 \uBC1C\uAE09\uD569\uB2C8\uB2E4. */\r\n fileToken(uuid: string): Promise<{ ok: boolean; token: string }> {\r\n return this.request(\"POST\", `/v1/files/token/${uuid}`, {});\r\n }\r\n\r\n /** \uD30C\uC77C \uC778\uB77C\uC778 \uBDF0/\uB2E4\uC6B4\uB85C\uB4DC URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n fileViewUrl(uuid: string, opts: { download?: boolean } = {}): string {\r\n const qs = opts.download ? \"?download=true\" : \"\";\r\n return `${this.baseUrl}/v1/files/${uuid}${qs}`;\r\n }\r\n\r\n /** \uD30C\uC77C \uC778\uB77C\uC778 \uBDF0 URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. (fetch \uC5C6\uC74C, URL \uC870\uD569\uB9CC) */\r\n fileUrl(uuid: string): string {\r\n return `${this.baseUrl}/v1/files/${uuid}`;\r\n }\r\n\r\n // \u2500\u2500\u2500 \uC2A4\uD1A0\uB9AC\uC9C0 \uB77C\uC6B0\uD2B8 \uBCC4\uCE6D \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uC5C5\uB85C\uB4DC \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\r\n storageUpload(\r\n entity: string,\r\n file: File | Blob,\r\n opts: StorageUploadOptions = {},\r\n ): Promise<{ ok: boolean; uuid: string; data: StorageMeta }> {\r\n return this.fileUpload(entity, file, opts);\r\n }\r\n\r\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uB2E4\uC6B4\uB85C\uB4DC \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\r\n storageDownload(entity: string, uuid: string): Promise<ArrayBuffer> {\r\n return this.fileDownload(entity, uuid);\r\n }\r\n\r\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uC0AD\uC81C \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\r\n storageDelete(\r\n entity: string,\r\n uuid: string,\r\n ): Promise<{ ok: boolean; uuid: string; deleted: boolean }> {\r\n return this.fileDelete(entity, uuid);\r\n }\r\n\r\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uBAA9\uB85D \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\r\n storageList(\r\n entity: string,\r\n opts: { refSeq?: number } = {},\r\n ): Promise<{\r\n ok: boolean;\r\n data: { items: StorageMeta[]; total: number };\r\n }> {\r\n return this.fileList(entity, opts);\r\n }\r\n\r\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uBA54\uD0C0 \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\r\n storageMeta(\r\n entity: string,\r\n uuid: string,\r\n ): Promise<{ ok: boolean; data: StorageMeta }> {\r\n return this.fileMeta(entity, uuid);\r\n }\r\n\r\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uC784\uC2DC \uD1A0\uD070 \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\r\n storageToken(uuid: string): Promise<{ ok: boolean; token: string }> {\r\n return this.fileToken(uuid);\r\n }\r\n\r\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uC778\uB77C\uC778 \uBDF0/\uB2E4\uC6B4\uB85C\uB4DC URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n storageViewUrl(uuid: string, opts: { download?: boolean } = {}): string {\r\n return this.fileViewUrl(uuid, opts);\r\n }\r\n\r\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uB2E4\uC6B4\uB85C\uB4DC URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n storageDownloadUrl(uuid: string): string {\r\n return this.fileViewUrl(uuid, { download: true });\r\n }\r\n\r\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uC778\uB77C\uC778 \uBDF0 URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n storageUrl(uuid: string): string {\r\n return this.fileUrl(uuid);\r\n }\r\n };\r\n}\r\n"],
4
+ "sourcesContent": ["import type {\n FileMeta,\n FileUploadOptions,\n StorageMeta,\n StorageUploadOptions,\n} from \"../../types.js\";\nimport type { GConstructor, EntityServerClientBase } from \"../../client/base.js\";\n\nexport function FileMixin<TBase extends GConstructor<EntityServerClientBase>>(\n Base: TBase,\n) {\n return class FileMixinClass extends Base {\n // \u2500\u2500\u2500 \uD30C\uC77C \uAD00\uB9AC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * \uD30C\uC77C\uC744 \uC5C5\uB85C\uB4DC\uD569\uB2C8\uB2E4. (multipart/form-data)\n *\n * ```ts\n * const input = document.querySelector('input[type=\"file\"]');\n * const result = await client.fileUpload(\"product\", input.files[0]);\n * console.log(result.data.uuid);\n * ```\n */\n async fileUpload(\n entity: string,\n file: File | Blob,\n opts: FileUploadOptions = {},\n ): Promise<{ ok: boolean; uuid: string; data: FileMeta }> {\n const form = new FormData();\n form.append(\n \"file\",\n file,\n file instanceof File ? file.name : \"upload\",\n );\n if (opts.refSeq != null)\n form.append(\"ref_seq\", String(opts.refSeq));\n if (opts.isPublic != null)\n form.append(\"is_public\", opts.isPublic ? \"true\" : \"false\");\n return this.requestForm(\n \"POST\",\n `/v1/files/${entity}/upload`,\n form,\n );\n }\n\n /** \uD30C\uC77C\uC744 \uB2E4\uC6B4\uB85C\uB4DC\uD569\uB2C8\uB2E4. `ArrayBuffer`\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\n fileDownload(entity: string, uuid: string): Promise<ArrayBuffer> {\n return this.requestBinary(\n \"POST\",\n `/v1/files/${entity}/download/${uuid}`,\n {},\n );\n }\n\n /** \uD30C\uC77C\uC744 \uC0AD\uC81C\uD569\uB2C8\uB2E4. */\n fileDelete(\n entity: string,\n uuid: string,\n ): Promise<{ ok: boolean; uuid: string; deleted: boolean }> {\n return this.request(\n \"POST\",\n `/v1/files/${entity}/delete/${uuid}`,\n {},\n );\n }\n\n /** \uC5D4\uD2F0\uD2F0\uC5D0 \uC5F0\uACB0\uB41C \uD30C\uC77C \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\n fileList(\n entity: string,\n opts: { refSeq?: number } = {},\n ): Promise<{\n ok: boolean;\n data: { items: FileMeta[]; total: number };\n }> {\n return this.request(\n \"POST\",\n `/v1/files/${entity}/list`,\n opts.refSeq ? { ref_seq: opts.refSeq } : {},\n );\n }\n\n /** \uD30C\uC77C \uBA54\uD0C0 \uC815\uBCF4\uB97C \uC870\uD68C\uD569\uB2C8\uB2E4. */\n fileMeta(\n entity: string,\n uuid: string,\n ): Promise<{ ok: boolean; data: FileMeta }> {\n return this.request(\n \"POST\",\n `/v1/files/${entity}/meta/${uuid}`,\n {},\n );\n }\n\n /** \uC784\uC2DC \uD30C\uC77C \uC811\uADFC \uD1A0\uD070\uC744 \uBC1C\uAE09\uD569\uB2C8\uB2E4. */\n fileToken(uuid: string): Promise<{ ok: boolean; token: string }> {\n return this.request(\"POST\", `/v1/files/token/${uuid}`, {});\n }\n\n /** \uD30C\uC77C \uC778\uB77C\uC778 \uBDF0/\uB2E4\uC6B4\uB85C\uB4DC URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\n fileViewUrl(uuid: string, opts: { download?: boolean } = {}): string {\n const qs = opts.download ? \"?download=true\" : \"\";\n return `${this.baseUrl}/v1/files/${uuid}${qs}`;\n }\n\n /** \uD30C\uC77C \uC778\uB77C\uC778 \uBDF0 URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. (fetch \uC5C6\uC74C, URL \uC870\uD569\uB9CC) */\n fileUrl(uuid: string): string {\n return `${this.baseUrl}/v1/files/${uuid}`;\n }\n\n // \u2500\u2500\u2500 \uC2A4\uD1A0\uB9AC\uC9C0 \uB77C\uC6B0\uD2B8 \uBCC4\uCE6D \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uC5C5\uB85C\uB4DC \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\n storageUpload(\n entity: string,\n file: File | Blob,\n opts: StorageUploadOptions = {},\n ): Promise<{ ok: boolean; uuid: string; data: StorageMeta }> {\n return this.fileUpload(entity, file, opts);\n }\n\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uB2E4\uC6B4\uB85C\uB4DC \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\n storageDownload(entity: string, uuid: string): Promise<ArrayBuffer> {\n return this.fileDownload(entity, uuid);\n }\n\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uC0AD\uC81C \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\n storageDelete(\n entity: string,\n uuid: string,\n ): Promise<{ ok: boolean; uuid: string; deleted: boolean }> {\n return this.fileDelete(entity, uuid);\n }\n\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uBAA9\uB85D \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\n storageList(\n entity: string,\n opts: { refSeq?: number } = {},\n ): Promise<{\n ok: boolean;\n data: { items: StorageMeta[]; total: number };\n }> {\n return this.fileList(entity, opts);\n }\n\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uBA54\uD0C0 \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\n storageMeta(\n entity: string,\n uuid: string,\n ): Promise<{ ok: boolean; data: StorageMeta }> {\n return this.fileMeta(entity, uuid);\n }\n\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uC784\uC2DC \uD1A0\uD070 \uB77C\uC6B0\uD2B8\uB97C \uD30C\uC77C API \uC774\uB984 \uB300\uC2E0 \uD638\uCD9C\uD569\uB2C8\uB2E4. */\n storageToken(uuid: string): Promise<{ ok: boolean; token: string }> {\n return this.fileToken(uuid);\n }\n\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uC778\uB77C\uC778 \uBDF0/\uB2E4\uC6B4\uB85C\uB4DC URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\n storageViewUrl(uuid: string, opts: { download?: boolean } = {}): string {\n return this.fileViewUrl(uuid, opts);\n }\n\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uB2E4\uC6B4\uB85C\uB4DC URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\n storageDownloadUrl(uuid: string): string {\n return this.fileViewUrl(uuid, { download: true });\n }\n\n /** ES \uC2A4\uD1A0\uB9AC\uC9C0 \uC778\uB77C\uC778 \uBDF0 URL\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4. */\n storageUrl(uuid: string): string {\n return this.fileUrl(uuid);\n }\n };\n}\n"],
5
5
  "mappings": "AAQO,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,YACR,OACA,aAAaF,CAAM,UACnBG,CACJ,CACJ,CAGA,aAAaH,EAAgBI,EAAoC,CAC7D,OAAO,KAAK,cACR,OACA,aAAaJ,CAAM,aAAaI,CAAI,GACpC,CAAC,CACL,CACJ,CAGA,WACIJ,EACAI,EACwD,CACxD,OAAO,KAAK,QACR,OACA,aAAaJ,CAAM,WAAWI,CAAI,GAClC,CAAC,CACL,CACJ,CAGA,SACIJ,EACAE,EAA4B,CAAC,EAI9B,CACC,OAAO,KAAK,QACR,OACA,aAAaF,CAAM,QACnBE,EAAK,OAAS,CAAE,QAASA,EAAK,MAAO,EAAI,CAAC,CAC9C,CACJ,CAGA,SACIF,EACAI,EACwC,CACxC,OAAO,KAAK,QACR,OACA,aAAaJ,CAAM,SAASI,CAAI,GAChC,CAAC,CACL,CACJ,CAGA,UAAUA,EAAuD,CAC7D,OAAO,KAAK,QAAQ,OAAQ,mBAAmBA,CAAI,GAAI,CAAC,CAAC,CAC7D,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,CAKA,cACIJ,EACAC,EACAC,EAA6B,CAAC,EAC2B,CACzD,OAAO,KAAK,WAAWF,EAAQC,EAAMC,CAAI,CAC7C,CAGA,gBAAgBF,EAAgBI,EAAoC,CAChE,OAAO,KAAK,aAAaJ,EAAQI,CAAI,CACzC,CAGA,cACIJ,EACAI,EACwD,CACxD,OAAO,KAAK,WAAWJ,EAAQI,CAAI,CACvC,CAGA,YACIJ,EACAE,EAA4B,CAAC,EAI9B,CACC,OAAO,KAAK,SAASF,EAAQE,CAAI,CACrC,CAGA,YACIF,EACAI,EAC2C,CAC3C,OAAO,KAAK,SAASJ,EAAQI,CAAI,CACrC,CAGA,aAAaA,EAAuD,CAChE,OAAO,KAAK,UAAUA,CAAI,CAC9B,CAGA,eAAeA,EAAcF,EAA+B,CAAC,EAAW,CACpE,OAAO,KAAK,YAAYE,EAAMF,CAAI,CACtC,CAGA,mBAAmBE,EAAsB,CACrC,OAAO,KAAK,YAAYA,EAAM,CAAE,SAAU,EAAK,CAAC,CACpD,CAGA,WAAWA,EAAsB,CAC7B,OAAO,KAAK,QAAQA,CAAI,CAC5B,CACJ,CACJ",
6
6
  "names": ["FileMixin", "Base", "entity", "file", "opts", "form", "uuid", "qs"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/mixins/server/index.ts"],
4
- "sourcesContent": ["export { AuthMixin, isAuthLoginSuccessResponse } from \"./auth.js\";\r\nexport type {\r\n AuthLoginResponse,\r\n AuthLoginRequiresTwoFactorResponse,\r\n AuthLoginSetupRequiredResponse,\r\n AuthLoginSuccessData,\r\n AuthLoginSuccessResponse,\r\n} from \"./auth.js\";\r\nexport { EntityMixin } from \"./entity.js\";\r\nexport { FileMixin } from \"./file.js\";\r\nexport { PushMixin } from \"./push.js\";\r\nexport { SmtpMixin } from \"./smtp.js\";\r\nexport { TransactionMixin } from \"./transaction.js\";\r\nexport { UtilsMixin } from \"./utils.js\";\r\nexport { AdminMixin } from \"./admin.js\";\r\n"],
4
+ "sourcesContent": ["export { AuthMixin, isAuthLoginSuccessResponse } from \"./auth.js\";\nexport type {\n AuthLoginResponse,\n AuthLoginRequiresTwoFactorResponse,\n AuthLoginSetupRequiredResponse,\n AuthLoginSuccessData,\n AuthLoginSuccessResponse,\n} 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
5
  "mappings": "AAAA,OAAS,aAAAA,EAAW,8BAAAC,MAAkC,YAQtD,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
6
  "names": ["AuthMixin", "isAuthLoginSuccessResponse", "EntityMixin", "FileMixin", "PushMixin", "SmtpMixin", "TransactionMixin", "UtilsMixin", "AdminMixin"]
7
7
  }
@@ -60,6 +60,7 @@ export declare function PushMixin<TBase extends GConstructor<WithSubmit>>(Base:
60
60
  csrfHeaderName: string;
61
61
  csrfCookieName: string;
62
62
  csrfRefresher: (() => Promise<void>) | null;
63
+ requestAbortControllers: Map<string, AbortController>;
63
64
  activeTxId: string | null;
64
65
  keepSession: boolean;
65
66
  refreshBuffer: number;
@@ -72,7 +73,6 @@ export declare function PushMixin<TBase extends GConstructor<WithSubmit>>(Base:
72
73
  healthTickPromise: Promise<unknown> | null;
73
74
  realtimeEnabled: boolean;
74
75
  realtimePath: string;
75
- realtimeAutoConnect: boolean;
76
76
  realtimeAutoReconnect: boolean;
77
77
  realtimeReconnectDelayMs: number;
78
78
  realtimeStatus: import("../../types.js").RealtimeConnectionStatus;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/mixins/server/push.ts"],
4
- "sourcesContent": ["import type {\r\n EntityListParams,\r\n EntityListResult,\r\n RegisterPushDeviceOptions,\r\n} from \"../../types.js\";\r\nimport type { GConstructor, EntityServerClientBase } from \"../../client/base.js\";\r\n\r\n// entity submit\uC744 \uAC00\uC9C4 base \uD0C0\uC785 (EntityMixin \uC801\uC6A9 \uD6C4)\r\ntype WithSubmit = EntityServerClientBase & {\r\n submit(\r\n entity: string,\r\n data: Record<string, unknown>,\r\n opts?: { transactionId?: string; skipHooks?: boolean },\r\n ): Promise<{ ok: boolean; seq: number }>;\r\n list<T = unknown>(\r\n entity: string,\r\n params?: EntityListParams,\r\n ): Promise<{ ok: boolean; data: EntityListResult<T> }>;\r\n};\r\n\r\nexport function PushMixin<TBase extends GConstructor<WithSubmit>>(Base: TBase) {\r\n return class PushMixinClass extends Base {\r\n // \u2500\u2500\u2500 \uD478\uC2DC submit \uB798\uD37C \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /**\r\n * \uD478\uC2DC \uAD00\uB828 \uC5D4\uD2F0\uD2F0\uB85C payload\uB97C \uC804\uC1A1(Submit)\uD569\uB2C8\uB2E4.\r\n * \uB0B4\uBD80\uC801\uC73C\uB85C `submit()` \uBA54\uC11C\uB4DC\uB97C \uD638\uCD9C\uD569\uB2C8\uB2E4.\r\n */\r\n push(\r\n pushEntity: string,\r\n payload: Record<string, unknown>,\r\n opts: { transactionId?: string } = {},\r\n ): Promise<{ ok: boolean; seq: number }> {\r\n return this.submit(pushEntity, payload, opts);\r\n }\r\n\r\n // \u2500\u2500\u2500 \uD478\uC2DC \uB514\uBC14\uC774\uC2A4 \uAD00\uB9AC \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\r\n\r\n /** \uD478\uC2DC \uB85C\uADF8 \uC5D4\uD2F0\uD2F0 \uBAA9\uB85D\uC744 \uC870\uD68C\uD569\uB2C8\uB2E4. */\r\n pushLogList<T = unknown>(\r\n params: EntityListParams = {},\r\n ): Promise<{ ok: boolean; data: EntityListResult<T> }> {\r\n return this.list<T>(\"push_log\", params);\r\n }\r\n\r\n /** \uACC4\uC815\uC758 \uD478\uC2DC \uB514\uBC14\uC774\uC2A4\uB97C \uB4F1\uB85D\uD569\uB2C8\uB2E4. */\r\n registerPushDevice(\r\n accountSeq: number,\r\n deviceId: string,\r\n pushToken: string,\r\n opts: RegisterPushDeviceOptions = {},\r\n ): Promise<{ ok: boolean; seq: number }> {\r\n const {\r\n platform,\r\n deviceType,\r\n browser,\r\n browserVersion,\r\n pushEnabled = true,\r\n transactionId,\r\n } = opts;\r\n return this.submit(\r\n \"account_device\",\r\n {\r\n id: deviceId,\r\n account_seq: accountSeq,\r\n push_token: pushToken,\r\n push_enabled: pushEnabled,\r\n ...(platform ? { platform } : {}),\r\n ...(deviceType ? { device_type: deviceType } : {}),\r\n ...(browser ? { browser } : {}),\r\n ...(browserVersion\r\n ? { browser_version: browserVersion }\r\n : {}),\r\n },\r\n { transactionId },\r\n );\r\n }\r\n\r\n /** \uB514\uBC14\uC774\uC2A4 \uB808\uCF54\uB4DC\uC758 \uD478\uC2DC \uD1A0\uD070\uC744 \uAC31\uC2E0\uD569\uB2C8\uB2E4. */\r\n updatePushDeviceToken(\r\n deviceSeq: number,\r\n pushToken: string,\r\n opts: { pushEnabled?: boolean; transactionId?: string } = {},\r\n ): Promise<{ ok: boolean; seq: number }> {\r\n const { pushEnabled = true, transactionId } = opts;\r\n return this.submit(\r\n \"account_device\",\r\n {\r\n seq: deviceSeq,\r\n push_token: pushToken,\r\n push_enabled: pushEnabled,\r\n },\r\n { transactionId },\r\n );\r\n }\r\n\r\n /** \uB514\uBC14\uC774\uC2A4\uC758 \uD478\uC2DC \uC218\uC2E0\uC744 \uBE44\uD65C\uC131\uD654\uD569\uB2C8\uB2E4. */\r\n disablePushDevice(\r\n deviceSeq: number,\r\n opts: { transactionId?: string } = {},\r\n ): Promise<{ ok: boolean; seq: number }> {\r\n return this.submit(\r\n \"account_device\",\r\n { seq: deviceSeq, push_enabled: false },\r\n { transactionId: opts.transactionId },\r\n );\r\n }\r\n };\r\n}\r\n"],
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
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
6
  "names": ["PushMixin", "Base", "pushEntity", "payload", "opts", "params", "accountSeq", "deviceId", "pushToken", "platform", "deviceType", "browser", "browserVersion", "pushEnabled", "transactionId", "deviceSeq"]
7
7
  }