entity-server-client 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/EntityServerClient.d.ts +40 -40
- package/dist/EntityServerClient.js +2 -0
- package/dist/EntityServerClient.js.map +7 -0
- package/dist/client/base.d.ts +2 -2
- package/dist/client/base.js +2 -0
- package/dist/client/base.js.map +7 -0
- package/dist/client/hmac.js +2 -0
- package/dist/client/hmac.js.map +7 -0
- package/dist/client/packet.js +2 -0
- package/dist/client/packet.js.map +7 -0
- package/dist/client/request.js +2 -0
- package/dist/client/request.js.map +7 -0
- package/dist/client/utils.js +2 -0
- package/dist/client/utils.js.map +7 -0
- package/dist/hooks/useEntityServer.d.ts +1 -1
- package/dist/hooks/useEntityServer.js +2 -0
- package/dist/hooks/useEntityServer.js.map +7 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1 -1
- package/dist/index.js.map +2 -2
- package/dist/mixins/auth.d.ts +4 -4
- package/dist/mixins/auth.js +2 -0
- package/dist/mixins/auth.js.map +7 -0
- package/dist/mixins/entity.d.ts +5 -5
- package/dist/mixins/entity.js +2 -0
- package/dist/mixins/entity.js.map +7 -0
- package/dist/mixins/file.d.ts +5 -5
- package/dist/mixins/file.js +2 -0
- package/dist/mixins/file.js.map +7 -0
- package/dist/mixins/push.d.ts +5 -5
- package/dist/mixins/push.js +2 -0
- package/dist/mixins/push.js.map +7 -0
- package/dist/mixins/smtp.d.ts +5 -5
- package/dist/mixins/smtp.js +2 -0
- package/dist/mixins/smtp.js.map +7 -0
- package/dist/mixins/utils.d.ts +5 -5
- package/dist/mixins/utils.js +2 -0
- package/dist/mixins/utils.js.map +7 -0
- package/dist/react.d.ts +1 -1
- package/dist/react.js +1 -1
- package/dist/react.js.map +2 -2
- package/dist/types.js +1 -0
- package/dist/types.js.map +7 -0
- package/package.json +2 -2
|
@@ -11,21 +11,21 @@
|
|
|
11
11
|
* src/mixins/file.ts — 파일 스토리지
|
|
12
12
|
* src/mixins/utils.ts — QR코드/바코드/PDF변환
|
|
13
13
|
*/
|
|
14
|
-
import { EntityServerClientBase } from "./client/base";
|
|
14
|
+
import { EntityServerClientBase } from "./client/base.js";
|
|
15
15
|
declare const EntityServerClient_base: {
|
|
16
16
|
new (...args: any[]): {
|
|
17
|
-
qrcode(content: string, opts?: import("./types").QRCodeOptions): Promise<ArrayBuffer>;
|
|
18
|
-
qrcodeBase64(content: string, opts?: import("./types").QRCodeOptions): Promise<{
|
|
17
|
+
qrcode(content: string, opts?: import("./types.js").QRCodeOptions): Promise<ArrayBuffer>;
|
|
18
|
+
qrcodeBase64(content: string, opts?: import("./types.js").QRCodeOptions): Promise<{
|
|
19
19
|
ok: boolean;
|
|
20
20
|
data: string;
|
|
21
21
|
data_uri: string;
|
|
22
22
|
}>;
|
|
23
|
-
qrcodeText(content: string, opts?: import("./types").QRCodeOptions): Promise<{
|
|
23
|
+
qrcodeText(content: string, opts?: import("./types.js").QRCodeOptions): Promise<{
|
|
24
24
|
ok: boolean;
|
|
25
25
|
text: string;
|
|
26
26
|
}>;
|
|
27
|
-
barcode(content: string, opts?: import("./types").BarcodeOptions): Promise<ArrayBuffer>;
|
|
28
|
-
pdf2png(pdfData: ArrayBuffer | Uint8Array<ArrayBuffer>, opts?: import("./types").Pdf2PngOptions): Promise<ArrayBuffer>;
|
|
27
|
+
barcode(content: string, opts?: import("./types.js").BarcodeOptions): Promise<ArrayBuffer>;
|
|
28
|
+
pdf2png(pdfData: ArrayBuffer | Uint8Array<ArrayBuffer>, opts?: import("./types.js").Pdf2PngOptions): Promise<ArrayBuffer>;
|
|
29
29
|
baseUrl: string;
|
|
30
30
|
token: string;
|
|
31
31
|
anonymousPacketToken: string;
|
|
@@ -46,7 +46,7 @@ declare const EntityServerClient_base: {
|
|
|
46
46
|
_refreshTimer: ReturnType<typeof setTimeout> | null;
|
|
47
47
|
_csrfRefreshTimer: ReturnType<typeof setTimeout> | null;
|
|
48
48
|
_csrfRefreshPromise: Promise<string> | null;
|
|
49
|
-
configure(options: Partial<import("./types").EntityServerClientOptions>): void;
|
|
49
|
+
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
50
50
|
setToken(token: string): void;
|
|
51
51
|
setAnonymousPacketToken(token: string): void;
|
|
52
52
|
setApiKey(apiKey: string): void;
|
|
@@ -64,9 +64,9 @@ declare const EntityServerClient_base: {
|
|
|
64
64
|
stopCsrfRefresh(): void;
|
|
65
65
|
_scheduleCsrfRefresh(expiresIn: number): void;
|
|
66
66
|
refreshCsrfToken(): Promise<string>;
|
|
67
|
-
_applyCsrfHealth(csrf?: import("./types").EntityServerClientHealthCsrf | null): void;
|
|
67
|
+
_applyCsrfHealth(csrf?: import("./types.js").EntityServerClientHealthCsrf | null): void;
|
|
68
68
|
readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
|
|
69
|
-
get _reqOpts(): import("./client/request").RequestOptions;
|
|
69
|
+
get _reqOpts(): import("./client/request.js").RequestOptions;
|
|
70
70
|
requestJson<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
|
|
71
71
|
requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
|
|
72
72
|
requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
|
|
@@ -78,10 +78,10 @@ declare const EntityServerClient_base: {
|
|
|
78
78
|
};
|
|
79
79
|
} & {
|
|
80
80
|
new (...args: any[]): {
|
|
81
|
-
fileUpload(entity: string, file: File | Blob, opts?: import("./types").FileUploadOptions): Promise<{
|
|
81
|
+
fileUpload(entity: string, file: File | Blob, opts?: import("./types.js").FileUploadOptions): Promise<{
|
|
82
82
|
ok: boolean;
|
|
83
83
|
uuid: string;
|
|
84
|
-
data: import("./types").FileMeta;
|
|
84
|
+
data: import("./types.js").FileMeta;
|
|
85
85
|
}>;
|
|
86
86
|
fileDownload(entity: string, uuid: string): Promise<ArrayBuffer>;
|
|
87
87
|
fileDelete(entity: string, uuid: string): Promise<{
|
|
@@ -94,13 +94,13 @@ declare const EntityServerClient_base: {
|
|
|
94
94
|
}): Promise<{
|
|
95
95
|
ok: boolean;
|
|
96
96
|
data: {
|
|
97
|
-
items: import("./types").FileMeta[];
|
|
97
|
+
items: import("./types.js").FileMeta[];
|
|
98
98
|
total: number;
|
|
99
99
|
};
|
|
100
100
|
}>;
|
|
101
101
|
fileMeta(entity: string, uuid: string): Promise<{
|
|
102
102
|
ok: boolean;
|
|
103
|
-
data: import("./types").FileMeta;
|
|
103
|
+
data: import("./types.js").FileMeta;
|
|
104
104
|
}>;
|
|
105
105
|
fileToken(uuid: string): Promise<{
|
|
106
106
|
ok: boolean;
|
|
@@ -127,7 +127,7 @@ declare const EntityServerClient_base: {
|
|
|
127
127
|
_refreshTimer: ReturnType<typeof setTimeout> | null;
|
|
128
128
|
_csrfRefreshTimer: ReturnType<typeof setTimeout> | null;
|
|
129
129
|
_csrfRefreshPromise: Promise<string> | null;
|
|
130
|
-
configure(options: Partial<import("./types").EntityServerClientOptions>): void;
|
|
130
|
+
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
131
131
|
setToken(token: string): void;
|
|
132
132
|
setAnonymousPacketToken(token: string): void;
|
|
133
133
|
setApiKey(apiKey: string): void;
|
|
@@ -145,9 +145,9 @@ declare const EntityServerClient_base: {
|
|
|
145
145
|
stopCsrfRefresh(): void;
|
|
146
146
|
_scheduleCsrfRefresh(expiresIn: number): void;
|
|
147
147
|
refreshCsrfToken(): Promise<string>;
|
|
148
|
-
_applyCsrfHealth(csrf?: import("./types").EntityServerClientHealthCsrf | null): void;
|
|
148
|
+
_applyCsrfHealth(csrf?: import("./types.js").EntityServerClientHealthCsrf | null): void;
|
|
149
149
|
readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
|
|
150
|
-
get _reqOpts(): import("./client/request").RequestOptions;
|
|
150
|
+
get _reqOpts(): import("./client/request.js").RequestOptions;
|
|
151
151
|
requestJson<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
|
|
152
152
|
requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
|
|
153
153
|
requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
|
|
@@ -159,7 +159,7 @@ declare const EntityServerClient_base: {
|
|
|
159
159
|
};
|
|
160
160
|
} & {
|
|
161
161
|
new (...args: any[]): {
|
|
162
|
-
smtpSend(req: import("./types").SmtpSendRequest): Promise<{
|
|
162
|
+
smtpSend(req: import("./types.js").SmtpSendRequest): Promise<{
|
|
163
163
|
ok: boolean;
|
|
164
164
|
seq: number;
|
|
165
165
|
}>;
|
|
@@ -187,7 +187,7 @@ declare const EntityServerClient_base: {
|
|
|
187
187
|
_refreshTimer: ReturnType<typeof setTimeout> | null;
|
|
188
188
|
_csrfRefreshTimer: ReturnType<typeof setTimeout> | null;
|
|
189
189
|
_csrfRefreshPromise: Promise<string> | null;
|
|
190
|
-
configure(options: Partial<import("./types").EntityServerClientOptions>): void;
|
|
190
|
+
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
191
191
|
setToken(token: string): void;
|
|
192
192
|
setAnonymousPacketToken(token: string): void;
|
|
193
193
|
setApiKey(apiKey: string): void;
|
|
@@ -205,9 +205,9 @@ declare const EntityServerClient_base: {
|
|
|
205
205
|
stopCsrfRefresh(): void;
|
|
206
206
|
_scheduleCsrfRefresh(expiresIn: number): void;
|
|
207
207
|
refreshCsrfToken(): Promise<string>;
|
|
208
|
-
_applyCsrfHealth(csrf?: import("./types").EntityServerClientHealthCsrf | null): void;
|
|
208
|
+
_applyCsrfHealth(csrf?: import("./types.js").EntityServerClientHealthCsrf | null): void;
|
|
209
209
|
readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
|
|
210
|
-
get _reqOpts(): import("./client/request").RequestOptions;
|
|
210
|
+
get _reqOpts(): import("./client/request.js").RequestOptions;
|
|
211
211
|
requestJson<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
|
|
212
212
|
requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
|
|
213
213
|
requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
|
|
@@ -225,11 +225,11 @@ declare const EntityServerClient_base: {
|
|
|
225
225
|
ok: boolean;
|
|
226
226
|
seq: number;
|
|
227
227
|
}>;
|
|
228
|
-
pushLogList<T = unknown>(params?: import("./types").EntityListParams): Promise<{
|
|
228
|
+
pushLogList<T = unknown>(params?: import("./types.js").EntityListParams): Promise<{
|
|
229
229
|
ok: boolean;
|
|
230
|
-
data: import("./types").EntityListResult<T>;
|
|
230
|
+
data: import("./types.js").EntityListResult<T>;
|
|
231
231
|
}>;
|
|
232
|
-
registerPushDevice(accountSeq: number, deviceId: string, pushToken: string, opts?: import("./types").RegisterPushDeviceOptions): Promise<{
|
|
232
|
+
registerPushDevice(accountSeq: number, deviceId: string, pushToken: string, opts?: import("./types.js").RegisterPushDeviceOptions): Promise<{
|
|
233
233
|
ok: boolean;
|
|
234
234
|
seq: number;
|
|
235
235
|
}>;
|
|
@@ -266,7 +266,7 @@ declare const EntityServerClient_base: {
|
|
|
266
266
|
_refreshTimer: ReturnType<typeof setTimeout> | null;
|
|
267
267
|
_csrfRefreshTimer: ReturnType<typeof setTimeout> | null;
|
|
268
268
|
_csrfRefreshPromise: Promise<string> | null;
|
|
269
|
-
configure(options: Partial<import("./types").EntityServerClientOptions>): void;
|
|
269
|
+
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
270
270
|
setToken(token: string): void;
|
|
271
271
|
setAnonymousPacketToken(token: string): void;
|
|
272
272
|
setApiKey(apiKey: string): void;
|
|
@@ -284,9 +284,9 @@ declare const EntityServerClient_base: {
|
|
|
284
284
|
stopCsrfRefresh(): void;
|
|
285
285
|
_scheduleCsrfRefresh(expiresIn: number): void;
|
|
286
286
|
refreshCsrfToken(): Promise<string>;
|
|
287
|
-
_applyCsrfHealth(csrf?: import("./types").EntityServerClientHealthCsrf | null): void;
|
|
287
|
+
_applyCsrfHealth(csrf?: import("./types.js").EntityServerClientHealthCsrf | null): void;
|
|
288
288
|
readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
|
|
289
|
-
get _reqOpts(): import("./client/request").RequestOptions;
|
|
289
|
+
get _reqOpts(): import("./client/request.js").RequestOptions;
|
|
290
290
|
requestJson<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
|
|
291
291
|
requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
|
|
292
292
|
requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
|
|
@@ -302,9 +302,9 @@ declare const EntityServerClient_base: {
|
|
|
302
302
|
ok: boolean;
|
|
303
303
|
seq: number;
|
|
304
304
|
}>;
|
|
305
|
-
list<T = unknown>(entity: string, params?: import("./types").EntityListParams): Promise<{
|
|
305
|
+
list<T = unknown>(entity: string, params?: import("./types.js").EntityListParams): Promise<{
|
|
306
306
|
ok: boolean;
|
|
307
|
-
data: import("./types").EntityListResult<T>;
|
|
307
|
+
data: import("./types.js").EntityListResult<T>;
|
|
308
308
|
}>;
|
|
309
309
|
};
|
|
310
310
|
} & {
|
|
@@ -333,15 +333,15 @@ declare const EntityServerClient_base: {
|
|
|
333
333
|
ok: boolean;
|
|
334
334
|
data: T;
|
|
335
335
|
}>;
|
|
336
|
-
list<T = unknown>(entity: string, params?: import("./types").EntityListParams): Promise<{
|
|
336
|
+
list<T = unknown>(entity: string, params?: import("./types.js").EntityListParams): Promise<{
|
|
337
337
|
ok: boolean;
|
|
338
|
-
data: import("./types").EntityListResult<T>;
|
|
338
|
+
data: import("./types.js").EntityListResult<T>;
|
|
339
339
|
}>;
|
|
340
340
|
count(entity: string, conditions?: Record<string, unknown>): Promise<{
|
|
341
341
|
ok: boolean;
|
|
342
342
|
count: number;
|
|
343
343
|
}>;
|
|
344
|
-
query<T = unknown>(entity: string, req: import("./types").EntityQueryRequest): Promise<{
|
|
344
|
+
query<T = unknown>(entity: string, req: import("./types.js").EntityQueryRequest): Promise<{
|
|
345
345
|
ok: boolean;
|
|
346
346
|
data: {
|
|
347
347
|
items: T[];
|
|
@@ -363,9 +363,9 @@ declare const EntityServerClient_base: {
|
|
|
363
363
|
ok: boolean;
|
|
364
364
|
deleted: number;
|
|
365
365
|
}>;
|
|
366
|
-
history<T = unknown>(entity: string, seq: number, params?: Pick<import("./types").EntityListParams, "page" | "limit">): Promise<{
|
|
366
|
+
history<T = unknown>(entity: string, seq: number, params?: Pick<import("./types.js").EntityListParams, "page" | "limit">): Promise<{
|
|
367
367
|
ok: boolean;
|
|
368
|
-
data: import("./types").EntityListResult<import("./types").EntityHistoryRecord<T>>;
|
|
368
|
+
data: import("./types.js").EntityListResult<import("./types.js").EntityHistoryRecord<T>>;
|
|
369
369
|
}>;
|
|
370
370
|
rollback(entity: string, historySeq: number): Promise<{
|
|
371
371
|
ok: boolean;
|
|
@@ -390,7 +390,7 @@ declare const EntityServerClient_base: {
|
|
|
390
390
|
_refreshTimer: ReturnType<typeof setTimeout> | null;
|
|
391
391
|
_csrfRefreshTimer: ReturnType<typeof setTimeout> | null;
|
|
392
392
|
_csrfRefreshPromise: Promise<string> | null;
|
|
393
|
-
configure(options: Partial<import("./types").EntityServerClientOptions>): void;
|
|
393
|
+
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
394
394
|
setToken(token: string): void;
|
|
395
395
|
setAnonymousPacketToken(token: string): void;
|
|
396
396
|
setApiKey(apiKey: string): void;
|
|
@@ -408,9 +408,9 @@ declare const EntityServerClient_base: {
|
|
|
408
408
|
stopCsrfRefresh(): void;
|
|
409
409
|
_scheduleCsrfRefresh(expiresIn: number): void;
|
|
410
410
|
refreshCsrfToken(): Promise<string>;
|
|
411
|
-
_applyCsrfHealth(csrf?: import("./types").EntityServerClientHealthCsrf | null): void;
|
|
411
|
+
_applyCsrfHealth(csrf?: import("./types.js").EntityServerClientHealthCsrf | null): void;
|
|
412
412
|
readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
|
|
413
|
-
get _reqOpts(): import("./client/request").RequestOptions;
|
|
413
|
+
get _reqOpts(): import("./client/request.js").RequestOptions;
|
|
414
414
|
requestJson<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
|
|
415
415
|
requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
|
|
416
416
|
requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
|
|
@@ -427,7 +427,7 @@ declare const EntityServerClient_base: {
|
|
|
427
427
|
packet_encryption?: boolean;
|
|
428
428
|
packet_mode?: string;
|
|
429
429
|
packet_token?: string;
|
|
430
|
-
csrf?: import("./types").EntityServerClientHealthCsrf;
|
|
430
|
+
csrf?: import("./types.js").EntityServerClientHealthCsrf;
|
|
431
431
|
}>;
|
|
432
432
|
login(email: string, password: string): Promise<{
|
|
433
433
|
access_token: string;
|
|
@@ -481,7 +481,7 @@ declare const EntityServerClient_base: {
|
|
|
481
481
|
_refreshTimer: ReturnType<typeof setTimeout> | null;
|
|
482
482
|
_csrfRefreshTimer: ReturnType<typeof setTimeout> | null;
|
|
483
483
|
_csrfRefreshPromise: Promise<string> | null;
|
|
484
|
-
configure(options: Partial<import("./types").EntityServerClientOptions>): void;
|
|
484
|
+
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
485
485
|
setToken(token: string): void;
|
|
486
486
|
setAnonymousPacketToken(token: string): void;
|
|
487
487
|
setApiKey(apiKey: string): void;
|
|
@@ -499,9 +499,9 @@ declare const EntityServerClient_base: {
|
|
|
499
499
|
stopCsrfRefresh(): void;
|
|
500
500
|
_scheduleCsrfRefresh(expiresIn: number): void;
|
|
501
501
|
refreshCsrfToken(): Promise<string>;
|
|
502
|
-
_applyCsrfHealth(csrf?: import("./types").EntityServerClientHealthCsrf | null): void;
|
|
502
|
+
_applyCsrfHealth(csrf?: import("./types.js").EntityServerClientHealthCsrf | null): void;
|
|
503
503
|
readRequestBody<T = Record<string, unknown>>(body: ArrayBuffer | Uint8Array | string | T | null | undefined, contentType?: string, requireEncrypted?: boolean): T;
|
|
504
|
-
get _reqOpts(): import("./client/request").RequestOptions;
|
|
504
|
+
get _reqOpts(): import("./client/request.js").RequestOptions;
|
|
505
505
|
requestJson<T>(method: string, path: string, body?: unknown, withAuth?: boolean, extraHeaders?: Record<string, string>): Promise<T>;
|
|
506
506
|
requestBinary(method: string, path: string, body?: unknown, withAuth?: boolean): Promise<ArrayBuffer>;
|
|
507
507
|
requestForm<T>(method: string, path: string, form: FormData, withAuth?: boolean): Promise<T>;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{EntityServerClientBase as i}from"./client/base.js";import{AuthMixin as t}from"./mixins/auth.js";import{EntityMixin as r}from"./mixins/entity.js";import{PushMixin as m}from"./mixins/push.js";import{SmtpMixin as o}from"./mixins/smtp.js";import{FileMixin as n}from"./mixins/file.js";import{UtilsMixin as e}from"./mixins/utils.js";class S extends e(n(o(m(r(t(i)))))){}export{S as EntityServerClient};
|
|
2
|
+
//# sourceMappingURL=EntityServerClient.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/EntityServerClient.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * @file EntityServerClient.ts\n * Mixin \uD328\uD134\uC73C\uB85C \uAD6C\uC131\uB41C EntityServerClient.\n *\n * \uC808(section)\uBCC4 \uAD6C\uD604:\n * src/client/base.ts \u2014 \uC0C1\uD0DC\u00B7\uC0DD\uC131\uC790\u00B7\uACF5\uD1B5 \uD5EC\uD37C\n * src/mixins/auth.ts \u2014 \uC778\uC99D (\uB85C\uADF8\uC778/\uB85C\uADF8\uC544\uC6C3/me/\uD2B8\uB79C\uC7AD\uC158 \uB4F1)\n * src/mixins/entity.ts \u2014 \uD2B8\uB79C\uC7AD\uC158 & \uC5D4\uD2F0\uD2F0 CRUD\n * src/mixins/push.ts \u2014 \uD478\uC2DC \uB514\uBC14\uC774\uC2A4 \uAD00\uB9AC\n * src/mixins/smtp.ts \u2014 SMTP \uBA54\uC77C \uBC1C\uC1A1\n * src/mixins/file.ts \u2014 \uD30C\uC77C \uC2A4\uD1A0\uB9AC\uC9C0\n * src/mixins/utils.ts \u2014 QR\uCF54\uB4DC/\uBC14\uCF54\uB4DC/PDF\uBCC0\uD658\n */\nimport { EntityServerClientBase } from \"./client/base.js\";\nimport { AuthMixin } from \"./mixins/auth.js\";\nimport { EntityMixin } from \"./mixins/entity.js\";\nimport { PushMixin } from \"./mixins/push.js\";\nimport { SmtpMixin } from \"./mixins/smtp.js\";\nimport { FileMixin } from \"./mixins/file.js\";\nimport { UtilsMixin } from \"./mixins/utils.js\";\n\n// \u2500\u2500\u2500 Composed class \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class EntityServerClient extends UtilsMixin(\n FileMixin(\n SmtpMixin(PushMixin(EntityMixin(AuthMixin(EntityServerClientBase)))),\n ),\n) {}\n"],
|
|
5
|
+
"mappings": "AAaA,OAAS,0BAAAA,MAA8B,mBACvC,OAAS,aAAAC,MAAiB,mBAC1B,OAAS,eAAAC,MAAmB,qBAC5B,OAAS,aAAAC,MAAiB,mBAC1B,OAAS,aAAAC,MAAiB,mBAC1B,OAAS,aAAAC,MAAiB,mBAC1B,OAAS,cAAAC,MAAkB,oBAIpB,MAAMC,UAA2BD,EACpCD,EACID,EAAUD,EAAUD,EAAYD,EAAUD,CAAsB,CAAC,CAAC,CAAC,CACvE,CACJ,CAAE,CAAC",
|
|
6
|
+
"names": ["EntityServerClientBase", "AuthMixin", "EntityMixin", "PushMixin", "SmtpMixin", "FileMixin", "UtilsMixin", "EntityServerClient"]
|
|
7
|
+
}
|
package/dist/client/base.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { EntityServerClientHealthCsrf, EntityServerClientOptions } from "../types";
|
|
2
|
-
import { type RequestOptions } from "./request";
|
|
1
|
+
import type { EntityServerClientHealthCsrf, EntityServerClientOptions } from "../types.js";
|
|
2
|
+
import { type RequestOptions } from "./request.js";
|
|
3
3
|
export type GConstructor<T = object> = new (...args: any[]) => T;
|
|
4
4
|
export declare class EntityServerClientBase {
|
|
5
5
|
baseUrl: string;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{readEnv as o}from"./utils.js";import{derivePacketKey as c,parseRequestBody as u}from"./packet.js";import{entityRequest as h}from"./request.js";class d{baseUrl;token;anonymousPacketToken;apiKey;hmacSecret;encryptRequests;csrfEnabled;csrfToken;csrfHeaderName;csrfRefreshPath;csrfRefreshBuffer;activeTxId=null;keepSession;refreshBuffer;onTokenRefreshed;onSessionExpired;_sessionRefreshToken=null;_refreshTimer=null;_csrfRefreshTimer=null;_csrfRefreshPromise=null;constructor(e={}){const r=o("VITE_ENTITY_SERVER_URL");this.baseUrl=(e.baseUrl??r??"").replace(/\/$/,""),this.token=e.token??"",this.anonymousPacketToken=e.anonymousPacketToken??"",this.apiKey=e.apiKey??"",this.hmacSecret=e.hmacSecret??"",this.encryptRequests=e.encryptRequests??!1,this.csrfEnabled=e.csrfEnabled??!1,this.csrfToken=e.csrfToken??"",this.csrfHeaderName=e.csrfHeaderName??"x-csrf-token",this.csrfRefreshPath=e.csrfRefreshPath??"/v1/csrf-token",this.csrfRefreshBuffer=e.csrfRefreshBuffer??60,this.keepSession=e.keepSession??!1,this.refreshBuffer=e.refreshBuffer??60,this.onTokenRefreshed=e.onTokenRefreshed,this.onSessionExpired=e.onSessionExpired}configure(e){typeof e.baseUrl=="string"&&(this.baseUrl=e.baseUrl.replace(/\/$/,"")),typeof e.token=="string"&&(this.token=e.token),typeof e.anonymousPacketToken=="string"&&(this.anonymousPacketToken=e.anonymousPacketToken),typeof e.encryptRequests=="boolean"&&(this.encryptRequests=e.encryptRequests),typeof e.csrfEnabled=="boolean"&&(this.csrfEnabled=e.csrfEnabled,e.csrfEnabled||(this.csrfToken="",this.stopCsrfRefresh())),typeof e.csrfToken=="string"&&(this.csrfToken=e.csrfToken),typeof e.csrfHeaderName=="string"&&(this.csrfHeaderName=e.csrfHeaderName),typeof e.csrfRefreshPath=="string"&&(this.csrfRefreshPath=e.csrfRefreshPath),typeof e.csrfRefreshBuffer=="number"&&(this.csrfRefreshBuffer=e.csrfRefreshBuffer),typeof e.apiKey=="string"&&(this.apiKey=e.apiKey),typeof e.hmacSecret=="string"&&(this.hmacSecret=e.hmacSecret),typeof e.keepSession=="boolean"&&(this.keepSession=e.keepSession),typeof e.refreshBuffer=="number"&&(this.refreshBuffer=e.refreshBuffer),e.onTokenRefreshed&&(this.onTokenRefreshed=e.onTokenRefreshed),e.onSessionExpired&&(this.onSessionExpired=e.onSessionExpired)}setToken(e){this.token=e}setAnonymousPacketToken(e){this.anonymousPacketToken=e}setApiKey(e){this.apiKey=e}setHmacSecret(e){this.hmacSecret=e}setEncryptRequests(e){this.encryptRequests=e}setCsrfToken(e){this.csrfToken=e}setCsrfEnabled(e){this.csrfEnabled=e,e||(this.csrfToken="",this.stopCsrfRefresh())}_scheduleKeepSession(e,r,t){this._clearRefreshTimer(),this._sessionRefreshToken=e;const i=Math.max((r-this.refreshBuffer)*1e3,0);this._refreshTimer=setTimeout(async()=>{if(this._sessionRefreshToken)try{const s=await t(this._sessionRefreshToken);this.onTokenRefreshed?.(s.access_token,s.expires_in),this._scheduleKeepSession(this._sessionRefreshToken,s.expires_in,t)}catch(s){this._clearRefreshTimer(),this.onSessionExpired?.(s instanceof Error?s:new Error(String(s)))}},i)}_clearRefreshTimer(){this._refreshTimer!==null&&(clearTimeout(this._refreshTimer),this._refreshTimer=null)}stopKeepSession(){this._clearRefreshTimer(),this._sessionRefreshToken=null}_clearCsrfRefreshTimer(){this._csrfRefreshTimer!==null&&(clearTimeout(this._csrfRefreshTimer),this._csrfRefreshTimer=null)}stopCsrfRefresh(){this._clearCsrfRefreshTimer(),this._csrfRefreshPromise=null}_scheduleCsrfRefresh(e){if(this._clearCsrfRefreshTimer(),!this.csrfEnabled||!this.csrfRefreshPath)return;const r=Math.max((e-this.csrfRefreshBuffer)*1e3,0);this._csrfRefreshTimer=setTimeout(()=>{this.refreshCsrfToken().catch(()=>{this._clearCsrfRefreshTimer()})},r)}async refreshCsrfToken(){return!this.csrfEnabled||!this.csrfRefreshPath?"":(this._csrfRefreshPromise||(this._csrfRefreshPromise=(async()=>{const e=await fetch(`${this.baseUrl}${this.csrfRefreshPath}`,{method:"GET",credentials:"include"});if(!e.ok){const i=await e.text().catch(()=>""),s=new Error(i||`HTTP ${e.status}`);throw s.status=e.status,s}const r=await e.json().catch(()=>null),t=r&&typeof r=="object"&&"data"in r?r.data??null:r;if(!t?.enabled||typeof t.token!="string")throw new Error("CSRF token refresh failed");return this._applyCsrfHealth(t),this.csrfToken})().finally(()=>{this._csrfRefreshPromise=null})),this._csrfRefreshPromise)}_applyCsrfHealth(e){if(!e?.enabled){this.setCsrfEnabled(!1);return}this.csrfEnabled=!0,typeof e.token=="string"&&(this.csrfToken=e.token),typeof e.headerName=="string"&&(this.csrfHeaderName=e.headerName),typeof e.refreshPath=="string"&&(this.csrfRefreshPath=e.refreshPath),typeof e.expiresIn=="number"&&e.expiresIn>0&&this._scheduleCsrfRefresh(e.expiresIn)}readRequestBody(e,r="application/json",t=!1){const i=c(this.hmacSecret,this.token||this.anonymousPacketToken);return u(e,r,t,i)}get _reqOpts(){return{baseUrl:this.baseUrl,token:this.token,anonymousPacketToken:this.anonymousPacketToken,apiKey:this.apiKey,hmacSecret:this.hmacSecret,encryptRequests:this.encryptRequests,csrfEnabled:this.csrfEnabled,csrfToken:this.csrfToken,csrfHeaderName:this.csrfHeaderName,refreshCsrfToken:this.csrfEnabled?()=>this.refreshCsrfToken():null}}requestJson(e,r,t,i=!0,s){return h(this._reqOpts,e,r,t,i,s,!1)}requestBinary(e,r,t,i=!0){return this._requestBinary(e,r,t,i)}requestForm(e,r,t,i=!0){return this._requestForm(e,r,t,i)}requestFormBinary(e,r,t,i=!0){return this._requestFormBinary(e,r,t,i)}_request(e,r,t,i=!0,s){return h(this._reqOpts,e,r,t,i,s,!0)}async _requestBinary(e,r,t,i=!0){const s={"Content-Type":"application/json"};i&&this.token&&(s.Authorization=`Bearer ${this.token}`),this.apiKey&&(s["X-API-Key"]=this.apiKey);const n=await fetch(this.baseUrl+r,{method:e,headers:s,...t!=null?{body:JSON.stringify(t)}:{},credentials:"include"});if(!n.ok){const f=await n.text(),a=new Error(`HTTP ${n.status}: ${f}`);throw a.status=n.status,a}return n.arrayBuffer()}async _requestForm(e,r,t,i=!0){const s={};i&&this.token&&(s.Authorization=`Bearer ${this.token}`),this.apiKey&&(s["X-API-Key"]=this.apiKey);const n=await fetch(this.baseUrl+r,{method:e,headers:s,body:t,credentials:"include"}),f=await n.json();if(!f.ok){const a=new Error(f.message??`EntityServer error (HTTP ${n.status})`);throw a.status=n.status,a}return f}async _requestFormBinary(e,r,t,i=!0){const s={};i&&this.token&&(s.Authorization=`Bearer ${this.token}`),this.apiKey&&(s["X-API-Key"]=this.apiKey);const n=await fetch(this.baseUrl+r,{method:e,headers:s,body:t,credentials:"include"});if(!n.ok){const f=await n.text(),a=new Error(`HTTP ${n.status}: ${f}`);throw a.status=n.status,a}return n.arrayBuffer()}}export{d as EntityServerClientBase};
|
|
2
|
+
//# sourceMappingURL=base.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/client/base.ts"],
|
|
4
|
+
"sourcesContent": ["import type {\n EntityServerClientHealthCsrf,\n EntityServerClientOptions,\n} from \"../types.js\";\nimport { readEnv } from \"./utils.js\";\nimport { derivePacketKey, parseRequestBody } from \"./packet.js\";\nimport { entityRequest, type RequestOptions } from \"./request.js\";\n\n// mixin \uD5EC\uD37C \uD0C0\uC785\nexport type GConstructor<T = object> = new (...args: any[]) => T;\n\nexport class EntityServerClientBase {\n baseUrl: string;\n token: string;\n anonymousPacketToken: string;\n apiKey: string;\n hmacSecret: string;\n encryptRequests: boolean;\n csrfEnabled: boolean;\n csrfToken: string;\n csrfHeaderName: string;\n csrfRefreshPath: string;\n csrfRefreshBuffer: number;\n activeTxId: string | null = null;\n\n // \uC138\uC158 \uC720\uC9C0 \uAD00\uB828\n keepSession: boolean;\n refreshBuffer: number;\n onTokenRefreshed?: (accessToken: string, expiresIn: number) => void;\n onSessionExpired?: (error: Error) => void;\n _sessionRefreshToken: string | null = null;\n _refreshTimer: ReturnType<typeof setTimeout> | null = null;\n _csrfRefreshTimer: ReturnType<typeof setTimeout> | null = null;\n _csrfRefreshPromise: Promise<string> | null = null;\n\n // \u2500\u2500\u2500 \uCD08\uAE30\uD654 & \uC124\uC815 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * EntityServerClient \uC778\uC2A4\uD134\uC2A4\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4.\n *\n * \uAE30\uBCF8\uAC12:\n * - `baseUrl`: `VITE_ENTITY_SERVER_URL` \uB610\uB294 \uC0C1\uB300 \uACBD\uB85C(`\"\"`)\n */\n constructor(options: EntityServerClientOptions = {}) {\n const envBaseUrl = readEnv(\"VITE_ENTITY_SERVER_URL\");\n\n this.baseUrl = (options.baseUrl ?? envBaseUrl ?? \"\").replace(/\\/$/, \"\");\n this.token = options.token ?? \"\";\n this.anonymousPacketToken = options.anonymousPacketToken ?? \"\";\n this.apiKey = options.apiKey ?? \"\";\n this.hmacSecret = options.hmacSecret ?? \"\";\n this.encryptRequests = options.encryptRequests ?? false;\n this.csrfEnabled = options.csrfEnabled ?? false;\n this.csrfToken = options.csrfToken ?? \"\";\n this.csrfHeaderName = options.csrfHeaderName ?? \"x-csrf-token\";\n this.csrfRefreshPath = options.csrfRefreshPath ?? \"/v1/csrf-token\";\n this.csrfRefreshBuffer = options.csrfRefreshBuffer ?? 60;\n this.keepSession = options.keepSession ?? false;\n this.refreshBuffer = options.refreshBuffer ?? 60;\n this.onTokenRefreshed = options.onTokenRefreshed;\n this.onSessionExpired = options.onSessionExpired;\n }\n\n /** baseUrl, token, encryptRequests \uAC12\uC744 \uB7F0\uD0C0\uC784\uC5D0 \uAC31\uC2E0\uD569\uB2C8\uB2E4. */\n configure(options: Partial<EntityServerClientOptions>): void {\n if (typeof options.baseUrl === \"string\") {\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\n }\n if (typeof options.token === \"string\") this.token = options.token;\n if (typeof options.anonymousPacketToken === \"string\") {\n this.anonymousPacketToken = options.anonymousPacketToken;\n }\n if (typeof options.encryptRequests === \"boolean\")\n this.encryptRequests = options.encryptRequests;\n if (typeof options.csrfEnabled === \"boolean\") {\n this.csrfEnabled = options.csrfEnabled;\n if (!options.csrfEnabled) {\n this.csrfToken = \"\";\n this.stopCsrfRefresh();\n }\n }\n if (typeof options.csrfToken === \"string\")\n this.csrfToken = options.csrfToken;\n if (typeof options.csrfHeaderName === \"string\") {\n this.csrfHeaderName = options.csrfHeaderName;\n }\n if (typeof options.csrfRefreshPath === \"string\") {\n this.csrfRefreshPath = options.csrfRefreshPath;\n }\n if (typeof options.csrfRefreshBuffer === \"number\") {\n this.csrfRefreshBuffer = options.csrfRefreshBuffer;\n }\n if (typeof options.apiKey === \"string\") this.apiKey = options.apiKey;\n if (typeof options.hmacSecret === \"string\")\n this.hmacSecret = options.hmacSecret;\n if (typeof options.keepSession === \"boolean\")\n this.keepSession = options.keepSession;\n if (typeof options.refreshBuffer === \"number\")\n this.refreshBuffer = options.refreshBuffer;\n if (options.onTokenRefreshed)\n this.onTokenRefreshed = options.onTokenRefreshed;\n if (options.onSessionExpired)\n this.onSessionExpired = options.onSessionExpired;\n }\n\n /** \uC778\uC99D \uC694\uCCAD\uC5D0 \uC0AC\uC6A9\uD560 JWT Access Token\uC744 \uC124\uC815\uD569\uB2C8\uB2E4. */\n setToken(token: string): void {\n this.token = token;\n }\n\n /** \uC775\uBA85 \uD328\uD0B7 \uC554\uD638\uD654\uC6A9 \uD1A0\uD070\uC744 \uC124\uC815\uD569\uB2C8\uB2E4. */\n setAnonymousPacketToken(token: string): void {\n this.anonymousPacketToken = token;\n }\n\n /** HMAC \uC778\uC99D\uC6A9 API Key\uB97C \uC124\uC815\uD569\uB2C8\uB2E4. */\n setApiKey(apiKey: string): void {\n this.apiKey = apiKey;\n }\n\n /** HMAC \uC778\uC99D\uC6A9 \uC2DC\uD06C\uB9BF\uC744 \uC124\uC815\uD569\uB2C8\uB2E4. */\n setHmacSecret(secret: string): void {\n this.hmacSecret = secret;\n }\n\n /** \uC554\uD638\uD654 \uC694\uCCAD \uD65C\uC131\uD654 \uC5EC\uBD80\uB97C \uC124\uC815\uD569\uB2C8\uB2E4. */\n setEncryptRequests(value: boolean): void {\n this.encryptRequests = value;\n }\n\n setCsrfToken(token: string): void {\n this.csrfToken = token;\n }\n\n setCsrfEnabled(enabled: boolean): void {\n this.csrfEnabled = enabled;\n if (!enabled) {\n this.csrfToken = \"\";\n this.stopCsrfRefresh();\n }\n }\n\n // \u2500\u2500\u2500 \uC138\uC158 \uC720\uC9C0 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /** @internal \uC790\uB3D9 \uD1A0\uD070 \uAC31\uC2E0 \uD0C0\uC774\uBA38\uB97C \uC2DC\uC791\uD569\uB2C8\uB2E4. */\n _scheduleKeepSession(\n refreshToken: string,\n expiresIn: number,\n refreshFn: (\n rt: string,\n ) => Promise<{ access_token: string; expires_in: number }>,\n ): void {\n this._clearRefreshTimer();\n this._sessionRefreshToken = refreshToken;\n const delayMs = Math.max((expiresIn - this.refreshBuffer) * 1000, 0);\n this._refreshTimer = setTimeout(async () => {\n if (!this._sessionRefreshToken) return;\n try {\n const result = await refreshFn(this._sessionRefreshToken);\n this.onTokenRefreshed?.(result.access_token, result.expires_in);\n this._scheduleKeepSession(\n this._sessionRefreshToken,\n result.expires_in,\n refreshFn,\n );\n } catch (err) {\n this._clearRefreshTimer();\n this.onSessionExpired?.(\n err instanceof Error ? err : new Error(String(err)),\n );\n }\n }, delayMs);\n }\n\n /** @internal \uC790\uB3D9 \uAC31\uC2E0 \uD0C0\uC774\uBA38\uB97C \uC815\uB9AC\uD569\uB2C8\uB2E4. */\n _clearRefreshTimer(): void {\n if (this._refreshTimer !== null) {\n clearTimeout(this._refreshTimer);\n this._refreshTimer = null;\n }\n }\n\n /**\n * \uC138\uC158 \uC720\uC9C0 \uD0C0\uC774\uBA38\uB97C \uC911\uC9C0\uD569\uB2C8\uB2E4.\n * `logout()` \uD638\uCD9C \uC2DC \uC790\uB3D9\uC73C\uB85C \uC911\uC9C0\uB418\uBA70, \uC9C1\uC811 \uD638\uCD9C\uC774 \uD544\uC694\uD55C \uACBD\uC6B0\uB294 \uB4DC\uBB45\uB2C8\uB2E4.\n */\n stopKeepSession(): void {\n this._clearRefreshTimer();\n this._sessionRefreshToken = null;\n }\n\n _clearCsrfRefreshTimer(): void {\n if (this._csrfRefreshTimer !== null) {\n clearTimeout(this._csrfRefreshTimer);\n this._csrfRefreshTimer = null;\n }\n }\n\n stopCsrfRefresh(): void {\n this._clearCsrfRefreshTimer();\n this._csrfRefreshPromise = null;\n }\n\n _scheduleCsrfRefresh(expiresIn: number): void {\n this._clearCsrfRefreshTimer();\n if (!this.csrfEnabled || !this.csrfRefreshPath) {\n return;\n }\n\n const delayMs = Math.max(\n (expiresIn - this.csrfRefreshBuffer) * 1000,\n 0,\n );\n this._csrfRefreshTimer = setTimeout(() => {\n void this.refreshCsrfToken().catch(() => {\n this._clearCsrfRefreshTimer();\n });\n }, delayMs);\n }\n\n async refreshCsrfToken(): Promise<string> {\n if (!this.csrfEnabled || !this.csrfRefreshPath) {\n return \"\";\n }\n\n if (!this._csrfRefreshPromise) {\n this._csrfRefreshPromise = (async () => {\n const res = await fetch(\n `${this.baseUrl}${this.csrfRefreshPath}`,\n {\n method: \"GET\",\n credentials: \"include\",\n },\n );\n\n if (!res.ok) {\n const message = await res.text().catch(() => \"\");\n const err = new Error(message || `HTTP ${res.status}`);\n (err as { status?: number }).status = res.status;\n throw err;\n }\n\n const payload = (await res.json().catch(() => null)) as\n | { data?: EntityServerClientHealthCsrf | null }\n | EntityServerClientHealthCsrf\n | null;\n const csrf = (\n payload && typeof payload === \"object\" && \"data\" in payload\n ? (payload.data ?? null)\n : payload\n ) as EntityServerClientHealthCsrf | null;\n\n if (!csrf?.enabled || typeof csrf.token !== \"string\") {\n throw new Error(\"CSRF token refresh failed\");\n }\n\n this._applyCsrfHealth(csrf);\n return this.csrfToken;\n })().finally(() => {\n this._csrfRefreshPromise = null;\n });\n }\n\n return this._csrfRefreshPromise;\n }\n\n _applyCsrfHealth(csrf?: EntityServerClientHealthCsrf | null): void {\n if (!csrf?.enabled) {\n this.setCsrfEnabled(false);\n return;\n }\n\n this.csrfEnabled = true;\n if (typeof csrf.token === \"string\") {\n this.csrfToken = csrf.token;\n }\n if (typeof csrf.headerName === \"string\") {\n this.csrfHeaderName = csrf.headerName;\n }\n if (typeof csrf.refreshPath === \"string\") {\n this.csrfRefreshPath = csrf.refreshPath;\n }\n if (typeof csrf.expiresIn === \"number\" && csrf.expiresIn > 0) {\n this._scheduleCsrfRefresh(csrf.expiresIn);\n }\n }\n\n // \u2500\u2500\u2500 \uC694\uCCAD \uBCF8\uBB38 \uD30C\uC2F1 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n /**\n * \uC694\uCCAD \uBC14\uB514\uB97C \uD30C\uC2F1\uD569\uB2C8\uB2E4.\n * `application/octet-stream`\uC774\uBA74 XChaCha20-Poly1305 \uBCF5\uD638\uD654, \uADF8 \uC678\uB294 JSON \uD30C\uC2F1\uD569\uB2C8\uB2E4.\n *\n * @param requireEncrypted `true`\uC774\uBA74 \uC554\uD638\uD654\uB41C \uC694\uCCAD\uB9CC \uD5C8\uC6A9\uD569\uB2C8\uB2E4.\n */\n readRequestBody<T = Record<string, unknown>>(\n body: ArrayBuffer | Uint8Array | string | T | null | undefined,\n contentType = \"application/json\",\n requireEncrypted = false,\n ): T {\n const key = derivePacketKey(\n this.hmacSecret,\n this.token || this.anonymousPacketToken,\n );\n return parseRequestBody<T>(body, contentType, requireEncrypted, key);\n }\n\n // \u2500\u2500\u2500 \uB0B4\uBD80 \uD5EC\uD37C \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n get _reqOpts(): RequestOptions {\n return {\n baseUrl: this.baseUrl,\n token: this.token,\n anonymousPacketToken: this.anonymousPacketToken,\n apiKey: this.apiKey,\n hmacSecret: this.hmacSecret,\n encryptRequests: this.encryptRequests,\n csrfEnabled: this.csrfEnabled,\n csrfToken: this.csrfToken,\n csrfHeaderName: this.csrfHeaderName,\n refreshCsrfToken: this.csrfEnabled\n ? () => this.refreshCsrfToken()\n : null,\n };\n }\n\n /**\n * \uC784\uC758 \uACBD\uB85C\uC5D0 JSON \uC694\uCCAD\uC744 \uBCF4\uB0C5\uB2C8\uB2E4. \uC751\uB2F5\uC774 JSON\uC774\uBA74 \uD30C\uC2F1, octet-stream\uC774\uBA74 \uC790\uB3D9 \uBCF5\uD638\uD654\uD569\uB2C8\uB2E4.\n * `ok` \uD544\uB4DC\uB97C \uAC15\uC81C\uD558\uC9C0 \uC54A\uC544 go\uC11C\uBC84/\uC571\uC11C\uBC84 \uC2E0\uADDC \uB77C\uC6B0\uD2B8 \uB4F1 \uC790\uC720 \uC751\uB2F5 \uD3EC\uB9F7\uC5D0 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.\n * `encryptRequests: true`\uC774\uBA74 \uC694\uCCAD \uBC14\uB514\uB3C4 \uC790\uB3D9 \uC554\uD638\uD654\uB429\uB2C8\uB2E4.\n */\n requestJson<T>(\n method: string,\n path: string,\n body?: unknown,\n withAuth = true,\n extraHeaders?: Record<string, string>,\n ): Promise<T> {\n return entityRequest<T>(\n this._reqOpts,\n method,\n path,\n body,\n withAuth,\n extraHeaders,\n false,\n );\n }\n\n /**\n * \uC784\uC758 \uACBD\uB85C\uC5D0 \uC694\uCCAD\uC744 \uBCF4\uB0B4\uACE0 \uBC14\uC774\uB108\uB9AC(ArrayBuffer)\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.\n * \uC774\uBBF8\uC9C0, PDF, \uC555\uCD95 \uD30C\uC77C \uB4F1 \uBC14\uC774\uB108\uB9AC \uC751\uB2F5\uC774 \uC624\uB294 \uC5D4\uB4DC\uD3EC\uC778\uD2B8\uC5D0 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.\n */\n requestBinary(\n method: string,\n path: string,\n body?: unknown,\n withAuth = true,\n ): Promise<ArrayBuffer> {\n return this._requestBinary(method, path, body, withAuth);\n }\n\n /**\n * multipart/form-data \uC694\uCCAD\uC744 \uBCF4\uB0C5\uB2C8\uB2E4. \uD30C\uC77C \uC5C5\uB85C\uB4DC \uB4F1\uC5D0 \uC0AC\uC6A9\uD569\uB2C8\uB2E4.\n * \uC751\uB2F5\uC740 JSON\uC73C\uB85C \uD30C\uC2F1\uD558\uC5EC \uBC18\uD658\uD569\uB2C8\uB2E4.\n */\n requestForm<T>(\n method: string,\n path: string,\n form: FormData,\n withAuth = true,\n ): Promise<T> {\n return this._requestForm<T>(method, path, form, withAuth);\n }\n\n /**\n * multipart/form-data \uC694\uCCAD\uC744 \uBCF4\uB0B4\uACE0 \uBC14\uC774\uB108\uB9AC(ArrayBuffer)\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.\n */\n requestFormBinary(\n method: string,\n path: string,\n form: FormData,\n withAuth = true,\n ): Promise<ArrayBuffer> {\n return this._requestFormBinary(method, path, form, withAuth);\n }\n\n _request<T>(\n method: string,\n path: string,\n body?: unknown,\n withAuth = true,\n extraHeaders?: Record<string, string>,\n ): Promise<T> {\n return entityRequest<T>(\n this._reqOpts,\n method,\n path,\n body,\n withAuth,\n extraHeaders,\n true,\n );\n }\n\n /** PNG/\uBC14\uC774\uB108\uB9AC \uC751\uB2F5\uC744 ArrayBuffer\uB85C \uBC18\uD658\uD569\uB2C8\uB2E4. (QR, \uBC14\uCF54\uB4DC \uB4F1) */\n async _requestBinary(\n method: string,\n path: string,\n body?: unknown,\n withAuth = true,\n ): Promise<ArrayBuffer> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (withAuth && this.token)\n headers[\"Authorization\"] = `Bearer ${this.token}`;\n if (this.apiKey) headers[\"X-API-Key\"] = this.apiKey;\n\n const res = await fetch(this.baseUrl + path, {\n method,\n headers,\n ...(body != null ? { body: JSON.stringify(body) } : {}),\n credentials: \"include\",\n });\n\n if (!res.ok) {\n const text = await res.text();\n const err = new Error(`HTTP ${res.status}: ${text}`);\n (err as { status?: number }).status = res.status;\n throw err;\n }\n\n return res.arrayBuffer();\n }\n\n /** multipart/form-data \uC694\uCCAD\uC744 \uBCF4\uB0C5\uB2C8\uB2E4. (\uD30C\uC77C \uC5C5\uB85C\uB4DC \uB4F1) */\n async _requestForm<T>(\n method: string,\n path: string,\n form: FormData,\n withAuth = true,\n ): Promise<T> {\n const headers: Record<string, string> = {};\n if (withAuth && this.token)\n headers[\"Authorization\"] = `Bearer ${this.token}`;\n if (this.apiKey) headers[\"X-API-Key\"] = this.apiKey;\n\n const res = await fetch(this.baseUrl + path, {\n method,\n headers,\n body: form,\n credentials: \"include\",\n });\n\n const data = (await res.json()) as { ok?: boolean; message?: string };\n if (!data.ok) {\n const err = new Error(\n data.message ?? `EntityServer error (HTTP ${res.status})`,\n );\n (err as { status?: number }).status = res.status;\n throw err;\n }\n return data as T;\n }\n\n /** multipart/form-data \uC694\uCCAD\uC744 \uBCF4\uB0B4\uACE0 \uBC14\uC774\uB108\uB9AC(ArrayBuffer)\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\n async _requestFormBinary(\n method: string,\n path: string,\n form: FormData,\n withAuth = true,\n ): Promise<ArrayBuffer> {\n const headers: Record<string, string> = {};\n if (withAuth && this.token)\n headers[\"Authorization\"] = `Bearer ${this.token}`;\n if (this.apiKey) headers[\"X-API-Key\"] = this.apiKey;\n\n const res = await fetch(this.baseUrl + path, {\n method,\n headers,\n body: form,\n credentials: \"include\",\n });\n\n if (!res.ok) {\n const text = await res.text();\n const err = new Error(`HTTP ${res.status}: ${text}`);\n (err as { status?: number }).status = res.status;\n throw err;\n }\n\n return res.arrayBuffer();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["readEnv", "derivePacketKey", "parseRequestBody", "entityRequest", "EntityServerClientBase", "options", "envBaseUrl", "token", "apiKey", "secret", "value", "enabled", "refreshToken", "expiresIn", "refreshFn", "delayMs", "result", "err", "res", "message", "payload", "csrf", "body", "contentType", "requireEncrypted", "key", "method", "path", "withAuth", "extraHeaders", "form", "headers", "text", "data"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{sha256 as p}from"@noble/hashes/sha2";import{hmac as d}from"@noble/hashes/hmac";function u(i,s,r,a,c){const e=String(Math.floor(Date.now()/1e3)),o=crypto.randomUUID(),t=new TextEncoder().encode(`${i}|${s}|${e}|${o}|`),n=new Uint8Array(t.length+r.length);n.set(t,0),n.set(r,t.length);const g=[...d(p,new TextEncoder().encode(c),n)].map(m=>m.toString(16).padStart(2,"0")).join("");return{"X-API-Key":a,"X-Timestamp":e,"X-Nonce":o,"X-Signature":g}}export{u as buildHmacHeaders};
|
|
2
|
+
//# sourceMappingURL=hmac.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/client/hmac.ts"],
|
|
4
|
+
"sourcesContent": ["// @ts-ignore\nimport { sha256 } from \"@noble/hashes/sha2\";\n// @ts-ignore\nimport { hmac } from \"@noble/hashes/hmac\";\n\n/**\n * HMAC-SHA256 \uC11C\uBA85 \uD5E4\uB354\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4.\n *\n * \uC11C\uBA85 \uB300\uC0C1: `METHOD|PATH|TIMESTAMP|NONCE|BODY`\n *\n * @returns `X-API-Key`, `X-Timestamp`, `X-Nonce`, `X-Signature` \uD5E4\uB354 \uAC1D\uCCB4\n */\nexport function buildHmacHeaders(\n method: string,\n path: string,\n bodyBytes: Uint8Array,\n apiKey: string,\n hmacSecret: string,\n): Record<string, string> {\n const timestamp = String(Math.floor(Date.now() / 1000));\n const nonce = crypto.randomUUID();\n\n const prefix = new TextEncoder().encode(\n `${method}|${path}|${timestamp}|${nonce}|`,\n );\n const payload = new Uint8Array(prefix.length + bodyBytes.length);\n payload.set(prefix, 0);\n payload.set(bodyBytes, prefix.length);\n\n const sig = hmac(sha256, new TextEncoder().encode(hmacSecret), payload);\n const signature = [...sig]\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n\n return {\n \"X-API-Key\": apiKey,\n \"X-Timestamp\": timestamp,\n \"X-Nonce\": nonce,\n \"X-Signature\": signature,\n };\n}\n"],
|
|
5
|
+
"mappings": "AACA,OAAS,UAAAA,MAAc,qBAEvB,OAAS,QAAAC,MAAY,qBASd,SAASC,EACZC,EACAC,EACAC,EACAC,EACAC,EACsB,CACtB,MAAMC,EAAY,OAAO,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,CAAC,EAChDC,EAAQ,OAAO,WAAW,EAE1BC,EAAS,IAAI,YAAY,EAAE,OAC7B,GAAGP,CAAM,IAAIC,CAAI,IAAII,CAAS,IAAIC,CAAK,GAC3C,EACME,EAAU,IAAI,WAAWD,EAAO,OAASL,EAAU,MAAM,EAC/DM,EAAQ,IAAID,EAAQ,CAAC,EACrBC,EAAQ,IAAIN,EAAWK,EAAO,MAAM,EAGpC,MAAME,EAAY,CAAC,GADPX,EAAKD,EAAQ,IAAI,YAAY,EAAE,OAAOO,CAAU,EAAGI,CAAO,CAC7C,EACpB,IAAKE,GAAMA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAC1C,KAAK,EAAE,EAEZ,MAAO,CACH,YAAaP,EACb,cAAeE,EACf,UAAWC,EACX,cAAeG,CACnB,CACJ",
|
|
6
|
+
"names": ["sha256", "hmac", "buildHmacHeaders", "method", "path", "bodyBytes", "apiKey", "hmacSecret", "timestamp", "nonce", "prefix", "payload", "signature", "b"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{derivePacketKey as s,encryptPacket as f,decryptPacket as u}from"../packet.js";function p(r,e){return s(r||e)}function y(r,e){return f(r,e)}function i(r,e){const t=u(r,e);return JSON.parse(new TextDecoder().decode(t))}function A(r,e,t,n){const a=e.toLowerCase().includes("application/octet-stream");if(t&&!a)throw new Error("Encrypted request required: Content-Type must be application/octet-stream");if(a){if(r==null)throw new Error("Encrypted request body is empty");if(r instanceof ArrayBuffer)return i(r,n);if(r instanceof Uint8Array){const c=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);return i(c,n)}throw new Error("Encrypted request body must be ArrayBuffer or Uint8Array")}return r==null||r===""?{}:typeof r=="string"?JSON.parse(r):r}export{i as decryptPacket,p as derivePacketKey,y as encryptPacket,A as parseRequestBody};
|
|
2
|
+
//# sourceMappingURL=packet.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/client/packet.ts"],
|
|
4
|
+
"sourcesContent": ["import {\n derivePacketKey as derivePacketKeyCore,\n encryptPacket as encryptPacketCore,\n decryptPacket as decryptPacketCore,\n} from \"../packet.js\";\n\n/**\n * \uD328\uD0B7 \uC554\uD638\uD654 \uD0A4\uB97C \uC720\uB3C4\uD569\uB2C8\uB2E4.\n * - HMAC \uBAA8\uB4DC (`hmacSecret` \uC720\uD6A8 \uC2DC): HKDF-SHA256(hmac_secret, \"entity-server:packet-encryption\")\n * - JWT \uBAA8\uB4DC: HKDF-SHA256(jwt_token, \"entity-server:packet-encryption\")\n */\nexport function derivePacketKey(hmacSecret: string, token: string): Uint8Array {\n return derivePacketKeyCore(hmacSecret || token);\n}\n\n/**\n * \uD3C9\uBB38 \uBC14\uC774\uD2B8\uB97C XChaCha20-Poly1305\uB85C \uC554\uD638\uD654\uD569\uB2C8\uB2E4.\n * \uD3EC\uB9F7: [random_magic:K][random_nonce:24][ciphertext+tag]\n * K = 2 + key[31] % 14 (\uD328\uD0B7 \uD0A4\uC5D0\uC11C \uC790\uB3D9 \uD30C\uC0DD)\n */\nexport function encryptPacket(\n plaintext: Uint8Array,\n key: Uint8Array,\n): Uint8Array {\n return encryptPacketCore(plaintext, key);\n}\n\n/**\n * XChaCha20-Poly1305 \uD328\uD0B7\uC744 \uBCF5\uD638\uD654\uD574 JSON \uAC1D\uCCB4\uB85C \uBCC0\uD658\uD569\uB2C8\uB2E4.\n * \uD3EC\uB9F7: [magic:K][nonce:24][ciphertext+tag]\n * K = 2 + key[31] % 14 (\uD328\uD0B7 \uD0A4\uC5D0\uC11C \uC790\uB3D9 \uD30C\uC0DD)\n */\nexport function decryptPacket<T>(buffer: ArrayBuffer, key: Uint8Array): T {\n const plaintext = decryptPacketCore(buffer, key);\n return JSON.parse(new TextDecoder().decode(plaintext)) as T;\n}\n\n/**\n * \uC694\uCCAD \uBC14\uB514\uB97C \uD30C\uC2F1\uD569\uB2C8\uB2E4. `application/octet-stream`\uC774\uBA74 \uBCF5\uD638\uD654, \uADF8 \uC678\uB294 JSON \uD30C\uC2F1\uD569\uB2C8\uB2E4.\n *\n * @param requireEncrypted `true`\uC774\uBA74 \uC554\uD638\uD654\uB41C \uC694\uCCAD\uB9CC \uD5C8\uC6A9\uD569\uB2C8\uB2E4.\n */\nexport function parseRequestBody<T>(\n body: ArrayBuffer | Uint8Array | string | T | null | undefined,\n contentType: string,\n requireEncrypted: boolean,\n key: Uint8Array,\n): T {\n const isEncrypted = contentType\n .toLowerCase()\n .includes(\"application/octet-stream\");\n\n if (requireEncrypted && !isEncrypted) {\n throw new Error(\n \"Encrypted request required: Content-Type must be application/octet-stream\",\n );\n }\n\n if (isEncrypted) {\n if (body == null) throw new Error(\"Encrypted request body is empty\");\n if (body instanceof ArrayBuffer) return decryptPacket<T>(body, key);\n if (body instanceof Uint8Array) {\n const sliced = body.buffer.slice(\n body.byteOffset,\n body.byteOffset + body.byteLength,\n );\n return decryptPacket<T>(sliced as ArrayBuffer, key);\n }\n throw new Error(\n \"Encrypted request body must be ArrayBuffer or Uint8Array\",\n );\n }\n\n if (body == null || body === \"\") return {} as T;\n if (typeof body === \"string\") return JSON.parse(body) as T;\n return body as T;\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OACI,mBAAmBA,EACnB,iBAAiBC,EACjB,iBAAiBC,MACd,eAOA,SAASC,EAAgBC,EAAoBC,EAA2B,CAC3E,OAAOL,EAAoBI,GAAcC,CAAK,CAClD,CAOO,SAASC,EACZC,EACAC,EACU,CACV,OAAOP,EAAkBM,EAAWC,CAAG,CAC3C,CAOO,SAASC,EAAiBC,EAAqBF,EAAoB,CACtE,MAAMD,EAAYL,EAAkBQ,EAAQF,CAAG,EAC/C,OAAO,KAAK,MAAM,IAAI,YAAY,EAAE,OAAOD,CAAS,CAAC,CACzD,CAOO,SAASI,EACZC,EACAC,EACAC,EACAN,EACC,CACD,MAAMO,EAAcF,EACf,YAAY,EACZ,SAAS,0BAA0B,EAExC,GAAIC,GAAoB,CAACC,EACrB,MAAM,IAAI,MACN,2EACJ,EAGJ,GAAIA,EAAa,CACb,GAAIH,GAAQ,KAAM,MAAM,IAAI,MAAM,iCAAiC,EACnE,GAAIA,aAAgB,YAAa,OAAOH,EAAiBG,EAAMJ,CAAG,EAClE,GAAII,aAAgB,WAAY,CAC5B,MAAMI,EAASJ,EAAK,OAAO,MACvBA,EAAK,WACLA,EAAK,WAAaA,EAAK,UAC3B,EACA,OAAOH,EAAiBO,EAAuBR,CAAG,CACtD,CACA,MAAM,IAAI,MACN,0DACJ,CACJ,CAEA,OAAII,GAAQ,MAAQA,IAAS,GAAW,CAAC,EACrC,OAAOA,GAAS,SAAiB,KAAK,MAAMA,CAAI,EAC7CA,CACX",
|
|
6
|
+
"names": ["derivePacketKeyCore", "encryptPacketCore", "decryptPacketCore", "derivePacketKey", "hmacSecret", "token", "encryptPacket", "plaintext", "key", "decryptPacket", "buffer", "parseRequestBody", "body", "contentType", "requireEncrypted", "isEncrypted", "sliced"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{derivePacketKey as E,encryptPacket as U,decryptPacket as N}from"./packet.js";import{buildHmacHeaders as B}from"./hmac.js";function v(e){return e.hmacSecret||e.token||e.anonymousPacketToken}function K(e){return e!=="GET"&&e!=="HEAD"&&e!=="OPTIONS"}function $(e,r){return e===403&&/csrf/i.test(r)?!0:/csrf/i.test(r)&&/expired|token validation failed/i.test(r)}async function P(e){if((e.headers.get("Content-Type")??"").includes("application/json")){const a=await e.json().catch(()=>null);if(a?.error)return a.error;if(a?.message)return a.message}return await e.text().catch(()=>"")||`HTTP ${e.status}`}async function I(e,r,y,a,k=!0,R={},h=!0){const{baseUrl:H,token:i,apiKey:T,hmacSecret:u,encryptRequests:q,anonymousPacketToken:f,csrfEnabled:x,csrfHeaderName:S,refreshCsrfToken:l}=e,g=k&&!!(T&&u),C=v(e),d=x&&K(r)&&!g;let c=e.csrfToken,m="application/json";const O=!i&&!g&&!!f;let o=null;if(a!=null)if(q&&!!C&&r!=="GET"&&r!=="HEAD"){const s=E(u,i||f);o=U(new TextEncoder().encode(JSON.stringify(a)),s),m="application/octet-stream"}else o=JSON.stringify(a);const j=t=>{const s={"Content-Type":m,...R};if(!g&&k&&i&&(s.Authorization=`Bearer ${i}`),O&&(s["X-Packet-Token"]=f),d&&t&&(s[S]=t),g){const A=o instanceof Uint8Array?o:typeof o=="string"?new TextEncoder().encode(o):new Uint8Array(0);Object.assign(s,B(r,y,A,T,u))}return s};d&&!c&&l&&(c=await l());const w=t=>fetch(H+y,{method:r,headers:j(t),...o!=null?{body:o}:{},credentials:"include"});let n=await w(c);if(!n.ok){const t=await P(n.clone());if(d&&l&&$(n.status,t))c=await l(),n=await w(c);else{const s=new Error(t);throw s.status=n.status,s}}if(!n.ok){const t=new Error(await P(n));throw t.status=n.status,t}const b=n.headers.get("Content-Type")??"";if(b.includes("application/octet-stream")){const t=E(u,i||f);return N(await n.arrayBuffer(),t)}if(!b.includes("application/json"))return await n.text();const p=await n.json();if(h&&!p.ok){const t=new Error(p.message??`EntityServer error (HTTP ${n.status})`);throw t.status=n.status,t}return p}export{I as entityRequest};
|
|
2
|
+
//# sourceMappingURL=request.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/client/request.ts"],
|
|
4
|
+
"sourcesContent": ["import { derivePacketKey, encryptPacket, decryptPacket } from \"./packet.js\";\nimport { buildHmacHeaders } from \"./hmac.js\";\n\nexport interface RequestOptions {\n baseUrl: string;\n token: string;\n anonymousPacketToken: string;\n apiKey: string;\n hmacSecret: string;\n encryptRequests: boolean;\n csrfEnabled: boolean;\n csrfToken: string;\n csrfHeaderName: string;\n refreshCsrfToken: (() => Promise<string>) | null;\n}\n\nfunction resolvePacketSource(opts: RequestOptions): string {\n return opts.hmacSecret || opts.token || opts.anonymousPacketToken;\n}\n\nfunction requiresCsrf(method: string): boolean {\n return method !== \"GET\" && method !== \"HEAD\" && method !== \"OPTIONS\";\n}\n\nfunction isCsrfError(status: number, message: string): boolean {\n if (status === 403 && /csrf/i.test(message)) {\n return true;\n }\n\n return (\n /csrf/i.test(message) &&\n /expired|token validation failed/i.test(message)\n );\n}\n\nasync function readErrorMessage(res: Response): Promise<string> {\n const contentType = res.headers.get(\"Content-Type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n const data = (await res.json().catch(() => null)) as {\n error?: string;\n message?: string;\n } | null;\n if (data?.error) return data.error;\n if (data?.message) return data.message;\n }\n\n const text = await res.text().catch(() => \"\");\n return text || `HTTP ${res.status}`;\n}\n\n/**\n * Entity Server\uC5D0 HTTP \uC694\uCCAD\uC744 \uBCF4\uB0C5\uB2C8\uB2E4.\n *\n * - `encryptRequests` \uD65C\uC131\uD654 \uC2DC \uC778\uC99D\uB41C POST \uBC14\uB514\uB97C \uC790\uB3D9 \uC554\uD638\uD654\uD569\uB2C8\uB2E4.\n * - \uC751\uB2F5\uC774 `application/octet-stream`\uC774\uBA74 \uC790\uB3D9 \uBCF5\uD638\uD654\uD569\uB2C8\uB2E4.\n * - JSON \uC751\uB2F5\uC758 `ok`\uAC00 false\uC774\uBA74 \uC5D0\uB7EC\uB97C \uB358\uC9D1\uB2C8\uB2E4.\n */\nexport async function entityRequest<T>(\n opts: RequestOptions,\n method: string,\n path: string,\n body?: unknown,\n withAuth = true,\n extraHeaders: Record<string, string> = {},\n requireOkShape = true,\n): Promise<T> {\n const {\n baseUrl,\n token,\n apiKey,\n hmacSecret,\n encryptRequests,\n anonymousPacketToken,\n csrfEnabled,\n csrfHeaderName,\n refreshCsrfToken,\n } = opts;\n const isHmacMode = withAuth && !!(apiKey && hmacSecret);\n const packetSource = resolvePacketSource(opts);\n const shouldUseCsrf = csrfEnabled && requiresCsrf(method) && !isHmacMode;\n let csrfToken = opts.csrfToken;\n let requestContentType = \"application/json\";\n const includeAnonymousPacketHeader =\n !token && !isHmacMode && !!anonymousPacketToken;\n\n let fetchBody: string | Uint8Array | null = null;\n if (body != null) {\n const shouldEncrypt =\n encryptRequests &&\n !!packetSource &&\n method !== \"GET\" &&\n method !== \"HEAD\";\n\n if (shouldEncrypt) {\n const key = derivePacketKey(\n hmacSecret,\n token || anonymousPacketToken,\n );\n fetchBody = encryptPacket(\n new TextEncoder().encode(JSON.stringify(body)),\n key,\n );\n requestContentType = \"application/octet-stream\";\n } else {\n fetchBody = JSON.stringify(body);\n }\n }\n\n const buildHeaders = (\n resolvedCsrfToken: string,\n ): Record<string, string> => {\n const headers: Record<string, string> = {\n \"Content-Type\": requestContentType,\n ...extraHeaders,\n };\n if (!isHmacMode && withAuth && token) {\n headers.Authorization = `Bearer ${token}`;\n }\n if (includeAnonymousPacketHeader) {\n headers[\"X-Packet-Token\"] = anonymousPacketToken;\n }\n if (shouldUseCsrf && resolvedCsrfToken) {\n headers[csrfHeaderName] = resolvedCsrfToken;\n }\n if (isHmacMode) {\n const bodyBytes =\n fetchBody instanceof Uint8Array\n ? fetchBody\n : typeof fetchBody === \"string\"\n ? new TextEncoder().encode(fetchBody)\n : new Uint8Array(0);\n Object.assign(\n headers,\n buildHmacHeaders(method, path, bodyBytes, apiKey, hmacSecret),\n );\n }\n return headers;\n };\n\n if (shouldUseCsrf && !csrfToken && refreshCsrfToken) {\n csrfToken = await refreshCsrfToken();\n }\n\n const executeRequest = (resolvedCsrfToken: string): Promise<Response> =>\n fetch(baseUrl + path, {\n method,\n headers: buildHeaders(resolvedCsrfToken),\n ...(fetchBody != null\n ? { body: fetchBody as RequestInit[\"body\"] }\n : {}),\n credentials: \"include\",\n });\n\n let res = await executeRequest(csrfToken);\n\n if (!res.ok) {\n const message = await readErrorMessage(res.clone());\n if (\n shouldUseCsrf &&\n refreshCsrfToken &&\n isCsrfError(res.status, message)\n ) {\n csrfToken = await refreshCsrfToken();\n res = await executeRequest(csrfToken);\n } else {\n const err = new Error(message);\n (err as { status?: number }).status = res.status;\n throw err;\n }\n }\n\n if (!res.ok) {\n const err = new Error(await readErrorMessage(res));\n (err as { status?: number }).status = res.status;\n throw err;\n }\n\n const contentType = res.headers.get(\"Content-Type\") ?? \"\";\n if (contentType.includes(\"application/octet-stream\")) {\n const key = derivePacketKey(hmacSecret, token || anonymousPacketToken);\n return decryptPacket<T>(await res.arrayBuffer(), key);\n }\n\n if (!contentType.includes(\"application/json\")) {\n return (await res.text()) as T;\n }\n\n const data = (await res.json()) as { ok?: boolean; message?: string };\n if (requireOkShape && !data.ok) {\n const err = new Error(\n data.message ?? `EntityServer error (HTTP ${res.status})`,\n );\n (err as { status?: number }).status = res.status;\n throw err;\n }\n\n return data as T;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["derivePacketKey", "encryptPacket", "decryptPacket", "buildHmacHeaders", "resolvePacketSource", "opts", "requiresCsrf", "method", "isCsrfError", "status", "message", "readErrorMessage", "res", "data", "entityRequest", "path", "body", "withAuth", "extraHeaders", "requireOkShape", "baseUrl", "token", "apiKey", "hmacSecret", "encryptRequests", "anonymousPacketToken", "csrfEnabled", "csrfHeaderName", "refreshCsrfToken", "isHmacMode", "packetSource", "shouldUseCsrf", "csrfToken", "requestContentType", "includeAnonymousPacketHeader", "fetchBody", "key", "buildHeaders", "resolvedCsrfToken", "headers", "bodyBytes", "executeRequest", "err", "contentType"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function t(e){const n=import.meta;if(n?.env?.[e]!=null)return n.env[e];const r=globalThis.process;if(r?.env?.[e]!=null)return r.env[e]}function o(e){return Object.entries(e).filter(([,n])=>n!=null).map(([n,r])=>`${encodeURIComponent(n==="orderBy"?"order_by":n)}=${encodeURIComponent(String(r))}`).join("&")}export{o as buildQuery,t as readEnv};
|
|
2
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/client/utils.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * \uD658\uACBD\uBCC0\uC218\uB97C \uC77D\uC2B5\uB2C8\uB2E4.\n * - \uBE0C\uB77C\uC6B0\uC800/Vite: `import.meta.env`\n * - Node.js: `process.env`\n */\nexport function readEnv(name: string): string | undefined {\n // Vite / \uAE30\uD0C0 \uBC88\uB4E4\uB7EC (import.meta.env)\n const meta = import.meta as unknown as {\n env?: Record<string, string | undefined>;\n };\n if (meta?.env?.[name] != null) return meta.env[name];\n\n // Node.js (process.env)\n const _proc = (\n globalThis as { process?: { env?: Record<string, string | undefined> } }\n ).process;\n if (_proc?.env?.[name] != null) {\n return _proc.env[name];\n }\n\n return undefined;\n}\n\n/** \uCFFC\uB9AC \uD30C\uB77C\uBBF8\uD130 \uAC1D\uCCB4\uB97C URL \uCFFC\uB9AC \uBB38\uC790\uC5F4\uB85C \uBCC0\uD658\uD569\uB2C8\uB2E4. `orderBy` \uD0A4\uB294 `order_by`\uB85C \uBCC0\uD658\uB429\uB2C8\uB2E4. */\nexport function buildQuery(params: Record<string, unknown>): string {\n return Object.entries(params)\n .filter(([, value]) => value != null)\n .map(\n ([key, value]) =>\n `${encodeURIComponent(key === \"orderBy\" ? \"order_by\" : key)}=${encodeURIComponent(String(value))}`,\n )\n .join(\"&\");\n}\n"],
|
|
5
|
+
"mappings": "AAKO,SAASA,EAAQC,EAAkC,CAEtD,MAAMC,EAAO,YAGb,GAAIA,GAAM,MAAMD,CAAI,GAAK,KAAM,OAAOC,EAAK,IAAID,CAAI,EAGnD,MAAME,EACF,WACF,QACF,GAAIA,GAAO,MAAMF,CAAI,GAAK,KACtB,OAAOE,EAAM,IAAIF,CAAI,CAI7B,CAGO,SAASG,EAAWC,EAAyC,CAChE,OAAO,OAAO,QAAQA,CAAM,EACvB,OAAO,CAAC,CAAC,CAAEC,CAAK,IAAMA,GAAS,IAAI,EACnC,IACG,CAAC,CAACC,EAAKD,CAAK,IACR,GAAG,mBAAmBC,IAAQ,UAAY,WAAaA,CAAG,CAAC,IAAI,mBAAmB,OAAOD,CAAK,CAAC,CAAC,EACxG,EACC,KAAK,GAAG,CACjB",
|
|
6
|
+
"names": ["readEnv", "name", "meta", "_proc", "buildQuery", "params", "value", "key"]
|
|
7
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EntityServerClient, type EntityQueryRequest, type EntityServerClientOptions } from "../index";
|
|
1
|
+
import { EntityServerClient, type EntityQueryRequest, type EntityServerClientOptions } from "../index.js";
|
|
2
2
|
export interface UseEntityServerOptions extends EntityServerClientOptions {
|
|
3
3
|
singleton?: boolean;
|
|
4
4
|
tokenResolver?: () => string | undefined | null;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{useCallback as i,useEffect as m,useMemo as P,useRef as d,useState as E}from"react";import{EntityServerClient as U,entityServer as h}from"../index.js";function x(b={}){const{singleton:u=!0,tokenResolver:f,baseUrl:l,token:c,resumeSession:k}=b,[p,a]=E(!1),[v,y]=E(null),o=d(!0);m(()=>(o.current=!0,()=>{o.current=!1}),[]);const S=d(k);m(()=>{const e=S.current;e&&r.refreshToken(e).catch(()=>{})},[]);const r=P(()=>{const e=u?h:new U({baseUrl:l,token:c});u&&e.configure({baseUrl:l,token:c});const t=f?.();return typeof t=="string"&&e.setToken(t),e},[u,f,l,c]),n=i(async e=>{o.current&&(a(!0),y(null));try{return await e()}catch(t){const s=t instanceof Error?t:new Error(String(t));throw o.current&&y(s),s}finally{o.current&&a(!1)}},[]),g=i((e,t,s)=>n(()=>r.submit(e,t,s)),[r,n]),R=i((e,t,s)=>n(()=>r.delete(e,t,s)),[r,n]),T=i((e,t)=>n(()=>r.query(e,t)),[r,n]),q=i(()=>{a(!1),y(null)},[]);return{client:r,isPending:p,error:v,reset:q,submit:g,del:R,query:T}}export{x as useEntityServer};
|
|
2
|
+
//# sourceMappingURL=useEntityServer.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/hooks/useEntityServer.ts"],
|
|
4
|
+
"sourcesContent": ["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n EntityServerClient,\n entityServer,\n type EntityListParams,\n type EntityQueryRequest,\n type EntityServerClientOptions,\n} from \"../index.js\";\n\nexport interface UseEntityServerOptions extends EntityServerClientOptions {\n singleton?: boolean;\n tokenResolver?: () => string | undefined | null;\n /**\n * \uD398\uC774\uC9C0 \uC0C8\uB85C\uACE0\uCE68 \uD6C4 \uB85C\uADF8\uC778 \uC0C1\uD0DC\uB97C \uBCF5\uC6D0\uD560 \uB54C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.\n * \uC774 \uAC12\uC774 \uC788\uC73C\uBA74 \uB9C8\uC6B4\uD2B8 \uC2DC `client.refreshToken()`\uC744 \uD638\uCD9C\uD574 \uC0C8 access_token\uC744 \uBC1C\uAE09\uBC1B\uC2B5\uB2C8\uB2E4.\n * `keepSession: true`\uC640 \uD568\uAED8 \uC0AC\uC6A9\uD558\uBA74 \uC138\uC158 \uC720\uC9C0 \uD0C0\uC774\uBA38\uB3C4 \uC7AC\uC2DC\uC791\uB429\uB2C8\uB2E4.\n * \uAC31\uC2E0 \uC131\uACF5 \uC2DC `onTokenRefreshed` \uCF5C\uBC31\uC774 \uD638\uCD9C\uB429\uB2C8\uB2E4.\n */\n resumeSession?: string;\n}\n\nexport interface UseEntityServerResult {\n /** EntityServerClient \uC778\uC2A4\uD134\uC2A4 (read \uC804\uC6A9 \uBA54\uC11C\uB4DC \uC9C1\uC811 \uD638\uCD9C \uC2DC \uC0AC\uC6A9) */\n client: EntityServerClient;\n /** submit \uB610\uB294 delete \uC9C4\uD589 \uC911 \uC5EC\uBD80 */\n isPending: boolean;\n /** \uB9C8\uC9C0\uB9C9 mutation \uC5D0\uB7EC (\uC5C6\uC73C\uBA74 null) */\n error: Error | null;\n /** \uC5D0\uB7EC\u00B7\uACB0\uACFC \uC0C1\uD0DC \uCD08\uAE30\uD654 */\n reset: () => void;\n /** entity \uB370\uC774\uD130 \uC0DD\uC131/\uC218\uC815 (seq \uC5C6\uC73C\uBA74 INSERT, \uC788\uC73C\uBA74 UPDATE) */\n submit: (\n entity: string,\n data: Record<string, unknown>,\n opts?: { transactionId?: string; skipHooks?: boolean },\n ) => Promise<{ ok: boolean; seq: number }>;\n /** entity \uB370\uC774\uD130 \uC0AD\uC81C */\n del: (\n entity: string,\n seq: number,\n opts?: { transactionId?: string; hard?: boolean; skipHooks?: boolean },\n ) => Promise<{ ok: boolean; deleted: number }>;\n /** \uCEE4\uC2A4\uD140 SQL \uC870\uD68C */\n query: <T = unknown>(\n entity: string,\n req: EntityQueryRequest,\n ) => Promise<{ ok: boolean; data: { items: T[]; count: number } }>;\n}\n\n/**\n * React \uD658\uACBD\uC5D0\uC11C EntityServerClient \uC778\uC2A4\uD134\uC2A4\uC640 mutation \uC0C1\uD0DC\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.\n *\n * - `singleton=true`(\uAE30\uBCF8): \uD328\uD0A4\uC9C0 \uC804\uC5ED `entityServer` \uC778\uC2A4\uD134\uC2A4\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.\n * - `singleton=false`: \uCEF4\uD3EC\uB10C\uD2B8 \uC2A4\uCF54\uD504\uC758 \uC0C8 \uC778\uC2A4\uD134\uC2A4\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4.\n *\n * @example\n * ```tsx\n * const { submit, del, isPending, error, reset } = useEntityServer();\n *\n * const handleSave = async () => {\n * await submit(\"account\", { name: \"\uD64D\uAE38\uB3D9\" });\n * };\n * ```\n */\nexport function useEntityServer(\n options: UseEntityServerOptions = {},\n): UseEntityServerResult {\n const {\n singleton = true,\n tokenResolver,\n baseUrl,\n token,\n resumeSession,\n } = options;\n\n const [isPending, setIsPending] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n // \uC5B8\uB9C8\uC6B4\uD2B8 \uD6C4 setState \uBC29\uC9C0\n const mountedRef = useRef(true);\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n // \uC0C8\uB85C\uACE0\uCE68 \uD6C4 \uB85C\uADF8\uC778 \uC0C1\uD0DC \uBCF5\uC6D0: resumeSession\uC774 \uC788\uC73C\uBA74 \uB9C8\uC6B4\uD2B8 \uC2DC refreshToken() \uD638\uCD9C\n const resumeTokenRef = useRef(resumeSession);\n useEffect(() => {\n const storedRefreshToken = resumeTokenRef.current;\n if (!storedRefreshToken) return;\n client.refreshToken(storedRefreshToken).catch(() => {\n // refresh_token \uB9CC\uB8CC \uB4F1 \u2014 onSessionExpired \uCF5C\uBC31\uC774 \uC774\uBBF8 \uCC98\uB9AC\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const client = useMemo(() => {\n const c = singleton\n ? entityServer\n : new EntityServerClient({ baseUrl, token });\n\n if (singleton) {\n c.configure({ baseUrl, token });\n }\n\n const resolvedToken = tokenResolver?.();\n if (typeof resolvedToken === \"string\") {\n c.setToken(resolvedToken);\n }\n\n return c;\n }, [singleton, tokenResolver, baseUrl, token]);\n\n const run = useCallback(async <T>(fn: () => Promise<T>): Promise<T> => {\n if (mountedRef.current) {\n setIsPending(true);\n setError(null);\n }\n try {\n const result = await fn();\n return result;\n } catch (err) {\n const e = err instanceof Error ? err : new Error(String(err));\n if (mountedRef.current) setError(e);\n throw e;\n } finally {\n if (mountedRef.current) setIsPending(false);\n }\n }, []);\n\n const submit = useCallback<UseEntityServerResult[\"submit\"]>(\n (entity, data, opts) => run(() => client.submit(entity, data, opts)),\n [client, run],\n );\n\n const del = useCallback<UseEntityServerResult[\"del\"]>(\n (entity, seq, opts) => run(() => client.delete(entity, seq, opts)),\n [client, run],\n );\n\n const query = useCallback<UseEntityServerResult[\"query\"]>(\n (entity, req) => run(() => client.query(entity, req)),\n [client, run],\n );\n\n const reset = useCallback(() => {\n setIsPending(false);\n setError(null);\n }, []);\n\n return { client, isPending, error, reset, submit, del, query };\n}\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,eAAAA,EAAa,aAAAC,EAAW,WAAAC,EAAS,UAAAC,EAAQ,YAAAC,MAAgB,QAClE,OACI,sBAAAC,EACA,gBAAAC,MAIG,cAyDA,SAASC,EACZC,EAAkC,CAAC,EACd,CACrB,KAAM,CACF,UAAAC,EAAY,GACZ,cAAAC,EACA,QAAAC,EACA,MAAAC,EACA,cAAAC,CACJ,EAAIL,EAEE,CAACM,EAAWC,CAAY,EAAIX,EAAS,EAAK,EAC1C,CAACY,EAAOC,CAAQ,EAAIb,EAAuB,IAAI,EAG/Cc,EAAaf,EAAO,EAAI,EAC9BF,EAAU,KACNiB,EAAW,QAAU,GACd,IAAM,CACTA,EAAW,QAAU,EACzB,GACD,CAAC,CAAC,EAGL,MAAMC,EAAiBhB,EAAOU,CAAa,EAC3CZ,EAAU,IAAM,CACZ,MAAMmB,EAAqBD,EAAe,QACrCC,GACLC,EAAO,aAAaD,CAAkB,EAAE,MAAM,IAAM,CAEpD,CAAC,CAEL,EAAG,CAAC,CAAC,EAEL,MAAMC,EAASnB,EAAQ,IAAM,CACzB,MAAMoB,EAAIb,EACJH,EACA,IAAID,EAAmB,CAAE,QAAAM,EAAS,MAAAC,CAAM,CAAC,EAE3CH,GACAa,EAAE,UAAU,CAAE,QAAAX,EAAS,MAAAC,CAAM,CAAC,EAGlC,MAAMW,EAAgBb,IAAgB,EACtC,OAAI,OAAOa,GAAkB,UACzBD,EAAE,SAASC,CAAa,EAGrBD,CACX,EAAG,CAACb,EAAWC,EAAeC,EAASC,CAAK,CAAC,EAEvCY,EAAMxB,EAAY,MAAUyB,GAAqC,CAC/DP,EAAW,UACXH,EAAa,EAAI,EACjBE,EAAS,IAAI,GAEjB,GAAI,CAEA,OADe,MAAMQ,EAAG,CAE5B,OAASC,EAAK,CACV,MAAMC,EAAID,aAAe,MAAQA,EAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,EAC5D,MAAIR,EAAW,SAASD,EAASU,CAAC,EAC5BA,CACV,QAAE,CACMT,EAAW,SAASH,EAAa,EAAK,CAC9C,CACJ,EAAG,CAAC,CAAC,EAECa,EAAS5B,EACX,CAAC6B,EAAQC,EAAMC,IAASP,EAAI,IAAMH,EAAO,OAAOQ,EAAQC,EAAMC,CAAI,CAAC,EACnE,CAACV,EAAQG,CAAG,CAChB,EAEMQ,EAAMhC,EACR,CAAC6B,EAAQI,EAAKF,IAASP,EAAI,IAAMH,EAAO,OAAOQ,EAAQI,EAAKF,CAAI,CAAC,EACjE,CAACV,EAAQG,CAAG,CAChB,EAEMU,EAAQlC,EACV,CAAC6B,EAAQM,IAAQX,EAAI,IAAMH,EAAO,MAAMQ,EAAQM,CAAG,CAAC,EACpD,CAACd,EAAQG,CAAG,CAChB,EAEMY,EAAQpC,EAAY,IAAM,CAC5Be,EAAa,EAAK,EAClBE,EAAS,IAAI,CACjB,EAAG,CAAC,CAAC,EAEL,MAAO,CAAE,OAAAI,EAAQ,UAAAP,EAAW,MAAAE,EAAO,MAAAoB,EAAO,OAAAR,EAAQ,IAAAI,EAAK,MAAAE,CAAM,CACjE",
|
|
6
|
+
"names": ["useCallback", "useEffect", "useMemo", "useRef", "useState", "EntityServerClient", "entityServer", "useEntityServer", "options", "singleton", "tokenResolver", "baseUrl", "token", "resumeSession", "isPending", "setIsPending", "error", "setError", "mountedRef", "resumeTokenRef", "storedRefreshToken", "client", "c", "resolvedToken", "run", "fn", "err", "e", "submit", "entity", "data", "opts", "del", "seq", "query", "req", "reset"]
|
|
7
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from "./types";
|
|
2
|
-
export * from "./EntityServerClient";
|
|
3
|
-
import { EntityServerClient } from "./EntityServerClient";
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export * from "./EntityServerClient.js";
|
|
3
|
+
import { EntityServerClient } from "./EntityServerClient.js";
|
|
4
4
|
export declare const entityServer: EntityServerClient;
|