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.
Files changed (44) hide show
  1. package/dist/EntityServerClient.d.ts +40 -40
  2. package/dist/EntityServerClient.js +2 -0
  3. package/dist/EntityServerClient.js.map +7 -0
  4. package/dist/client/base.d.ts +2 -2
  5. package/dist/client/base.js +2 -0
  6. package/dist/client/base.js.map +7 -0
  7. package/dist/client/hmac.js +2 -0
  8. package/dist/client/hmac.js.map +7 -0
  9. package/dist/client/packet.js +2 -0
  10. package/dist/client/packet.js.map +7 -0
  11. package/dist/client/request.js +2 -0
  12. package/dist/client/request.js.map +7 -0
  13. package/dist/client/utils.js +2 -0
  14. package/dist/client/utils.js.map +7 -0
  15. package/dist/hooks/useEntityServer.d.ts +1 -1
  16. package/dist/hooks/useEntityServer.js +2 -0
  17. package/dist/hooks/useEntityServer.js.map +7 -0
  18. package/dist/index.d.ts +3 -3
  19. package/dist/index.js +1 -1
  20. package/dist/index.js.map +2 -2
  21. package/dist/mixins/auth.d.ts +4 -4
  22. package/dist/mixins/auth.js +2 -0
  23. package/dist/mixins/auth.js.map +7 -0
  24. package/dist/mixins/entity.d.ts +5 -5
  25. package/dist/mixins/entity.js +2 -0
  26. package/dist/mixins/entity.js.map +7 -0
  27. package/dist/mixins/file.d.ts +5 -5
  28. package/dist/mixins/file.js +2 -0
  29. package/dist/mixins/file.js.map +7 -0
  30. package/dist/mixins/push.d.ts +5 -5
  31. package/dist/mixins/push.js +2 -0
  32. package/dist/mixins/push.js.map +7 -0
  33. package/dist/mixins/smtp.d.ts +5 -5
  34. package/dist/mixins/smtp.js +2 -0
  35. package/dist/mixins/smtp.js.map +7 -0
  36. package/dist/mixins/utils.d.ts +5 -5
  37. package/dist/mixins/utils.js +2 -0
  38. package/dist/mixins/utils.js.map +7 -0
  39. package/dist/react.d.ts +1 -1
  40. package/dist/react.js +1 -1
  41. package/dist/react.js.map +2 -2
  42. package/dist/types.js +1 -0
  43. package/dist/types.js.map +7 -0
  44. 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
+ }
@@ -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;