entity-client 1.0.20 → 1.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/EntityAppServerApi.d.ts +16 -0
- package/dist/EntityServerApi.d.ts +8 -0
- package/dist/client/base.d.ts +2 -0
- package/dist/client/base.js +1 -1
- package/dist/client/base.js.map +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +3 -3
- package/dist/mixins/app/plugins/alimtalk.d.ts +1 -0
- package/dist/mixins/app/plugins/friendtalk.d.ts +1 -0
- package/dist/mixins/app/plugins/holidays.d.ts +1 -0
- package/dist/mixins/app/plugins/identity.d.ts +1 -0
- package/dist/mixins/app/plugins/llm.d.ts +1 -0
- package/dist/mixins/app/plugins/ocr.d.ts +1 -0
- package/dist/mixins/app/plugins/pg.d.ts +1 -0
- package/dist/mixins/app/plugins/push.d.ts +1 -0
- package/dist/mixins/app/plugins/sms.d.ts +1 -0
- package/dist/mixins/app/plugins/taxinvoice.d.ts +1 -0
- package/dist/mixins/app/routes/account.d.ts +1 -0
- package/dist/mixins/app/routes/board.d.ts +1 -0
- package/dist/mixins/app/routes/email-verify.d.ts +1 -0
- package/dist/mixins/app/routes/oauth.d.ts +1 -0
- package/dist/mixins/app/routes/password-reset.d.ts +1 -0
- package/dist/mixins/app/routes/two-factor.d.ts +1 -0
- package/dist/mixins/server/admin.d.ts +1 -0
- package/dist/mixins/server/auth.d.ts +2 -0
- package/dist/mixins/server/auth.js +1 -1
- package/dist/mixins/server/auth.js.map +3 -3
- package/dist/mixins/server/entity.d.ts +1 -0
- package/dist/mixins/server/file.d.ts +1 -0
- package/dist/mixins/server/push.d.ts +1 -0
- package/dist/mixins/server/smtp.d.ts +1 -0
- package/dist/mixins/server/transaction.d.ts +1 -0
- package/dist/mixins/server/utils.d.ts +1 -0
- package/dist/react.js +1 -1
- package/dist/react.js.map +3 -3
- package/package.json +1 -1
|
@@ -40,6 +40,7 @@ declare const EntityAppServerApi_base: {
|
|
|
40
40
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
41
41
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
42
42
|
setToken(token: string): void;
|
|
43
|
+
setAccessTokenFromResponse(token: string): void;
|
|
43
44
|
setAnonymousPacketToken(token: string): void;
|
|
44
45
|
setApiKey(apiKey: string): void;
|
|
45
46
|
setHmacSecret(secret: string): void;
|
|
@@ -124,6 +125,7 @@ declare const EntityAppServerApi_base: {
|
|
|
124
125
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
125
126
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
126
127
|
setToken(token: string): void;
|
|
128
|
+
setAccessTokenFromResponse(token: string): void;
|
|
127
129
|
setAnonymousPacketToken(token: string): void;
|
|
128
130
|
setApiKey(apiKey: string): void;
|
|
129
131
|
setHmacSecret(secret: string): void;
|
|
@@ -211,6 +213,7 @@ declare const EntityAppServerApi_base: {
|
|
|
211
213
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
212
214
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
213
215
|
setToken(token: string): void;
|
|
216
|
+
setAccessTokenFromResponse(token: string): void;
|
|
214
217
|
setAnonymousPacketToken(token: string): void;
|
|
215
218
|
setApiKey(apiKey: string): void;
|
|
216
219
|
setHmacSecret(secret: string): void;
|
|
@@ -299,6 +302,7 @@ declare const EntityAppServerApi_base: {
|
|
|
299
302
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
300
303
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
301
304
|
setToken(token: string): void;
|
|
305
|
+
setAccessTokenFromResponse(token: string): void;
|
|
302
306
|
setAnonymousPacketToken(token: string): void;
|
|
303
307
|
setApiKey(apiKey: string): void;
|
|
304
308
|
setHmacSecret(secret: string): void;
|
|
@@ -389,6 +393,7 @@ declare const EntityAppServerApi_base: {
|
|
|
389
393
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
390
394
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
391
395
|
setToken(token: string): void;
|
|
396
|
+
setAccessTokenFromResponse(token: string): void;
|
|
392
397
|
setAnonymousPacketToken(token: string): void;
|
|
393
398
|
setApiKey(apiKey: string): void;
|
|
394
399
|
setHmacSecret(secret: string): void;
|
|
@@ -478,6 +483,7 @@ declare const EntityAppServerApi_base: {
|
|
|
478
483
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
479
484
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
480
485
|
setToken(token: string): void;
|
|
486
|
+
setAccessTokenFromResponse(token: string): void;
|
|
481
487
|
setAnonymousPacketToken(token: string): void;
|
|
482
488
|
setApiKey(apiKey: string): void;
|
|
483
489
|
setHmacSecret(secret: string): void;
|
|
@@ -569,6 +575,7 @@ declare const EntityAppServerApi_base: {
|
|
|
569
575
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
570
576
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
571
577
|
setToken(token: string): void;
|
|
578
|
+
setAccessTokenFromResponse(token: string): void;
|
|
572
579
|
setAnonymousPacketToken(token: string): void;
|
|
573
580
|
setApiKey(apiKey: string): void;
|
|
574
581
|
setHmacSecret(secret: string): void;
|
|
@@ -687,6 +694,7 @@ declare const EntityAppServerApi_base: {
|
|
|
687
694
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
688
695
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
689
696
|
setToken(token: string): void;
|
|
697
|
+
setAccessTokenFromResponse(token: string): void;
|
|
690
698
|
setAnonymousPacketToken(token: string): void;
|
|
691
699
|
setApiKey(apiKey: string): void;
|
|
692
700
|
setHmacSecret(secret: string): void;
|
|
@@ -774,6 +782,7 @@ declare const EntityAppServerApi_base: {
|
|
|
774
782
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
775
783
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
776
784
|
setToken(token: string): void;
|
|
785
|
+
setAccessTokenFromResponse(token: string): void;
|
|
777
786
|
setAnonymousPacketToken(token: string): void;
|
|
778
787
|
setApiKey(apiKey: string): void;
|
|
779
788
|
setHmacSecret(secret: string): void;
|
|
@@ -864,6 +873,7 @@ declare const EntityAppServerApi_base: {
|
|
|
864
873
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
865
874
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
866
875
|
setToken(token: string): void;
|
|
876
|
+
setAccessTokenFromResponse(token: string): void;
|
|
867
877
|
setAnonymousPacketToken(token: string): void;
|
|
868
878
|
setApiKey(apiKey: string): void;
|
|
869
879
|
setHmacSecret(secret: string): void;
|
|
@@ -953,6 +963,7 @@ declare const EntityAppServerApi_base: {
|
|
|
953
963
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
954
964
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
955
965
|
setToken(token: string): void;
|
|
966
|
+
setAccessTokenFromResponse(token: string): void;
|
|
956
967
|
setAnonymousPacketToken(token: string): void;
|
|
957
968
|
setApiKey(apiKey: string): void;
|
|
958
969
|
setHmacSecret(secret: string): void;
|
|
@@ -1043,6 +1054,7 @@ declare const EntityAppServerApi_base: {
|
|
|
1043
1054
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
1044
1055
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
1045
1056
|
setToken(token: string): void;
|
|
1057
|
+
setAccessTokenFromResponse(token: string): void;
|
|
1046
1058
|
setAnonymousPacketToken(token: string): void;
|
|
1047
1059
|
setApiKey(apiKey: string): void;
|
|
1048
1060
|
setHmacSecret(secret: string): void;
|
|
@@ -1131,6 +1143,7 @@ declare const EntityAppServerApi_base: {
|
|
|
1131
1143
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
1132
1144
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
1133
1145
|
setToken(token: string): void;
|
|
1146
|
+
setAccessTokenFromResponse(token: string): void;
|
|
1134
1147
|
setAnonymousPacketToken(token: string): void;
|
|
1135
1148
|
setApiKey(apiKey: string): void;
|
|
1136
1149
|
setHmacSecret(secret: string): void;
|
|
@@ -1219,6 +1232,7 @@ declare const EntityAppServerApi_base: {
|
|
|
1219
1232
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
1220
1233
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
1221
1234
|
setToken(token: string): void;
|
|
1235
|
+
setAccessTokenFromResponse(token: string): void;
|
|
1222
1236
|
setAnonymousPacketToken(token: string): void;
|
|
1223
1237
|
setApiKey(apiKey: string): void;
|
|
1224
1238
|
setHmacSecret(secret: string): void;
|
|
@@ -1335,6 +1349,7 @@ declare const EntityAppServerApi_base: {
|
|
|
1335
1349
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
1336
1350
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
1337
1351
|
setToken(token: string): void;
|
|
1352
|
+
setAccessTokenFromResponse(token: string): void;
|
|
1338
1353
|
setAnonymousPacketToken(token: string): void;
|
|
1339
1354
|
setApiKey(apiKey: string): void;
|
|
1340
1355
|
setHmacSecret(secret: string): void;
|
|
@@ -1428,6 +1443,7 @@ declare const EntityAppServerApi_base: {
|
|
|
1428
1443
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
1429
1444
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
1430
1445
|
setToken(token: string): void;
|
|
1446
|
+
setAccessTokenFromResponse(token: string): void;
|
|
1431
1447
|
setAnonymousPacketToken(token: string): void;
|
|
1432
1448
|
setApiKey(apiKey: string): void;
|
|
1433
1449
|
setHmacSecret(secret: string): void;
|
|
@@ -71,6 +71,7 @@ declare const EntityServerApi_base: {
|
|
|
71
71
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
72
72
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
73
73
|
setToken(token: string): void;
|
|
74
|
+
setAccessTokenFromResponse(token: string): void;
|
|
74
75
|
setAnonymousPacketToken(token: string): void;
|
|
75
76
|
setApiKey(apiKey: string): void;
|
|
76
77
|
setHmacSecret(secret: string): void;
|
|
@@ -157,6 +158,7 @@ declare const EntityServerApi_base: {
|
|
|
157
158
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
158
159
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
159
160
|
setToken(token: string): void;
|
|
161
|
+
setAccessTokenFromResponse(token: string): void;
|
|
160
162
|
setAnonymousPacketToken(token: string): void;
|
|
161
163
|
setApiKey(apiKey: string): void;
|
|
162
164
|
setHmacSecret(secret: string): void;
|
|
@@ -305,6 +307,7 @@ declare const EntityServerApi_base: {
|
|
|
305
307
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
306
308
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
307
309
|
setToken(token: string): void;
|
|
310
|
+
setAccessTokenFromResponse(token: string): void;
|
|
308
311
|
setAnonymousPacketToken(token: string): void;
|
|
309
312
|
setApiKey(apiKey: string): void;
|
|
310
313
|
setHmacSecret(secret: string): void;
|
|
@@ -397,6 +400,7 @@ declare const EntityServerApi_base: {
|
|
|
397
400
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
398
401
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
399
402
|
setToken(token: string): void;
|
|
403
|
+
setAccessTokenFromResponse(token: string): void;
|
|
400
404
|
setAnonymousPacketToken(token: string): void;
|
|
401
405
|
setApiKey(apiKey: string): void;
|
|
402
406
|
setHmacSecret(secret: string): void;
|
|
@@ -507,6 +511,7 @@ declare const EntityServerApi_base: {
|
|
|
507
511
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
508
512
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
509
513
|
setToken(token: string): void;
|
|
514
|
+
setAccessTokenFromResponse(token: string): void;
|
|
510
515
|
setAnonymousPacketToken(token: string): void;
|
|
511
516
|
setApiKey(apiKey: string): void;
|
|
512
517
|
setHmacSecret(secret: string): void;
|
|
@@ -652,6 +657,7 @@ declare const EntityServerApi_base: {
|
|
|
652
657
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
653
658
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
654
659
|
setToken(token: string): void;
|
|
660
|
+
setAccessTokenFromResponse(token: string): void;
|
|
655
661
|
setAnonymousPacketToken(token: string): void;
|
|
656
662
|
setApiKey(apiKey: string): void;
|
|
657
663
|
setHmacSecret(secret: string): void;
|
|
@@ -801,6 +807,7 @@ declare const EntityServerApi_base: {
|
|
|
801
807
|
realtimeEventListeners: Map<string, Set<import("./types.js").RealtimeMessageListener>>;
|
|
802
808
|
configure(options: Partial<import("./types.js").EntityServerClientOptions>): void;
|
|
803
809
|
setToken(token: string): void;
|
|
810
|
+
setAccessTokenFromResponse(token: string): void;
|
|
804
811
|
setAnonymousPacketToken(token: string): void;
|
|
805
812
|
setApiKey(apiKey: string): void;
|
|
806
813
|
setHmacSecret(secret: string): void;
|
|
@@ -852,6 +859,7 @@ declare const EntityServerApi_base: {
|
|
|
852
859
|
authBootstrapPromise: Promise<void> | null;
|
|
853
860
|
authBootstrapToken: string;
|
|
854
861
|
authBootstrapAnonymousCompleted: boolean;
|
|
862
|
+
setAccessTokenFromResponse(token: string): void;
|
|
855
863
|
csrfRefresher: () => Promise<void>;
|
|
856
864
|
checkHealth(bootstrapAuth?: boolean): Promise<{
|
|
857
865
|
status: string;
|
package/dist/client/base.d.ts
CHANGED
|
@@ -47,6 +47,8 @@ export declare class EntityServerClientBase {
|
|
|
47
47
|
configure(options: Partial<EntityServerClientOptions>): void;
|
|
48
48
|
/** 인증 요청에 사용할 JWT Access Token을 설정합니다. */
|
|
49
49
|
setToken(token: string): void;
|
|
50
|
+
/** 응답 헤더로 받은 access token 갱신을 반영한다. */
|
|
51
|
+
setAccessTokenFromResponse(token: string): void;
|
|
50
52
|
/** 익명 패킷 암호화용 토큰을 설정합니다. */
|
|
51
53
|
setAnonymousPacketToken(token: string): void;
|
|
52
54
|
/** HMAC 인증용 API Key를 설정합니다. */
|
package/dist/client/base.js
CHANGED
|
@@ -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(()=>{})}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.token=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;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};
|
|
2
2
|
//# sourceMappingURL=base.js.map
|
package/dist/client/base.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/client/base.ts"],
|
|
4
|
-
"sourcesContent": ["import type {\r\n EntityServerClientOptions,\r\n RealtimeClientOptions,\r\n RealtimeConnectionStatus,\r\n RealtimeEnvelope,\r\n RealtimeMessageListener,\r\n RealtimeStatusListener,\r\n} from \"../types.js\";\r\nimport { readEnv } from \"./utils.js\";\r\nimport { derivePacketKey, parseRequestBody } from \"./packet.js\";\r\nimport {\r\n entityRequest,\r\n type EntityRequestConfig,\r\n type RequestOptions,\r\n} from \"./request.js\";\r\n\r\nconst REALTIME_DEFAULT_PATH = \"/v1/realtime\";\r\n\r\n// mixin \uD5EC\uD37C \uD0C0\uC785\r\nexport type GConstructor<T = object> = new (...args: any[]) => T;\r\n\r\nexport class EntityServerClientBase {\r\n baseUrl: string;\r\n token: string;\r\n anonymousPacketToken: string;\r\n apiKey: string;\r\n hmacSecret: string;\r\n encryptRequests: boolean;\r\n csrfEnabled: boolean;\r\n csrfHeaderName: string;\r\n csrfCookieName: string;\r\n /** @internal health \uC7AC\uD638\uCD9C\uB85C CSRF \uCFE0\uD0A4 \uAC31\uC2E0 (AuthMixin\uC5D0\uC11C \uC124\uC815) */\r\n csrfRefresher: (() => Promise<void>) | null = null;\r\n activeTxId: string | null = null;\r\n\r\n // \uC138\uC158 \uC720\uC9C0 \uAD00\uB828\r\n keepSession: boolean;\r\n refreshBuffer: number;\r\n onTokenRefreshed?: (accessToken: string, expiresIn: number) => void;\r\n onSessionExpired?: (error: Error) => void;\r\n onHealthChange?: (online: boolean) => void;\r\n sessionRefreshToken: string | null = null;\r\n refreshTimer: ReturnType<typeof setTimeout> | null = null;\r\n healthTickTimer: ReturnType<typeof setInterval> | null = null;\r\n healthTickPromise: Promise<unknown> | null = null;\r\n realtimeEnabled: boolean;\r\n realtimePath: string;\r\n realtimeAutoConnect: boolean;\r\n realtimeAutoReconnect: boolean;\r\n realtimeReconnectDelayMs: number;\r\n realtimeStatus: RealtimeConnectionStatus;\r\n realtimeSocket: WebSocket | null = null;\r\n realtimeConnectPromise: Promise<void> | null = null;\r\n realtimeReconnectTimer: ReturnType<typeof setTimeout> | null = null;\r\n realtimeShouldReconnect = false;\r\n realtimeMessageListeners = new Set<RealtimeMessageListener>();\r\n realtimeStatusListeners = new Set<RealtimeStatusListener>();\r\n realtimeEventListeners = new Map<string, Set<RealtimeMessageListener>>();\r\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\r\n\r\n /**\r\n * EntityServerClient \uC778\uC2A4\uD134\uC2A4\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4.\r\n *\r\n * \uAE30\uBCF8\uAC12:\r\n * - `baseUrl`: `VITE_ENTITY_SERVER_URL` \uB610\uB294 \uC0C1\uB300 \uACBD\uB85C(`\"\"`)\r\n */\r\n constructor(options: EntityServerClientOptions = {}) {\r\n const envBaseUrl = readEnv(\"VITE_ENTITY_SERVER_URL\");\r\n\r\n this.baseUrl = (options.baseUrl ?? envBaseUrl ?? \"\").replace(/\\/$/, \"\");\r\n this.token = options.token ?? \"\";\r\n this.anonymousPacketToken = options.anonymousPacketToken ?? \"\";\r\n this.apiKey = options.apiKey ?? \"\";\r\n this.hmacSecret = options.hmacSecret ?? \"\";\r\n this.encryptRequests = options.encryptRequests ?? false;\r\n this.csrfEnabled = options.csrfEnabled ?? false;\r\n this.csrfHeaderName = options.csrfHeaderName ?? \"x-csrf-token\";\r\n this.csrfCookieName = options.csrfCookieName ?? \"_csrf\";\r\n this.keepSession = options.keepSession ?? false;\r\n this.refreshBuffer = options.refreshBuffer ?? 60;\r\n this.onTokenRefreshed = options.onTokenRefreshed;\r\n this.onSessionExpired = options.onSessionExpired;\r\n this.onHealthChange = options.onHealthChange;\r\n this.realtimeEnabled = false;\r\n this.realtimePath = REALTIME_DEFAULT_PATH;\r\n this.realtimeAutoConnect = true;\r\n this.realtimeAutoReconnect = true;\r\n this.realtimeReconnectDelayMs = 3000;\r\n this.realtimeStatus = \"idle\";\r\n this.applyRealtimeOptions(options.realtime);\r\n if (\r\n typeof options.healthTickInterval === \"number\" &&\r\n options.healthTickInterval > 0\r\n ) {\r\n // csrfRefresher\uB294 AuthMixin\uC5D0\uC11C \uC124\uC815\uB418\uBBC0\uB85C \uB2E4\uC74C tick\uC5D0 \uC2DC\uC791\r\n Promise.resolve().then(() =>\r\n this.startHealthTick(options.healthTickInterval, false),\r\n );\r\n }\r\n }\r\n\r\n /** baseUrl, token, encryptRequests \uAC12\uC744 \uB7F0\uD0C0\uC784\uC5D0 \uAC31\uC2E0\uD569\uB2C8\uB2E4. */\r\n configure(options: Partial<EntityServerClientOptions>): void {\r\n if (typeof options.baseUrl === \"string\") {\r\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\r\n }\r\n if (typeof options.token === \"string\") this.token = options.token;\r\n if (typeof options.anonymousPacketToken === \"string\") {\r\n this.anonymousPacketToken = options.anonymousPacketToken;\r\n }\r\n if (typeof options.encryptRequests === \"boolean\")\r\n this.encryptRequests = options.encryptRequests;\r\n if (typeof options.csrfEnabled === \"boolean\") {\r\n this.csrfEnabled = options.csrfEnabled;\r\n }\r\n if (typeof options.csrfHeaderName === \"string\") {\r\n this.csrfHeaderName = options.csrfHeaderName;\r\n }\r\n if (typeof options.csrfCookieName === \"string\") {\r\n this.csrfCookieName = options.csrfCookieName;\r\n }\r\n if (typeof options.apiKey === \"string\") this.apiKey = options.apiKey;\r\n if (typeof options.hmacSecret === \"string\")\r\n this.hmacSecret = options.hmacSecret;\r\n if (typeof options.keepSession === \"boolean\")\r\n this.keepSession = options.keepSession;\r\n if (typeof options.refreshBuffer === \"number\")\r\n this.refreshBuffer = options.refreshBuffer;\r\n if (options.onTokenRefreshed)\r\n this.onTokenRefreshed = options.onTokenRefreshed;\r\n if (options.onSessionExpired)\r\n this.onSessionExpired = options.onSessionExpired;\r\n if (options.onHealthChange)\r\n this.onHealthChange = options.onHealthChange;\r\n if (typeof options.realtime !== \"undefined\") {\r\n this.applyRealtimeOptions(options.realtime);\r\n }\r\n if (\r\n typeof options.healthTickInterval === \"number\" &&\r\n options.healthTickInterval > 0\r\n ) {\r\n Promise.resolve().then(() =>\r\n this.startHealthTick(options.healthTickInterval, false),\r\n );\r\n }\r\n }\r\n\r\n /** \uC778\uC99D \uC694\uCCAD\uC5D0 \uC0AC\uC6A9\uD560 JWT Access Token\uC744 \uC124\uC815\uD569\uB2C8\uB2E4. */\r\n setToken(token: string): void {\r\n this.token = token;\r\n if (!token) {\r\n this.disconnectRealtime(\"token_cleared\");\r\n return;\r\n }\r\n if (this.realtimeEnabled && this.realtimeAutoConnect) {\r\n void this.connectRealtime().catch(() => {});\r\n }\r\n }\r\n\r\n /** \uC775\uBA85 \uD328\uD0B7 \uC554\uD638\uD654\uC6A9 \uD1A0\uD070\uC744 \uC124\uC815\uD569\uB2C8\uB2E4. */\r\n setAnonymousPacketToken(token: string): void {\r\n this.anonymousPacketToken = token;\r\n }\r\n\r\n /** HMAC \uC778\uC99D\uC6A9 API Key\uB97C \uC124\uC815\uD569\uB2C8\uB2E4. */\r\n setApiKey(apiKey: string): void {\r\n this.apiKey = apiKey;\r\n }\r\n\r\n /** HMAC \uC778\uC99D\uC6A9 \uC2DC\uD06C\uB9BF\uC744 \uC124\uC815\uD569\uB2C8\uB2E4. */\r\n setHmacSecret(secret: string): void {\r\n this.hmacSecret = secret;\r\n }\r\n\r\n /** \uC554\uD638\uD654 \uC694\uCCAD \uD65C\uC131\uD654 \uC5EC\uBD80\uB97C \uC124\uC815\uD569\uB2C8\uB2E4. */\r\n setEncryptRequests(value: boolean): void {\r\n this.encryptRequests = value;\r\n }\r\n\r\n setCsrfEnabled(enabled: boolean): void {\r\n this.csrfEnabled = enabled;\r\n }\r\n\r\n addRealtimeListener(listener: RealtimeMessageListener): void {\r\n this.realtimeMessageListeners.add(listener);\r\n }\r\n\r\n removeRealtimeListener(listener: RealtimeMessageListener): void {\r\n this.realtimeMessageListeners.delete(listener);\r\n }\r\n\r\n addRealtimeStatusListener(listener: RealtimeStatusListener): void {\r\n this.realtimeStatusListeners.add(listener);\r\n }\r\n\r\n removeRealtimeStatusListener(listener: RealtimeStatusListener): void {\r\n this.realtimeStatusListeners.delete(listener);\r\n }\r\n\r\n addRealtimeEventListener(\r\n eventName: string,\r\n listener: RealtimeMessageListener,\r\n ): void {\r\n const key = String(eventName).trim();\r\n if (!key) {\r\n return;\r\n }\r\n if (!this.realtimeEventListeners.has(key)) {\r\n this.realtimeEventListeners.set(key, new Set());\r\n }\r\n this.realtimeEventListeners.get(key)!.add(listener);\r\n }\r\n\r\n removeRealtimeEventListener(\r\n eventName: string,\r\n listener: RealtimeMessageListener,\r\n ): void {\r\n const key = String(eventName).trim();\r\n if (!key) {\r\n return;\r\n }\r\n const listeners = this.realtimeEventListeners.get(key);\r\n if (!listeners) {\r\n return;\r\n }\r\n listeners.delete(listener);\r\n if (listeners.size === 0) {\r\n this.realtimeEventListeners.delete(key);\r\n }\r\n }\r\n\r\n async connectRealtime(): Promise<void> {\r\n if (!this.realtimeEnabled) {\r\n this.setRealtimeStatus(\"disabled\", \"realtime_disabled\");\r\n return;\r\n }\r\n\r\n if (!this.token) {\r\n throw new Error(\r\n \"Cannot open realtime connection without access token.\",\r\n );\r\n }\r\n\r\n if (typeof WebSocket === \"undefined\") {\r\n throw new Error(\"WebSocket is not available in this environment.\");\r\n }\r\n\r\n if (\r\n this.realtimeSocket &&\r\n this.realtimeSocket.readyState === WebSocket.OPEN\r\n ) {\r\n return;\r\n }\r\n\r\n if (\r\n this.realtimeSocket &&\r\n this.realtimeSocket.readyState === WebSocket.CONNECTING &&\r\n this.realtimeConnectPromise\r\n ) {\r\n return this.realtimeConnectPromise;\r\n }\r\n\r\n this.clearRealtimeReconnectTimer();\r\n this.realtimeShouldReconnect = this.realtimeAutoReconnect;\r\n this.setRealtimeStatus(\"connecting\", \"connect_requested\");\r\n\r\n const socket = new WebSocket(this.buildRealtimeUrl());\r\n this.realtimeSocket = socket;\r\n\r\n this.realtimeConnectPromise = new Promise<void>((resolve, reject) => {\r\n let settled = false;\r\n\r\n const finalizeResolve = () => {\r\n if (settled) {\r\n return;\r\n }\r\n settled = true;\r\n this.realtimeConnectPromise = null;\r\n resolve();\r\n };\r\n\r\n const finalizeReject = (error: Error) => {\r\n if (settled) {\r\n return;\r\n }\r\n settled = true;\r\n this.realtimeConnectPromise = null;\r\n reject(error);\r\n };\r\n\r\n socket.addEventListener(\"open\", () => {\r\n this.setRealtimeStatus(\"open\", \"socket_open\");\r\n finalizeResolve();\r\n });\r\n\r\n socket.addEventListener(\"message\", (event) => {\r\n this.handleRealtimeMessage(event.data);\r\n });\r\n\r\n socket.addEventListener(\"error\", () => {\r\n this.setRealtimeStatus(\r\n \"closed\",\r\n \"socket_error\",\r\n new Error(\"Realtime socket error.\"),\r\n );\r\n });\r\n\r\n socket.addEventListener(\"close\", (event) => {\r\n if (this.realtimeSocket === socket) {\r\n this.realtimeSocket = null;\r\n }\r\n\r\n const reason = event.reason || \"socket_closed\";\r\n const error = new Error(\r\n `Realtime socket closed (${event.code}${event.reason ? `: ${event.reason}` : \"\"}).`,\r\n );\r\n\r\n this.setRealtimeStatus(\"closed\", reason, error);\r\n if (!settled) {\r\n finalizeReject(error);\r\n }\r\n\r\n if (\r\n this.realtimeShouldReconnect &&\r\n this.realtimeEnabled &&\r\n this.realtimeAutoReconnect &&\r\n this.token\r\n ) {\r\n this.scheduleRealtimeReconnect(reason);\r\n }\r\n });\r\n });\r\n\r\n return this.realtimeConnectPromise;\r\n }\r\n\r\n disconnectRealtime(reason = \"client_disconnect\"): void {\r\n this.realtimeShouldReconnect = false;\r\n this.clearRealtimeReconnectTimer();\r\n\r\n if (this.realtimeSocket) {\r\n const socket = this.realtimeSocket;\r\n this.realtimeSocket = null;\r\n try {\r\n if (\r\n socket.readyState === WebSocket.OPEN ||\r\n socket.readyState === WebSocket.CONNECTING\r\n ) {\r\n socket.close(1000, reason);\r\n }\r\n } catch {\r\n // ignore close errors\r\n }\r\n }\r\n\r\n this.realtimeConnectPromise = null;\r\n this.setRealtimeStatus(\r\n this.realtimeEnabled ? \"idle\" : \"disabled\",\r\n reason,\r\n );\r\n }\r\n\r\n sendRealtime(message: RealtimeEnvelope | Record<string, unknown>): boolean {\r\n if (\r\n !this.realtimeSocket ||\r\n this.realtimeSocket.readyState !== WebSocket.OPEN\r\n ) {\r\n return false;\r\n }\r\n\r\n this.realtimeSocket.send(JSON.stringify(message));\r\n return true;\r\n }\r\n\r\n subscribeRealtime(subscriptions: string[]): boolean {\r\n return this.sendRealtime({\r\n type: \"subscribe\",\r\n channel: \"session\",\r\n event: \"session.subscribe\",\r\n data: { subscriptions },\r\n });\r\n }\r\n\r\n unsubscribeRealtime(subscriptions: string[]): boolean {\r\n return this.sendRealtime({\r\n type: \"unsubscribe\",\r\n channel: \"session\",\r\n event: \"session.unsubscribe\",\r\n data: { subscriptions },\r\n });\r\n }\r\n\r\n /**\r\n * \uC8FC\uAE30\uC801\uC73C\uB85C health \uCCB4\uD06C\uB97C \uC2E4\uD589\uD569\uB2C8\uB2E4.\r\n * CSRF \uCFE0\uD0A4 \uAC31\uC2E0\uACFC \uC11C\uBC84 \uC0C1\uD0DC \uD655\uC778\uC744 \uC790\uB3D9\uD654\uD569\uB2C8\uB2E4.\r\n * keepSession=true \uC774\uBA74 \uAC01 tick\uC5D0\uC11C \uC138\uC158 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uB3C4 \uD568\uAED8 \uC2DC\uB3C4\uD569\uB2C8\uB2E4.\r\n *\r\n * @param intervalMs \uD638\uCD9C \uC8FC\uAE30(ms). \uAE30\uBCF8\uAC12: 5\uBD84\r\n * @param runImmediately true\uBA74 \uC2DC\uC791 \uC9C1\uD6C4 \uCCAB tick\uC744 \uC989\uC2DC \uC2E4\uD589\uD569\uB2C8\uB2E4.\r\n */\r\n startHealthTick(\r\n intervalMs: number = 5 * 60 * 1000,\r\n runImmediately = true,\r\n ): void {\r\n this.stopHealthTick();\r\n const tick = (): void => {\r\n if (this.healthTickPromise) return;\r\n this.healthTickPromise = (\r\n this.csrfRefresher ? this.csrfRefresher() : Promise.resolve()\r\n )\r\n .then(() => {\r\n this.onHealthChange?.(true);\r\n })\r\n .catch(() => {\r\n this.onHealthChange?.(false);\r\n })\r\n .finally(() => {\r\n this.healthTickPromise = null;\r\n });\r\n };\r\n if (runImmediately) {\r\n tick();\r\n }\r\n this.healthTickTimer = setInterval(tick, intervalMs);\r\n }\r\n\r\n /** health tick \uD0C0\uC774\uBA38\uB97C \uC911\uC9C0\uD569\uB2C8\uB2E4. */\r\n stopHealthTick(): void {\r\n if (this.healthTickTimer !== null) {\r\n clearInterval(this.healthTickTimer);\r\n this.healthTickTimer = null;\r\n }\r\n this.healthTickPromise = null;\r\n }\r\n\r\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\r\n\r\n /** @deprecated \uC138\uC158 \uC5F0\uC7A5\uC740 health tick \uAE30\uBC18 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uC73C\uB85C \uB300\uCCB4\uB418\uC5C8\uC2B5\uB2C8\uB2E4. */\r\n scheduleKeepSession(\r\n refreshToken: string,\r\n expiresIn: number,\r\n refreshFn: (\r\n rt: string,\r\n ) => Promise<{ access_token: string; expires_in: number }>,\r\n ): void {\r\n this.clearRefreshTimer();\r\n this.sessionRefreshToken = refreshToken;\r\n const delayMs = Math.max((expiresIn - this.refreshBuffer) * 1000, 0);\r\n this.refreshTimer = setTimeout(async () => {\r\n if (!this.sessionRefreshToken) return;\r\n try {\r\n const result = await refreshFn(this.sessionRefreshToken);\r\n this.onTokenRefreshed?.(result.access_token, result.expires_in);\r\n this.scheduleKeepSession(\r\n this.sessionRefreshToken,\r\n result.expires_in,\r\n refreshFn,\r\n );\r\n } catch (err) {\r\n this.clearRefreshTimer();\r\n this.onSessionExpired?.(\r\n err instanceof Error ? err : new Error(String(err)),\r\n );\r\n }\r\n }, delayMs);\r\n }\r\n\r\n /** @deprecated \uC138\uC158 \uC5F0\uC7A5\uC740 health tick \uAE30\uBC18 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uC73C\uB85C \uB300\uCCB4\uB418\uC5C8\uC2B5\uB2C8\uB2E4. */\r\n clearRefreshTimer(): void {\r\n if (this.refreshTimer !== null) {\r\n clearTimeout(this.refreshTimer);\r\n this.refreshTimer = null;\r\n }\r\n }\r\n\r\n /**\r\n * \uC138\uC158 \uC790\uB3D9 \uC5F0\uC7A5\uC744 \uC911\uC9C0\uD569\uB2C8\uB2E4.\r\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.\r\n */\r\n stopKeepSession(): void {\r\n this.clearRefreshTimer();\r\n this.sessionRefreshToken = null;\r\n }\r\n\r\n applyRealtimeOptions(options?: boolean | RealtimeClientOptions): void {\r\n const normalized: RealtimeClientOptions =\r\n typeof options === \"boolean\"\r\n ? { enabled: options }\r\n : (options ?? {});\r\n\r\n this.realtimeEnabled = normalized.enabled ?? false;\r\n this.realtimePath =\r\n String(normalized.path ?? REALTIME_DEFAULT_PATH).trim() ||\r\n REALTIME_DEFAULT_PATH;\r\n this.realtimeAutoConnect = normalized.autoConnect ?? true;\r\n this.realtimeAutoReconnect = normalized.autoReconnect ?? true;\r\n this.realtimeReconnectDelayMs = Math.max(\r\n 250,\r\n normalized.reconnectDelayMs ?? 3000,\r\n );\r\n\r\n if (!this.realtimeEnabled) {\r\n this.disconnectRealtime(\"realtime_disabled\");\r\n return;\r\n }\r\n\r\n this.setRealtimeStatus(\"idle\", \"realtime_enabled\");\r\n if (this.token && this.realtimeAutoConnect) {\r\n void this.connectRealtime().catch(() => {});\r\n }\r\n }\r\n\r\n buildRealtimeUrl(): string {\r\n const rawBaseUrl =\r\n this.baseUrl || readEnv(\"VITE_ENTITY_SERVER_URL\") || \"\";\r\n const baseUrl =\r\n rawBaseUrl ||\r\n (typeof window !== \"undefined\" ? window.location.origin : \"\");\r\n\r\n if (!baseUrl) {\r\n throw new Error(\"Realtime connection requires baseUrl.\");\r\n }\r\n\r\n const url = new URL(this.realtimePath, baseUrl);\r\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\r\n url.searchParams.set(\"access_token\", this.token);\r\n return url.toString();\r\n }\r\n\r\n handleRealtimeMessage(payload: unknown): void {\r\n if (typeof payload !== \"string\") {\r\n return;\r\n }\r\n\r\n let envelope: RealtimeEnvelope;\r\n try {\r\n envelope = JSON.parse(payload) as RealtimeEnvelope;\r\n } catch {\r\n return;\r\n }\r\n\r\n for (const listener of this.realtimeMessageListeners) {\r\n listener(envelope);\r\n }\r\n\r\n const listeners = this.realtimeEventListeners.get(envelope.event);\r\n if (listeners) {\r\n for (const listener of listeners) {\r\n listener(envelope);\r\n }\r\n }\r\n }\r\n\r\n scheduleRealtimeReconnect(reason: string): void {\r\n this.clearRealtimeReconnectTimer();\r\n this.realtimeReconnectTimer = setTimeout(() => {\r\n this.realtimeReconnectTimer = null;\r\n if (!this.realtimeEnabled || !this.token) {\r\n return;\r\n }\r\n this.setRealtimeStatus(\"connecting\", `${reason}:reconnect`);\r\n void this.connectRealtime().catch(() => {});\r\n }, this.realtimeReconnectDelayMs);\r\n }\r\n\r\n clearRealtimeReconnectTimer(): void {\r\n if (this.realtimeReconnectTimer !== null) {\r\n clearTimeout(this.realtimeReconnectTimer);\r\n this.realtimeReconnectTimer = null;\r\n }\r\n }\r\n\r\n setRealtimeStatus(\r\n status: RealtimeConnectionStatus,\r\n reason?: string,\r\n error?: Error,\r\n ): void {\r\n const previousStatus = this.realtimeStatus;\r\n if (\r\n previousStatus === status &&\r\n typeof reason === \"undefined\" &&\r\n typeof error === \"undefined\"\r\n ) {\r\n return;\r\n }\r\n\r\n this.realtimeStatus = status;\r\n for (const listener of this.realtimeStatusListeners) {\r\n listener({\r\n status,\r\n previousStatus,\r\n ...(reason ? { reason } : {}),\r\n ...(error ? { error } : {}),\r\n });\r\n }\r\n }\r\n\r\n applyCsrfHealth(): void {\r\n if (typeof document === \"undefined\") return;\r\n for (const chunk of document.cookie.split(\";\")) {\r\n const idx = chunk.indexOf(\"=\");\r\n if (idx < 0) continue;\r\n if (chunk.substring(0, idx).trim() === this.csrfCookieName) {\r\n this.csrfEnabled = !!chunk.substring(idx + 1).trim();\r\n return;\r\n }\r\n }\r\n this.csrfEnabled = false;\r\n }\r\n\r\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\r\n\r\n /**\r\n * \uC694\uCCAD \uBC14\uB514\uB97C \uD30C\uC2F1\uD569\uB2C8\uB2E4.\r\n * `application/octet-stream`\uC774\uBA74 XChaCha20-Poly1305 \uBCF5\uD638\uD654, \uADF8 \uC678\uB294 JSON \uD30C\uC2F1\uD569\uB2C8\uB2E4.\r\n *\r\n * @param requireEncrypted `true`\uC774\uBA74 \uC554\uD638\uD654\uB41C \uC694\uCCAD\uB9CC \uD5C8\uC6A9\uD569\uB2C8\uB2E4.\r\n */\r\n readRequestBody<T = Record<string, unknown>>(\r\n body: ArrayBuffer | Uint8Array | string | T | null | undefined,\r\n contentType = \"application/json\",\r\n requireEncrypted = false,\r\n ): T {\r\n const key = derivePacketKey(\r\n this.hmacSecret,\r\n this.token || this.anonymousPacketToken,\r\n );\r\n return parseRequestBody<T>(body, contentType, requireEncrypted, key);\r\n }\r\n\r\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\r\n\r\n get reqOpts(): RequestOptions {\r\n return {\r\n baseUrl: this.baseUrl,\r\n token: this.token,\r\n anonymousPacketToken: this.anonymousPacketToken,\r\n apiKey: this.apiKey,\r\n hmacSecret: this.hmacSecret,\r\n encryptRequests: this.encryptRequests,\r\n csrfEnabled: this.csrfEnabled,\r\n csrfHeaderName: this.csrfHeaderName,\r\n csrfCookieName: this.csrfCookieName,\r\n refreshCsrfCookie: this.csrfEnabled ? this.csrfRefresher : null,\r\n onAccessToken: (token) => {\r\n this.token = token;\r\n },\r\n };\r\n }\r\n\r\n // \uC778\uC99D \uC694\uCCAD \uC804\uC5D0 \uD544\uC694\uD55C \uD074\uB77C\uC774\uC5B8\uD2B8 \uC900\uBE44 \uC791\uC5C5\uC744 \uC218\uD589\uD569\uB2C8\uB2E4.\r\n prepareRequest(_withAuth: boolean): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n /**\r\n * \uCEE4\uC2A4\uD140 \uB77C\uC6B0\uD2B8 \uC9C1\uC811 \uD638\uCD9C\uC6A9 HTTP \uB124\uC784\uC2A4\uD398\uC774\uC2A4.\r\n * \uC778\uC99D\u00B7\uC554\uD638\uD654\u00B7HMAC \uB4F1 SDK \uC635\uC158\uC774 \uADF8\uB300\uB85C \uC801\uC6A9\uB429\uB2C8\uB2E4.\r\n *\r\n * @example\r\n * const res = await client.http.get<{ version: string }>(\"/api/v1/status\", false);\r\n * const res = await client.http.post<MyResponse>(\"/api/v1/custom\", { key: \"value\" });\r\n */\r\n get http() {\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n const self = this;\r\n return {\r\n get<T>(\r\n path: string,\r\n withAuth = true,\r\n extraHeaders?: Record<string, string>,\r\n requestConfig?: EntityRequestConfig,\r\n ): Promise<T> {\r\n return self\r\n .prepareRequest(withAuth)\r\n .then(() =>\r\n entityRequest<T>(\r\n self.reqOpts,\r\n \"GET\",\r\n path,\r\n undefined,\r\n withAuth,\r\n extraHeaders,\r\n requestConfig ?? true,\r\n ),\r\n );\r\n },\r\n post<T>(\r\n path: string,\r\n body?: unknown,\r\n withAuth = true,\r\n extraHeaders?: Record<string, string>,\r\n requestConfig?: EntityRequestConfig,\r\n ): Promise<T> {\r\n return self\r\n .prepareRequest(withAuth)\r\n .then(() =>\r\n entityRequest<T>(\r\n self.reqOpts,\r\n \"POST\",\r\n path,\r\n body,\r\n withAuth,\r\n extraHeaders,\r\n requestConfig ?? true,\r\n ),\r\n );\r\n },\r\n put<T>(\r\n path: string,\r\n body?: unknown,\r\n withAuth = true,\r\n extraHeaders?: Record<string, string>,\r\n requestConfig?: EntityRequestConfig,\r\n ): Promise<T> {\r\n return self\r\n .prepareRequest(withAuth)\r\n .then(() =>\r\n entityRequest<T>(\r\n self.reqOpts,\r\n \"PUT\",\r\n path,\r\n body,\r\n withAuth,\r\n extraHeaders,\r\n requestConfig ?? true,\r\n ),\r\n );\r\n },\r\n patch<T>(\r\n path: string,\r\n body?: unknown,\r\n withAuth = true,\r\n extraHeaders?: Record<string, string>,\r\n requestConfig?: EntityRequestConfig,\r\n ): Promise<T> {\r\n return self\r\n .prepareRequest(withAuth)\r\n .then(() =>\r\n entityRequest<T>(\r\n self.reqOpts,\r\n \"PATCH\",\r\n path,\r\n body,\r\n withAuth,\r\n extraHeaders,\r\n requestConfig ?? true,\r\n ),\r\n );\r\n },\r\n delete<T>(\r\n path: string,\r\n body?: unknown,\r\n withAuth = true,\r\n extraHeaders?: Record<string, string>,\r\n requestConfig?: EntityRequestConfig,\r\n ): Promise<T> {\r\n return self\r\n .prepareRequest(withAuth)\r\n .then(() =>\r\n entityRequest<T>(\r\n self.reqOpts,\r\n \"DELETE\",\r\n path,\r\n body,\r\n withAuth,\r\n extraHeaders,\r\n requestConfig ?? true,\r\n ),\r\n );\r\n },\r\n };\r\n }\r\n\r\n request<T>(\r\n method: string,\r\n path: string,\r\n body?: unknown,\r\n withAuth = true,\r\n extraHeaders?: Record<string, string>,\r\n requestConfig?: EntityRequestConfig,\r\n ): Promise<T> {\r\n return this.prepareRequest(withAuth).then(() =>\r\n entityRequest<T>(\r\n this.reqOpts,\r\n method,\r\n path,\r\n body,\r\n withAuth,\r\n extraHeaders,\r\n requestConfig ?? true,\r\n ),\r\n );\r\n }\r\n\r\n /** PNG/\uBC14\uC774\uB108\uB9AC \uC751\uB2F5\uC744 ArrayBuffer\uB85C \uBC18\uD658\uD569\uB2C8\uB2E4. (QR, \uBC14\uCF54\uB4DC \uB4F1) */\r\n async requestBinary(\r\n method: string,\r\n path: string,\r\n body?: unknown,\r\n withAuth = true,\r\n ): Promise<ArrayBuffer> {\r\n await this.prepareRequest(withAuth);\r\n\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n };\r\n if (withAuth && this.token)\r\n headers[\"Authorization\"] = `Bearer ${this.token}`;\r\n if (this.apiKey) headers[\"X-API-Key\"] = this.apiKey;\r\n\r\n const res = await fetch(this.baseUrl + path, {\r\n method,\r\n headers,\r\n ...(body != null ? { body: JSON.stringify(body) } : {}),\r\n credentials: \"include\",\r\n });\r\n\r\n if (!res.ok) {\r\n const text = await res.text();\r\n const err = new Error(`HTTP ${res.status}: ${text}`);\r\n (err as { status?: number }).status = res.status;\r\n throw err;\r\n }\r\n\r\n return res.arrayBuffer();\r\n }\r\n\r\n /** multipart/form-data \uC694\uCCAD\uC744 \uBCF4\uB0C5\uB2C8\uB2E4. (\uD30C\uC77C \uC5C5\uB85C\uB4DC \uB4F1) */\r\n async requestForm<T>(\r\n method: string,\r\n path: string,\r\n form: FormData,\r\n withAuth = true,\r\n ): Promise<T> {\r\n const headers: Record<string, string> = {};\r\n if (withAuth && this.token)\r\n headers[\"Authorization\"] = `Bearer ${this.token}`;\r\n if (this.apiKey) headers[\"X-API-Key\"] = this.apiKey;\r\n\r\n const res = await fetch(this.baseUrl + path, {\r\n method,\r\n headers,\r\n body: form,\r\n credentials: \"include\",\r\n });\r\n\r\n const data = (await res.json()) as { ok?: boolean; message?: string };\r\n if (!data.ok) {\r\n const err = new Error(\r\n data.message ?? `EntityServer error (HTTP ${res.status})`,\r\n );\r\n (err as { status?: number }).status = res.status;\r\n throw err;\r\n }\r\n return data as T;\r\n }\r\n\r\n /** multipart/form-data \uC694\uCCAD\uC744 \uBCF4\uB0B4\uACE0 \uBC14\uC774\uB108\uB9AC(ArrayBuffer)\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n async requestFormBinary(\r\n method: string,\r\n path: string,\r\n form: FormData,\r\n withAuth = true,\r\n ): Promise<ArrayBuffer> {\r\n const headers: Record<string, string> = {};\r\n if (withAuth && this.token)\r\n headers[\"Authorization\"] = `Bearer ${this.token}`;\r\n if (this.apiKey) headers[\"X-API-Key\"] = this.apiKey;\r\n\r\n const res = await fetch(this.baseUrl + path, {\r\n method,\r\n headers,\r\n body: form,\r\n credentials: \"include\",\r\n });\r\n\r\n if (!res.ok) {\r\n const text = await res.text();\r\n const err = new Error(`HTTP ${res.status}: ${text}`);\r\n (err as { status?: number }).status = res.status;\r\n throw err;\r\n }\r\n\r\n return res.arrayBuffer();\r\n }\r\n}\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type {\r\n EntityServerClientOptions,\r\n RealtimeClientOptions,\r\n RealtimeConnectionStatus,\r\n RealtimeEnvelope,\r\n RealtimeMessageListener,\r\n RealtimeStatusListener,\r\n} from \"../types.js\";\r\nimport { readEnv } from \"./utils.js\";\r\nimport { derivePacketKey, parseRequestBody } from \"./packet.js\";\r\nimport {\r\n entityRequest,\r\n type EntityRequestConfig,\r\n type RequestOptions,\r\n} from \"./request.js\";\r\n\r\nconst REALTIME_DEFAULT_PATH = \"/v1/realtime\";\r\n\r\n// mixin \uD5EC\uD37C \uD0C0\uC785\r\nexport type GConstructor<T = object> = new (...args: any[]) => T;\r\n\r\nexport class EntityServerClientBase {\r\n baseUrl: string;\r\n token: string;\r\n anonymousPacketToken: string;\r\n apiKey: string;\r\n hmacSecret: string;\r\n encryptRequests: boolean;\r\n csrfEnabled: boolean;\r\n csrfHeaderName: string;\r\n csrfCookieName: string;\r\n /** @internal health \uC7AC\uD638\uCD9C\uB85C CSRF \uCFE0\uD0A4 \uAC31\uC2E0 (AuthMixin\uC5D0\uC11C \uC124\uC815) */\r\n csrfRefresher: (() => Promise<void>) | null = null;\r\n activeTxId: string | null = null;\r\n\r\n // \uC138\uC158 \uC720\uC9C0 \uAD00\uB828\r\n keepSession: boolean;\r\n refreshBuffer: number;\r\n onTokenRefreshed?: (accessToken: string, expiresIn: number) => void;\r\n onSessionExpired?: (error: Error) => void;\r\n onHealthChange?: (online: boolean) => void;\r\n sessionRefreshToken: string | null = null;\r\n refreshTimer: ReturnType<typeof setTimeout> | null = null;\r\n healthTickTimer: ReturnType<typeof setInterval> | null = null;\r\n healthTickPromise: Promise<unknown> | null = null;\r\n realtimeEnabled: boolean;\r\n realtimePath: string;\r\n realtimeAutoConnect: boolean;\r\n realtimeAutoReconnect: boolean;\r\n realtimeReconnectDelayMs: number;\r\n realtimeStatus: RealtimeConnectionStatus;\r\n realtimeSocket: WebSocket | null = null;\r\n realtimeConnectPromise: Promise<void> | null = null;\r\n realtimeReconnectTimer: ReturnType<typeof setTimeout> | null = null;\r\n realtimeShouldReconnect = false;\r\n realtimeMessageListeners = new Set<RealtimeMessageListener>();\r\n realtimeStatusListeners = new Set<RealtimeStatusListener>();\r\n realtimeEventListeners = new Map<string, Set<RealtimeMessageListener>>();\r\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\r\n\r\n /**\r\n * EntityServerClient \uC778\uC2A4\uD134\uC2A4\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4.\r\n *\r\n * \uAE30\uBCF8\uAC12:\r\n * - `baseUrl`: `VITE_ENTITY_SERVER_URL` \uB610\uB294 \uC0C1\uB300 \uACBD\uB85C(`\"\"`)\r\n */\r\n constructor(options: EntityServerClientOptions = {}) {\r\n const envBaseUrl = readEnv(\"VITE_ENTITY_SERVER_URL\");\r\n\r\n this.baseUrl = (options.baseUrl ?? envBaseUrl ?? \"\").replace(/\\/$/, \"\");\r\n this.token = options.token ?? \"\";\r\n this.anonymousPacketToken = options.anonymousPacketToken ?? \"\";\r\n this.apiKey = options.apiKey ?? \"\";\r\n this.hmacSecret = options.hmacSecret ?? \"\";\r\n this.encryptRequests = options.encryptRequests ?? false;\r\n this.csrfEnabled = options.csrfEnabled ?? false;\r\n this.csrfHeaderName = options.csrfHeaderName ?? \"x-csrf-token\";\r\n this.csrfCookieName = options.csrfCookieName ?? \"_csrf\";\r\n this.keepSession = options.keepSession ?? false;\r\n this.refreshBuffer = options.refreshBuffer ?? 60;\r\n this.onTokenRefreshed = options.onTokenRefreshed;\r\n this.onSessionExpired = options.onSessionExpired;\r\n this.onHealthChange = options.onHealthChange;\r\n this.realtimeEnabled = false;\r\n this.realtimePath = REALTIME_DEFAULT_PATH;\r\n this.realtimeAutoConnect = true;\r\n this.realtimeAutoReconnect = true;\r\n this.realtimeReconnectDelayMs = 3000;\r\n this.realtimeStatus = \"idle\";\r\n this.applyRealtimeOptions(options.realtime);\r\n if (\r\n typeof options.healthTickInterval === \"number\" &&\r\n options.healthTickInterval > 0\r\n ) {\r\n // csrfRefresher\uB294 AuthMixin\uC5D0\uC11C \uC124\uC815\uB418\uBBC0\uB85C \uB2E4\uC74C tick\uC5D0 \uC2DC\uC791\r\n Promise.resolve().then(() =>\r\n this.startHealthTick(options.healthTickInterval, false),\r\n );\r\n }\r\n }\r\n\r\n /** baseUrl, token, encryptRequests \uAC12\uC744 \uB7F0\uD0C0\uC784\uC5D0 \uAC31\uC2E0\uD569\uB2C8\uB2E4. */\r\n configure(options: Partial<EntityServerClientOptions>): void {\r\n if (typeof options.baseUrl === \"string\") {\r\n this.baseUrl = options.baseUrl.replace(/\\/$/, \"\");\r\n }\r\n if (typeof options.token === \"string\") this.token = options.token;\r\n if (typeof options.anonymousPacketToken === \"string\") {\r\n this.anonymousPacketToken = options.anonymousPacketToken;\r\n }\r\n if (typeof options.encryptRequests === \"boolean\")\r\n this.encryptRequests = options.encryptRequests;\r\n if (typeof options.csrfEnabled === \"boolean\") {\r\n this.csrfEnabled = options.csrfEnabled;\r\n }\r\n if (typeof options.csrfHeaderName === \"string\") {\r\n this.csrfHeaderName = options.csrfHeaderName;\r\n }\r\n if (typeof options.csrfCookieName === \"string\") {\r\n this.csrfCookieName = options.csrfCookieName;\r\n }\r\n if (typeof options.apiKey === \"string\") this.apiKey = options.apiKey;\r\n if (typeof options.hmacSecret === \"string\")\r\n this.hmacSecret = options.hmacSecret;\r\n if (typeof options.keepSession === \"boolean\")\r\n this.keepSession = options.keepSession;\r\n if (typeof options.refreshBuffer === \"number\")\r\n this.refreshBuffer = options.refreshBuffer;\r\n if (options.onTokenRefreshed)\r\n this.onTokenRefreshed = options.onTokenRefreshed;\r\n if (options.onSessionExpired)\r\n this.onSessionExpired = options.onSessionExpired;\r\n if (options.onHealthChange)\r\n this.onHealthChange = options.onHealthChange;\r\n if (typeof options.realtime !== \"undefined\") {\r\n this.applyRealtimeOptions(options.realtime);\r\n }\r\n if (\r\n typeof options.healthTickInterval === \"number\" &&\r\n options.healthTickInterval > 0\r\n ) {\r\n Promise.resolve().then(() =>\r\n this.startHealthTick(options.healthTickInterval, false),\r\n );\r\n }\r\n }\r\n\r\n /** \uC778\uC99D \uC694\uCCAD\uC5D0 \uC0AC\uC6A9\uD560 JWT Access Token\uC744 \uC124\uC815\uD569\uB2C8\uB2E4. */\r\n setToken(token: string): void {\r\n this.token = token;\r\n if (!token) {\r\n this.disconnectRealtime(\"token_cleared\");\r\n return;\r\n }\r\n if (this.realtimeEnabled && this.realtimeAutoConnect) {\r\n void this.connectRealtime().catch(() => {});\r\n }\r\n }\r\n\r\n /** \uC751\uB2F5 \uD5E4\uB354\uB85C \uBC1B\uC740 access token \uAC31\uC2E0\uC744 \uBC18\uC601\uD55C\uB2E4. */\r\n setAccessTokenFromResponse(token: string): void {\r\n this.token = token;\r\n }\r\n\r\n /** \uC775\uBA85 \uD328\uD0B7 \uC554\uD638\uD654\uC6A9 \uD1A0\uD070\uC744 \uC124\uC815\uD569\uB2C8\uB2E4. */\r\n setAnonymousPacketToken(token: string): void {\r\n this.anonymousPacketToken = token;\r\n }\r\n\r\n /** HMAC \uC778\uC99D\uC6A9 API Key\uB97C \uC124\uC815\uD569\uB2C8\uB2E4. */\r\n setApiKey(apiKey: string): void {\r\n this.apiKey = apiKey;\r\n }\r\n\r\n /** HMAC \uC778\uC99D\uC6A9 \uC2DC\uD06C\uB9BF\uC744 \uC124\uC815\uD569\uB2C8\uB2E4. */\r\n setHmacSecret(secret: string): void {\r\n this.hmacSecret = secret;\r\n }\r\n\r\n /** \uC554\uD638\uD654 \uC694\uCCAD \uD65C\uC131\uD654 \uC5EC\uBD80\uB97C \uC124\uC815\uD569\uB2C8\uB2E4. */\r\n setEncryptRequests(value: boolean): void {\r\n this.encryptRequests = value;\r\n }\r\n\r\n setCsrfEnabled(enabled: boolean): void {\r\n this.csrfEnabled = enabled;\r\n }\r\n\r\n addRealtimeListener(listener: RealtimeMessageListener): void {\r\n this.realtimeMessageListeners.add(listener);\r\n }\r\n\r\n removeRealtimeListener(listener: RealtimeMessageListener): void {\r\n this.realtimeMessageListeners.delete(listener);\r\n }\r\n\r\n addRealtimeStatusListener(listener: RealtimeStatusListener): void {\r\n this.realtimeStatusListeners.add(listener);\r\n }\r\n\r\n removeRealtimeStatusListener(listener: RealtimeStatusListener): void {\r\n this.realtimeStatusListeners.delete(listener);\r\n }\r\n\r\n addRealtimeEventListener(\r\n eventName: string,\r\n listener: RealtimeMessageListener,\r\n ): void {\r\n const key = String(eventName).trim();\r\n if (!key) {\r\n return;\r\n }\r\n if (!this.realtimeEventListeners.has(key)) {\r\n this.realtimeEventListeners.set(key, new Set());\r\n }\r\n this.realtimeEventListeners.get(key)!.add(listener);\r\n }\r\n\r\n removeRealtimeEventListener(\r\n eventName: string,\r\n listener: RealtimeMessageListener,\r\n ): void {\r\n const key = String(eventName).trim();\r\n if (!key) {\r\n return;\r\n }\r\n const listeners = this.realtimeEventListeners.get(key);\r\n if (!listeners) {\r\n return;\r\n }\r\n listeners.delete(listener);\r\n if (listeners.size === 0) {\r\n this.realtimeEventListeners.delete(key);\r\n }\r\n }\r\n\r\n async connectRealtime(): Promise<void> {\r\n if (!this.realtimeEnabled) {\r\n this.setRealtimeStatus(\"disabled\", \"realtime_disabled\");\r\n return;\r\n }\r\n\r\n if (!this.token) {\r\n throw new Error(\r\n \"Cannot open realtime connection without access token.\",\r\n );\r\n }\r\n\r\n if (typeof WebSocket === \"undefined\") {\r\n throw new Error(\"WebSocket is not available in this environment.\");\r\n }\r\n\r\n if (\r\n this.realtimeSocket &&\r\n this.realtimeSocket.readyState === WebSocket.OPEN\r\n ) {\r\n return;\r\n }\r\n\r\n if (\r\n this.realtimeSocket &&\r\n this.realtimeSocket.readyState === WebSocket.CONNECTING &&\r\n this.realtimeConnectPromise\r\n ) {\r\n return this.realtimeConnectPromise;\r\n }\r\n\r\n this.clearRealtimeReconnectTimer();\r\n this.realtimeShouldReconnect = this.realtimeAutoReconnect;\r\n this.setRealtimeStatus(\"connecting\", \"connect_requested\");\r\n\r\n const socket = new WebSocket(this.buildRealtimeUrl());\r\n this.realtimeSocket = socket;\r\n\r\n this.realtimeConnectPromise = new Promise<void>((resolve, reject) => {\r\n let settled = false;\r\n\r\n const finalizeResolve = () => {\r\n if (settled) {\r\n return;\r\n }\r\n settled = true;\r\n this.realtimeConnectPromise = null;\r\n resolve();\r\n };\r\n\r\n const finalizeReject = (error: Error) => {\r\n if (settled) {\r\n return;\r\n }\r\n settled = true;\r\n this.realtimeConnectPromise = null;\r\n reject(error);\r\n };\r\n\r\n socket.addEventListener(\"open\", () => {\r\n this.setRealtimeStatus(\"open\", \"socket_open\");\r\n finalizeResolve();\r\n });\r\n\r\n socket.addEventListener(\"message\", (event) => {\r\n this.handleRealtimeMessage(event.data);\r\n });\r\n\r\n socket.addEventListener(\"error\", () => {\r\n this.setRealtimeStatus(\r\n \"closed\",\r\n \"socket_error\",\r\n new Error(\"Realtime socket error.\"),\r\n );\r\n });\r\n\r\n socket.addEventListener(\"close\", (event) => {\r\n if (this.realtimeSocket === socket) {\r\n this.realtimeSocket = null;\r\n }\r\n\r\n const reason = event.reason || \"socket_closed\";\r\n const error = new Error(\r\n `Realtime socket closed (${event.code}${event.reason ? `: ${event.reason}` : \"\"}).`,\r\n );\r\n\r\n this.setRealtimeStatus(\"closed\", reason, error);\r\n if (!settled) {\r\n finalizeReject(error);\r\n }\r\n\r\n if (\r\n this.realtimeShouldReconnect &&\r\n this.realtimeEnabled &&\r\n this.realtimeAutoReconnect &&\r\n this.token\r\n ) {\r\n this.scheduleRealtimeReconnect(reason);\r\n }\r\n });\r\n });\r\n\r\n return this.realtimeConnectPromise;\r\n }\r\n\r\n disconnectRealtime(reason = \"client_disconnect\"): void {\r\n this.realtimeShouldReconnect = false;\r\n this.clearRealtimeReconnectTimer();\r\n\r\n if (this.realtimeSocket) {\r\n const socket = this.realtimeSocket;\r\n this.realtimeSocket = null;\r\n try {\r\n if (\r\n socket.readyState === WebSocket.OPEN ||\r\n socket.readyState === WebSocket.CONNECTING\r\n ) {\r\n socket.close(1000, reason);\r\n }\r\n } catch {\r\n // ignore close errors\r\n }\r\n }\r\n\r\n this.realtimeConnectPromise = null;\r\n this.setRealtimeStatus(\r\n this.realtimeEnabled ? \"idle\" : \"disabled\",\r\n reason,\r\n );\r\n }\r\n\r\n sendRealtime(message: RealtimeEnvelope | Record<string, unknown>): boolean {\r\n if (\r\n !this.realtimeSocket ||\r\n this.realtimeSocket.readyState !== WebSocket.OPEN\r\n ) {\r\n return false;\r\n }\r\n\r\n this.realtimeSocket.send(JSON.stringify(message));\r\n return true;\r\n }\r\n\r\n subscribeRealtime(subscriptions: string[]): boolean {\r\n return this.sendRealtime({\r\n type: \"subscribe\",\r\n channel: \"session\",\r\n event: \"session.subscribe\",\r\n data: { subscriptions },\r\n });\r\n }\r\n\r\n unsubscribeRealtime(subscriptions: string[]): boolean {\r\n return this.sendRealtime({\r\n type: \"unsubscribe\",\r\n channel: \"session\",\r\n event: \"session.unsubscribe\",\r\n data: { subscriptions },\r\n });\r\n }\r\n\r\n /**\r\n * \uC8FC\uAE30\uC801\uC73C\uB85C health \uCCB4\uD06C\uB97C \uC2E4\uD589\uD569\uB2C8\uB2E4.\r\n * CSRF \uCFE0\uD0A4 \uAC31\uC2E0\uACFC \uC11C\uBC84 \uC0C1\uD0DC \uD655\uC778\uC744 \uC790\uB3D9\uD654\uD569\uB2C8\uB2E4.\r\n * keepSession=true \uC774\uBA74 \uAC01 tick\uC5D0\uC11C \uC138\uC158 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uB3C4 \uD568\uAED8 \uC2DC\uB3C4\uD569\uB2C8\uB2E4.\r\n *\r\n * @param intervalMs \uD638\uCD9C \uC8FC\uAE30(ms). \uAE30\uBCF8\uAC12: 5\uBD84\r\n * @param runImmediately true\uBA74 \uC2DC\uC791 \uC9C1\uD6C4 \uCCAB tick\uC744 \uC989\uC2DC \uC2E4\uD589\uD569\uB2C8\uB2E4.\r\n */\r\n startHealthTick(\r\n intervalMs: number = 5 * 60 * 1000,\r\n runImmediately = true,\r\n ): void {\r\n this.stopHealthTick();\r\n const tick = (): void => {\r\n if (this.healthTickPromise) return;\r\n this.healthTickPromise = (\r\n this.csrfRefresher ? this.csrfRefresher() : Promise.resolve()\r\n )\r\n .then(() => {\r\n this.onHealthChange?.(true);\r\n })\r\n .catch(() => {\r\n this.onHealthChange?.(false);\r\n })\r\n .finally(() => {\r\n this.healthTickPromise = null;\r\n });\r\n };\r\n if (runImmediately) {\r\n tick();\r\n }\r\n this.healthTickTimer = setInterval(tick, intervalMs);\r\n }\r\n\r\n /** health tick \uD0C0\uC774\uBA38\uB97C \uC911\uC9C0\uD569\uB2C8\uB2E4. */\r\n stopHealthTick(): void {\r\n if (this.healthTickTimer !== null) {\r\n clearInterval(this.healthTickTimer);\r\n this.healthTickTimer = null;\r\n }\r\n this.healthTickPromise = null;\r\n }\r\n\r\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\r\n\r\n /** @deprecated \uC138\uC158 \uC5F0\uC7A5\uC740 health tick \uAE30\uBC18 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uC73C\uB85C \uB300\uCCB4\uB418\uC5C8\uC2B5\uB2C8\uB2E4. */\r\n scheduleKeepSession(\r\n refreshToken: string,\r\n expiresIn: number,\r\n refreshFn: (\r\n rt: string,\r\n ) => Promise<{ access_token: string; expires_in: number }>,\r\n ): void {\r\n this.clearRefreshTimer();\r\n this.sessionRefreshToken = refreshToken;\r\n const delayMs = Math.max((expiresIn - this.refreshBuffer) * 1000, 0);\r\n this.refreshTimer = setTimeout(async () => {\r\n if (!this.sessionRefreshToken) return;\r\n try {\r\n const result = await refreshFn(this.sessionRefreshToken);\r\n this.onTokenRefreshed?.(result.access_token, result.expires_in);\r\n this.scheduleKeepSession(\r\n this.sessionRefreshToken,\r\n result.expires_in,\r\n refreshFn,\r\n );\r\n } catch (err) {\r\n this.clearRefreshTimer();\r\n this.onSessionExpired?.(\r\n err instanceof Error ? err : new Error(String(err)),\r\n );\r\n }\r\n }, delayMs);\r\n }\r\n\r\n /** @deprecated \uC138\uC158 \uC5F0\uC7A5\uC740 health tick \uAE30\uBC18 \uBD80\uD2B8\uC2A4\uD2B8\uB7A9\uC73C\uB85C \uB300\uCCB4\uB418\uC5C8\uC2B5\uB2C8\uB2E4. */\r\n clearRefreshTimer(): void {\r\n if (this.refreshTimer !== null) {\r\n clearTimeout(this.refreshTimer);\r\n this.refreshTimer = null;\r\n }\r\n }\r\n\r\n /**\r\n * \uC138\uC158 \uC790\uB3D9 \uC5F0\uC7A5\uC744 \uC911\uC9C0\uD569\uB2C8\uB2E4.\r\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.\r\n */\r\n stopKeepSession(): void {\r\n this.clearRefreshTimer();\r\n this.sessionRefreshToken = null;\r\n }\r\n\r\n applyRealtimeOptions(options?: boolean | RealtimeClientOptions): void {\r\n const normalized: RealtimeClientOptions =\r\n typeof options === \"boolean\"\r\n ? { enabled: options }\r\n : (options ?? {});\r\n\r\n this.realtimeEnabled = normalized.enabled ?? false;\r\n this.realtimePath =\r\n String(normalized.path ?? REALTIME_DEFAULT_PATH).trim() ||\r\n REALTIME_DEFAULT_PATH;\r\n this.realtimeAutoConnect = normalized.autoConnect ?? true;\r\n this.realtimeAutoReconnect = normalized.autoReconnect ?? true;\r\n this.realtimeReconnectDelayMs = Math.max(\r\n 250,\r\n normalized.reconnectDelayMs ?? 3000,\r\n );\r\n\r\n if (!this.realtimeEnabled) {\r\n this.disconnectRealtime(\"realtime_disabled\");\r\n return;\r\n }\r\n\r\n this.setRealtimeStatus(\"idle\", \"realtime_enabled\");\r\n if (this.token && this.realtimeAutoConnect) {\r\n void this.connectRealtime().catch(() => {});\r\n }\r\n }\r\n\r\n buildRealtimeUrl(): string {\r\n const rawBaseUrl =\r\n this.baseUrl || readEnv(\"VITE_ENTITY_SERVER_URL\") || \"\";\r\n const baseUrl =\r\n rawBaseUrl ||\r\n (typeof window !== \"undefined\" ? window.location.origin : \"\");\r\n\r\n if (!baseUrl) {\r\n throw new Error(\"Realtime connection requires baseUrl.\");\r\n }\r\n\r\n const url = new URL(this.realtimePath, baseUrl);\r\n url.protocol = url.protocol === \"https:\" ? \"wss:\" : \"ws:\";\r\n url.searchParams.set(\"access_token\", this.token);\r\n return url.toString();\r\n }\r\n\r\n handleRealtimeMessage(payload: unknown): void {\r\n if (typeof payload !== \"string\") {\r\n return;\r\n }\r\n\r\n let envelope: RealtimeEnvelope;\r\n try {\r\n envelope = JSON.parse(payload) as RealtimeEnvelope;\r\n } catch {\r\n return;\r\n }\r\n\r\n for (const listener of this.realtimeMessageListeners) {\r\n listener(envelope);\r\n }\r\n\r\n const listeners = this.realtimeEventListeners.get(envelope.event);\r\n if (listeners) {\r\n for (const listener of listeners) {\r\n listener(envelope);\r\n }\r\n }\r\n }\r\n\r\n scheduleRealtimeReconnect(reason: string): void {\r\n this.clearRealtimeReconnectTimer();\r\n this.realtimeReconnectTimer = setTimeout(() => {\r\n this.realtimeReconnectTimer = null;\r\n if (!this.realtimeEnabled || !this.token) {\r\n return;\r\n }\r\n this.setRealtimeStatus(\"connecting\", `${reason}:reconnect`);\r\n void this.connectRealtime().catch(() => {});\r\n }, this.realtimeReconnectDelayMs);\r\n }\r\n\r\n clearRealtimeReconnectTimer(): void {\r\n if (this.realtimeReconnectTimer !== null) {\r\n clearTimeout(this.realtimeReconnectTimer);\r\n this.realtimeReconnectTimer = null;\r\n }\r\n }\r\n\r\n setRealtimeStatus(\r\n status: RealtimeConnectionStatus,\r\n reason?: string,\r\n error?: Error,\r\n ): void {\r\n const previousStatus = this.realtimeStatus;\r\n if (\r\n previousStatus === status &&\r\n typeof reason === \"undefined\" &&\r\n typeof error === \"undefined\"\r\n ) {\r\n return;\r\n }\r\n\r\n this.realtimeStatus = status;\r\n for (const listener of this.realtimeStatusListeners) {\r\n listener({\r\n status,\r\n previousStatus,\r\n ...(reason ? { reason } : {}),\r\n ...(error ? { error } : {}),\r\n });\r\n }\r\n }\r\n\r\n applyCsrfHealth(): void {\r\n if (typeof document === \"undefined\") return;\r\n for (const chunk of document.cookie.split(\";\")) {\r\n const idx = chunk.indexOf(\"=\");\r\n if (idx < 0) continue;\r\n if (chunk.substring(0, idx).trim() === this.csrfCookieName) {\r\n this.csrfEnabled = !!chunk.substring(idx + 1).trim();\r\n return;\r\n }\r\n }\r\n this.csrfEnabled = false;\r\n }\r\n\r\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\r\n\r\n /**\r\n * \uC694\uCCAD \uBC14\uB514\uB97C \uD30C\uC2F1\uD569\uB2C8\uB2E4.\r\n * `application/octet-stream`\uC774\uBA74 XChaCha20-Poly1305 \uBCF5\uD638\uD654, \uADF8 \uC678\uB294 JSON \uD30C\uC2F1\uD569\uB2C8\uB2E4.\r\n *\r\n * @param requireEncrypted `true`\uC774\uBA74 \uC554\uD638\uD654\uB41C \uC694\uCCAD\uB9CC \uD5C8\uC6A9\uD569\uB2C8\uB2E4.\r\n */\r\n readRequestBody<T = Record<string, unknown>>(\r\n body: ArrayBuffer | Uint8Array | string | T | null | undefined,\r\n contentType = \"application/json\",\r\n requireEncrypted = false,\r\n ): T {\r\n const key = derivePacketKey(\r\n this.hmacSecret,\r\n this.token || this.anonymousPacketToken,\r\n );\r\n return parseRequestBody<T>(body, contentType, requireEncrypted, key);\r\n }\r\n\r\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\r\n\r\n get reqOpts(): RequestOptions {\r\n return {\r\n baseUrl: this.baseUrl,\r\n token: this.token,\r\n anonymousPacketToken: this.anonymousPacketToken,\r\n apiKey: this.apiKey,\r\n hmacSecret: this.hmacSecret,\r\n encryptRequests: this.encryptRequests,\r\n csrfEnabled: this.csrfEnabled,\r\n csrfHeaderName: this.csrfHeaderName,\r\n csrfCookieName: this.csrfCookieName,\r\n refreshCsrfCookie: this.csrfEnabled ? this.csrfRefresher : null,\r\n onAccessToken: (token) => {\r\n this.setAccessTokenFromResponse(token);\r\n },\r\n };\r\n }\r\n\r\n // \uC778\uC99D \uC694\uCCAD \uC804\uC5D0 \uD544\uC694\uD55C \uD074\uB77C\uC774\uC5B8\uD2B8 \uC900\uBE44 \uC791\uC5C5\uC744 \uC218\uD589\uD569\uB2C8\uB2E4.\r\n prepareRequest(_withAuth: boolean): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n /**\r\n * \uCEE4\uC2A4\uD140 \uB77C\uC6B0\uD2B8 \uC9C1\uC811 \uD638\uCD9C\uC6A9 HTTP \uB124\uC784\uC2A4\uD398\uC774\uC2A4.\r\n * \uC778\uC99D\u00B7\uC554\uD638\uD654\u00B7HMAC \uB4F1 SDK \uC635\uC158\uC774 \uADF8\uB300\uB85C \uC801\uC6A9\uB429\uB2C8\uB2E4.\r\n *\r\n * @example\r\n * const res = await client.http.get<{ version: string }>(\"/api/v1/status\", false);\r\n * const res = await client.http.post<MyResponse>(\"/api/v1/custom\", { key: \"value\" });\r\n */\r\n get http() {\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n const self = this;\r\n return {\r\n get<T>(\r\n path: string,\r\n withAuth = true,\r\n extraHeaders?: Record<string, string>,\r\n requestConfig?: EntityRequestConfig,\r\n ): Promise<T> {\r\n return self\r\n .prepareRequest(withAuth)\r\n .then(() =>\r\n entityRequest<T>(\r\n self.reqOpts,\r\n \"GET\",\r\n path,\r\n undefined,\r\n withAuth,\r\n extraHeaders,\r\n requestConfig ?? true,\r\n ),\r\n );\r\n },\r\n post<T>(\r\n path: string,\r\n body?: unknown,\r\n withAuth = true,\r\n extraHeaders?: Record<string, string>,\r\n requestConfig?: EntityRequestConfig,\r\n ): Promise<T> {\r\n return self\r\n .prepareRequest(withAuth)\r\n .then(() =>\r\n entityRequest<T>(\r\n self.reqOpts,\r\n \"POST\",\r\n path,\r\n body,\r\n withAuth,\r\n extraHeaders,\r\n requestConfig ?? true,\r\n ),\r\n );\r\n },\r\n put<T>(\r\n path: string,\r\n body?: unknown,\r\n withAuth = true,\r\n extraHeaders?: Record<string, string>,\r\n requestConfig?: EntityRequestConfig,\r\n ): Promise<T> {\r\n return self\r\n .prepareRequest(withAuth)\r\n .then(() =>\r\n entityRequest<T>(\r\n self.reqOpts,\r\n \"PUT\",\r\n path,\r\n body,\r\n withAuth,\r\n extraHeaders,\r\n requestConfig ?? true,\r\n ),\r\n );\r\n },\r\n patch<T>(\r\n path: string,\r\n body?: unknown,\r\n withAuth = true,\r\n extraHeaders?: Record<string, string>,\r\n requestConfig?: EntityRequestConfig,\r\n ): Promise<T> {\r\n return self\r\n .prepareRequest(withAuth)\r\n .then(() =>\r\n entityRequest<T>(\r\n self.reqOpts,\r\n \"PATCH\",\r\n path,\r\n body,\r\n withAuth,\r\n extraHeaders,\r\n requestConfig ?? true,\r\n ),\r\n );\r\n },\r\n delete<T>(\r\n path: string,\r\n body?: unknown,\r\n withAuth = true,\r\n extraHeaders?: Record<string, string>,\r\n requestConfig?: EntityRequestConfig,\r\n ): Promise<T> {\r\n return self\r\n .prepareRequest(withAuth)\r\n .then(() =>\r\n entityRequest<T>(\r\n self.reqOpts,\r\n \"DELETE\",\r\n path,\r\n body,\r\n withAuth,\r\n extraHeaders,\r\n requestConfig ?? true,\r\n ),\r\n );\r\n },\r\n };\r\n }\r\n\r\n request<T>(\r\n method: string,\r\n path: string,\r\n body?: unknown,\r\n withAuth = true,\r\n extraHeaders?: Record<string, string>,\r\n requestConfig?: EntityRequestConfig,\r\n ): Promise<T> {\r\n return this.prepareRequest(withAuth).then(() =>\r\n entityRequest<T>(\r\n this.reqOpts,\r\n method,\r\n path,\r\n body,\r\n withAuth,\r\n extraHeaders,\r\n requestConfig ?? true,\r\n ),\r\n );\r\n }\r\n\r\n /** PNG/\uBC14\uC774\uB108\uB9AC \uC751\uB2F5\uC744 ArrayBuffer\uB85C \uBC18\uD658\uD569\uB2C8\uB2E4. (QR, \uBC14\uCF54\uB4DC \uB4F1) */\r\n async requestBinary(\r\n method: string,\r\n path: string,\r\n body?: unknown,\r\n withAuth = true,\r\n ): Promise<ArrayBuffer> {\r\n await this.prepareRequest(withAuth);\r\n\r\n const headers: Record<string, string> = {\r\n \"Content-Type\": \"application/json\",\r\n };\r\n if (withAuth && this.token)\r\n headers[\"Authorization\"] = `Bearer ${this.token}`;\r\n if (this.apiKey) headers[\"X-API-Key\"] = this.apiKey;\r\n\r\n const res = await fetch(this.baseUrl + path, {\r\n method,\r\n headers,\r\n ...(body != null ? { body: JSON.stringify(body) } : {}),\r\n credentials: \"include\",\r\n });\r\n\r\n if (!res.ok) {\r\n const text = await res.text();\r\n const err = new Error(`HTTP ${res.status}: ${text}`);\r\n (err as { status?: number }).status = res.status;\r\n throw err;\r\n }\r\n\r\n return res.arrayBuffer();\r\n }\r\n\r\n /** multipart/form-data \uC694\uCCAD\uC744 \uBCF4\uB0C5\uB2C8\uB2E4. (\uD30C\uC77C \uC5C5\uB85C\uB4DC \uB4F1) */\r\n async requestForm<T>(\r\n method: string,\r\n path: string,\r\n form: FormData,\r\n withAuth = true,\r\n ): Promise<T> {\r\n const headers: Record<string, string> = {};\r\n if (withAuth && this.token)\r\n headers[\"Authorization\"] = `Bearer ${this.token}`;\r\n if (this.apiKey) headers[\"X-API-Key\"] = this.apiKey;\r\n\r\n const res = await fetch(this.baseUrl + path, {\r\n method,\r\n headers,\r\n body: form,\r\n credentials: \"include\",\r\n });\r\n\r\n const data = (await res.json()) as { ok?: boolean; message?: string };\r\n if (!data.ok) {\r\n const err = new Error(\r\n data.message ?? `EntityServer error (HTTP ${res.status})`,\r\n );\r\n (err as { status?: number }).status = res.status;\r\n throw err;\r\n }\r\n return data as T;\r\n }\r\n\r\n /** multipart/form-data \uC694\uCCAD\uC744 \uBCF4\uB0B4\uACE0 \uBC14\uC774\uB108\uB9AC(ArrayBuffer)\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4. */\r\n async requestFormBinary(\r\n method: string,\r\n path: string,\r\n form: FormData,\r\n withAuth = true,\r\n ): Promise<ArrayBuffer> {\r\n const headers: Record<string, string> = {};\r\n if (withAuth && this.token)\r\n headers[\"Authorization\"] = `Bearer ${this.token}`;\r\n if (this.apiKey) headers[\"X-API-Key\"] = this.apiKey;\r\n\r\n const res = await fetch(this.baseUrl + path, {\r\n method,\r\n headers,\r\n body: form,\r\n credentials: \"include\",\r\n });\r\n\r\n if (!res.ok) {\r\n const text = await res.text();\r\n const err = new Error(`HTTP ${res.status}: ${text}`);\r\n (err as { status?: number }).status = res.status;\r\n throw err;\r\n }\r\n\r\n return res.arrayBuffer();\r\n }\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["readEnv", "derivePacketKey", "parseRequestBody", "entityRequest", "REALTIME_DEFAULT_PATH", "EntityServerClientBase", "options", "envBaseUrl", "token", "apiKey", "secret", "value", "enabled", "listener", "eventName", "key", "listeners", "socket", "resolve", "reject", "settled", "finalizeResolve", "finalizeReject", "error", "event", "reason", "message", "subscriptions", "intervalMs", "runImmediately", "tick", "refreshToken", "expiresIn", "refreshFn", "delayMs", "result", "err", "normalized", "baseUrl", "url", "payload", "envelope", "status", "previousStatus", "chunk", "idx", "body", "contentType", "requireEncrypted", "_withAuth", "self", "path", "withAuth", "extraHeaders", "requestConfig", "method", "headers", "res", "text", "form", "data"]
|
|
7
7
|
}
|