entity-server-client 0.2.5 → 0.2.6

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 (44) hide show
  1. package/README.md +0 -1
  2. package/build.mjs +4 -1
  3. package/dist/EntityServerClient.d.ts +705 -199
  4. package/dist/client/base.d.ts +59 -0
  5. package/dist/client/packet.d.ts +8 -6
  6. package/dist/client/request.d.ts +0 -1
  7. package/dist/client/utils.d.ts +5 -1
  8. package/dist/index.js +1 -1
  9. package/dist/index.js.map +4 -4
  10. package/dist/mixins/alimtalk.d.ts +56 -0
  11. package/dist/mixins/auth.d.ts +167 -0
  12. package/dist/mixins/email.d.ts +51 -0
  13. package/dist/mixins/entity.d.ts +119 -0
  14. package/dist/mixins/file.d.ts +78 -0
  15. package/dist/mixins/identity.d.ts +52 -0
  16. package/dist/mixins/pg.d.ts +63 -0
  17. package/dist/mixins/push.d.ts +110 -0
  18. package/dist/mixins/sms.d.ts +55 -0
  19. package/dist/mixins/smtp.d.ts +44 -0
  20. package/dist/mixins/utils.d.ts +70 -0
  21. package/dist/react.js +1 -1
  22. package/dist/react.js.map +4 -4
  23. package/dist/types.d.ts +165 -1
  24. package/docs/apis.md +5 -12
  25. package/docs/react.md +6 -7
  26. package/package.json +2 -1
  27. package/src/EntityServerClient.ts +54 -546
  28. package/src/client/base.ts +246 -0
  29. package/src/client/packet.ts +14 -27
  30. package/src/client/request.ts +2 -11
  31. package/src/client/utils.ts +18 -2
  32. package/src/hooks/useEntityServer.ts +3 -4
  33. package/src/mixins/alimtalk.ts +35 -0
  34. package/src/mixins/auth.ts +287 -0
  35. package/src/mixins/email.ts +46 -0
  36. package/src/mixins/entity.ts +205 -0
  37. package/src/mixins/file.ts +99 -0
  38. package/src/mixins/identity.ts +35 -0
  39. package/src/mixins/pg.ts +58 -0
  40. package/src/mixins/push.ts +132 -0
  41. package/src/mixins/sms.ts +46 -0
  42. package/src/mixins/smtp.ts +20 -0
  43. package/src/mixins/utils.ts +75 -0
  44. package/src/types.ts +203 -1
@@ -0,0 +1,167 @@
1
+ import type { GConstructor, EntityServerClientBase } from "../client/base";
2
+ export declare function AuthMixin<TBase extends GConstructor<EntityServerClientBase>>(Base: TBase): {
3
+ new (...args: any[]): {
4
+ /**
5
+ * 서버 헬스 체크를 수행하고 패킷 암호화 활성 여부를 자동으로 감지합니다.
6
+ *
7
+ * 서버가 `packet_encryption: true`를 응답하면 이후 모든 요청에 암호화가 자동 적용됩니다.
8
+ *
9
+ * ```ts
10
+ * await client.checkHealth();
11
+ * await client.login(email, password);
12
+ * ```
13
+ */
14
+ checkHealth(): Promise<{
15
+ ok: boolean;
16
+ packet_encryption?: boolean;
17
+ }>;
18
+ /** 로그인 후 `access_token`을 내부 상태에 저장합니다. */
19
+ login(email: string, password: string): Promise<{
20
+ access_token: string;
21
+ refresh_token: string;
22
+ expires_in: number;
23
+ }>;
24
+ /** Refresh Token으로 Access Token을 재발급받아 내부 토큰을 교체합니다. */
25
+ refreshToken(refreshToken: string): Promise<{
26
+ access_token: string;
27
+ expires_in: number;
28
+ }>;
29
+ /**
30
+ * 서버에 로그아웃을 요청하고 내부 토큰을 초기화합니다.
31
+ * refresh_token을 서버에 전달해 무효화합니다.
32
+ */
33
+ logout(refreshToken: string): Promise<{
34
+ ok: boolean;
35
+ }>;
36
+ /** 현재 로그인된 사용자 정보를 반환합니다. */
37
+ me<T = Record<string, unknown>>(): Promise<{
38
+ ok: boolean;
39
+ data: T;
40
+ }>;
41
+ /** 비밀번호를 변경합니다. */
42
+ changePassword(currentPasswd: string, newPasswd: string): Promise<{
43
+ ok: boolean;
44
+ }>;
45
+ /** 회원 탈퇴를 요청합니다. */
46
+ withdraw(passwd?: string): Promise<{
47
+ ok: boolean;
48
+ }>;
49
+ /**
50
+ * 휴면 계정을 재활성화합니다.
51
+ * 비밀번호 또는 OAuth(provider + code)로 본인 확인합니다.
52
+ */
53
+ reactivate(params: {
54
+ email: string;
55
+ passwd?: string;
56
+ provider?: string;
57
+ code?: string;
58
+ }): Promise<{
59
+ access_token: string;
60
+ refresh_token: string;
61
+ expires_in: number;
62
+ }>;
63
+ /** 비밀번호 재설정 메일을 요청합니다. */
64
+ passwordResetRequest(email: string): Promise<{
65
+ ok: boolean;
66
+ }>;
67
+ /** 이메일로 전달된 토큰으로 비밀번호를 재설정합니다. */
68
+ passwordResetConfirm(token: string, newPasswd: string): Promise<{
69
+ ok: boolean;
70
+ }>;
71
+ /** OAuth 프로바이더를 현재 계정에 연동합니다. */
72
+ oauthLink(provider: string, code: string, state?: string): Promise<{
73
+ ok: boolean;
74
+ message: string;
75
+ provider: string;
76
+ }>;
77
+ /** OAuth 프로바이더 연동을 해제합니다. */
78
+ oauthUnlink(provider: string): Promise<{
79
+ ok: boolean;
80
+ message: string;
81
+ provider: string;
82
+ }>;
83
+ /** 현재 계정에 연동된 OAuth 프로바이더 목록을 반환합니다. */
84
+ oauthProviders(): Promise<{
85
+ ok: boolean;
86
+ data: Array<{
87
+ provider: string;
88
+ email?: string;
89
+ linked_at?: string;
90
+ }>;
91
+ }>;
92
+ /** 특정 OAuth 프로바이더의 액세스 토큰을 갱신합니다. */
93
+ oauthTokenRefresh(provider: string): Promise<{
94
+ ok: boolean;
95
+ access_token: string;
96
+ expires_at?: string;
97
+ }>;
98
+ /** 2FA 설정을 시작하고 QR 코드 / 시크릿을 반환합니다. */
99
+ twoFactorSetup(): Promise<{
100
+ ok: boolean;
101
+ setup_token: string;
102
+ qr_url: string;
103
+ secret: string;
104
+ }>;
105
+ /** TOTP 코드로 2FA 설정을 완료합니다. */
106
+ twoFactorSetupVerify(code: string, setupToken: string): Promise<{
107
+ ok: boolean;
108
+ recovery_codes: string[];
109
+ }>;
110
+ /** 2FA를 비활성화합니다. */
111
+ twoFactorDisable(code: string): Promise<{
112
+ ok: boolean;
113
+ }>;
114
+ /** 2FA 활성화 여부를 조회합니다. */
115
+ twoFactorStatus(): Promise<{
116
+ ok: boolean;
117
+ enabled: boolean;
118
+ }>;
119
+ /** 임시 토큰으로 TOTP 코드를 검증하여 최종 JWT를 발급받습니다. */
120
+ twoFactorVerify(twoFactorToken: string, code: string): Promise<{
121
+ ok: boolean;
122
+ access_token: string;
123
+ refresh_token: string;
124
+ expires_in: number;
125
+ }>;
126
+ /** 복구 코드로 2FA를 우회하여 최종 JWT를 발급받습니다. */
127
+ twoFactorRecovery(twoFactorToken: string, recoveryCode: string): Promise<{
128
+ ok: boolean;
129
+ access_token: string;
130
+ refresh_token: string;
131
+ expires_in: number;
132
+ }>;
133
+ /** 복구 코드를 재생성합니다. */
134
+ twoFactorRegenerateRecovery(code: string): Promise<{
135
+ ok: boolean;
136
+ recovery_codes: string[];
137
+ }>;
138
+ baseUrl: string;
139
+ token: string;
140
+ apiKey: string;
141
+ hmacSecret: string;
142
+ encryptRequests: boolean;
143
+ activeTxId: string | null;
144
+ keepSession: boolean;
145
+ refreshBuffer: number;
146
+ onTokenRefreshed?: (accessToken: string, expiresIn: number) => void;
147
+ onSessionExpired?: (error: Error) => void;
148
+ _sessionRefreshToken: string | null;
149
+ _refreshTimer: ReturnType<typeof setTimeout> | null;
150
+ configure(options: Partial<import("..").EntityServerClientOptions>): void;
151
+ setToken(token: string): void;
152
+ setApiKey(apiKey: string): void;
153
+ setHmacSecret(secret: string): void;
154
+ setEncryptRequests(value: boolean): void;
155
+ _scheduleKeepSession(refreshToken: string, expiresIn: number, refreshFn: (rt: string) => Promise<{
156
+ access_token: string;
157
+ expires_in: number;
158
+ }>): void;
159
+ _clearRefreshTimer(): void;
160
+ stopKeepSession(): void;
161
+ readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
162
+ get _reqOpts(): import("../client/request").RequestOptions;
163
+ _request<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
164
+ _requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
165
+ _requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
166
+ };
167
+ } & TBase;
@@ -0,0 +1,51 @@
1
+ import type { GConstructor, EntityServerClientBase } from "../client/base";
2
+ export declare function EmailMixin<TBase extends GConstructor<EntityServerClientBase>>(Base: TBase): {
3
+ new (...args: any[]): {
4
+ /** 이메일 인증 코드 또는 링크를 발송합니다. */
5
+ emailVerificationSend(email: string): Promise<{
6
+ ok: boolean;
7
+ }>;
8
+ /** 이메일 인증 코드를 확인합니다. */
9
+ emailVerificationConfirm(token: string): Promise<{
10
+ ok: boolean;
11
+ }>;
12
+ /** 현재 계정의 이메일 인증 상태를 조회합니다. (JWT 필요) */
13
+ emailVerificationStatus(): Promise<{
14
+ ok: boolean;
15
+ verified: boolean;
16
+ email?: string;
17
+ }>;
18
+ /** 이메일 주소를 변경합니다. (JWT + 인증 코드 필요) */
19
+ emailChange(newEmail: string, code?: string): Promise<{
20
+ ok: boolean;
21
+ }>;
22
+ baseUrl: string;
23
+ token: string;
24
+ apiKey: string;
25
+ hmacSecret: string;
26
+ encryptRequests: boolean;
27
+ activeTxId: string | null;
28
+ keepSession: boolean;
29
+ refreshBuffer: number;
30
+ onTokenRefreshed?: (accessToken: string, expiresIn: number) => void;
31
+ onSessionExpired?: (error: Error) => void;
32
+ _sessionRefreshToken: string | null;
33
+ _refreshTimer: ReturnType<typeof setTimeout> | null;
34
+ configure(options: Partial<import("..").EntityServerClientOptions>): void;
35
+ setToken(token: string): void;
36
+ setApiKey(apiKey: string): void;
37
+ setHmacSecret(secret: string): void;
38
+ setEncryptRequests(value: boolean): void;
39
+ _scheduleKeepSession(refreshToken: string, expiresIn: number, refreshFn: (rt: string) => Promise<{
40
+ access_token: string;
41
+ expires_in: number;
42
+ }>): void;
43
+ _clearRefreshTimer(): void;
44
+ stopKeepSession(): void;
45
+ readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
46
+ get _reqOpts(): import("../client/request").RequestOptions;
47
+ _request<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
48
+ _requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
49
+ _requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
50
+ };
51
+ } & TBase;
@@ -0,0 +1,119 @@
1
+ import type { EntityHistoryRecord, EntityListParams, EntityListResult, EntityQueryRequest } from "../types";
2
+ import type { GConstructor, EntityServerClientBase } from "../client/base";
3
+ export declare function EntityMixin<TBase extends GConstructor<EntityServerClientBase>>(Base: TBase): {
4
+ new (...args: any[]): {
5
+ /** 트랜잭션을 시작하고 활성 트랜잭션 ID를 저장합니다. */
6
+ transStart(): Promise<string>;
7
+ /** 활성 트랜잭션(또는 전달된 transactionId)을 롤백합니다. */
8
+ transRollback(transactionId?: string): Promise<{
9
+ ok: boolean;
10
+ }>;
11
+ /**
12
+ * 활성 트랜잭션(또는 전달된 transactionId)을 커밋합니다.
13
+ *
14
+ * @returns `results` 배열: commit된 각 작업의 `entity`, `action`, `seq`
15
+ */
16
+ transCommit(transactionId?: string): Promise<{
17
+ ok: boolean;
18
+ results: Array<{
19
+ entity: string;
20
+ action: string;
21
+ seq: number;
22
+ }>;
23
+ }>;
24
+ /** 시퀀스 ID로 엔티티 단건을 조회합니다. */
25
+ get<T = unknown>(entity: string, seq: number, opts?: {
26
+ skipHooks?: boolean;
27
+ }): Promise<{
28
+ ok: boolean;
29
+ data: T;
30
+ }>;
31
+ /** 조건으로 엔티티 단건을 조회합니다. data 컬럼을 완전히 복호화하여 반환합니다. */
32
+ find<T = unknown>(entity: string, conditions?: Record<string, unknown>, opts?: {
33
+ skipHooks?: boolean;
34
+ }): Promise<{
35
+ ok: boolean;
36
+ data: T;
37
+ }>;
38
+ /** 페이지네이션/정렬/필터 조건으로 엔티티 목록을 조회합니다. */
39
+ list<T = unknown>(entity: string, params?: EntityListParams): Promise<{
40
+ ok: boolean;
41
+ data: EntityListResult<T>;
42
+ }>;
43
+ /**
44
+ * 엔티티 총 건수를 조회합니다.
45
+ *
46
+ * @param conditions 필터 조건 (예: `{ status: "active" }`)
47
+ */
48
+ count(entity: string, conditions?: Record<string, unknown>): Promise<{
49
+ ok: boolean;
50
+ count: number;
51
+ }>;
52
+ /**
53
+ * 커스텀 SQL로 엔티티를 조회합니다.
54
+ *
55
+ * SELECT 전용이며 인덱스 테이블만 조회 가능합니다. JOIN 지원.
56
+ */
57
+ query<T = unknown>(entity: string, req: EntityQueryRequest): Promise<{
58
+ ok: boolean;
59
+ data: {
60
+ items: T[];
61
+ count: number;
62
+ };
63
+ }>;
64
+ /** 엔티티 데이터를 생성/수정(Submit)합니다. `seq`가 없으면 INSERT, 있으면 UPDATE입니다. */
65
+ submit(entity: string, data: Record<string, unknown>, opts?: {
66
+ transactionId?: string;
67
+ skipHooks?: boolean;
68
+ }): Promise<{
69
+ ok: boolean;
70
+ seq: number;
71
+ }>;
72
+ /** 시퀀스 ID로 엔티티를 삭제합니다(`hard=true`면 하드 삭제, 기본은 소프트 삭제). */
73
+ delete(entity: string, seq: number, opts?: {
74
+ transactionId?: string;
75
+ hard?: boolean;
76
+ skipHooks?: boolean;
77
+ }): Promise<{
78
+ ok: boolean;
79
+ deleted: number;
80
+ }>;
81
+ /** 엔티티 단건의 변경 이력을 조회합니다. */
82
+ history<T = unknown>(entity: string, seq: number, params?: Pick<EntityListParams, "page" | "limit">): Promise<{
83
+ ok: boolean;
84
+ data: EntityListResult<EntityHistoryRecord<T>>;
85
+ }>;
86
+ /** 특정 이력 시점으로 엔티티를 롤백합니다. */
87
+ rollback(entity: string, historySeq: number): Promise<{
88
+ ok: boolean;
89
+ }>;
90
+ baseUrl: string;
91
+ token: string;
92
+ apiKey: string;
93
+ hmacSecret: string;
94
+ encryptRequests: boolean;
95
+ activeTxId: string | null;
96
+ keepSession: boolean;
97
+ refreshBuffer: number;
98
+ onTokenRefreshed?: (accessToken: string, expiresIn: number) => void;
99
+ onSessionExpired?: (error: Error) => void;
100
+ _sessionRefreshToken: string | null;
101
+ _refreshTimer: ReturnType<typeof setTimeout> | null;
102
+ configure(options: Partial<import("..").EntityServerClientOptions>): void;
103
+ setToken(token: string): void;
104
+ setApiKey(apiKey: string): void;
105
+ setHmacSecret(secret: string): void;
106
+ setEncryptRequests(value: boolean): void;
107
+ _scheduleKeepSession(refreshToken: string, expiresIn: number, refreshFn: (rt: string) => Promise<{
108
+ access_token: string;
109
+ expires_in: number;
110
+ }>): void;
111
+ _clearRefreshTimer(): void;
112
+ stopKeepSession(): void;
113
+ readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
114
+ get _reqOpts(): import("../client/request").RequestOptions;
115
+ _request<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
116
+ _requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
117
+ _requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
118
+ };
119
+ } & TBase;
@@ -0,0 +1,78 @@
1
+ import type { FileMeta, FileUploadOptions } from "../types";
2
+ import type { GConstructor, EntityServerClientBase } from "../client/base";
3
+ export declare function FileMixin<TBase extends GConstructor<EntityServerClientBase>>(Base: TBase): {
4
+ new (...args: any[]): {
5
+ /**
6
+ * 파일을 업로드합니다. (multipart/form-data)
7
+ *
8
+ * ```ts
9
+ * const input = document.querySelector('input[type="file"]');
10
+ * const result = await client.fileUpload("product", input.files[0]);
11
+ * console.log(result.data.uuid);
12
+ * ```
13
+ */
14
+ fileUpload(entity: string, file: File | Blob, opts?: FileUploadOptions): Promise<{
15
+ ok: boolean;
16
+ uuid: string;
17
+ data: FileMeta;
18
+ }>;
19
+ /** 파일을 다운로드합니다. `ArrayBuffer`를 반환합니다. */
20
+ fileDownload(entity: string, uuid: string): Promise<ArrayBuffer>;
21
+ /** 파일을 삭제합니다. */
22
+ fileDelete(entity: string, uuid: string): Promise<{
23
+ ok: boolean;
24
+ uuid: string;
25
+ deleted: boolean;
26
+ }>;
27
+ /** 엔티티에 연결된 파일 목록을 조회합니다. */
28
+ fileList(entity: string, opts?: {
29
+ refSeq?: number;
30
+ }): Promise<{
31
+ ok: boolean;
32
+ data: {
33
+ items: FileMeta[];
34
+ total: number;
35
+ };
36
+ }>;
37
+ /** 파일 메타 정보를 조회합니다. */
38
+ fileMeta(entity: string, uuid: string): Promise<{
39
+ ok: boolean;
40
+ data: FileMeta;
41
+ }>;
42
+ /** 임시 파일 접근 토큰을 발급합니다. */
43
+ fileToken(uuid: string): Promise<{
44
+ ok: boolean;
45
+ token: string;
46
+ }>;
47
+ /** 파일 인라인 뷰 URL을 반환합니다. (fetch 없음, URL 조합만) */
48
+ fileUrl(uuid: string): string;
49
+ baseUrl: string;
50
+ token: string;
51
+ apiKey: string;
52
+ hmacSecret: string;
53
+ encryptRequests: boolean;
54
+ activeTxId: string | null;
55
+ keepSession: boolean;
56
+ refreshBuffer: number;
57
+ onTokenRefreshed?: (accessToken: string, expiresIn: number) => void;
58
+ onSessionExpired?: (error: Error) => void;
59
+ _sessionRefreshToken: string | null;
60
+ _refreshTimer: ReturnType<typeof setTimeout> | null;
61
+ configure(options: Partial<import("..").EntityServerClientOptions>): void;
62
+ setToken(token: string): void;
63
+ setApiKey(apiKey: string): void;
64
+ setHmacSecret(secret: string): void;
65
+ setEncryptRequests(value: boolean): void;
66
+ _scheduleKeepSession(refreshToken: string, expiresIn: number, refreshFn: (rt: string) => Promise<{
67
+ access_token: string;
68
+ expires_in: number;
69
+ }>): void;
70
+ _clearRefreshTimer(): void;
71
+ stopKeepSession(): void;
72
+ readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
73
+ get _reqOpts(): import("../client/request").RequestOptions;
74
+ _request<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
75
+ _requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
76
+ _requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
77
+ };
78
+ } & TBase;
@@ -0,0 +1,52 @@
1
+ import type { IdentityRequestOptions } from "../types";
2
+ import type { GConstructor, EntityServerClientBase } from "../client/base";
3
+ export declare function IdentityMixin<TBase extends GConstructor<EntityServerClientBase>>(Base: TBase): {
4
+ new (...args: any[]): {
5
+ /** 본인인증 요청을 생성합니다. */
6
+ identityRequest(opts: IdentityRequestOptions): Promise<{
7
+ ok: boolean;
8
+ data: Record<string, unknown>;
9
+ }>;
10
+ /** 본인인증 결과를 조회합니다. */
11
+ identityResult(requestId: string): Promise<{
12
+ ok: boolean;
13
+ data: Record<string, unknown>;
14
+ }>;
15
+ /** CI 해시 중복 여부를 확인합니다. */
16
+ identityVerifyCI(ciHash: string): Promise<{
17
+ ok: boolean;
18
+ data: {
19
+ exists: boolean;
20
+ account_seq?: number;
21
+ };
22
+ }>;
23
+ baseUrl: string;
24
+ token: string;
25
+ apiKey: string;
26
+ hmacSecret: string;
27
+ encryptRequests: boolean;
28
+ activeTxId: string | null;
29
+ keepSession: boolean;
30
+ refreshBuffer: number;
31
+ onTokenRefreshed?: (accessToken: string, expiresIn: number) => void;
32
+ onSessionExpired?: (error: Error) => void;
33
+ _sessionRefreshToken: string | null;
34
+ _refreshTimer: ReturnType<typeof setTimeout> | null;
35
+ configure(options: Partial<import("..").EntityServerClientOptions>): void;
36
+ setToken(token: string): void;
37
+ setApiKey(apiKey: string): void;
38
+ setHmacSecret(secret: string): void;
39
+ setEncryptRequests(value: boolean): void;
40
+ _scheduleKeepSession(refreshToken: string, expiresIn: number, refreshFn: (rt: string) => Promise<{
41
+ access_token: string;
42
+ expires_in: number;
43
+ }>): void;
44
+ _clearRefreshTimer(): void;
45
+ stopKeepSession(): void;
46
+ readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
47
+ get _reqOpts(): import("../client/request").RequestOptions;
48
+ _request<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
49
+ _requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
50
+ _requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
51
+ };
52
+ } & TBase;
@@ -0,0 +1,63 @@
1
+ import type { PgCreateOrderRequest, PgConfirmPaymentRequest, PgCancelPaymentRequest } from "../types";
2
+ import type { GConstructor, EntityServerClientBase } from "../client/base";
3
+ export declare function PgMixin<TBase extends GConstructor<EntityServerClientBase>>(Base: TBase): {
4
+ new (...args: any[]): {
5
+ /** 결제 주문을 생성합니다. */
6
+ pgCreateOrder(req: PgCreateOrderRequest): Promise<{
7
+ ok: boolean;
8
+ data: Record<string, unknown>;
9
+ }>;
10
+ /** 주문 정보를 조회합니다. */
11
+ pgGetOrder(orderId: string): Promise<{
12
+ ok: boolean;
13
+ data: Record<string, unknown>;
14
+ }>;
15
+ /** 결제를 승인합니다. */
16
+ pgConfirmPayment(req: PgConfirmPaymentRequest): Promise<{
17
+ ok: boolean;
18
+ data: Record<string, unknown>;
19
+ }>;
20
+ /** 결제를 취소합니다. */
21
+ pgCancelPayment(orderId: string, req: PgCancelPaymentRequest): Promise<{
22
+ ok: boolean;
23
+ data: Record<string, unknown>;
24
+ }>;
25
+ /** 결제 상태를 외부 PG와 동기화합니다. */
26
+ pgSyncPayment(orderId: string): Promise<{
27
+ ok: boolean;
28
+ }>;
29
+ /** 클라이언트 SDK 설정을 반환합니다 (공개 API, 인증 불필요). */
30
+ pgConfig(): Promise<{
31
+ ok: boolean;
32
+ data: Record<string, unknown>;
33
+ }>;
34
+ baseUrl: string;
35
+ token: string;
36
+ apiKey: string;
37
+ hmacSecret: string;
38
+ encryptRequests: boolean;
39
+ activeTxId: string | null;
40
+ keepSession: boolean;
41
+ refreshBuffer: number;
42
+ onTokenRefreshed?: (accessToken: string, expiresIn: number) => void;
43
+ onSessionExpired?: (error: Error) => void;
44
+ _sessionRefreshToken: string | null;
45
+ _refreshTimer: ReturnType<typeof setTimeout> | null;
46
+ configure(options: Partial<import("..").EntityServerClientOptions>): void;
47
+ setToken(token: string): void;
48
+ setApiKey(apiKey: string): void;
49
+ setHmacSecret(secret: string): void;
50
+ setEncryptRequests(value: boolean): void;
51
+ _scheduleKeepSession(refreshToken: string, expiresIn: number, refreshFn: (rt: string) => Promise<{
52
+ access_token: string;
53
+ expires_in: number;
54
+ }>): void;
55
+ _clearRefreshTimer(): void;
56
+ stopKeepSession(): void;
57
+ readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
58
+ get _reqOpts(): import("../client/request").RequestOptions;
59
+ _request<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
60
+ _requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
61
+ _requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
62
+ };
63
+ } & TBase;
@@ -0,0 +1,110 @@
1
+ import type { EntityListParams, EntityListResult, RegisterPushDeviceOptions, PushSendRequest, PushSendAllRequest } from "../types";
2
+ import type { GConstructor, EntityServerClientBase } from "../client/base";
3
+ type WithSubmit = EntityServerClientBase & {
4
+ submit(entity: string, data: Record<string, unknown>, opts?: {
5
+ transactionId?: string;
6
+ skipHooks?: boolean;
7
+ }): Promise<{
8
+ ok: boolean;
9
+ seq: number;
10
+ }>;
11
+ list<T = unknown>(entity: string, params?: EntityListParams): Promise<{
12
+ ok: boolean;
13
+ data: EntityListResult<T>;
14
+ }>;
15
+ };
16
+ export declare function PushMixin<TBase extends GConstructor<WithSubmit>>(Base: TBase): {
17
+ new (...args: any[]): {
18
+ /**
19
+ * 푸시 관련 엔티티로 payload를 전송(Submit)합니다.
20
+ * 내부적으로 `submit()` 메서드를 호출합니다.
21
+ */
22
+ push(pushEntity: string, payload: Record<string, unknown>, opts?: {
23
+ transactionId?: string;
24
+ }): Promise<{
25
+ ok: boolean;
26
+ seq: number;
27
+ }>;
28
+ /** 푸시 로그 엔티티 목록을 조회합니다. */
29
+ pushLogList<T = unknown>(params?: EntityListParams): Promise<{
30
+ ok: boolean;
31
+ data: EntityListResult<T>;
32
+ }>;
33
+ /** 계정의 푸시 디바이스를 등록합니다. */
34
+ registerPushDevice(accountSeq: number, deviceId: string, pushToken: string, opts?: RegisterPushDeviceOptions): Promise<{
35
+ ok: boolean;
36
+ seq: number;
37
+ }>;
38
+ /** 디바이스 레코드의 푸시 토큰을 갱신합니다. */
39
+ updatePushDeviceToken(deviceSeq: number, pushToken: string, opts?: {
40
+ pushEnabled?: boolean;
41
+ transactionId?: string;
42
+ }): Promise<{
43
+ ok: boolean;
44
+ seq: number;
45
+ }>;
46
+ /** 디바이스의 푸시 수신을 비활성화합니다. */
47
+ disablePushDevice(deviceSeq: number, opts?: {
48
+ transactionId?: string;
49
+ }): Promise<{
50
+ ok: boolean;
51
+ seq: number;
52
+ }>;
53
+ /** 특정 계정에 푸시 알림을 발송합니다. */
54
+ pushSend(req: PushSendRequest): Promise<{
55
+ ok: boolean;
56
+ seq: number;
57
+ }>;
58
+ /** 전체 사용자에게 푸시 알림을 발송합니다. */
59
+ pushSendAll(req: PushSendAllRequest): Promise<{
60
+ ok: boolean;
61
+ sent: number;
62
+ failed: number;
63
+ }>;
64
+ /** 푸시 발송 상태를 조회합니다. */
65
+ pushStatus(seq: number): Promise<{
66
+ ok: boolean;
67
+ status: string;
68
+ }>;
69
+ baseUrl: string;
70
+ token: string;
71
+ apiKey: string;
72
+ hmacSecret: string;
73
+ encryptRequests: boolean;
74
+ activeTxId: string | null;
75
+ keepSession: boolean;
76
+ refreshBuffer: number;
77
+ onTokenRefreshed?: (accessToken: string, expiresIn: number) => void;
78
+ onSessionExpired?: (error: Error) => void;
79
+ _sessionRefreshToken: string | null;
80
+ _refreshTimer: ReturnType<typeof setTimeout> | null;
81
+ configure(options: Partial<import("..").EntityServerClientOptions>): void;
82
+ setToken(token: string): void;
83
+ setApiKey(apiKey: string): void;
84
+ setHmacSecret(secret: string): void;
85
+ setEncryptRequests(value: boolean): void;
86
+ _scheduleKeepSession(refreshToken: string, expiresIn: number, refreshFn: (rt: string) => Promise<{
87
+ access_token: string;
88
+ expires_in: number;
89
+ }>): void;
90
+ _clearRefreshTimer(): void;
91
+ stopKeepSession(): void;
92
+ readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
93
+ get _reqOpts(): import("../client/request").RequestOptions;
94
+ _request<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
95
+ _requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
96
+ _requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
97
+ submit(entity: string, data: Record<string, unknown>, opts?: {
98
+ transactionId?: string;
99
+ skipHooks?: boolean;
100
+ }): Promise<{
101
+ ok: boolean;
102
+ seq: number;
103
+ }>;
104
+ list<T = unknown>(entity: string, params?: EntityListParams): Promise<{
105
+ ok: boolean;
106
+ data: EntityListResult<T>;
107
+ }>;
108
+ };
109
+ } & TBase;
110
+ export {};