entity-client 1.0.21 → 1.0.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/README.md +362 -362
  2. package/dist/EntityAppServerApi.d.ts +16 -16
  3. package/dist/EntityAppServerApi.js.map +1 -1
  4. package/dist/EntityServerApi.d.ts +8 -8
  5. package/dist/EntityServerApi.js.map +1 -1
  6. package/dist/client/base.d.ts +1 -1
  7. package/dist/client/base.js +1 -1
  8. package/dist/client/base.js.map +3 -3
  9. package/dist/client/hmac.js.map +1 -1
  10. package/dist/client/packet.js.map +1 -1
  11. package/dist/client/request.d.ts +2 -0
  12. package/dist/client/request.js +1 -1
  13. package/dist/client/request.js.map +3 -3
  14. package/dist/client/utils.js.map +1 -1
  15. package/dist/hooks/useEntityAppServer.js.map +1 -1
  16. package/dist/hooks/useEntityClient.js.map +1 -1
  17. package/dist/hooks/useEntityServer.js.map +1 -1
  18. package/dist/index.js +1 -1
  19. package/dist/index.js.map +3 -3
  20. package/dist/mixins/app/index.js.map +1 -1
  21. package/dist/mixins/app/plugins/alimtalk.d.ts +1 -1
  22. package/dist/mixins/app/plugins/alimtalk.js.map +1 -1
  23. package/dist/mixins/app/plugins/friendtalk.d.ts +1 -1
  24. package/dist/mixins/app/plugins/friendtalk.js.map +1 -1
  25. package/dist/mixins/app/plugins/holidays.d.ts +1 -1
  26. package/dist/mixins/app/plugins/holidays.js.map +1 -1
  27. package/dist/mixins/app/plugins/identity.d.ts +1 -1
  28. package/dist/mixins/app/plugins/identity.js.map +1 -1
  29. package/dist/mixins/app/plugins/index.js.map +1 -1
  30. package/dist/mixins/app/plugins/llm.d.ts +1 -1
  31. package/dist/mixins/app/plugins/llm.js.map +1 -1
  32. package/dist/mixins/app/plugins/ocr.d.ts +1 -1
  33. package/dist/mixins/app/plugins/ocr.js.map +1 -1
  34. package/dist/mixins/app/plugins/pg.d.ts +1 -1
  35. package/dist/mixins/app/plugins/pg.js.map +1 -1
  36. package/dist/mixins/app/plugins/push.d.ts +1 -1
  37. package/dist/mixins/app/plugins/push.js.map +1 -1
  38. package/dist/mixins/app/plugins/sms.d.ts +1 -1
  39. package/dist/mixins/app/plugins/sms.js.map +1 -1
  40. package/dist/mixins/app/plugins/taxinvoice.d.ts +1 -1
  41. package/dist/mixins/app/plugins/taxinvoice.js.map +1 -1
  42. package/dist/mixins/app/routes/account.d.ts +1 -1
  43. package/dist/mixins/app/routes/account.js.map +1 -1
  44. package/dist/mixins/app/routes/board.d.ts +1 -1
  45. package/dist/mixins/app/routes/board.js.map +1 -1
  46. package/dist/mixins/app/routes/email-verify.d.ts +1 -1
  47. package/dist/mixins/app/routes/email-verify.js.map +1 -1
  48. package/dist/mixins/app/routes/oauth.d.ts +1 -1
  49. package/dist/mixins/app/routes/oauth.js.map +1 -1
  50. package/dist/mixins/app/routes/password-reset.d.ts +1 -1
  51. package/dist/mixins/app/routes/password-reset.js.map +1 -1
  52. package/dist/mixins/app/routes/two-factor.d.ts +1 -1
  53. package/dist/mixins/app/routes/two-factor.js.map +1 -1
  54. package/dist/mixins/server/admin.d.ts +1 -1
  55. package/dist/mixins/server/admin.js.map +1 -1
  56. package/dist/mixins/server/auth.d.ts +1 -1
  57. package/dist/mixins/server/auth.js +1 -1
  58. package/dist/mixins/server/auth.js.map +2 -2
  59. package/dist/mixins/server/entity.d.ts +1 -1
  60. package/dist/mixins/server/entity.js.map +1 -1
  61. package/dist/mixins/server/file.d.ts +1 -1
  62. package/dist/mixins/server/file.js.map +1 -1
  63. package/dist/mixins/server/index.js.map +1 -1
  64. package/dist/mixins/server/push.d.ts +1 -1
  65. package/dist/mixins/server/push.js.map +1 -1
  66. package/dist/mixins/server/smtp.d.ts +1 -1
  67. package/dist/mixins/server/smtp.js.map +1 -1
  68. package/dist/mixins/server/transaction.d.ts +1 -1
  69. package/dist/mixins/server/transaction.js.map +1 -1
  70. package/dist/mixins/server/utils.d.ts +1 -1
  71. package/dist/mixins/server/utils.js.map +1 -1
  72. package/dist/packet.js.map +1 -1
  73. package/dist/react.js +1 -1
  74. package/dist/react.js.map +3 -3
  75. package/dist/types.d.ts +0 -1
  76. package/package.json +57 -57
@@ -15,6 +15,7 @@ declare const EntityAppServerApi_base: {
15
15
  csrfHeaderName: string;
16
16
  csrfCookieName: string;
17
17
  csrfRefresher: (() => Promise<void>) | null;
18
+ requestAbortControllers: Map<string, AbortController>;
18
19
  activeTxId: string | null;
19
20
  keepSession: boolean;
20
21
  refreshBuffer: number;
@@ -27,7 +28,6 @@ declare const EntityAppServerApi_base: {
27
28
  healthTickPromise: Promise<unknown> | null;
28
29
  realtimeEnabled: boolean;
29
30
  realtimePath: string;
30
- realtimeAutoConnect: boolean;
31
31
  realtimeAutoReconnect: boolean;
32
32
  realtimeReconnectDelayMs: number;
33
33
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -100,6 +100,7 @@ declare const EntityAppServerApi_base: {
100
100
  csrfHeaderName: string;
101
101
  csrfCookieName: string;
102
102
  csrfRefresher: (() => Promise<void>) | null;
103
+ requestAbortControllers: Map<string, AbortController>;
103
104
  activeTxId: string | null;
104
105
  keepSession: boolean;
105
106
  refreshBuffer: number;
@@ -112,7 +113,6 @@ declare const EntityAppServerApi_base: {
112
113
  healthTickPromise: Promise<unknown> | null;
113
114
  realtimeEnabled: boolean;
114
115
  realtimePath: string;
115
- realtimeAutoConnect: boolean;
116
116
  realtimeAutoReconnect: boolean;
117
117
  realtimeReconnectDelayMs: number;
118
118
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -188,6 +188,7 @@ declare const EntityAppServerApi_base: {
188
188
  csrfHeaderName: string;
189
189
  csrfCookieName: string;
190
190
  csrfRefresher: (() => Promise<void>) | null;
191
+ requestAbortControllers: Map<string, AbortController>;
191
192
  activeTxId: string | null;
192
193
  keepSession: boolean;
193
194
  refreshBuffer: number;
@@ -200,7 +201,6 @@ declare const EntityAppServerApi_base: {
200
201
  healthTickPromise: Promise<unknown> | null;
201
202
  realtimeEnabled: boolean;
202
203
  realtimePath: string;
203
- realtimeAutoConnect: boolean;
204
204
  realtimeAutoReconnect: boolean;
205
205
  realtimeReconnectDelayMs: number;
206
206
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -277,6 +277,7 @@ declare const EntityAppServerApi_base: {
277
277
  csrfHeaderName: string;
278
278
  csrfCookieName: string;
279
279
  csrfRefresher: (() => Promise<void>) | null;
280
+ requestAbortControllers: Map<string, AbortController>;
280
281
  activeTxId: string | null;
281
282
  keepSession: boolean;
282
283
  refreshBuffer: number;
@@ -289,7 +290,6 @@ declare const EntityAppServerApi_base: {
289
290
  healthTickPromise: Promise<unknown> | null;
290
291
  realtimeEnabled: boolean;
291
292
  realtimePath: string;
292
- realtimeAutoConnect: boolean;
293
293
  realtimeAutoReconnect: boolean;
294
294
  realtimeReconnectDelayMs: number;
295
295
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -368,6 +368,7 @@ declare const EntityAppServerApi_base: {
368
368
  csrfHeaderName: string;
369
369
  csrfCookieName: string;
370
370
  csrfRefresher: (() => Promise<void>) | null;
371
+ requestAbortControllers: Map<string, AbortController>;
371
372
  activeTxId: string | null;
372
373
  keepSession: boolean;
373
374
  refreshBuffer: number;
@@ -380,7 +381,6 @@ declare const EntityAppServerApi_base: {
380
381
  healthTickPromise: Promise<unknown> | null;
381
382
  realtimeEnabled: boolean;
382
383
  realtimePath: string;
383
- realtimeAutoConnect: boolean;
384
384
  realtimeAutoReconnect: boolean;
385
385
  realtimeReconnectDelayMs: number;
386
386
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -458,6 +458,7 @@ declare const EntityAppServerApi_base: {
458
458
  csrfHeaderName: string;
459
459
  csrfCookieName: string;
460
460
  csrfRefresher: (() => Promise<void>) | null;
461
+ requestAbortControllers: Map<string, AbortController>;
461
462
  activeTxId: string | null;
462
463
  keepSession: boolean;
463
464
  refreshBuffer: number;
@@ -470,7 +471,6 @@ declare const EntityAppServerApi_base: {
470
471
  healthTickPromise: Promise<unknown> | null;
471
472
  realtimeEnabled: boolean;
472
473
  realtimePath: string;
473
- realtimeAutoConnect: boolean;
474
474
  realtimeAutoReconnect: boolean;
475
475
  realtimeReconnectDelayMs: number;
476
476
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -550,6 +550,7 @@ declare const EntityAppServerApi_base: {
550
550
  csrfHeaderName: string;
551
551
  csrfCookieName: string;
552
552
  csrfRefresher: (() => Promise<void>) | null;
553
+ requestAbortControllers: Map<string, AbortController>;
553
554
  activeTxId: string | null;
554
555
  keepSession: boolean;
555
556
  refreshBuffer: number;
@@ -562,7 +563,6 @@ declare const EntityAppServerApi_base: {
562
563
  healthTickPromise: Promise<unknown> | null;
563
564
  realtimeEnabled: boolean;
564
565
  realtimePath: string;
565
- realtimeAutoConnect: boolean;
566
566
  realtimeAutoReconnect: boolean;
567
567
  realtimeReconnectDelayMs: number;
568
568
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -669,6 +669,7 @@ declare const EntityAppServerApi_base: {
669
669
  csrfHeaderName: string;
670
670
  csrfCookieName: string;
671
671
  csrfRefresher: (() => Promise<void>) | null;
672
+ requestAbortControllers: Map<string, AbortController>;
672
673
  activeTxId: string | null;
673
674
  keepSession: boolean;
674
675
  refreshBuffer: number;
@@ -681,7 +682,6 @@ declare const EntityAppServerApi_base: {
681
682
  healthTickPromise: Promise<unknown> | null;
682
683
  realtimeEnabled: boolean;
683
684
  realtimePath: string;
684
- realtimeAutoConnect: boolean;
685
685
  realtimeAutoReconnect: boolean;
686
686
  realtimeReconnectDelayMs: number;
687
687
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -757,6 +757,7 @@ declare const EntityAppServerApi_base: {
757
757
  csrfHeaderName: string;
758
758
  csrfCookieName: string;
759
759
  csrfRefresher: (() => Promise<void>) | null;
760
+ requestAbortControllers: Map<string, AbortController>;
760
761
  activeTxId: string | null;
761
762
  keepSession: boolean;
762
763
  refreshBuffer: number;
@@ -769,7 +770,6 @@ declare const EntityAppServerApi_base: {
769
770
  healthTickPromise: Promise<unknown> | null;
770
771
  realtimeEnabled: boolean;
771
772
  realtimePath: string;
772
- realtimeAutoConnect: boolean;
773
773
  realtimeAutoReconnect: boolean;
774
774
  realtimeReconnectDelayMs: number;
775
775
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -848,6 +848,7 @@ declare const EntityAppServerApi_base: {
848
848
  csrfHeaderName: string;
849
849
  csrfCookieName: string;
850
850
  csrfRefresher: (() => Promise<void>) | null;
851
+ requestAbortControllers: Map<string, AbortController>;
851
852
  activeTxId: string | null;
852
853
  keepSession: boolean;
853
854
  refreshBuffer: number;
@@ -860,7 +861,6 @@ declare const EntityAppServerApi_base: {
860
861
  healthTickPromise: Promise<unknown> | null;
861
862
  realtimeEnabled: boolean;
862
863
  realtimePath: string;
863
- realtimeAutoConnect: boolean;
864
864
  realtimeAutoReconnect: boolean;
865
865
  realtimeReconnectDelayMs: number;
866
866
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -938,6 +938,7 @@ declare const EntityAppServerApi_base: {
938
938
  csrfHeaderName: string;
939
939
  csrfCookieName: string;
940
940
  csrfRefresher: (() => Promise<void>) | null;
941
+ requestAbortControllers: Map<string, AbortController>;
941
942
  activeTxId: string | null;
942
943
  keepSession: boolean;
943
944
  refreshBuffer: number;
@@ -950,7 +951,6 @@ declare const EntityAppServerApi_base: {
950
951
  healthTickPromise: Promise<unknown> | null;
951
952
  realtimeEnabled: boolean;
952
953
  realtimePath: string;
953
- realtimeAutoConnect: boolean;
954
954
  realtimeAutoReconnect: boolean;
955
955
  realtimeReconnectDelayMs: number;
956
956
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -1029,6 +1029,7 @@ declare const EntityAppServerApi_base: {
1029
1029
  csrfHeaderName: string;
1030
1030
  csrfCookieName: string;
1031
1031
  csrfRefresher: (() => Promise<void>) | null;
1032
+ requestAbortControllers: Map<string, AbortController>;
1032
1033
  activeTxId: string | null;
1033
1034
  keepSession: boolean;
1034
1035
  refreshBuffer: number;
@@ -1041,7 +1042,6 @@ declare const EntityAppServerApi_base: {
1041
1042
  healthTickPromise: Promise<unknown> | null;
1042
1043
  realtimeEnabled: boolean;
1043
1044
  realtimePath: string;
1044
- realtimeAutoConnect: boolean;
1045
1045
  realtimeAutoReconnect: boolean;
1046
1046
  realtimeReconnectDelayMs: number;
1047
1047
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -1118,6 +1118,7 @@ declare const EntityAppServerApi_base: {
1118
1118
  csrfHeaderName: string;
1119
1119
  csrfCookieName: string;
1120
1120
  csrfRefresher: (() => Promise<void>) | null;
1121
+ requestAbortControllers: Map<string, AbortController>;
1121
1122
  activeTxId: string | null;
1122
1123
  keepSession: boolean;
1123
1124
  refreshBuffer: number;
@@ -1130,7 +1131,6 @@ declare const EntityAppServerApi_base: {
1130
1131
  healthTickPromise: Promise<unknown> | null;
1131
1132
  realtimeEnabled: boolean;
1132
1133
  realtimePath: string;
1133
- realtimeAutoConnect: boolean;
1134
1134
  realtimeAutoReconnect: boolean;
1135
1135
  realtimeReconnectDelayMs: number;
1136
1136
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -1207,6 +1207,7 @@ declare const EntityAppServerApi_base: {
1207
1207
  csrfHeaderName: string;
1208
1208
  csrfCookieName: string;
1209
1209
  csrfRefresher: (() => Promise<void>) | null;
1210
+ requestAbortControllers: Map<string, AbortController>;
1210
1211
  activeTxId: string | null;
1211
1212
  keepSession: boolean;
1212
1213
  refreshBuffer: number;
@@ -1219,7 +1220,6 @@ declare const EntityAppServerApi_base: {
1219
1220
  healthTickPromise: Promise<unknown> | null;
1220
1221
  realtimeEnabled: boolean;
1221
1222
  realtimePath: string;
1222
- realtimeAutoConnect: boolean;
1223
1223
  realtimeAutoReconnect: boolean;
1224
1224
  realtimeReconnectDelayMs: number;
1225
1225
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -1324,6 +1324,7 @@ declare const EntityAppServerApi_base: {
1324
1324
  csrfHeaderName: string;
1325
1325
  csrfCookieName: string;
1326
1326
  csrfRefresher: (() => Promise<void>) | null;
1327
+ requestAbortControllers: Map<string, AbortController>;
1327
1328
  activeTxId: string | null;
1328
1329
  keepSession: boolean;
1329
1330
  refreshBuffer: number;
@@ -1336,7 +1337,6 @@ declare const EntityAppServerApi_base: {
1336
1337
  healthTickPromise: Promise<unknown> | null;
1337
1338
  realtimeEnabled: boolean;
1338
1339
  realtimePath: string;
1339
- realtimeAutoConnect: boolean;
1340
1340
  realtimeAutoReconnect: boolean;
1341
1341
  realtimeReconnectDelayMs: number;
1342
1342
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -1418,6 +1418,7 @@ declare const EntityAppServerApi_base: {
1418
1418
  csrfHeaderName: string;
1419
1419
  csrfCookieName: string;
1420
1420
  csrfRefresher: (() => Promise<void>) | null;
1421
+ requestAbortControllers: Map<string, AbortController>;
1421
1422
  activeTxId: string | null;
1422
1423
  keepSession: boolean;
1423
1424
  refreshBuffer: number;
@@ -1430,7 +1431,6 @@ declare const EntityAppServerApi_base: {
1430
1431
  healthTickPromise: Promise<unknown> | null;
1431
1432
  realtimeEnabled: boolean;
1432
1433
  realtimePath: string;
1433
- realtimeAutoConnect: boolean;
1434
1434
  realtimeAutoReconnect: boolean;
1435
1435
  realtimeReconnectDelayMs: number;
1436
1436
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/EntityAppServerApi.ts"],
4
- "sourcesContent": ["import { EntityServerApi } from \"./EntityServerApi.js\";\r\nimport {\r\n AccountAppMixin,\r\n BoardMixin,\r\n EmailVerifyMixin,\r\n OAuthMixin,\r\n PasswordResetMixin,\r\n TwoFactorMixin,\r\n} from \"./mixins/app/index.js\";\r\nimport {\r\n AlimtalkMixin,\r\n AppPushMixin,\r\n FriendtalkMixin,\r\n HolidaysMixin,\r\n IdentityMixin,\r\n LlmMixin,\r\n OcrMixin,\r\n PgMixin,\r\n SmsMixin,\r\n TaxinvoiceMixin,\r\n} from \"./mixins/app/plugins/index.js\";\r\n\r\nexport class EntityAppServerApi extends AlimtalkMixin(\r\n FriendtalkMixin(\r\n SmsMixin(\r\n AppPushMixin(\r\n PgMixin(\r\n TaxinvoiceMixin(\r\n OcrMixin(\r\n LlmMixin(\r\n IdentityMixin(\r\n HolidaysMixin(\r\n OAuthMixin(\r\n TwoFactorMixin(\r\n PasswordResetMixin(\r\n EmailVerifyMixin(\r\n BoardMixin(\r\n AccountAppMixin(\r\n EntityServerApi,\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n ),\r\n) {}\r\n"],
4
+ "sourcesContent": ["import { EntityServerApi } from \"./EntityServerApi.js\";\nimport {\n AccountAppMixin,\n BoardMixin,\n EmailVerifyMixin,\n OAuthMixin,\n PasswordResetMixin,\n TwoFactorMixin,\n} from \"./mixins/app/index.js\";\nimport {\n AlimtalkMixin,\n AppPushMixin,\n FriendtalkMixin,\n HolidaysMixin,\n IdentityMixin,\n LlmMixin,\n OcrMixin,\n PgMixin,\n SmsMixin,\n TaxinvoiceMixin,\n} from \"./mixins/app/plugins/index.js\";\n\nexport class EntityAppServerApi extends AlimtalkMixin(\n FriendtalkMixin(\n SmsMixin(\n AppPushMixin(\n PgMixin(\n TaxinvoiceMixin(\n OcrMixin(\n LlmMixin(\n IdentityMixin(\n HolidaysMixin(\n OAuthMixin(\n TwoFactorMixin(\n PasswordResetMixin(\n EmailVerifyMixin(\n BoardMixin(\n AccountAppMixin(\n EntityServerApi,\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n ),\n) {}\n"],
5
5
  "mappings": "AAAA,OAAS,mBAAAA,MAAuB,uBAChC,OACI,mBAAAC,EACA,cAAAC,EACA,oBAAAC,EACA,cAAAC,EACA,sBAAAC,EACA,kBAAAC,MACG,wBACP,OACI,iBAAAC,EACA,gBAAAC,EACA,mBAAAC,EACA,iBAAAC,EACA,iBAAAC,EACA,YAAAC,EACA,YAAAC,EACA,WAAAC,EACA,YAAAC,EACA,mBAAAC,MACG,gCAEA,MAAMC,UAA2BV,EACpCE,EACIM,EACIP,EACIM,EACIE,EACIH,EACID,EACID,EACID,EACIN,EACIE,EACID,EACIF,EACID,EACID,EACID,CACJ,CACJ,CACJ,CACJ,CACJ,CACJ,CACJ,CACJ,CACJ,CACJ,CACJ,CACJ,CACJ,CACJ,CACJ,CACJ,CAAE,CAAC",
6
6
  "names": ["EntityServerApi", "AccountAppMixin", "BoardMixin", "EmailVerifyMixin", "OAuthMixin", "PasswordResetMixin", "TwoFactorMixin", "AlimtalkMixin", "AppPushMixin", "FriendtalkMixin", "HolidaysMixin", "IdentityMixin", "LlmMixin", "OcrMixin", "PgMixin", "SmsMixin", "TaxinvoiceMixin", "EntityAppServerApi"]
7
7
  }
@@ -46,6 +46,7 @@ declare const EntityServerApi_base: {
46
46
  csrfHeaderName: string;
47
47
  csrfCookieName: string;
48
48
  csrfRefresher: (() => Promise<void>) | null;
49
+ requestAbortControllers: Map<string, AbortController>;
49
50
  activeTxId: string | null;
50
51
  keepSession: boolean;
51
52
  refreshBuffer: number;
@@ -58,7 +59,6 @@ declare const EntityServerApi_base: {
58
59
  healthTickPromise: Promise<unknown> | null;
59
60
  realtimeEnabled: boolean;
60
61
  realtimePath: string;
61
- realtimeAutoConnect: boolean;
62
62
  realtimeAutoReconnect: boolean;
63
63
  realtimeReconnectDelayMs: number;
64
64
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -133,6 +133,7 @@ declare const EntityServerApi_base: {
133
133
  csrfHeaderName: string;
134
134
  csrfCookieName: string;
135
135
  csrfRefresher: (() => Promise<void>) | null;
136
+ requestAbortControllers: Map<string, AbortController>;
136
137
  activeTxId: string | null;
137
138
  keepSession: boolean;
138
139
  refreshBuffer: number;
@@ -145,7 +146,6 @@ declare const EntityServerApi_base: {
145
146
  healthTickPromise: Promise<unknown> | null;
146
147
  realtimeEnabled: boolean;
147
148
  realtimePath: string;
148
- realtimeAutoConnect: boolean;
149
149
  realtimeAutoReconnect: boolean;
150
150
  realtimeReconnectDelayMs: number;
151
151
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -282,6 +282,7 @@ declare const EntityServerApi_base: {
282
282
  csrfHeaderName: string;
283
283
  csrfCookieName: string;
284
284
  csrfRefresher: (() => Promise<void>) | null;
285
+ requestAbortControllers: Map<string, AbortController>;
285
286
  activeTxId: string | null;
286
287
  keepSession: boolean;
287
288
  refreshBuffer: number;
@@ -294,7 +295,6 @@ declare const EntityServerApi_base: {
294
295
  healthTickPromise: Promise<unknown> | null;
295
296
  realtimeEnabled: boolean;
296
297
  realtimePath: string;
297
- realtimeAutoConnect: boolean;
298
298
  realtimeAutoReconnect: boolean;
299
299
  realtimeReconnectDelayMs: number;
300
300
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -375,6 +375,7 @@ declare const EntityServerApi_base: {
375
375
  csrfHeaderName: string;
376
376
  csrfCookieName: string;
377
377
  csrfRefresher: (() => Promise<void>) | null;
378
+ requestAbortControllers: Map<string, AbortController>;
378
379
  activeTxId: string | null;
379
380
  keepSession: boolean;
380
381
  refreshBuffer: number;
@@ -387,7 +388,6 @@ declare const EntityServerApi_base: {
387
388
  healthTickPromise: Promise<unknown> | null;
388
389
  realtimeEnabled: boolean;
389
390
  realtimePath: string;
390
- realtimeAutoConnect: boolean;
391
391
  realtimeAutoReconnect: boolean;
392
392
  realtimeReconnectDelayMs: number;
393
393
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -486,6 +486,7 @@ declare const EntityServerApi_base: {
486
486
  csrfHeaderName: string;
487
487
  csrfCookieName: string;
488
488
  csrfRefresher: (() => Promise<void>) | null;
489
+ requestAbortControllers: Map<string, AbortController>;
489
490
  activeTxId: string | null;
490
491
  keepSession: boolean;
491
492
  refreshBuffer: number;
@@ -498,7 +499,6 @@ declare const EntityServerApi_base: {
498
499
  healthTickPromise: Promise<unknown> | null;
499
500
  realtimeEnabled: boolean;
500
501
  realtimePath: string;
501
- realtimeAutoConnect: boolean;
502
502
  realtimeAutoReconnect: boolean;
503
503
  realtimeReconnectDelayMs: number;
504
504
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -632,6 +632,7 @@ declare const EntityServerApi_base: {
632
632
  csrfHeaderName: string;
633
633
  csrfCookieName: string;
634
634
  csrfRefresher: (() => Promise<void>) | null;
635
+ requestAbortControllers: Map<string, AbortController>;
635
636
  activeTxId: string | null;
636
637
  keepSession: boolean;
637
638
  refreshBuffer: number;
@@ -644,7 +645,6 @@ declare const EntityServerApi_base: {
644
645
  healthTickPromise: Promise<unknown> | null;
645
646
  realtimeEnabled: boolean;
646
647
  realtimePath: string;
647
- realtimeAutoConnect: boolean;
648
648
  realtimeAutoReconnect: boolean;
649
649
  realtimeReconnectDelayMs: number;
650
650
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -782,6 +782,7 @@ declare const EntityServerApi_base: {
782
782
  csrfHeaderName: string;
783
783
  csrfCookieName: string;
784
784
  csrfRefresher: (() => Promise<void>) | null;
785
+ requestAbortControllers: Map<string, AbortController>;
785
786
  activeTxId: string | null;
786
787
  keepSession: boolean;
787
788
  refreshBuffer: number;
@@ -794,7 +795,6 @@ declare const EntityServerApi_base: {
794
795
  healthTickPromise: Promise<unknown> | null;
795
796
  realtimeEnabled: boolean;
796
797
  realtimePath: string;
797
- realtimeAutoConnect: boolean;
798
798
  realtimeAutoReconnect: boolean;
799
799
  realtimeReconnectDelayMs: number;
800
800
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -900,6 +900,7 @@ declare const EntityServerApi_base: {
900
900
  csrfEnabled: boolean;
901
901
  csrfHeaderName: string;
902
902
  csrfCookieName: string;
903
+ requestAbortControllers: Map<string, AbortController>;
903
904
  activeTxId: string | null;
904
905
  keepSession: boolean;
905
906
  refreshBuffer: number;
@@ -912,7 +913,6 @@ declare const EntityServerApi_base: {
912
913
  healthTickPromise: Promise<unknown> | null;
913
914
  realtimeEnabled: boolean;
914
915
  realtimePath: string;
915
- realtimeAutoConnect: boolean;
916
916
  realtimeAutoReconnect: boolean;
917
917
  realtimeReconnectDelayMs: number;
918
918
  realtimeStatus: import("./types.js").RealtimeConnectionStatus;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/EntityServerApi.ts"],
4
- "sourcesContent": ["/**\r\n * @file EntityServerApi.ts\r\n * entity-server core route\uC6A9 Mixin \uC870\uD569 \uD074\uB77C\uC774\uC5B8\uD2B8.\r\n *\r\n * \uC808(section)\uBCC4 \uAD6C\uD604:\r\n * src/client/base.ts \u2014 \uC0C1\uD0DC\u00B7\uC0DD\uC131\uC790\u00B7\uACF5\uD1B5 \uD5EC\uD37C\r\n * src/mixins/server/* \u2014 entity-server core route mixin\r\n * src/mixins/app/* \u2014 entity-app-server plugin mixin\r\n */\r\nimport { EntityServerClientBase } from \"./client/base.js\";\r\nimport {\r\n AdminMixin,\r\n AuthMixin,\r\n EntityMixin,\r\n FileMixin,\r\n PushMixin,\r\n SmtpMixin,\r\n TransactionMixin,\r\n UtilsMixin,\r\n} from \"./mixins/server/index.js\";\r\n\r\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\r\n\r\nexport class EntityServerApi extends UtilsMixin(\r\n TransactionMixin(\r\n FileMixin(\r\n SmtpMixin(\r\n PushMixin(\r\n AdminMixin(EntityMixin(AuthMixin(EntityServerClientBase))),\r\n ),\r\n ),\r\n ),\r\n ),\r\n) {}\r\n"],
4
+ "sourcesContent": ["/**\n * @file EntityServerApi.ts\n * entity-server core route\uC6A9 Mixin \uC870\uD569 \uD074\uB77C\uC774\uC5B8\uD2B8.\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/server/* \u2014 entity-server core route mixin\n * src/mixins/app/* \u2014 entity-app-server plugin mixin\n */\nimport { EntityServerClientBase } from \"./client/base.js\";\nimport {\n AdminMixin,\n AuthMixin,\n EntityMixin,\n FileMixin,\n PushMixin,\n SmtpMixin,\n TransactionMixin,\n UtilsMixin,\n} from \"./mixins/server/index.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 EntityServerApi extends UtilsMixin(\n TransactionMixin(\n FileMixin(\n SmtpMixin(\n PushMixin(\n AdminMixin(EntityMixin(AuthMixin(EntityServerClientBase))),\n ),\n ),\n ),\n ),\n) {}\n"],
5
5
  "mappings": "AASA,OAAS,0BAAAA,MAA8B,mBACvC,OACI,cAAAC,EACA,aAAAC,EACA,eAAAC,EACA,aAAAC,EACA,aAAAC,EACA,aAAAC,EACA,oBAAAC,EACA,cAAAC,MACG,2BAIA,MAAMC,UAAwBD,EACjCD,EACIH,EACIE,EACID,EACIJ,EAAWE,EAAYD,EAAUF,CAAsB,CAAC,CAAC,CAC7D,CACJ,CACJ,CACJ,CACJ,CAAE,CAAC",
6
6
  "names": ["EntityServerClientBase", "AdminMixin", "AuthMixin", "EntityMixin", "FileMixin", "PushMixin", "SmtpMixin", "TransactionMixin", "UtilsMixin", "EntityServerApi"]
7
7
  }
@@ -13,6 +13,7 @@ export declare class EntityServerClientBase {
13
13
  csrfCookieName: string;
14
14
  /** @internal health 재호출로 CSRF 쿠키 갱신 (AuthMixin에서 설정) */
15
15
  csrfRefresher: (() => Promise<void>) | null;
16
+ requestAbortControllers: Map<string, AbortController>;
16
17
  activeTxId: string | null;
17
18
  keepSession: boolean;
18
19
  refreshBuffer: number;
@@ -25,7 +26,6 @@ export declare class EntityServerClientBase {
25
26
  healthTickPromise: Promise<unknown> | null;
26
27
  realtimeEnabled: boolean;
27
28
  realtimePath: string;
28
- realtimeAutoConnect: boolean;
29
29
  realtimeAutoReconnect: boolean;
30
30
  realtimeReconnectDelayMs: number;
31
31
  realtimeStatus: RealtimeConnectionStatus;
@@ -1,2 +1,2 @@
1
- import{readEnv as m}from"./utils.js";import{derivePacketKey as u,parseRequestBody as f}from"./packet.js";import{entityRequest as l}from"./request.js";const c="/v1/realtime";class y{baseUrl;token;anonymousPacketToken;apiKey;hmacSecret;encryptRequests;csrfEnabled;csrfHeaderName;csrfCookieName;csrfRefresher=null;activeTxId=null;keepSession;refreshBuffer;onTokenRefreshed;onSessionExpired;onHealthChange;sessionRefreshToken=null;refreshTimer=null;healthTickTimer=null;healthTickPromise=null;realtimeEnabled;realtimePath;realtimeAutoConnect;realtimeAutoReconnect;realtimeReconnectDelayMs;realtimeStatus;realtimeSocket=null;realtimeConnectPromise=null;realtimeReconnectTimer=null;realtimeShouldReconnect=!1;realtimeMessageListeners=new Set;realtimeStatusListeners=new Set;realtimeEventListeners=new Map;constructor(e={}){const t=m("VITE_ENTITY_SERVER_URL");this.baseUrl=(e.baseUrl??t??"").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.csrfHeaderName=e.csrfHeaderName??"x-csrf-token",this.csrfCookieName=e.csrfCookieName??"_csrf",this.keepSession=e.keepSession??!1,this.refreshBuffer=e.refreshBuffer??60,this.onTokenRefreshed=e.onTokenRefreshed,this.onSessionExpired=e.onSessionExpired,this.onHealthChange=e.onHealthChange,this.realtimeEnabled=!1,this.realtimePath=c,this.realtimeAutoConnect=!0,this.realtimeAutoReconnect=!0,this.realtimeReconnectDelayMs=3e3,this.realtimeStatus="idle",this.applyRealtimeOptions(e.realtime),typeof e.healthTickInterval=="number"&&e.healthTickInterval>0&&Promise.resolve().then(()=>this.startHealthTick(e.healthTickInterval,!1))}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),typeof e.csrfHeaderName=="string"&&(this.csrfHeaderName=e.csrfHeaderName),typeof e.csrfCookieName=="string"&&(this.csrfCookieName=e.csrfCookieName),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),e.onHealthChange&&(this.onHealthChange=e.onHealthChange),typeof e.realtime<"u"&&this.applyRealtimeOptions(e.realtime),typeof e.healthTickInterval=="number"&&e.healthTickInterval>0&&Promise.resolve().then(()=>this.startHealthTick(e.healthTickInterval,!1))}setToken(e){if(this.token=e,!e){this.disconnectRealtime("token_cleared");return}this.realtimeEnabled&&this.realtimeAutoConnect&&this.connectRealtime().catch(()=>{})}setAccessTokenFromResponse(e){this.token=e}setAnonymousPacketToken(e){this.anonymousPacketToken=e}setApiKey(e){this.apiKey=e}setHmacSecret(e){this.hmacSecret=e}setEncryptRequests(e){this.encryptRequests=e}setCsrfEnabled(e){this.csrfEnabled=e}addRealtimeListener(e){this.realtimeMessageListeners.add(e)}removeRealtimeListener(e){this.realtimeMessageListeners.delete(e)}addRealtimeStatusListener(e){this.realtimeStatusListeners.add(e)}removeRealtimeStatusListener(e){this.realtimeStatusListeners.delete(e)}addRealtimeEventListener(e,t){const s=String(e).trim();s&&(this.realtimeEventListeners.has(s)||this.realtimeEventListeners.set(s,new Set),this.realtimeEventListeners.get(s).add(t))}removeRealtimeEventListener(e,t){const s=String(e).trim();if(!s)return;const i=this.realtimeEventListeners.get(s);i&&(i.delete(t),i.size===0&&this.realtimeEventListeners.delete(s))}async connectRealtime(){if(!this.realtimeEnabled){this.setRealtimeStatus("disabled","realtime_disabled");return}if(!this.token)throw new Error("Cannot open realtime connection without access token.");if(typeof WebSocket>"u")throw new Error("WebSocket is not available in this environment.");if(this.realtimeSocket&&this.realtimeSocket.readyState===WebSocket.OPEN)return;if(this.realtimeSocket&&this.realtimeSocket.readyState===WebSocket.CONNECTING&&this.realtimeConnectPromise)return this.realtimeConnectPromise;this.clearRealtimeReconnectTimer(),this.realtimeShouldReconnect=this.realtimeAutoReconnect,this.setRealtimeStatus("connecting","connect_requested");const e=new WebSocket(this.buildRealtimeUrl());return this.realtimeSocket=e,this.realtimeConnectPromise=new Promise((t,s)=>{let i=!1;const r=()=>{i||(i=!0,this.realtimeConnectPromise=null,t())},n=a=>{i||(i=!0,this.realtimeConnectPromise=null,s(a))};e.addEventListener("open",()=>{this.setRealtimeStatus("open","socket_open"),r()}),e.addEventListener("message",a=>{this.handleRealtimeMessage(a.data)}),e.addEventListener("error",()=>{this.setRealtimeStatus("closed","socket_error",new Error("Realtime socket error."))}),e.addEventListener("close",a=>{this.realtimeSocket===e&&(this.realtimeSocket=null);const o=a.reason||"socket_closed",h=new Error(`Realtime socket closed (${a.code}${a.reason?`: ${a.reason}`:""}).`);this.setRealtimeStatus("closed",o,h),i||n(h),this.realtimeShouldReconnect&&this.realtimeEnabled&&this.realtimeAutoReconnect&&this.token&&this.scheduleRealtimeReconnect(o)})}),this.realtimeConnectPromise}disconnectRealtime(e="client_disconnect"){if(this.realtimeShouldReconnect=!1,this.clearRealtimeReconnectTimer(),this.realtimeSocket){const t=this.realtimeSocket;this.realtimeSocket=null;try{(t.readyState===WebSocket.OPEN||t.readyState===WebSocket.CONNECTING)&&t.close(1e3,e)}catch{}}this.realtimeConnectPromise=null,this.setRealtimeStatus(this.realtimeEnabled?"idle":"disabled",e)}sendRealtime(e){return!this.realtimeSocket||this.realtimeSocket.readyState!==WebSocket.OPEN?!1:(this.realtimeSocket.send(JSON.stringify(e)),!0)}subscribeRealtime(e){return this.sendRealtime({type:"subscribe",channel:"session",event:"session.subscribe",data:{subscriptions:e}})}unsubscribeRealtime(e){return this.sendRealtime({type:"unsubscribe",channel:"session",event:"session.unsubscribe",data:{subscriptions:e}})}startHealthTick(e=300*1e3,t=!0){this.stopHealthTick();const s=()=>{this.healthTickPromise||(this.healthTickPromise=(this.csrfRefresher?this.csrfRefresher():Promise.resolve()).then(()=>{this.onHealthChange?.(!0)}).catch(()=>{this.onHealthChange?.(!1)}).finally(()=>{this.healthTickPromise=null}))};t&&s(),this.healthTickTimer=setInterval(s,e)}stopHealthTick(){this.healthTickTimer!==null&&(clearInterval(this.healthTickTimer),this.healthTickTimer=null),this.healthTickPromise=null}scheduleKeepSession(e,t,s){this.clearRefreshTimer(),this.sessionRefreshToken=e;const i=Math.max((t-this.refreshBuffer)*1e3,0);this.refreshTimer=setTimeout(async()=>{if(this.sessionRefreshToken)try{const r=await s(this.sessionRefreshToken);this.onTokenRefreshed?.(r.access_token,r.expires_in),this.scheduleKeepSession(this.sessionRefreshToken,r.expires_in,s)}catch(r){this.clearRefreshTimer(),this.onSessionExpired?.(r instanceof Error?r:new Error(String(r)))}},i)}clearRefreshTimer(){this.refreshTimer!==null&&(clearTimeout(this.refreshTimer),this.refreshTimer=null)}stopKeepSession(){this.clearRefreshTimer(),this.sessionRefreshToken=null}applyRealtimeOptions(e){const t=typeof e=="boolean"?{enabled:e}:e??{};if(this.realtimeEnabled=t.enabled??!1,this.realtimePath=String(t.path??c).trim()||c,this.realtimeAutoConnect=t.autoConnect??!0,this.realtimeAutoReconnect=t.autoReconnect??!0,this.realtimeReconnectDelayMs=Math.max(250,t.reconnectDelayMs??3e3),!this.realtimeEnabled){this.disconnectRealtime("realtime_disabled");return}this.setRealtimeStatus("idle","realtime_enabled"),this.token&&this.realtimeAutoConnect&&this.connectRealtime().catch(()=>{})}buildRealtimeUrl(){const t=this.baseUrl||m("VITE_ENTITY_SERVER_URL")||""||(typeof window<"u"?window.location.origin:"");if(!t)throw new Error("Realtime connection requires baseUrl.");const s=new URL(this.realtimePath,t);return s.protocol=s.protocol==="https:"?"wss:":"ws:",s.searchParams.set("access_token",this.token),s.toString()}handleRealtimeMessage(e){if(typeof e!="string")return;let t;try{t=JSON.parse(e)}catch{return}for(const i of this.realtimeMessageListeners)i(t);const s=this.realtimeEventListeners.get(t.event);if(s)for(const i of s)i(t)}scheduleRealtimeReconnect(e){this.clearRealtimeReconnectTimer(),this.realtimeReconnectTimer=setTimeout(()=>{this.realtimeReconnectTimer=null,!(!this.realtimeEnabled||!this.token)&&(this.setRealtimeStatus("connecting",`${e}:reconnect`),this.connectRealtime().catch(()=>{}))},this.realtimeReconnectDelayMs)}clearRealtimeReconnectTimer(){this.realtimeReconnectTimer!==null&&(clearTimeout(this.realtimeReconnectTimer),this.realtimeReconnectTimer=null)}setRealtimeStatus(e,t,s){const i=this.realtimeStatus;if(!(i===e&&typeof t>"u"&&typeof s>"u")){this.realtimeStatus=e;for(const r of this.realtimeStatusListeners)r({status:e,previousStatus:i,...t?{reason:t}:{},...s?{error:s}:{}})}}applyCsrfHealth(){if(!(typeof document>"u")){for(const e of document.cookie.split(";")){const t=e.indexOf("=");if(!(t<0)&&e.substring(0,t).trim()===this.csrfCookieName){this.csrfEnabled=!!e.substring(t+1).trim();return}}this.csrfEnabled=!1}}readRequestBody(e,t="application/json",s=!1){const i=u(this.hmacSecret,this.token||this.anonymousPacketToken);return f(e,t,s,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,csrfHeaderName:this.csrfHeaderName,csrfCookieName:this.csrfCookieName,refreshCsrfCookie:this.csrfEnabled?this.csrfRefresher:null,onAccessToken:e=>{this.setAccessTokenFromResponse(e)}}}prepareRequest(e){return Promise.resolve()}get http(){const e=this;return{get(t,s=!0,i,r){return e.prepareRequest(s).then(()=>l(e.reqOpts,"GET",t,void 0,s,i,r??!0))},post(t,s,i=!0,r,n){return e.prepareRequest(i).then(()=>l(e.reqOpts,"POST",t,s,i,r,n??!0))},put(t,s,i=!0,r,n){return e.prepareRequest(i).then(()=>l(e.reqOpts,"PUT",t,s,i,r,n??!0))},patch(t,s,i=!0,r,n){return e.prepareRequest(i).then(()=>l(e.reqOpts,"PATCH",t,s,i,r,n??!0))},delete(t,s,i=!0,r,n){return e.prepareRequest(i).then(()=>l(e.reqOpts,"DELETE",t,s,i,r,n??!0))}}}request(e,t,s,i=!0,r,n){return this.prepareRequest(i).then(()=>l(this.reqOpts,e,t,s,i,r,n??!0))}async requestBinary(e,t,s,i=!0){await this.prepareRequest(i);const r={"Content-Type":"application/json"};i&&this.token&&(r.Authorization=`Bearer ${this.token}`),this.apiKey&&(r["X-API-Key"]=this.apiKey);const n=await fetch(this.baseUrl+t,{method:e,headers:r,...s!=null?{body:JSON.stringify(s)}:{},credentials:"include"});if(!n.ok){const a=await n.text(),o=new Error(`HTTP ${n.status}: ${a}`);throw o.status=n.status,o}return n.arrayBuffer()}async requestForm(e,t,s,i=!0){const r={};i&&this.token&&(r.Authorization=`Bearer ${this.token}`),this.apiKey&&(r["X-API-Key"]=this.apiKey);const n=await fetch(this.baseUrl+t,{method:e,headers:r,body:s,credentials:"include"}),a=await n.json();if(!a.ok){const o=new Error(a.message??`EntityServer error (HTTP ${n.status})`);throw o.status=n.status,o}return a}async requestFormBinary(e,t,s,i=!0){const r={};i&&this.token&&(r.Authorization=`Bearer ${this.token}`),this.apiKey&&(r["X-API-Key"]=this.apiKey);const n=await fetch(this.baseUrl+t,{method:e,headers:r,body:s,credentials:"include"});if(!n.ok){const a=await n.text(),o=new Error(`HTTP ${n.status}: ${a}`);throw o.status=n.status,o}return n.arrayBuffer()}}export{y as EntityServerClientBase};
1
+ import{readEnv as m}from"./utils.js";import{derivePacketKey as u,parseRequestBody as f}from"./packet.js";import{entityRequest as l}from"./request.js";const c="/v1/realtime";class y{baseUrl;token;anonymousPacketToken;apiKey;hmacSecret;encryptRequests;csrfEnabled;csrfHeaderName;csrfCookieName;csrfRefresher=null;requestAbortControllers=new Map;activeTxId=null;keepSession;refreshBuffer;onTokenRefreshed;onSessionExpired;onHealthChange;sessionRefreshToken=null;refreshTimer=null;healthTickTimer=null;healthTickPromise=null;realtimeEnabled;realtimePath;realtimeAutoReconnect;realtimeReconnectDelayMs;realtimeStatus;realtimeSocket=null;realtimeConnectPromise=null;realtimeReconnectTimer=null;realtimeShouldReconnect=!1;realtimeMessageListeners=new Set;realtimeStatusListeners=new Set;realtimeEventListeners=new Map;constructor(e={}){const t=m("VITE_ENTITY_SERVER_URL");this.baseUrl=(e.baseUrl??t??"").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.csrfHeaderName=e.csrfHeaderName??"x-csrf-token",this.csrfCookieName=e.csrfCookieName??"_csrf",this.keepSession=e.keepSession??!1,this.refreshBuffer=e.refreshBuffer??60,this.onTokenRefreshed=e.onTokenRefreshed,this.onSessionExpired=e.onSessionExpired,this.onHealthChange=e.onHealthChange,this.realtimeEnabled=!1,this.realtimePath=c,this.realtimeAutoReconnect=!0,this.realtimeReconnectDelayMs=3e3,this.realtimeStatus="idle",this.applyRealtimeOptions(e.realtime),typeof e.healthTickInterval=="number"&&e.healthTickInterval>0&&Promise.resolve().then(()=>this.startHealthTick(e.healthTickInterval,!1))}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),typeof e.csrfHeaderName=="string"&&(this.csrfHeaderName=e.csrfHeaderName),typeof e.csrfCookieName=="string"&&(this.csrfCookieName=e.csrfCookieName),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),e.onHealthChange&&(this.onHealthChange=e.onHealthChange),typeof e.realtime<"u"&&this.applyRealtimeOptions(e.realtime),typeof e.healthTickInterval=="number"&&e.healthTickInterval>0&&Promise.resolve().then(()=>this.startHealthTick(e.healthTickInterval,!1))}setToken(e){this.token=e,e||this.disconnectRealtime("token_cleared")}setAccessTokenFromResponse(e){this.token=e,e||this.disconnectRealtime("token_cleared")}setAnonymousPacketToken(e){this.anonymousPacketToken=e}setApiKey(e){this.apiKey=e}setHmacSecret(e){this.hmacSecret=e}setEncryptRequests(e){this.encryptRequests=e}setCsrfEnabled(e){this.csrfEnabled=e}addRealtimeListener(e){this.realtimeMessageListeners.add(e)}removeRealtimeListener(e){this.realtimeMessageListeners.delete(e)}addRealtimeStatusListener(e){this.realtimeStatusListeners.add(e)}removeRealtimeStatusListener(e){this.realtimeStatusListeners.delete(e)}addRealtimeEventListener(e,t){const i=String(e).trim();i&&(this.realtimeEventListeners.has(i)||this.realtimeEventListeners.set(i,new Set),this.realtimeEventListeners.get(i).add(t))}removeRealtimeEventListener(e,t){const i=String(e).trim();if(!i)return;const s=this.realtimeEventListeners.get(i);s&&(s.delete(t),s.size===0&&this.realtimeEventListeners.delete(i))}async connectRealtime(){if(!this.realtimeEnabled){this.setRealtimeStatus("disabled","realtime_disabled");return}if(!this.token)throw new Error("Cannot open realtime connection without access token.");if(typeof WebSocket>"u")throw new Error("WebSocket is not available in this environment.");if(this.realtimeSocket&&this.realtimeSocket.readyState===WebSocket.OPEN)return;if(this.realtimeSocket&&this.realtimeSocket.readyState===WebSocket.CONNECTING&&this.realtimeConnectPromise)return this.realtimeConnectPromise;this.clearRealtimeReconnectTimer(),this.realtimeShouldReconnect=this.realtimeAutoReconnect,this.setRealtimeStatus("connecting","connect_requested");const e=new WebSocket(this.buildRealtimeUrl());return this.realtimeSocket=e,this.realtimeConnectPromise=new Promise((t,i)=>{let s=!1;const r=()=>{s||(s=!0,this.realtimeConnectPromise=null,t())},n=a=>{s||(s=!0,this.realtimeConnectPromise=null,i(a))};e.addEventListener("open",()=>{this.setRealtimeStatus("open","socket_open"),r()}),e.addEventListener("message",a=>{this.handleRealtimeMessage(a.data)}),e.addEventListener("error",()=>{this.setRealtimeStatus("closed","socket_error",new Error("Realtime socket error."))}),e.addEventListener("close",a=>{this.realtimeSocket===e&&(this.realtimeSocket=null);const o=a.reason||"socket_closed",h=new Error(`Realtime socket closed (${a.code}${a.reason?`: ${a.reason}`:""}).`);this.setRealtimeStatus("closed",o,h),s||n(h),this.realtimeShouldReconnect&&this.realtimeEnabled&&this.realtimeAutoReconnect&&this.token&&this.scheduleRealtimeReconnect(o)})}),this.realtimeConnectPromise}disconnectRealtime(e="client_disconnect"){if(this.realtimeShouldReconnect=!1,this.clearRealtimeReconnectTimer(),this.realtimeSocket){const t=this.realtimeSocket;this.realtimeSocket=null;try{(t.readyState===WebSocket.OPEN||t.readyState===WebSocket.CONNECTING)&&t.close(1e3,e)}catch{}}this.realtimeConnectPromise=null,this.setRealtimeStatus(this.realtimeEnabled?"idle":"disabled",e)}sendRealtime(e){return!this.realtimeSocket||this.realtimeSocket.readyState!==WebSocket.OPEN?!1:(this.realtimeSocket.send(JSON.stringify(e)),!0)}subscribeRealtime(e){return this.sendRealtime({type:"subscribe",channel:"session",event:"session.subscribe",data:{subscriptions:e}})}unsubscribeRealtime(e){return this.sendRealtime({type:"unsubscribe",channel:"session",event:"session.unsubscribe",data:{subscriptions:e}})}startHealthTick(e=300*1e3,t=!0){this.stopHealthTick();const i=()=>{this.healthTickPromise||(this.healthTickPromise=(this.csrfRefresher?this.csrfRefresher():Promise.resolve()).then(()=>{this.onHealthChange?.(!0)}).catch(()=>{this.onHealthChange?.(!1)}).finally(()=>{this.healthTickPromise=null}))};t&&i(),this.healthTickTimer=setInterval(i,e)}stopHealthTick(){this.healthTickTimer!==null&&(clearInterval(this.healthTickTimer),this.healthTickTimer=null),this.healthTickPromise=null}scheduleKeepSession(e,t,i){this.clearRefreshTimer(),this.sessionRefreshToken=e;const s=Math.max((t-this.refreshBuffer)*1e3,0);this.refreshTimer=setTimeout(async()=>{if(this.sessionRefreshToken)try{const r=await i(this.sessionRefreshToken);this.onTokenRefreshed?.(r.access_token,r.expires_in),this.scheduleKeepSession(this.sessionRefreshToken,r.expires_in,i)}catch(r){this.clearRefreshTimer(),this.onSessionExpired?.(r instanceof Error?r:new Error(String(r)))}},s)}clearRefreshTimer(){this.refreshTimer!==null&&(clearTimeout(this.refreshTimer),this.refreshTimer=null)}stopKeepSession(){this.clearRefreshTimer(),this.sessionRefreshToken=null}applyRealtimeOptions(e){const t=typeof e=="boolean"?{enabled:e}:e??{};if(this.realtimeEnabled=t.enabled??!1,this.realtimePath=String(t.path??c).trim()||c,this.realtimeAutoReconnect=t.autoReconnect??!0,this.realtimeReconnectDelayMs=Math.max(250,t.reconnectDelayMs??3e3),!this.realtimeEnabled){this.disconnectRealtime("realtime_disabled");return}this.setRealtimeStatus("idle","realtime_enabled")}buildRealtimeUrl(){const e=this.baseUrl||m("VITE_ENTITY_SERVER_URL")||"",t=typeof window<"u"?window.location.origin:"",i=e||t;if(!i)throw new Error("Realtime connection requires baseUrl.");const s=new URL(i,t||void 0),r=s.pathname==="/"?"":s.pathname.replace(/\/+$/,""),n=`/${this.realtimePath.replace(/^\/+/,"")}`;return s.pathname=`${r}${n}`||n,s.search="",s.hash="",s.protocol=s.protocol==="https:"?"wss:":"ws:",s.searchParams.set("access_token",this.token),s.toString()}handleRealtimeMessage(e){if(typeof e!="string")return;let t;try{t=JSON.parse(e)}catch{return}for(const s of this.realtimeMessageListeners)s(t);const i=this.realtimeEventListeners.get(t.event);if(i)for(const s of i)s(t)}scheduleRealtimeReconnect(e){this.clearRealtimeReconnectTimer(),this.realtimeReconnectTimer=setTimeout(()=>{this.realtimeReconnectTimer=null,!(!this.realtimeEnabled||!this.token)&&(this.setRealtimeStatus("connecting",`${e}:reconnect`),this.connectRealtime().catch(()=>{}))},this.realtimeReconnectDelayMs)}clearRealtimeReconnectTimer(){this.realtimeReconnectTimer!==null&&(clearTimeout(this.realtimeReconnectTimer),this.realtimeReconnectTimer=null)}setRealtimeStatus(e,t,i){const s=this.realtimeStatus;if(!(s===e&&typeof t>"u"&&typeof i>"u")){this.realtimeStatus=e;for(const r of this.realtimeStatusListeners)r({status:e,previousStatus:s,...t?{reason:t}:{},...i?{error:i}:{}})}}applyCsrfHealth(){if(!(typeof document>"u")){for(const e of document.cookie.split(";")){const t=e.indexOf("=");if(!(t<0)&&e.substring(0,t).trim()===this.csrfCookieName){this.csrfEnabled=!!e.substring(t+1).trim();return}}this.csrfEnabled=!1}}readRequestBody(e,t="application/json",i=!1){const s=u(this.hmacSecret,this.token||this.anonymousPacketToken);return f(e,t,i,s)}get reqOpts(){return{baseUrl:this.baseUrl,token:this.token,anonymousPacketToken:this.anonymousPacketToken,apiKey:this.apiKey,hmacSecret:this.hmacSecret,encryptRequests:this.encryptRequests,csrfEnabled:this.csrfEnabled,csrfHeaderName:this.csrfHeaderName,csrfCookieName:this.csrfCookieName,refreshCsrfCookie:this.csrfEnabled?this.csrfRefresher:null,requestAbortControllers:this.requestAbortControllers,onAccessToken:e=>{this.setAccessTokenFromResponse(e)}}}prepareRequest(e){return Promise.resolve()}get http(){const e=this;return{get(t,i=!0,s,r){return e.prepareRequest(i).then(()=>l(e.reqOpts,"GET",t,void 0,i,s,r??!0))},post(t,i,s=!0,r,n){return e.prepareRequest(s).then(()=>l(e.reqOpts,"POST",t,i,s,r,n??!0))},put(t,i,s=!0,r,n){return e.prepareRequest(s).then(()=>l(e.reqOpts,"PUT",t,i,s,r,n??!0))},patch(t,i,s=!0,r,n){return e.prepareRequest(s).then(()=>l(e.reqOpts,"PATCH",t,i,s,r,n??!0))},delete(t,i,s=!0,r,n){return e.prepareRequest(s).then(()=>l(e.reqOpts,"DELETE",t,i,s,r,n??!0))}}}request(e,t,i,s=!0,r,n){return this.prepareRequest(s).then(()=>l(this.reqOpts,e,t,i,s,r,n??!0))}async requestBinary(e,t,i,s=!0){await this.prepareRequest(s);const r={"Content-Type":"application/json"};s&&this.token&&(r.Authorization=`Bearer ${this.token}`),this.apiKey&&(r["X-API-Key"]=this.apiKey);const n=await fetch(this.baseUrl+t,{method:e,headers:r,...i!=null?{body:JSON.stringify(i)}:{},credentials:"include"});if(!n.ok){const a=await n.text(),o=new Error(`HTTP ${n.status}: ${a}`);throw o.status=n.status,o}return n.arrayBuffer()}async requestForm(e,t,i,s=!0){const r={};s&&this.token&&(r.Authorization=`Bearer ${this.token}`),this.apiKey&&(r["X-API-Key"]=this.apiKey);const n=await fetch(this.baseUrl+t,{method:e,headers:r,body:i,credentials:"include"}),a=await n.json();if(!a.ok){const o=new Error(a.message??`EntityServer error (HTTP ${n.status})`);throw o.status=n.status,o}return a}async requestFormBinary(e,t,i,s=!0){const r={};s&&this.token&&(r.Authorization=`Bearer ${this.token}`),this.apiKey&&(r["X-API-Key"]=this.apiKey);const n=await fetch(this.baseUrl+t,{method:e,headers:r,body:i,credentials:"include"});if(!n.ok){const a=await n.text(),o=new Error(`HTTP ${n.status}: ${a}`);throw o.status=n.status,o}return n.arrayBuffer()}}export{y as EntityServerClientBase};
2
2
  //# sourceMappingURL=base.js.map