@hive-ng/web-sdk 0.1.0

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.
@@ -0,0 +1,898 @@
1
+ import { ConnectError, createClient } from '@connectrpc/connect';
2
+ import { timestampDate, file_google_protobuf_timestamp } from '@bufbuild/protobuf/wkt';
3
+ import { messageDesc, serviceDesc, fileDesc } from '@bufbuild/protobuf/codegenv2';
4
+ import { createConnectTransport } from '@connectrpc/connect-web';
5
+
6
+ // src/hive-ng.ts
7
+ var file_hiveng_v1_common = /* @__PURE__ */ fileDesc("ChZoaXZlbmcvdjEvY29tbW9uLnByb3RvEgloaXZlbmcudjEimgEKC0Vycm9yRGV0YWlsEiIKBGNvZGUYASABKA4yFC5oaXZlbmcudjEuRXJyb3JDb2RlEjYKCG1ldGFkYXRhGAIgAygLMiQuaGl2ZW5nLnYxLkVycm9yRGV0YWlsLk1ldGFkYXRhRW50cnkaLwoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIjQKC1BhZ2VSZXF1ZXN0EhEKCXBhZ2Vfc2l6ZRgBIAEoBRISCgpwYWdlX3Rva2VuGAIgASgJIjYKDFBhZ2VSZXNwb25zZRIXCg9uZXh0X3BhZ2VfdG9rZW4YASABKAkSDQoFdG90YWwYAiABKAMqhAgKCUVycm9yQ29kZRIaChZFUlJPUl9DT0RFX1VOU1BFQ0lGSUVEEAASFwoTRVJST1JfQ09ERV9JTlRFUk5BTBABEh8KG0VSUk9SX0NPREVfSU5WQUxJRF9BUkdVTUVOVBACEhgKFEVSUk9SX0NPREVfTk9UX0ZPVU5EEAMSHQoZRVJST1JfQ09ERV9BTFJFQURZX0VYSVNUUxAEEiAKHEVSUk9SX0NPREVfUEVSTUlTU0lPTl9ERU5JRUQQBRIeChpFUlJPUl9DT0RFX1VOQVVUSEVOVElDQVRFRBAGEiYKIkVSUk9SX0NPREVfTUFJTlRFTkFOQ0VfSU5fUFJPR1JFU1MQZBIaChZFUlJPUl9DT0RFX0dFT19CTE9DS0VEEGUSKQolRVJST1JfQ09ERV9DTElFTlRfVkVSU0lPTl9VTlNVUFBPUlRFRBBmEh0KGEVSUk9SX0NPREVfUExBWUVSX0JBTk5FRBDIARImCiFFUlJPUl9DT0RFX0lOVkFMSURfUFJPVklERVJfVE9LRU4QyQESJAofRVJST1JfQ09ERV9QUk9WSURFUl9OT1RfRU5BQkxFRBDKARIpCiRFUlJPUl9DT0RFX0NSRURFTlRJQUxfTk9UX0NPTkZJR1VSRUQQywESHwoaRVJST1JfQ09ERV9TRVNTSU9OX0VYUElSRUQQzAESIAobRVJST1JfQ09ERV9QTEFZRVJfTk9UX0ZPVU5EEM0BEiEKHEVSUk9SX0NPREVfRFVQTElDQVRFX1JFQ0VJUFQQrAISKwomRVJST1JfQ09ERV9SRUNFSVBUX1ZFUklGSUNBVElPTl9GQUlMRUQQrQISJAofRVJST1JfQ09ERV9NQVJLRVRfTk9UX1NVUFBPUlRFRBCuAhIfChpFUlJPUl9DT0RFX0FQSV9LRVlfSU5WQUxJRBCQAxIfChpFUlJPUl9DT0RFX0FQSV9LRVlfUkVWT0tFRBCRAxIiCh1FUlJPUl9DT0RFX1NFUlZFUl9LRVlfSU5WQUxJRBCSAxIiCh1FUlJPUl9DT0RFX1NFUlZFUl9LRVlfUkVWT0tFRBCTAxIiCh1FUlJPUl9DT0RFX0FETUlOX0VNQUlMX0VYSVNUUxD0AxIpCiRFUlJPUl9DT0RFX0FETUlOX0lOVkFMSURfQ1JFREVOVElBTFMQ9QMSIwoeRVJST1JfQ09ERV9QQUNLQUdFX05BTUVfRVhJU1RTEPYDEh4KGUVSUk9SX0NPREVfTUFJTF9OT1RfRk9VTkQQ2AQSJAofRVJST1JfQ09ERV9NQUlMX0FMUkVBRFlfQ0xBSU1FRBDZBBIiCh1FUlJPUl9DT0RFX01BSUxfTk9UX0NMQUlNQUJMRRDaBEJhCg1jb20uaGl2ZW5nLnYxQgtDb21tb25Qcm90b1ABogIDSFhYqgIJSGl2ZW5nLlYxygIJSGl2ZW5nXFYx4gIVSGl2ZW5nXFYxXEdQQk1ldGFkYXRh6gIKSGl2ZW5nOjpWMWIGcHJvdG8z");
8
+ var ErrorDetailSchema = /* @__PURE__ */ messageDesc(file_hiveng_v1_common, 0);
9
+ var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => {
10
+ ErrorCode2[ErrorCode2["UNSPECIFIED"] = 0] = "UNSPECIFIED";
11
+ ErrorCode2[ErrorCode2["INTERNAL"] = 1] = "INTERNAL";
12
+ ErrorCode2[ErrorCode2["INVALID_ARGUMENT"] = 2] = "INVALID_ARGUMENT";
13
+ ErrorCode2[ErrorCode2["NOT_FOUND"] = 3] = "NOT_FOUND";
14
+ ErrorCode2[ErrorCode2["ALREADY_EXISTS"] = 4] = "ALREADY_EXISTS";
15
+ ErrorCode2[ErrorCode2["PERMISSION_DENIED"] = 5] = "PERMISSION_DENIED";
16
+ ErrorCode2[ErrorCode2["UNAUTHENTICATED"] = 6] = "UNAUTHENTICATED";
17
+ ErrorCode2[ErrorCode2["MAINTENANCE_IN_PROGRESS"] = 100] = "MAINTENANCE_IN_PROGRESS";
18
+ ErrorCode2[ErrorCode2["GEO_BLOCKED"] = 101] = "GEO_BLOCKED";
19
+ ErrorCode2[ErrorCode2["CLIENT_VERSION_UNSUPPORTED"] = 102] = "CLIENT_VERSION_UNSUPPORTED";
20
+ ErrorCode2[ErrorCode2["PLAYER_BANNED"] = 200] = "PLAYER_BANNED";
21
+ ErrorCode2[ErrorCode2["INVALID_PROVIDER_TOKEN"] = 201] = "INVALID_PROVIDER_TOKEN";
22
+ ErrorCode2[ErrorCode2["PROVIDER_NOT_ENABLED"] = 202] = "PROVIDER_NOT_ENABLED";
23
+ ErrorCode2[ErrorCode2["CREDENTIAL_NOT_CONFIGURED"] = 203] = "CREDENTIAL_NOT_CONFIGURED";
24
+ ErrorCode2[ErrorCode2["SESSION_EXPIRED"] = 204] = "SESSION_EXPIRED";
25
+ ErrorCode2[ErrorCode2["PLAYER_NOT_FOUND"] = 205] = "PLAYER_NOT_FOUND";
26
+ ErrorCode2[ErrorCode2["DUPLICATE_RECEIPT"] = 300] = "DUPLICATE_RECEIPT";
27
+ ErrorCode2[ErrorCode2["RECEIPT_VERIFICATION_FAILED"] = 301] = "RECEIPT_VERIFICATION_FAILED";
28
+ ErrorCode2[ErrorCode2["MARKET_NOT_SUPPORTED"] = 302] = "MARKET_NOT_SUPPORTED";
29
+ ErrorCode2[ErrorCode2["API_KEY_INVALID"] = 400] = "API_KEY_INVALID";
30
+ ErrorCode2[ErrorCode2["API_KEY_REVOKED"] = 401] = "API_KEY_REVOKED";
31
+ ErrorCode2[ErrorCode2["SERVER_KEY_INVALID"] = 402] = "SERVER_KEY_INVALID";
32
+ ErrorCode2[ErrorCode2["SERVER_KEY_REVOKED"] = 403] = "SERVER_KEY_REVOKED";
33
+ ErrorCode2[ErrorCode2["ADMIN_EMAIL_EXISTS"] = 500] = "ADMIN_EMAIL_EXISTS";
34
+ ErrorCode2[ErrorCode2["ADMIN_INVALID_CREDENTIALS"] = 501] = "ADMIN_INVALID_CREDENTIALS";
35
+ ErrorCode2[ErrorCode2["PACKAGE_NAME_EXISTS"] = 502] = "PACKAGE_NAME_EXISTS";
36
+ ErrorCode2[ErrorCode2["MAIL_NOT_FOUND"] = 600] = "MAIL_NOT_FOUND";
37
+ ErrorCode2[ErrorCode2["MAIL_ALREADY_CLAIMED"] = 601] = "MAIL_ALREADY_CLAIMED";
38
+ ErrorCode2[ErrorCode2["MAIL_NOT_CLAIMABLE"] = 602] = "MAIL_NOT_CLAIMABLE";
39
+ return ErrorCode2;
40
+ })(ErrorCode || {});
41
+
42
+ // src/gen/hiveng/v1/auth_pb.ts
43
+ var file_hiveng_v1_auth = /* @__PURE__ */ fileDesc("ChRoaXZlbmcvdjEvYXV0aC5wcm90bxIJaGl2ZW5nLnYxIqwCCgZQbGF5ZXISEQoJcGxheWVyX2lkGAEgASgJEhIKCnByb2plY3RfaWQYAiABKAkSDwoHY291bnRyeRgDIAEoCRIuCglwcm92aWRlcnMYBCADKA4yGy5oaXZlbmcudjEuSWRlbnRpdHlQcm92aWRlchIuCgpjcmVhdGVkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIxCg1sYXN0X2xvZ2luX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIQCghuaWNrbmFtZRgHIAEoCRINCgVlbWFpbBgIIAEoCRI2ChNsYXN0X2xvZ2luX3BsYXRmb3JtGAkgASgOMhkuaGl2ZW5nLnYxLkNsaWVudFBsYXRmb3JtInUKCVRva2VuUGFpchIUCgxhY2Nlc3NfdG9rZW4YASABKAkSFQoNcmVmcmVzaF90b2tlbhgCIAEoCRI7ChdhY2Nlc3NfdG9rZW5fZXhwaXJlc19hdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiWQoWQ291bnRyeVByb3ZpZGVyTWFwcGluZxIPCgdjb3VudHJ5GAEgASgJEi4KCXByb3ZpZGVycxgCIAMoDjIbLmhpdmVuZy52MS5JZGVudGl0eVByb3ZpZGVyImEKGEdldExvZ2luUHJvdmlkZXJzUmVxdWVzdBIYChBjb3VudHJ5X292ZXJyaWRlGAEgASgJEisKCHBsYXRmb3JtGAIgASgOMhkuaGl2ZW5nLnYxLkNsaWVudFBsYXRmb3JtIlwKGUdldExvZ2luUHJvdmlkZXJzUmVzcG9uc2USLgoJcHJvdmlkZXJzGAEgAygOMhsuaGl2ZW5nLnYxLklkZW50aXR5UHJvdmlkZXISDwoHY291bnRyeRgCIAEoCSKOAQoYTG9naW5XaXRoUHJvdmlkZXJSZXF1ZXN0Ei0KCHByb3ZpZGVyGAEgASgOMhsuaGl2ZW5nLnYxLklkZW50aXR5UHJvdmlkZXISFgoOcHJvdmlkZXJfdG9rZW4YAiABKAkSKwoIcGxhdGZvcm0YAyABKA4yGS5oaXZlbmcudjEuQ2xpZW50UGxhdGZvcm0iaAoZTG9naW5XaXRoUHJvdmlkZXJSZXNwb25zZRIhCgZwbGF5ZXIYASABKAsyES5oaXZlbmcudjEuUGxheWVyEigKCnRva2VuX3BhaXIYAiABKAsyFC5oaXZlbmcudjEuVG9rZW5QYWlyIiwKE1JlZnJlc2hUb2tlblJlcXVlc3QSFQoNcmVmcmVzaF90b2tlbhgBIAEoCSJAChRSZWZyZXNoVG9rZW5SZXNwb25zZRIoCgp0b2tlbl9wYWlyGAEgASgLMhQuaGl2ZW5nLnYxLlRva2VuUGFpciIPCg1Mb2dvdXRSZXF1ZXN0IhAKDkxvZ291dFJlc3BvbnNlIhIKEEdldFBsYXllclJlcXVlc3QiNgoRR2V0UGxheWVyUmVzcG9uc2USIQoGcGxheWVyGAEgASgLMhEuaGl2ZW5nLnYxLlBsYXllciIpChVVcGRhdGVOaWNrbmFtZVJlcXVlc3QSEAoIbmlja25hbWUYASABKAkiOwoWVXBkYXRlTmlja25hbWVSZXNwb25zZRIhCgZwbGF5ZXIYASABKAsyES5oaXZlbmcudjEuUGxheWVyIm8KGFNldExvZ2luUHJvdmlkZXJzUmVxdWVzdBISCgpwcm9qZWN0X2lkGAEgASgJEg8KB2NvdW50cnkYAiABKAkSLgoJcHJvdmlkZXJzGAMgAygOMhsuaGl2ZW5nLnYxLklkZW50aXR5UHJvdmlkZXIiGwoZU2V0TG9naW5Qcm92aWRlcnNSZXNwb25zZSI1Ch9HZXRMb2dpblByb3ZpZGVyTWFwcGluZ3NSZXF1ZXN0EhIKCnByb2plY3RfaWQYASABKAkiVwogR2V0TG9naW5Qcm92aWRlck1hcHBpbmdzUmVzcG9uc2USMwoIbWFwcGluZ3MYASADKAsyIS5oaXZlbmcudjEuQ291bnRyeVByb3ZpZGVyTWFwcGluZyJICiFEZWxldGVMb2dpblByb3ZpZGVyTWFwcGluZ1JlcXVlc3QSEgoKcHJvamVjdF9pZBgBIAEoCRIPCgdjb3VudHJ5GAIgASgJIiQKIkRlbGV0ZUxvZ2luUHJvdmlkZXJNYXBwaW5nUmVzcG9uc2UijAEKFFNlYXJjaFBsYXllcnNSZXF1ZXN0EhIKCnByb2plY3RfaWQYASABKAkSDQoFcXVlcnkYAiABKAkSJAoEcGFnZRgDIAEoCzIWLmhpdmVuZy52MS5QYWdlUmVxdWVzdBIrCgVmaWVsZBgEIAEoDjIcLmhpdmVuZy52MS5QbGF5ZXJTZWFyY2hGaWVsZCJiChVTZWFyY2hQbGF5ZXJzUmVzcG9uc2USIgoHcGxheWVycxgBIAMoCzIRLmhpdmVuZy52MS5QbGF5ZXISJQoEcGFnZRgCIAEoCzIXLmhpdmVuZy52MS5QYWdlUmVzcG9uc2UiPwoWR2V0UGxheWVyRGV0YWlsUmVxdWVzdBISCgpwcm9qZWN0X2lkGAEgASgJEhEKCXBsYXllcl9pZBgCIAEoCSI8ChdHZXRQbGF5ZXJEZXRhaWxSZXNwb25zZRIhCgZwbGF5ZXIYASABKAsyES5oaXZlbmcudjEuUGxheWVyKsYCChBJZGVudGl0eVByb3ZpZGVyEiEKHUlERU5USVRZX1BST1ZJREVSX1VOU1BFQ0lGSUVEEAASGwoXSURFTlRJVFlfUFJPVklERVJfS0FLQU8QARIbChdJREVOVElUWV9QUk9WSURFUl9OQVZFUhACEhwKGElERU5USVRZX1BST1ZJREVSX0dPT0dMRRADEh4KGklERU5USVRZX1BST1ZJREVSX0ZBQ0VCT09LEAQSGwoXSURFTlRJVFlfUFJPVklERVJfQVBQTEUQBRIaChZJREVOVElUWV9QUk9WSURFUl9MSU5FEAYSIAocSURFTlRJVFlfUFJPVklERVJfVFJVRUNBTExFUhAHEh8KG0lERU5USVRZX1BST1ZJREVSX1BIT05FX09UUBAIEhsKF0lERU5USVRZX1BST1ZJREVSX0dVRVNUEAkqnQEKDkNsaWVudFBsYXRmb3JtEh8KG0NMSUVOVF9QTEFURk9STV9VTlNQRUNJRklFRBAAEhcKE0NMSUVOVF9QTEFURk9STV9XRUIQARIbChdDTElFTlRfUExBVEZPUk1fQU5EUk9JRBACEhcKE0NMSUVOVF9QTEFURk9STV9JT1MQAxIbChdDTElFTlRfUExBVEZPUk1fREVTS1RPUBAEKpwBChFQbGF5ZXJTZWFyY2hGaWVsZBIjCh9QTEFZRVJfU0VBUkNIX0ZJRUxEX1VOU1BFQ0lGSUVEEAASIQodUExBWUVSX1NFQVJDSF9GSUVMRF9QTEFZRVJfSUQQARIgChxQTEFZRVJfU0VBUkNIX0ZJRUxEX05JQ0tOQU1FEAISHQoZUExBWUVSX1NFQVJDSF9GSUVMRF9FTUFJTBADMvwDCgtBdXRoU2VydmljZRJeChFHZXRMb2dpblByb3ZpZGVycxIjLmhpdmVuZy52MS5HZXRMb2dpblByb3ZpZGVyc1JlcXVlc3QaJC5oaXZlbmcudjEuR2V0TG9naW5Qcm92aWRlcnNSZXNwb25zZRJeChFMb2dpbldpdGhQcm92aWRlchIjLmhpdmVuZy52MS5Mb2dpbldpdGhQcm92aWRlclJlcXVlc3QaJC5oaXZlbmcudjEuTG9naW5XaXRoUHJvdmlkZXJSZXNwb25zZRJPCgxSZWZyZXNoVG9rZW4SHi5oaXZlbmcudjEuUmVmcmVzaFRva2VuUmVxdWVzdBofLmhpdmVuZy52MS5SZWZyZXNoVG9rZW5SZXNwb25zZRI9CgZMb2dvdXQSGC5oaXZlbmcudjEuTG9nb3V0UmVxdWVzdBoZLmhpdmVuZy52MS5Mb2dvdXRSZXNwb25zZRJGCglHZXRQbGF5ZXISGy5oaXZlbmcudjEuR2V0UGxheWVyUmVxdWVzdBocLmhpdmVuZy52MS5HZXRQbGF5ZXJSZXNwb25zZRJVCg5VcGRhdGVOaWNrbmFtZRIgLmhpdmVuZy52MS5VcGRhdGVOaWNrbmFtZVJlcXVlc3QaIS5oaXZlbmcudjEuVXBkYXRlTmlja25hbWVSZXNwb25zZTLtAgobQ29uc29sZUxvZ2luUHJvdmlkZXJTZXJ2aWNlEl4KEVNldExvZ2luUHJvdmlkZXJzEiMuaGl2ZW5nLnYxLlNldExvZ2luUHJvdmlkZXJzUmVxdWVzdBokLmhpdmVuZy52MS5TZXRMb2dpblByb3ZpZGVyc1Jlc3BvbnNlEnMKGEdldExvZ2luUHJvdmlkZXJNYXBwaW5ncxIqLmhpdmVuZy52MS5HZXRMb2dpblByb3ZpZGVyTWFwcGluZ3NSZXF1ZXN0GisuaGl2ZW5nLnYxLkdldExvZ2luUHJvdmlkZXJNYXBwaW5nc1Jlc3BvbnNlEnkKGkRlbGV0ZUxvZ2luUHJvdmlkZXJNYXBwaW5nEiwuaGl2ZW5nLnYxLkRlbGV0ZUxvZ2luUHJvdmlkZXJNYXBwaW5nUmVxdWVzdBotLmhpdmVuZy52MS5EZWxldGVMb2dpblByb3ZpZGVyTWFwcGluZ1Jlc3BvbnNlMsQBChRDb25zb2xlUGxheWVyU2VydmljZRJSCg1TZWFyY2hQbGF5ZXJzEh8uaGl2ZW5nLnYxLlNlYXJjaFBsYXllcnNSZXF1ZXN0GiAuaGl2ZW5nLnYxLlNlYXJjaFBsYXllcnNSZXNwb25zZRJYCg9HZXRQbGF5ZXJEZXRhaWwSIS5oaXZlbmcudjEuR2V0UGxheWVyRGV0YWlsUmVxdWVzdBoiLmhpdmVuZy52MS5HZXRQbGF5ZXJEZXRhaWxSZXNwb25zZUJfCg1jb20uaGl2ZW5nLnYxQglBdXRoUHJvdG9QAaICA0hYWKoCCUhpdmVuZy5WMcoCCUhpdmVuZ1xWMeICFUhpdmVuZ1xWMVxHUEJNZXRhZGF0YeoCCkhpdmVuZzo6VjFiBnByb3RvMw", [file_google_protobuf_timestamp, file_hiveng_v1_common]);
44
+ var IdentityProvider = /* @__PURE__ */ ((IdentityProvider2) => {
45
+ IdentityProvider2[IdentityProvider2["UNSPECIFIED"] = 0] = "UNSPECIFIED";
46
+ IdentityProvider2[IdentityProvider2["KAKAO"] = 1] = "KAKAO";
47
+ IdentityProvider2[IdentityProvider2["NAVER"] = 2] = "NAVER";
48
+ IdentityProvider2[IdentityProvider2["GOOGLE"] = 3] = "GOOGLE";
49
+ IdentityProvider2[IdentityProvider2["FACEBOOK"] = 4] = "FACEBOOK";
50
+ IdentityProvider2[IdentityProvider2["APPLE"] = 5] = "APPLE";
51
+ IdentityProvider2[IdentityProvider2["LINE"] = 6] = "LINE";
52
+ IdentityProvider2[IdentityProvider2["TRUECALLER"] = 7] = "TRUECALLER";
53
+ IdentityProvider2[IdentityProvider2["PHONE_OTP"] = 8] = "PHONE_OTP";
54
+ IdentityProvider2[IdentityProvider2["GUEST"] = 9] = "GUEST";
55
+ return IdentityProvider2;
56
+ })(IdentityProvider || {});
57
+ var AuthService = /* @__PURE__ */ serviceDesc(file_hiveng_v1_auth, 0);
58
+ var HiveNgError = class extends Error {
59
+ code;
60
+ constructor(code, message) {
61
+ super(message);
62
+ this.name = "HiveNgError";
63
+ this.code = code;
64
+ }
65
+ };
66
+ var BannedError = class extends HiveNgError {
67
+ reason;
68
+ until;
69
+ permanent;
70
+ constructor(reason, permanent, until, message) {
71
+ super("PLAYER_BANNED", message);
72
+ this.name = "BannedError";
73
+ this.reason = reason;
74
+ this.permanent = permanent;
75
+ this.until = until;
76
+ }
77
+ };
78
+ var MaintenanceError = class extends HiveNgError {
79
+ startsAt;
80
+ endsAt;
81
+ maintenanceMessage;
82
+ constructor(message, startsAt, endsAt) {
83
+ super("MAINTENANCE_IN_PROGRESS", message);
84
+ this.name = "MaintenanceError";
85
+ this.maintenanceMessage = message;
86
+ this.startsAt = startsAt;
87
+ this.endsAt = endsAt;
88
+ }
89
+ };
90
+ function errorDetailOf(err) {
91
+ if (!(err instanceof ConnectError)) {
92
+ return void 0;
93
+ }
94
+ return err.findDetails(ErrorDetailSchema)[0];
95
+ }
96
+ function errorCodeOf(err) {
97
+ const detail = errorDetailOf(err);
98
+ if (!detail) {
99
+ return 0 /* UNSPECIFIED */;
100
+ }
101
+ return detail.code;
102
+ }
103
+ function errorCodeName(code) {
104
+ return ErrorCode[code] ?? `CODE_${code}`;
105
+ }
106
+ function bannedErrorFrom(detail, message) {
107
+ const meta = detail.metadata;
108
+ const permanent = meta["permanent"] === "true";
109
+ const untilRaw = meta["until"] ?? meta["banned_until"];
110
+ const until = untilRaw === void 0 ? void 0 : new Date(untilRaw);
111
+ return new BannedError(meta["reason"] ?? message, permanent, until, message);
112
+ }
113
+ function maintenanceErrorFrom(detail, message) {
114
+ const meta = detail.metadata;
115
+ const startsAtRaw = meta["starts_at"];
116
+ const endsAtRaw = meta["ends_at"];
117
+ const startsAt = startsAtRaw === void 0 ? void 0 : new Date(startsAtRaw);
118
+ const endsAt = endsAtRaw === void 0 ? void 0 : new Date(endsAtRaw);
119
+ return new MaintenanceError(meta["message"] ?? message, startsAt, endsAt);
120
+ }
121
+ function toHiveNgError(err) {
122
+ const detail = errorDetailOf(err);
123
+ if (!detail) {
124
+ return err;
125
+ }
126
+ const message = err.rawMessage;
127
+ if (detail.code === 200 /* PLAYER_BANNED */) {
128
+ return bannedErrorFrom(detail, message);
129
+ }
130
+ if (detail.code === 100 /* MAINTENANCE_IN_PROGRESS */) {
131
+ return maintenanceErrorFrom(detail, message);
132
+ }
133
+ return new HiveNgError(errorCodeName(detail.code), message);
134
+ }
135
+
136
+ // src/auth.ts
137
+ var PROVIDER_NAMES = {
138
+ [1 /* KAKAO */]: "kakao",
139
+ [2 /* NAVER */]: "naver",
140
+ [3 /* GOOGLE */]: "google",
141
+ [4 /* FACEBOOK */]: "facebook",
142
+ [5 /* APPLE */]: "apple",
143
+ [6 /* LINE */]: "line",
144
+ [7 /* TRUECALLER */]: "truecaller",
145
+ [8 /* PHONE_OTP */]: "phone_otp",
146
+ [9 /* GUEST */]: "guest"
147
+ };
148
+ var PLATFORM_NAMES = {
149
+ [1 /* WEB */]: "web",
150
+ [2 /* ANDROID */]: "android",
151
+ [3 /* IOS */]: "ios"
152
+ };
153
+ function providerName(provider) {
154
+ return PROVIDER_NAMES[provider] ?? "unspecified";
155
+ }
156
+ function platformName(platform) {
157
+ return PLATFORM_NAMES[platform] ?? "unspecified";
158
+ }
159
+ function mapPlayer(message) {
160
+ return {
161
+ playerId: message.playerId,
162
+ projectId: message.projectId,
163
+ country: message.country,
164
+ email: message.email,
165
+ nickname: message.nickname,
166
+ lastLoginPlatform: platformName(message.lastLoginPlatform),
167
+ providers: message.providers.map(providerName),
168
+ createdAt: message.createdAt ? timestampDate(message.createdAt) : void 0,
169
+ lastLoginAt: message.lastLoginAt ? timestampDate(message.lastLoginAt) : void 0
170
+ };
171
+ }
172
+ var AuthApi = class {
173
+ constructor(session) {
174
+ this.session = session;
175
+ }
176
+ session;
177
+ player = null;
178
+ client = null;
179
+ bind(client) {
180
+ this.client = client;
181
+ }
182
+ async getLoginProviders(countryOverride = "") {
183
+ const client = this.requireClient();
184
+ try {
185
+ const res = await client.getLoginProviders({
186
+ countryOverride,
187
+ platform: 1 /* WEB */
188
+ });
189
+ return {
190
+ providers: res.providers.map(providerName),
191
+ country: res.country
192
+ };
193
+ } catch (err) {
194
+ throw toHiveNgError(err);
195
+ }
196
+ }
197
+ // 클라이언트가 Google Sign-In으로 획득한 idToken으로 로그인한다.
198
+ async loginWithGoogle(idToken) {
199
+ if (!idToken) {
200
+ throw new HiveNgError("INVALID_ARGUMENT", "idToken is required");
201
+ }
202
+ return this.login(3 /* GOOGLE */, idToken);
203
+ }
204
+ // 외부 IdP 없이 디바이스 식별자로 게스트 계정에 로그인한다.
205
+ async loginAsGuest(deviceId) {
206
+ if (!deviceId) {
207
+ throw new HiveNgError("INVALID_ARGUMENT", "deviceId is required");
208
+ }
209
+ return this.login(9 /* GUEST */, deviceId);
210
+ }
211
+ // 저장된 토큰으로 세션을 복원한다. 토큰이 없거나 만료·무효면 null.
212
+ async restoreSession() {
213
+ if (this.session.accessToken === null) {
214
+ return null;
215
+ }
216
+ const client = this.requireClient();
217
+ try {
218
+ return await this.fetchPlayer(client);
219
+ } catch {
220
+ return null;
221
+ }
222
+ }
223
+ async getPlayer() {
224
+ if (this.session.accessToken === null) {
225
+ return null;
226
+ }
227
+ const client = this.requireClient();
228
+ try {
229
+ return await this.fetchPlayer(client);
230
+ } catch (err) {
231
+ throw toHiveNgError(err);
232
+ }
233
+ }
234
+ async logout() {
235
+ const client = this.requireClient();
236
+ if (this.session.accessToken !== null) {
237
+ try {
238
+ await client.logout({});
239
+ } catch {
240
+ }
241
+ }
242
+ this.session.clear();
243
+ this.player = null;
244
+ }
245
+ currentPlayer() {
246
+ return this.player;
247
+ }
248
+ clearPlayer() {
249
+ this.player = null;
250
+ }
251
+ async login(provider, providerToken) {
252
+ const client = this.requireClient();
253
+ try {
254
+ const res = await client.loginWithProvider({
255
+ provider,
256
+ providerToken,
257
+ platform: 1 /* WEB */
258
+ });
259
+ if (!res.player || !res.tokenPair) {
260
+ throw new HiveNgError("INTERNAL", "login response missing player or token pair");
261
+ }
262
+ this.session.save(res.tokenPair);
263
+ this.player = mapPlayer(res.player);
264
+ return this.player;
265
+ } catch (err) {
266
+ throw toHiveNgError(err);
267
+ }
268
+ }
269
+ async fetchPlayer(client) {
270
+ const res = await client.getPlayer({});
271
+ if (!res.player) {
272
+ return null;
273
+ }
274
+ this.player = mapPlayer(res.player);
275
+ return this.player;
276
+ }
277
+ requireClient() {
278
+ if (this.client === null) {
279
+ throw new HiveNgError("FAILED_PRECONDITION", "HiveNg not initialized \u2014 call init() first");
280
+ }
281
+ return this.client;
282
+ }
283
+ };
284
+
285
+ // src/config.ts
286
+ function trimTrailingSlash(url) {
287
+ return url.replace(/\/+$/, "");
288
+ }
289
+ function defaultLanguage() {
290
+ if (typeof navigator !== "undefined" && navigator.language) {
291
+ return navigator.language;
292
+ }
293
+ return "en";
294
+ }
295
+ function resolveConfig(config) {
296
+ const gatewayUrl = trimTrailingSlash(config.gatewayUrl ?? "");
297
+ const projectId = config.projectId?.trim() ?? "";
298
+ if (gatewayUrl === "") {
299
+ throw new HiveNgError("INVALID_ARGUMENT", "gatewayUrl is required");
300
+ }
301
+ if (!config.apiKey) {
302
+ throw new HiveNgError("INVALID_ARGUMENT", "apiKey is required");
303
+ }
304
+ if (projectId === "") {
305
+ throw new HiveNgError("INVALID_ARGUMENT", "projectId is required");
306
+ }
307
+ return {
308
+ gatewayUrl,
309
+ projectId,
310
+ apiKey: config.apiKey,
311
+ clientVersion: config.clientVersion ?? "",
312
+ language: config.language ?? defaultLanguage(),
313
+ debug: config.debug ?? false,
314
+ persistSession: config.persistSession ?? false
315
+ };
316
+ }
317
+ var file_hiveng_v1_discovery = /* @__PURE__ */ fileDesc("ChloaXZlbmcvdjEvZGlzY292ZXJ5LnByb3RvEgloaXZlbmcudjEiMQoNRW5kcG9pbnRFbnRyeRIOCgZkb21haW4YASABKAkSEAoIYmFzZV91cmwYAiABKAkiXAoXUmVzb2x2ZUVuZHBvaW50c1JlcXVlc3QSFgoOY2xpZW50X3ZlcnNpb24YASABKAkSEgoKcHJvamVjdF9pZBgFIAEoCUoECAIQA1IPcmVnaW9uX292ZXJyaWRlIpsBChhSZXNvbHZlRW5kcG9pbnRzUmVzcG9uc2USKwoJZW5kcG9pbnRzGAEgAygLMhguaGl2ZW5nLnYxLkVuZHBvaW50RW50cnkSLwoLc2VydmVyX3RpbWUYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhMKC3R0bF9zZWNvbmRzGAQgASgFSgQIAhADUgZyZWdpb24ybwoQRGlzY292ZXJ5U2VydmljZRJbChBSZXNvbHZlRW5kcG9pbnRzEiIuaGl2ZW5nLnYxLlJlc29sdmVFbmRwb2ludHNSZXF1ZXN0GiMuaGl2ZW5nLnYxLlJlc29sdmVFbmRwb2ludHNSZXNwb25zZUJkCg1jb20uaGl2ZW5nLnYxQg5EaXNjb3ZlcnlQcm90b1ABogIDSFhYqgIJSGl2ZW5nLlYxygIJSGl2ZW5nXFYx4gIVSGl2ZW5nXFYxXEdQQk1ldGFkYXRh6gIKSGl2ZW5nOjpWMWIGcHJvdG8z", [file_google_protobuf_timestamp]);
318
+ var DiscoveryService = /* @__PURE__ */ serviceDesc(file_hiveng_v1_discovery, 0);
319
+
320
+ // src/discovery.ts
321
+ async function resolveEndpoints(transport, clientVersion, projectId) {
322
+ const client = createClient(DiscoveryService, transport);
323
+ const res = await client.resolveEndpoints({ clientVersion, projectId });
324
+ const endpoints = /* @__PURE__ */ new Map();
325
+ for (const entry of res.endpoints) {
326
+ endpoints.set(entry.domain, entry.baseUrl);
327
+ }
328
+ return { endpoints, ttlSeconds: res.ttlSeconds };
329
+ }
330
+ function requireEndpoint(endpoints, domain) {
331
+ const base = endpoints.get(domain);
332
+ if (base === void 0 || base === "") {
333
+ throw new HiveNgError("NOT_FOUND", `discovery returned no endpoint for domain: ${domain}`);
334
+ }
335
+ return base;
336
+ }
337
+ var file_hiveng_v1_mailbox = /* @__PURE__ */ fileDesc("ChdoaXZlbmcvdjEvbWFpbGJveC5wcm90bxIJaGl2ZW5nLnYxIpoFCgRNYWlsEgoKAmlkGAEgASgJEg8KB21haWxfaWQYAiABKAkSEgoKcHJvamVjdF9pZBgDIAEoCRIhCgR0eXBlGAQgASgOMhMuaGl2ZW5nLnYxLk1haWxUeXBlEikKBXRpdGxlGAUgAygLMhouaGl2ZW5nLnYxLk1haWwuVGl0bGVFbnRyeRInCgRib2R5GAYgAygLMhkuaGl2ZW5nLnYxLk1haWwuQm9keUVudHJ5Eg4KBnNlbmRlchgHIAEoCRI6Cg5yZXdhcmRfcHJldmlldxgIIAMoCzIiLmhpdmVuZy52MS5NYWlsLlJld2FyZFByZXZpZXdFbnRyeRIPCgdjbGFpbWVkGAkgASgIEjIKDmNsYWltYWJsZV9mcm9tGAogASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgpleHBpcmVzX2F0GAsgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgpjbGFpbWVkX2F0GAwgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgpjcmVhdGVkX2F0GA0gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI4Cg5yZXdhcmRfZGlzcGxheRgOIAMoCzIgLmhpdmVuZy52MS5NYWlsUmV3YXJkRGlzcGxheUl0ZW0aLAoKVGl0bGVFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGisKCUJvZHlFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGjQKElJld2FyZFByZXZpZXdFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIkYKFU1haWxSZXdhcmREaXNwbGF5SXRlbRIMCgRpY29uGAEgASgJEg0KBWxhYmVsGAIgASgJEhAKCHF1YW50aXR5GAMgASgJIskFCgtDb25zb2xlTWFpbBIKCgJpZBgBIAEoCRISCgpwcm9qZWN0X2lkGAIgASgJEiEKBHR5cGUYAyABKA4yEy5oaXZlbmcudjEuTWFpbFR5cGUSKQoIYXVkaWVuY2UYBCABKA4yFy5oaXZlbmcudjEuTWFpbEF1ZGllbmNlEjAKBXRpdGxlGAUgAygLMiEuaGl2ZW5nLnYxLkNvbnNvbGVNYWlsLlRpdGxlRW50cnkSLgoEYm9keRgGIAMoCzIgLmhpdmVuZy52MS5Db25zb2xlTWFpbC5Cb2R5RW50cnkSDgoGc2VuZGVyGAcgASgJEhYKDnJld2FyZF9wYXlsb2FkGAggASgJEkEKDnJld2FyZF9wcmV2aWV3GAkgAygLMikuaGl2ZW5nLnYxLkNvbnNvbGVNYWlsLlJld2FyZFByZXZpZXdFbnRyeRIZChF0YXJnZXRfcGxheWVyX2lkcxgKIAMoCRIyCg5jbGFpbWFibGVfZnJvbRgLIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLgoKZXhwaXJlc19hdBgMIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLgoKY3JlYXRlZF9hdBgNIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLgoKdXBkYXRlZF9hdBgOIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASDwoHZGVsZXRlZBgPIAEoCBosCgpUaXRsZUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaKwoJQm9keUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaNAoSUmV3YXJkUHJldmlld0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiUAoPTGlzdE1haWxSZXF1ZXN0EiQKBHBhZ2UYASABKAsyFi5oaXZlbmcudjEuUGFnZVJlcXVlc3QSFwoPaW5jbHVkZV9jbGFpbWVkGAIgASgIIlgKEExpc3RNYWlsUmVzcG9uc2USHQoEbWFpbBgBIAMoCzIPLmhpdmVuZy52MS5NYWlsEiUKBHBhZ2UYAiABKAsyFy5oaXZlbmcudjEuUGFnZVJlc3BvbnNlIhUKE0NoZWNrTmV3TWFpbFJlcXVlc3QiQgoUQ2hlY2tOZXdNYWlsUmVzcG9uc2USFAoMaGFzX25ld19tYWlsGAEgASgIEhQKDHVucmVhZF9jb3VudBgCIAEoAyItChBDbGFpbU1haWxSZXF1ZXN0EhkKEW1haWxfcmVjaXBpZW50X2lkGAEgASgJIjIKEUNsYWltTWFpbFJlc3BvbnNlEh0KBG1haWwYASABKAsyDy5oaXZlbmcudjEuTWFpbCLkBAoRQ3JlYXRlTWFpbFJlcXVlc3QSEgoKcHJvamVjdF9pZBgBIAEoCRIhCgR0eXBlGAIgASgOMhMuaGl2ZW5nLnYxLk1haWxUeXBlEikKCGF1ZGllbmNlGAMgASgOMhcuaGl2ZW5nLnYxLk1haWxBdWRpZW5jZRI2CgV0aXRsZRgEIAMoCzInLmhpdmVuZy52MS5DcmVhdGVNYWlsUmVxdWVzdC5UaXRsZUVudHJ5EjQKBGJvZHkYBSADKAsyJi5oaXZlbmcudjEuQ3JlYXRlTWFpbFJlcXVlc3QuQm9keUVudHJ5Eg4KBnNlbmRlchgGIAEoCRIWCg5yZXdhcmRfcGF5bG9hZBgHIAEoCRJHCg5yZXdhcmRfcHJldmlldxgIIAMoCzIvLmhpdmVuZy52MS5DcmVhdGVNYWlsUmVxdWVzdC5SZXdhcmRQcmV2aWV3RW50cnkSGQoRdGFyZ2V0X3BsYXllcl9pZHMYCSADKAkSMgoOY2xhaW1hYmxlX2Zyb20YCiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCmV4cGlyZXNfYXQYCyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wGiwKClRpdGxlRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARorCglCb2R5RW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARo0ChJSZXdhcmRQcmV2aWV3RW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASI6ChJDcmVhdGVNYWlsUmVzcG9uc2USJAoEbWFpbBgBIAEoCzIWLmhpdmVuZy52MS5Db25zb2xlTWFpbCL1BAoRVXBkYXRlTWFpbFJlcXVlc3QSEgoKcHJvamVjdF9pZBgBIAEoCRIPCgdtYWlsX2lkGAIgASgJEiEKBHR5cGUYAyABKA4yEy5oaXZlbmcudjEuTWFpbFR5cGUSKQoIYXVkaWVuY2UYBCABKA4yFy5oaXZlbmcudjEuTWFpbEF1ZGllbmNlEjYKBXRpdGxlGAUgAygLMicuaGl2ZW5nLnYxLlVwZGF0ZU1haWxSZXF1ZXN0LlRpdGxlRW50cnkSNAoEYm9keRgGIAMoCzImLmhpdmVuZy52MS5VcGRhdGVNYWlsUmVxdWVzdC5Cb2R5RW50cnkSDgoGc2VuZGVyGAcgASgJEhYKDnJld2FyZF9wYXlsb2FkGAggASgJEkcKDnJld2FyZF9wcmV2aWV3GAkgAygLMi8uaGl2ZW5nLnYxLlVwZGF0ZU1haWxSZXF1ZXN0LlJld2FyZFByZXZpZXdFbnRyeRIZChF0YXJnZXRfcGxheWVyX2lkcxgKIAMoCRIyCg5jbGFpbWFibGVfZnJvbRgLIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLgoKZXhwaXJlc19hdBgMIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAaLAoKVGl0bGVFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGisKCUJvZHlFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGjQKElJld2FyZFByZXZpZXdFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBIjoKElVwZGF0ZU1haWxSZXNwb25zZRIkCgRtYWlsGAEgASgLMhYuaGl2ZW5nLnYxLkNvbnNvbGVNYWlsIjgKEURlbGV0ZU1haWxSZXF1ZXN0EhIKCnByb2plY3RfaWQYASABKAkSDwoHbWFpbF9pZBgCIAEoCSIUChJEZWxldGVNYWlsUmVzcG9uc2UiNQoOR2V0TWFpbFJlcXVlc3QSEgoKcHJvamVjdF9pZBgBIAEoCRIPCgdtYWlsX2lkGAIgASgJIjcKD0dldE1haWxSZXNwb25zZRIkCgRtYWlsGAEgASgLMhYuaGl2ZW5nLnYxLkNvbnNvbGVNYWlsIrMBChBMaXN0TWFpbHNSZXF1ZXN0EhIKCnByb2plY3RfaWQYASABKAkSJAoEcGFnZRgCIAEoCzIWLmhpdmVuZy52MS5QYWdlUmVxdWVzdBIhCgR0eXBlGAMgASgOMhMuaGl2ZW5nLnYxLk1haWxUeXBlEikKCGF1ZGllbmNlGAQgASgOMhcuaGl2ZW5nLnYxLk1haWxBdWRpZW5jZRIXCg9pbmNsdWRlX2RlbGV0ZWQYBSABKAgiYAoRTGlzdE1haWxzUmVzcG9uc2USJAoEbWFpbBgBIAMoCzIWLmhpdmVuZy52MS5Db25zb2xlTWFpbBIlCgRwYWdlGAIgASgLMhcuaGl2ZW5nLnYxLlBhZ2VSZXNwb25zZSpNCghNYWlsVHlwZRIZChVNQUlMX1RZUEVfVU5TUEVDSUZJRUQQABISCg5NQUlMX1RZUEVfVEVYVBABEhIKDk1BSUxfVFlQRV9JVEVNEAIqYgoMTWFpbEF1ZGllbmNlEh0KGU1BSUxfQVVESUVOQ0VfVU5TUEVDSUZJRUQQABIVChFNQUlMX0FVRElFTkNFX0FMTBABEhwKGE1BSUxfQVVESUVOQ0VfSU5ESVZJRFVBTBACMu4BCg5NYWlsYm94U2VydmljZRJDCghMaXN0TWFpbBIaLmhpdmVuZy52MS5MaXN0TWFpbFJlcXVlc3QaGy5oaXZlbmcudjEuTGlzdE1haWxSZXNwb25zZRJPCgxDaGVja05ld01haWwSHi5oaXZlbmcudjEuQ2hlY2tOZXdNYWlsUmVxdWVzdBofLmhpdmVuZy52MS5DaGVja05ld01haWxSZXNwb25zZRJGCglDbGFpbU1haWwSGy5oaXZlbmcudjEuQ2xhaW1NYWlsUmVxdWVzdBocLmhpdmVuZy52MS5DbGFpbU1haWxSZXNwb25zZTKCAwoVQ29uc29sZU1haWxib3hTZXJ2aWNlEkkKCkNyZWF0ZU1haWwSHC5oaXZlbmcudjEuQ3JlYXRlTWFpbFJlcXVlc3QaHS5oaXZlbmcudjEuQ3JlYXRlTWFpbFJlc3BvbnNlEkkKClVwZGF0ZU1haWwSHC5oaXZlbmcudjEuVXBkYXRlTWFpbFJlcXVlc3QaHS5oaXZlbmcudjEuVXBkYXRlTWFpbFJlc3BvbnNlEkkKCkRlbGV0ZU1haWwSHC5oaXZlbmcudjEuRGVsZXRlTWFpbFJlcXVlc3QaHS5oaXZlbmcudjEuRGVsZXRlTWFpbFJlc3BvbnNlEkAKB0dldE1haWwSGS5oaXZlbmcudjEuR2V0TWFpbFJlcXVlc3QaGi5oaXZlbmcudjEuR2V0TWFpbFJlc3BvbnNlEkYKCUxpc3RNYWlscxIbLmhpdmVuZy52MS5MaXN0TWFpbHNSZXF1ZXN0GhwuaGl2ZW5nLnYxLkxpc3RNYWlsc1Jlc3BvbnNlQmIKDWNvbS5oaXZlbmcudjFCDE1haWxib3hQcm90b1ABogIDSFhYqgIJSGl2ZW5nLlYxygIJSGl2ZW5nXFYx4gIVSGl2ZW5nXFYxXEdQQk1ldGFkYXRh6gIKSGl2ZW5nOjpWMWIGcHJvdG8z", [file_google_protobuf_timestamp, file_hiveng_v1_common]);
338
+ var MailType = /* @__PURE__ */ ((MailType2) => {
339
+ MailType2[MailType2["UNSPECIFIED"] = 0] = "UNSPECIFIED";
340
+ MailType2[MailType2["TEXT"] = 1] = "TEXT";
341
+ MailType2[MailType2["ITEM"] = 2] = "ITEM";
342
+ return MailType2;
343
+ })(MailType || {});
344
+ var MailboxService = /* @__PURE__ */ serviceDesc(file_hiveng_v1_mailbox, 0);
345
+ var file_hiveng_v1_notice = /* @__PURE__ */ fileDesc("ChZoaXZlbmcvdjEvbm90aWNlLnByb3RvEgloaXZlbmcudjEi2gMKBk5vdGljZRIKCgJpZBgBIAEoCRISCgpwcm9qZWN0X2lkGAIgASgJEisKBXRpdGxlGAQgAygLMhwuaGl2ZW5nLnYxLk5vdGljZS5UaXRsZUVudHJ5EikKBGJvZHkYBSADKAsyGy5oaXZlbmcudjEuTm90aWNlLkJvZHlFbnRyeRItCglzdGFydHNfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEisKB2VuZHNfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCmNyZWF0ZWRfYXQYCiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYCyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhIKCnZpZXdfY291bnQYDCABKAMaLAoKVGl0bGVFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBGisKCUJvZHlFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBSgQIAxAESgQICBAJSgQICRAKUgR0eXBlUgljb3VudHJpZXNSCnNvcnRfb3JkZXIigQMKE0NyZWF0ZU5vdGljZVJlcXVlc3QSEgoKcHJvamVjdF9pZBgBIAEoCRI4CgV0aXRsZRgDIAMoCzIpLmhpdmVuZy52MS5DcmVhdGVOb3RpY2VSZXF1ZXN0LlRpdGxlRW50cnkSNgoEYm9keRgEIAMoCzIoLmhpdmVuZy52MS5DcmVhdGVOb3RpY2VSZXF1ZXN0LkJvZHlFbnRyeRItCglzdGFydHNfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEisKB2VuZHNfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wGiwKClRpdGxlRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ARorCglCb2R5RW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4AUoECAIQA0oECAcQCEoECAgQCVIEdHlwZVIJY291bnRyaWVzUgpzb3J0X29yZGVyIjkKFENyZWF0ZU5vdGljZVJlc3BvbnNlEiEKBm5vdGljZRgBIAEoCzIRLmhpdmVuZy52MS5Ob3RpY2UilAMKE1VwZGF0ZU5vdGljZVJlcXVlc3QSEgoKcHJvamVjdF9pZBgBIAEoCRIRCglub3RpY2VfaWQYAiABKAkSOAoFdGl0bGUYBCADKAsyKS5oaXZlbmcudjEuVXBkYXRlTm90aWNlUmVxdWVzdC5UaXRsZUVudHJ5EjYKBGJvZHkYBSADKAsyKC5oaXZlbmcudjEuVXBkYXRlTm90aWNlUmVxdWVzdC5Cb2R5RW50cnkSLQoJc3RhcnRzX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIrCgdlbmRzX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBosCgpUaXRsZUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEaKwoJQm9keUVudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAFKBAgDEARKBAgIEAlKBAgJEApSBHR5cGVSCWNvdW50cmllc1IKc29ydF9vcmRlciI5ChRVcGRhdGVOb3RpY2VSZXNwb25zZRIhCgZub3RpY2UYASABKAsyES5oaXZlbmcudjEuTm90aWNlIjwKE0RlbGV0ZU5vdGljZVJlcXVlc3QSEgoKcHJvamVjdF9pZBgBIAEoCRIRCglub3RpY2VfaWQYAiABKAkiFgoURGVsZXRlTm90aWNlUmVzcG9uc2UiTgoSTGlzdE5vdGljZXNSZXF1ZXN0EhIKCnByb2plY3RfaWQYASABKAkSJAoEcGFnZRgCIAEoCzIWLmhpdmVuZy52MS5QYWdlUmVxdWVzdCJgChNMaXN0Tm90aWNlc1Jlc3BvbnNlEiIKB25vdGljZXMYASADKAsyES5oaXZlbmcudjEuTm90aWNlEiUKBHBhZ2UYAiABKAsyFy5oaXZlbmcudjEuUGFnZVJlc3BvbnNlIjIKGExpc3RBY3RpdmVOb3RpY2VzUmVxdWVzdEoECAEQAlIQY291bnRyeV9vdmVycmlkZSI/ChlMaXN0QWN0aXZlTm90aWNlc1Jlc3BvbnNlEiIKB25vdGljZXMYASADKAsyES5oaXZlbmcudjEuTm90aWNlMtcCChRDb25zb2xlTm90aWNlU2VydmljZRJPCgxDcmVhdGVOb3RpY2USHi5oaXZlbmcudjEuQ3JlYXRlTm90aWNlUmVxdWVzdBofLmhpdmVuZy52MS5DcmVhdGVOb3RpY2VSZXNwb25zZRJPCgxVcGRhdGVOb3RpY2USHi5oaXZlbmcudjEuVXBkYXRlTm90aWNlUmVxdWVzdBofLmhpdmVuZy52MS5VcGRhdGVOb3RpY2VSZXNwb25zZRJPCgxEZWxldGVOb3RpY2USHi5oaXZlbmcudjEuRGVsZXRlTm90aWNlUmVxdWVzdBofLmhpdmVuZy52MS5EZWxldGVOb3RpY2VSZXNwb25zZRJMCgtMaXN0Tm90aWNlcxIdLmhpdmVuZy52MS5MaXN0Tm90aWNlc1JlcXVlc3QaHi5oaXZlbmcudjEuTGlzdE5vdGljZXNSZXNwb25zZTJvCg1Ob3RpY2VTZXJ2aWNlEl4KEUxpc3RBY3RpdmVOb3RpY2VzEiMuaGl2ZW5nLnYxLkxpc3RBY3RpdmVOb3RpY2VzUmVxdWVzdBokLmhpdmVuZy52MS5MaXN0QWN0aXZlTm90aWNlc1Jlc3BvbnNlQmEKDWNvbS5oaXZlbmcudjFCC05vdGljZVByb3RvUAGiAgNIWFiqAglIaXZlbmcuVjHKAglIaXZlbmdcVjHiAhVIaXZlbmdcVjFcR1BCTWV0YWRhdGHqAgpIaXZlbmc6OlYxYgZwcm90bzM", [file_google_protobuf_timestamp, file_hiveng_v1_common]);
346
+ var NoticeService = /* @__PURE__ */ serviceDesc(file_hiveng_v1_notice, 1);
347
+ var file_hiveng_v1_payment = /* @__PURE__ */ fileDesc("ChdoaXZlbmcvdjEvcGF5bWVudC5wcm90bxIJaGl2ZW5nLnYxIogHCghQdXJjaGFzZRIKCgJpZBgBIAEoCRISCgpwcm9qZWN0X2lkGAIgASgJEhEKCXBsYXllcl9pZBgDIAEoCRIhCgZtYXJrZXQYBCABKA4yES5oaXZlbmcudjEuTWFya2V0EhIKCnByb2R1Y3RfaWQYBSABKAkSFAoMYW1vdW50X21pbm9yGAYgASgDEhAKCGN1cnJlbmN5GAcgASgJEikKBnN0YXR1cxgIIAEoDjIZLmhpdmVuZy52MS5QdXJjaGFzZVN0YXR1cxIwCgxwdXJjaGFzZWRfYXQYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KC3ZlcmlmaWVkX2F0GAogASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgpjcmVhdGVkX2F0GAsgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIsCgxwcm9kdWN0X3R5cGUYDCABKA4yFi5oaXZlbmcudjEuUHJvZHVjdFR5cGUSFAoMcGFja2FnZV9uYW1lGA0gASgJEhcKD21hcmtldF9vcmRlcl9pZBgOIAEoCRIbChNwdXJjaGFzZV90b2tlbl9oYXNoGA8gASgJEhYKDmZhaWx1cmVfcmVhc29uGBAgASgJEhsKE3Jhd19tYXJrZXRfcmVzcG9uc2UYESABKAkSMAoMcmVxdWVzdGVkX2F0GBIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GBMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIaChJwdXJjaGFzZV9pbnRlbnRfaWQYFCABKAkSNwoOY29uc3VtZV9wb2xpY3kYFSABKA4yHy5oaXZlbmcudjEuUGF5bWVudENvbnN1bWVQb2xpY3kSFgoOY29uc3VtZV9zdGF0dXMYFiABKAkSLwoLY29uc3VtZWRfYXQYFyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KCmdyYW50X21vZGUYGCABKA4yGy5oaXZlbmcudjEuUGF5bWVudEdyYW50TW9kZRIUCgxncmFudF9zdGF0dXMYGSABKAkSNgoSZ3JhbnRfZGVsaXZlcmVkX2F0GBogASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKYBAoMU3Vic2NyaXB0aW9uEgoKAmlkGAEgASgJEhIKCnByb2plY3RfaWQYAiABKAkSEQoJcGxheWVyX2lkGAMgASgJEiEKBm1hcmtldBgEIAEoDjIRLmhpdmVuZy52MS5NYXJrZXQSEgoKcHJvZHVjdF9pZBgFIAEoCRIUCgxwYWNrYWdlX25hbWUYBiABKAkSGwoTcHVyY2hhc2VfdG9rZW5faGFzaBgHIAEoCRIXCg9tYXJrZXRfb3JkZXJfaWQYCCABKAkSLQoGc3RhdHVzGAkgASgOMh0uaGl2ZW5nLnYxLlN1YnNjcmlwdGlvblN0YXR1cxIVCg1hdXRvX3JlbmV3aW5nGAogASgIEi4KCnN0YXJ0ZWRfYXQYCyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCmV4cGlyZXNfYXQYDCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi8KC3ZlcmlmaWVkX2F0GA0gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgpjcmVhdGVkX2F0GA4gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GA8gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIbChNyYXdfbWFya2V0X3Jlc3BvbnNlGBAgASgJIswCCg9QYXltZW50U2V0dGluZ3MSEgoKcHJvamVjdF9pZBgBIAEoCRIkChhnb29nbGVfcGxheV9wYWNrYWdlX25hbWUYAiABKAlCAhgBEikKIWdvb2dsZV9wbGF5X2NyZWRlbnRpYWxfY29uZmlndXJlZBgDIAEoCBIuCgpjcmVhdGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI4Cg9tYXJrZXRfc2V0dGluZ3MYBiADKAsyHy5oaXZlbmcudjEuUGF5bWVudE1hcmtldFNldHRpbmcSOgoQcHJvZHVjdF9zZXR0aW5ncxgHIAMoCzIgLmhpdmVuZy52MS5QYXltZW50UHJvZHVjdFNldHRpbmciiwIKFFBheW1lbnRNYXJrZXRTZXR0aW5nEhIKCnByb2plY3RfaWQYASABKAkSIQoGbWFya2V0GAIgASgOMhEuaGl2ZW5nLnYxLk1hcmtldBIWCg5hcHBfaWRlbnRpZmllchgDIAEoCRIUCgxkaXNwbGF5X25hbWUYBCABKAkSDwoHZW5hYmxlZBgFIAEoCBIdChVjcmVkZW50aWFsX2NvbmZpZ3VyZWQYBiABKAgSLgoKY3JlYXRlZF9hdBgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLgoKdXBkYXRlZF9hdBgIIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAigwMKFVBheW1lbnRQcm9kdWN0U2V0dGluZxISCgpwcm9qZWN0X2lkGAEgASgJEiEKBm1hcmtldBgCIAEoDjIRLmhpdmVuZy52MS5NYXJrZXQSFgoOYXBwX2lkZW50aWZpZXIYAyABKAkSEgoKcHJvZHVjdF9pZBgEIAEoCRIsCgxwcm9kdWN0X3R5cGUYBSABKA4yFi5oaXZlbmcudjEuUHJvZHVjdFR5cGUSNwoOY29uc3VtZV9wb2xpY3kYBiABKA4yHy5oaXZlbmcudjEuUGF5bWVudENvbnN1bWVQb2xpY3kSLwoKZ3JhbnRfbW9kZRgHIAEoDjIbLmhpdmVuZy52MS5QYXltZW50R3JhbnRNb2RlEg8KB2VuYWJsZWQYCCABKAgSLgoKY3JlYXRlZF9hdBgJIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLgoKdXBkYXRlZF9hdBgKIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAi7QMKDlBheW1lbnRQcm9kdWN0EhIKCnByb2plY3RfaWQYASABKAkSIQoGbWFya2V0GAIgASgOMhEuaGl2ZW5nLnYxLk1hcmtldBIWCg5hcHBfaWRlbnRpZmllchgDIAEoCRISCgpwcm9kdWN0X2lkGAQgASgJEiwKDHByb2R1Y3RfdHlwZRgFIAEoDjIWLmhpdmVuZy52MS5Qcm9kdWN0VHlwZRIVCg1tYXJrZXRfc3RhdHVzGAYgASgJEg0KBXRpdGxlGAcgASgJEhMKC2Rlc2NyaXB0aW9uGAggASgJEjcKDmNvbnN1bWVfcG9saWN5GAkgASgOMh8uaGl2ZW5nLnYxLlBheW1lbnRDb25zdW1lUG9saWN5Ei8KCmdyYW50X21vZGUYCiABKA4yGy5oaXZlbmcudjEuUGF5bWVudEdyYW50TW9kZRIPCgdlbmFibGVkGAsgASgIEjQKEGxhc3RfaW1wb3J0ZWRfYXQYDCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCmNyZWF0ZWRfYXQYDSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYDiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIn4KE0xpc3RQcm9kdWN0c1JlcXVlc3QSIQoGbWFya2V0GAEgASgOMhEuaGl2ZW5nLnYxLk1hcmtldBIWCg5hcHBfaWRlbnRpZmllchgCIAEoCRIsCgxwcm9kdWN0X3R5cGUYAyABKA4yFi5oaXZlbmcudjEuUHJvZHVjdFR5cGUiQwoUTGlzdFByb2R1Y3RzUmVzcG9uc2USKwoIcHJvZHVjdHMYASADKAsyGS5oaXZlbmcudjEuUGF5bWVudFByb2R1Y3QikwEKFFN0YXJ0UHVyY2hhc2VSZXF1ZXN0EiEKBm1hcmtldBgBIAEoDjIRLmhpdmVuZy52MS5NYXJrZXQSEgoKcHJvZHVjdF9pZBgCIAEoCRIsCgxwcm9kdWN0X3R5cGUYAyABKA4yFi5oaXZlbmcudjEuUHJvZHVjdFR5cGUSFgoOYXBwX2lkZW50aWZpZXIYBCABKAkiMwoVU3RhcnRQdXJjaGFzZVJlc3BvbnNlEhoKEnB1cmNoYXNlX2ludGVudF9pZBgBIAEoCSL7AQoVVmVyaWZ5UHVyY2hhc2VSZXF1ZXN0EiEKBm1hcmtldBgBIAEoDjIRLmhpdmVuZy52MS5NYXJrZXQSFwoPcmVjZWlwdF9wYXlsb2FkGAIgASgJEhIKCnByb2R1Y3RfaWQYAyABKAkSLAoMcHJvZHVjdF90eXBlGAQgASgOMhYuaGl2ZW5nLnYxLlByb2R1Y3RUeXBlEhYKDnB1cmNoYXNlX3Rva2VuGAUgASgJEhgKDHBhY2thZ2VfbmFtZRgGIAEoCUICGAESFgoOYXBwX2lkZW50aWZpZXIYByABKAkSGgoScHVyY2hhc2VfaW50ZW50X2lkGAggASgJIj8KFlZlcmlmeVB1cmNoYXNlUmVzcG9uc2USJQoIcHVyY2hhc2UYASABKAsyEy5oaXZlbmcudjEuUHVyY2hhc2UiNwogUGF5bWVudFNlcnZpY2VHZXRQdXJjaGFzZVJlcXVlc3QSEwoLcHVyY2hhc2VfaWQYASABKAkiSgohUGF5bWVudFNlcnZpY2VHZXRQdXJjaGFzZVJlc3BvbnNlEiUKCHB1cmNoYXNlGAEgASgLMhMuaGl2ZW5nLnYxLlB1cmNoYXNlImAKI0NvbmZpcm1QYXltZW50R3JhbnREZWxpdmVyZWRSZXF1ZXN0EhIKCnByb2plY3RfaWQYASABKAkSEwoLcHVyY2hhc2VfaWQYAiABKAkSEAoIZXZlbnRfaWQYAyABKAkiTQokQ29uZmlybVBheW1lbnRHcmFudERlbGl2ZXJlZFJlc3BvbnNlEiUKCHB1cmNoYXNlGAEgASgLMhMuaGl2ZW5nLnYxLlB1cmNoYXNlIi8KGUdldFBheW1lbnRTZXR0aW5nc1JlcXVlc3QSEgoKcHJvamVjdF9pZBgBIAEoCSJKChpHZXRQYXltZW50U2V0dGluZ3NSZXNwb25zZRIsCghzZXR0aW5ncxgBIAEoCzIaLmhpdmVuZy52MS5QYXltZW50U2V0dGluZ3MiVQoZU2V0UGF5bWVudFNldHRpbmdzUmVxdWVzdBISCgpwcm9qZWN0X2lkGAEgASgJEiQKGGdvb2dsZV9wbGF5X3BhY2thZ2VfbmFtZRgCIAEoCUICGAEiSgoaU2V0UGF5bWVudFNldHRpbmdzUmVzcG9uc2USLAoIc2V0dGluZ3MYASABKAsyGi5oaXZlbmcudjEuUGF5bWVudFNldHRpbmdzIqoBCiFVcHNlcnRQYXltZW50TWFya2V0U2V0dGluZ1JlcXVlc3QSEgoKcHJvamVjdF9pZBgBIAEoCRIhCgZtYXJrZXQYAiABKA4yES5oaXZlbmcudjEuTWFya2V0EhYKDmFwcF9pZGVudGlmaWVyGAMgASgJEhQKDGRpc3BsYXlfbmFtZRgEIAEoCRIUCgdlbmFibGVkGAUgASgISACIAQFCCgoIX2VuYWJsZWQiUgoiVXBzZXJ0UGF5bWVudE1hcmtldFNldHRpbmdSZXNwb25zZRIsCghzZXR0aW5ncxgBIAEoCzIaLmhpdmVuZy52MS5QYXltZW50U2V0dGluZ3MiwQIKIlVwc2VydFBheW1lbnRQcm9kdWN0U2V0dGluZ1JlcXVlc3QSEgoKcHJvamVjdF9pZBgBIAEoCRIhCgZtYXJrZXQYAiABKA4yES5oaXZlbmcudjEuTWFya2V0EhYKDmFwcF9pZGVudGlmaWVyGAMgASgJEhIKCnByb2R1Y3RfaWQYBCABKAkSLAoMcHJvZHVjdF90eXBlGAUgASgOMhYuaGl2ZW5nLnYxLlByb2R1Y3RUeXBlEjcKDmNvbnN1bWVfcG9saWN5GAYgASgOMh8uaGl2ZW5nLnYxLlBheW1lbnRDb25zdW1lUG9saWN5Ei8KCmdyYW50X21vZGUYByABKA4yGy5oaXZlbmcudjEuUGF5bWVudEdyYW50TW9kZRIUCgdlbmFibGVkGAggASgISACIAQFCCgoIX2VuYWJsZWQiUwojVXBzZXJ0UGF5bWVudFByb2R1Y3RTZXR0aW5nUmVzcG9uc2USLAoIc2V0dGluZ3MYASABKAsyGi5oaXZlbmcudjEuUGF5bWVudFNldHRpbmdzIm0KHEltcG9ydFBheW1lbnRQcm9kdWN0c1JlcXVlc3QSEgoKcHJvamVjdF9pZBgBIAEoCRIhCgZtYXJrZXQYAiABKA4yES5oaXZlbmcudjEuTWFya2V0EhYKDmFwcF9pZGVudGlmaWVyGAMgASgJImQKHUltcG9ydFBheW1lbnRQcm9kdWN0c1Jlc3BvbnNlEisKCHByb2R1Y3RzGAEgAygLMhkuaGl2ZW5nLnYxLlBheW1lbnRQcm9kdWN0EhYKDmltcG9ydGVkX2NvdW50GAIgASgFIpkBChpMaXN0UGF5bWVudFByb2R1Y3RzUmVxdWVzdBISCgpwcm9qZWN0X2lkGAEgASgJEiEKBm1hcmtldBgCIAEoDjIRLmhpdmVuZy52MS5NYXJrZXQSFgoOYXBwX2lkZW50aWZpZXIYAyABKAkSLAoMcHJvZHVjdF90eXBlGAQgASgOMhYuaGl2ZW5nLnYxLlByb2R1Y3RUeXBlIkoKG0xpc3RQYXltZW50UHJvZHVjdHNSZXNwb25zZRIrCghwcm9kdWN0cxgBIAMoCzIZLmhpdmVuZy52MS5QYXltZW50UHJvZHVjdCKxAgoUTGlzdFB1cmNoYXNlc1JlcXVlc3QSEgoKcHJvamVjdF9pZBgBIAEoCRIhCgZtYXJrZXQYAiABKA4yES5oaXZlbmcudjEuTWFya2V0EigKBGZyb20YAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEiYKAnRvGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIkCgRwYWdlGAUgASgLMhYuaGl2ZW5nLnYxLlBhZ2VSZXF1ZXN0EiwKDHByb2R1Y3RfdHlwZRgGIAEoDjIWLmhpdmVuZy52MS5Qcm9kdWN0VHlwZRIpCgZzdGF0dXMYByABKA4yGS5oaXZlbmcudjEuUHVyY2hhc2VTdGF0dXMSEQoJcGxheWVyX2lkGAggASgJImYKFUxpc3RQdXJjaGFzZXNSZXNwb25zZRImCglwdXJjaGFzZXMYASADKAsyEy5oaXZlbmcudjEuUHVyY2hhc2USJQoEcGFnZRgCIAEoCzIXLmhpdmVuZy52MS5QYWdlUmVzcG9uc2UiPQoSR2V0UHVyY2hhc2VSZXF1ZXN0EhIKCnByb2plY3RfaWQYASABKAkSEwoLcHVyY2hhc2VfaWQYAiABKAkiPAoTR2V0UHVyY2hhc2VSZXNwb25zZRIlCghwdXJjaGFzZRgBIAEoCzITLmhpdmVuZy52MS5QdXJjaGFzZSKmAQoYTGlzdFN1YnNjcmlwdGlvbnNSZXF1ZXN0EhIKCnByb2plY3RfaWQYASABKAkSIQoGbWFya2V0GAIgASgOMhEuaGl2ZW5nLnYxLk1hcmtldBItCgZzdGF0dXMYAyABKA4yHS5oaXZlbmcudjEuU3Vic2NyaXB0aW9uU3RhdHVzEiQKBHBhZ2UYBCABKAsyFi5oaXZlbmcudjEuUGFnZVJlcXVlc3QicgoZTGlzdFN1YnNjcmlwdGlvbnNSZXNwb25zZRIuCg1zdWJzY3JpcHRpb25zGAEgAygLMhcuaGl2ZW5nLnYxLlN1YnNjcmlwdGlvbhIlCgRwYWdlGAIgASgLMhcuaGl2ZW5nLnYxLlBhZ2VSZXNwb25zZSJFChZHZXRTdWJzY3JpcHRpb25SZXF1ZXN0EhIKCnByb2plY3RfaWQYASABKAkSFwoPc3Vic2NyaXB0aW9uX2lkGAIgASgJIkgKF0dldFN1YnNjcmlwdGlvblJlc3BvbnNlEi0KDHN1YnNjcmlwdGlvbhgBIAEoCzIXLmhpdmVuZy52MS5TdWJzY3JpcHRpb24qfAoGTWFya2V0EhYKEk1BUktFVF9VTlNQRUNJRklFRBAAEhYKEk1BUktFVF9HT09HTEVfUExBWRABEhQKEE1BUktFVF9BUFBfU1RPUkUQAhIQCgxNQVJLRVRfU1RFQU0QBRIOCgpNQVJLRVRfV0VCEAYiBAgDEAMiBAgEEAQq4QEKDlB1cmNoYXNlU3RhdHVzEh8KG1BVUkNIQVNFX1NUQVRVU19VTlNQRUNJRklFRBAAEhsKF1BVUkNIQVNFX1NUQVRVU19QRU5ESU5HEAESHAoYUFVSQ0hBU0VfU1RBVFVTX1ZFUklGSUVEEAISGgoWUFVSQ0hBU0VfU1RBVFVTX0ZBSUxFRBADEhwKGFBVUkNIQVNFX1NUQVRVU19SRUZVTkRFRBAEEhwKGFBVUkNIQVNFX1NUQVRVU19DQU5DRUxFRBAFEhsKF1BVUkNIQVNFX1NUQVRVU19FWFBJUkVEEAYqZQoLUHJvZHVjdFR5cGUSHAoYUFJPRFVDVF9UWVBFX1VOU1BFQ0lGSUVEEAASGQoVUFJPRFVDVF9UWVBFX09ORV9USU1FEAESHQoZUFJPRFVDVF9UWVBFX1NVQlNDUklQVElPThACKo8BChRQYXltZW50Q29uc3VtZVBvbGljeRImCiJQQVlNRU5UX0NPTlNVTUVfUE9MSUNZX1VOU1BFQ0lGSUVEEAASHwobUEFZTUVOVF9DT05TVU1FX1BPTElDWV9OT05FEAESLgoqUEFZTUVOVF9DT05TVU1FX1BPTElDWV9DT05TVU1FX0FGVEVSX0dSQU5UEAIqpQEKEFBheW1lbnRHcmFudE1vZGUSIgoeUEFZTUVOVF9HUkFOVF9NT0RFX1VOU1BFQ0lGSUVEEAASJwojUEFZTUVOVF9HUkFOVF9NT0RFX1dFQkhPT0tfUkVRVUlSRUQQARIfChtQQVlNRU5UX0dSQU5UX01PREVfTk9fR1JBTlQQAhIjCh9QQVlNRU5UX0dSQU5UX01PREVfQ0xJRU5UX0dSQU5UEAMqxwIKElN1YnNjcmlwdGlvblN0YXR1cxIjCh9TVUJTQ1JJUFRJT05fU1RBVFVTX1VOU1BFQ0lGSUVEEAASHgoaU1VCU0NSSVBUSU9OX1NUQVRVU19BQ1RJVkUQARInCiNTVUJTQ1JJUFRJT05fU1RBVFVTX0lOX0dSQUNFX1BFUklPRBACEh8KG1NVQlNDUklQVElPTl9TVEFUVVNfT05fSE9MRBADEh4KGlNVQlNDUklQVElPTl9TVEFUVVNfUEFVU0VEEAQSIAocU1VCU0NSSVBUSU9OX1NUQVRVU19DQU5DRUxFRBAFEh8KG1NVQlNDUklQVElPTl9TVEFUVVNfRVhQSVJFRBAGEh8KG1NVQlNDUklQVElPTl9TVEFUVVNfUEVORElORxAHEh4KGlNVQlNDUklQVElPTl9TVEFUVVNfRkFJTEVEEAgy9wMKDlBheW1lbnRTZXJ2aWNlEk8KDExpc3RQcm9kdWN0cxIeLmhpdmVuZy52MS5MaXN0UHJvZHVjdHNSZXF1ZXN0Gh8uaGl2ZW5nLnYxLkxpc3RQcm9kdWN0c1Jlc3BvbnNlElIKDVN0YXJ0UHVyY2hhc2USHy5oaXZlbmcudjEuU3RhcnRQdXJjaGFzZVJlcXVlc3QaIC5oaXZlbmcudjEuU3RhcnRQdXJjaGFzZVJlc3BvbnNlElUKDlZlcmlmeVB1cmNoYXNlEiAuaGl2ZW5nLnYxLlZlcmlmeVB1cmNoYXNlUmVxdWVzdBohLmhpdmVuZy52MS5WZXJpZnlQdXJjaGFzZVJlc3BvbnNlEmgKC0dldFB1cmNoYXNlEisuaGl2ZW5nLnYxLlBheW1lbnRTZXJ2aWNlR2V0UHVyY2hhc2VSZXF1ZXN0GiwuaGl2ZW5nLnYxLlBheW1lbnRTZXJ2aWNlR2V0UHVyY2hhc2VSZXNwb25zZRJ/ChxDb25maXJtUGF5bWVudEdyYW50RGVsaXZlcmVkEi4uaGl2ZW5nLnYxLkNvbmZpcm1QYXltZW50R3JhbnREZWxpdmVyZWRSZXF1ZXN0Gi8uaGl2ZW5nLnYxLkNvbmZpcm1QYXltZW50R3JhbnREZWxpdmVyZWRSZXNwb25zZTKECAoVQ29uc29sZVBheW1lbnRTZXJ2aWNlEmEKEkdldFBheW1lbnRTZXR0aW5ncxIkLmhpdmVuZy52MS5HZXRQYXltZW50U2V0dGluZ3NSZXF1ZXN0GiUuaGl2ZW5nLnYxLkdldFBheW1lbnRTZXR0aW5nc1Jlc3BvbnNlEmEKElNldFBheW1lbnRTZXR0aW5ncxIkLmhpdmVuZy52MS5TZXRQYXltZW50U2V0dGluZ3NSZXF1ZXN0GiUuaGl2ZW5nLnYxLlNldFBheW1lbnRTZXR0aW5nc1Jlc3BvbnNlEnkKGlVwc2VydFBheW1lbnRNYXJrZXRTZXR0aW5nEiwuaGl2ZW5nLnYxLlVwc2VydFBheW1lbnRNYXJrZXRTZXR0aW5nUmVxdWVzdBotLmhpdmVuZy52MS5VcHNlcnRQYXltZW50TWFya2V0U2V0dGluZ1Jlc3BvbnNlEnwKG1Vwc2VydFBheW1lbnRQcm9kdWN0U2V0dGluZxItLmhpdmVuZy52MS5VcHNlcnRQYXltZW50UHJvZHVjdFNldHRpbmdSZXF1ZXN0Gi4uaGl2ZW5nLnYxLlVwc2VydFBheW1lbnRQcm9kdWN0U2V0dGluZ1Jlc3BvbnNlEmoKFUltcG9ydFBheW1lbnRQcm9kdWN0cxInLmhpdmVuZy52MS5JbXBvcnRQYXltZW50UHJvZHVjdHNSZXF1ZXN0GiguaGl2ZW5nLnYxLkltcG9ydFBheW1lbnRQcm9kdWN0c1Jlc3BvbnNlEmQKE0xpc3RQYXltZW50UHJvZHVjdHMSJS5oaXZlbmcudjEuTGlzdFBheW1lbnRQcm9kdWN0c1JlcXVlc3QaJi5oaXZlbmcudjEuTGlzdFBheW1lbnRQcm9kdWN0c1Jlc3BvbnNlElIKDUxpc3RQdXJjaGFzZXMSHy5oaXZlbmcudjEuTGlzdFB1cmNoYXNlc1JlcXVlc3QaIC5oaXZlbmcudjEuTGlzdFB1cmNoYXNlc1Jlc3BvbnNlEkwKC0dldFB1cmNoYXNlEh0uaGl2ZW5nLnYxLkdldFB1cmNoYXNlUmVxdWVzdBoeLmhpdmVuZy52MS5HZXRQdXJjaGFzZVJlc3BvbnNlEl4KEUxpc3RTdWJzY3JpcHRpb25zEiMuaGl2ZW5nLnYxLkxpc3RTdWJzY3JpcHRpb25zUmVxdWVzdBokLmhpdmVuZy52MS5MaXN0U3Vic2NyaXB0aW9uc1Jlc3BvbnNlElgKD0dldFN1YnNjcmlwdGlvbhIhLmhpdmVuZy52MS5HZXRTdWJzY3JpcHRpb25SZXF1ZXN0GiIuaGl2ZW5nLnYxLkdldFN1YnNjcmlwdGlvblJlc3BvbnNlQmIKDWNvbS5oaXZlbmcudjFCDFBheW1lbnRQcm90b1ABogIDSFhYqgIJSGl2ZW5nLlYxygIJSGl2ZW5nXFYx4gIVSGl2ZW5nXFYxXEdQQk1ldGFkYXRh6gIKSGl2ZW5nOjpWMWIGcHJvdG8z", [file_google_protobuf_timestamp, file_hiveng_v1_common]);
348
+ var PaymentService = /* @__PURE__ */ serviceDesc(file_hiveng_v1_payment, 0);
349
+ var MailboxApi = class {
350
+ constructor(language) {
351
+ this.language = language;
352
+ }
353
+ language;
354
+ client = null;
355
+ bind(client) {
356
+ this.client = client;
357
+ }
358
+ unbind() {
359
+ this.client = null;
360
+ }
361
+ async listMail(options = {}) {
362
+ const client = this.requireClient();
363
+ try {
364
+ const res = await client.listMail({
365
+ page: {
366
+ pageSize: options.pageSize ?? 20,
367
+ pageToken: options.pageToken ?? ""
368
+ },
369
+ includeClaimed: options.includeClaimed ?? false
370
+ });
371
+ return {
372
+ mail: res.mail.map((mail) => mapMail(mail, this.language)),
373
+ nextPageToken: res.page?.nextPageToken ?? "",
374
+ total: res.page?.total ?? 0n
375
+ };
376
+ } catch (err) {
377
+ throw toHiveNgError(err);
378
+ }
379
+ }
380
+ async checkNewMail() {
381
+ const client = this.requireClient();
382
+ try {
383
+ const res = await client.checkNewMail({});
384
+ return {
385
+ hasNewMail: res.hasNewMail,
386
+ unreadCount: res.unreadCount
387
+ };
388
+ } catch (err) {
389
+ throw toHiveNgError(err);
390
+ }
391
+ }
392
+ async claimMail(mailRecipientId) {
393
+ const client = this.requireClient();
394
+ try {
395
+ const res = await client.claimMail({ mailRecipientId });
396
+ if (!res.mail) {
397
+ throw new HiveNgError("INTERNAL", "claim response missing mail");
398
+ }
399
+ return mapMail(res.mail, this.language);
400
+ } catch (err) {
401
+ throw toHiveNgError(err);
402
+ }
403
+ }
404
+ requireClient() {
405
+ if (this.client === null) {
406
+ throw new HiveNgError("NOT_FOUND", "discovery returned no endpoint for domain: mailbox");
407
+ }
408
+ return this.client;
409
+ }
410
+ };
411
+ function mapMail(message, language) {
412
+ return {
413
+ id: message.id,
414
+ mailId: message.mailId,
415
+ projectId: message.projectId,
416
+ type: message.type,
417
+ title: resolveLocalized(message.title, language),
418
+ body: resolveLocalized(message.body, language),
419
+ sender: message.sender,
420
+ rewardPreview: message.rewardPreview,
421
+ rewardDisplay: message.rewardDisplay.map((item) => ({
422
+ icon: item.icon,
423
+ label: item.label,
424
+ quantity: item.quantity
425
+ })),
426
+ claimed: message.claimed,
427
+ claimableFrom: message.claimableFrom ? timestampDate(message.claimableFrom) : void 0,
428
+ expiresAt: message.expiresAt ? timestampDate(message.expiresAt) : void 0,
429
+ claimedAt: message.claimedAt ? timestampDate(message.claimedAt) : void 0,
430
+ createdAt: message.createdAt ? timestampDate(message.createdAt) : void 0
431
+ };
432
+ }
433
+ function resolveLocalized(values, language) {
434
+ const normalized = language.trim();
435
+ if (normalized) {
436
+ const exact = values[normalized];
437
+ if (exact !== void 0) {
438
+ return exact;
439
+ }
440
+ const dash = normalized.indexOf("-");
441
+ if (dash > 0) {
442
+ const base = values[normalized.substring(0, dash)];
443
+ if (base !== void 0) {
444
+ return base;
445
+ }
446
+ }
447
+ }
448
+ if (values.en !== void 0) {
449
+ return values.en;
450
+ }
451
+ if (values.ko !== void 0) {
452
+ return values.ko;
453
+ }
454
+ const firstKey = Object.keys(values).sort()[0];
455
+ return firstKey ? values[firstKey] : "";
456
+ }
457
+ var NoticeApi = class {
458
+ constructor(language) {
459
+ this.language = language;
460
+ }
461
+ language;
462
+ client = null;
463
+ bind(client) {
464
+ this.client = client;
465
+ }
466
+ unbind() {
467
+ this.client = null;
468
+ }
469
+ async listActiveNotices() {
470
+ const client = this.requireClient();
471
+ try {
472
+ const res = await client.listActiveNotices({});
473
+ return res.notices.map((notice) => mapNotice(notice, this.language));
474
+ } catch (err) {
475
+ throw toHiveNgError(err);
476
+ }
477
+ }
478
+ requireClient() {
479
+ if (this.client === null) {
480
+ throw new HiveNgError("NOT_FOUND", "discovery returned no endpoint for domain: notice");
481
+ }
482
+ return this.client;
483
+ }
484
+ };
485
+ function mapNotice(message, language) {
486
+ return {
487
+ id: message.id,
488
+ projectId: message.projectId,
489
+ title: resolveLocalized2(message.title, language),
490
+ body: resolveLocalized2(message.body, language),
491
+ startsAt: message.startsAt ? timestampDate(message.startsAt) : void 0,
492
+ endsAt: message.endsAt ? timestampDate(message.endsAt) : void 0,
493
+ viewCount: message.viewCount
494
+ };
495
+ }
496
+ function resolveLocalized2(values, language) {
497
+ const normalized = language.trim();
498
+ if (normalized) {
499
+ const exact = values[normalized];
500
+ if (exact !== void 0) {
501
+ return exact;
502
+ }
503
+ const dash = normalized.indexOf("-");
504
+ if (dash > 0) {
505
+ const base = values[normalized.substring(0, dash)];
506
+ if (base !== void 0) {
507
+ return base;
508
+ }
509
+ }
510
+ }
511
+ if (values.en !== void 0) {
512
+ return values.en;
513
+ }
514
+ if (values.ko !== void 0) {
515
+ return values.ko;
516
+ }
517
+ const firstKey = Object.keys(values).sort()[0];
518
+ return firstKey ? values[firstKey] : "";
519
+ }
520
+ var GRANT_POLL_DELAYS_MILLIS = [1e3, 2e3, 3e3, 5e3];
521
+ var DEFAULT_GRANT_WAIT_TIMEOUT_MILLIS = 3e4;
522
+ var PaymentApi = class {
523
+ client = null;
524
+ bind(client) {
525
+ this.client = client;
526
+ }
527
+ unbind() {
528
+ this.client = null;
529
+ }
530
+ async getPurchase(purchaseId) {
531
+ if (!purchaseId) {
532
+ throw new HiveNgError("INVALID_ARGUMENT", "purchaseId is required");
533
+ }
534
+ const client = this.requireClient();
535
+ try {
536
+ const res = await client.getPurchase({ purchaseId });
537
+ if (!res.purchase) {
538
+ throw new HiveNgError("INTERNAL", "get purchase response missing purchase");
539
+ }
540
+ return mapPurchase(res.purchase);
541
+ } catch (err) {
542
+ throw toHiveNgError(err);
543
+ }
544
+ }
545
+ async waitForPaymentGrant(purchaseId, timeoutMillis = DEFAULT_GRANT_WAIT_TIMEOUT_MILLIS) {
546
+ if (!purchaseId) {
547
+ throw new HiveNgError("INVALID_ARGUMENT", "purchaseId is required");
548
+ }
549
+ if (timeoutMillis <= 0) {
550
+ throw new HiveNgError("INVALID_ARGUMENT", "timeoutMillis must be positive");
551
+ }
552
+ const startedAt = Date.now();
553
+ let purchase = await this.getPurchase(purchaseId);
554
+ if (isGrantFinished(purchase) || isPurchaseFailed(purchase)) {
555
+ return purchase;
556
+ }
557
+ let delayIndex = 0;
558
+ let elapsed = Date.now() - startedAt;
559
+ while (elapsed < timeoutMillis) {
560
+ const remainingMillis = timeoutMillis - elapsed;
561
+ const delayMillis = Math.min(nextDelayMillis(delayIndex), remainingMillis);
562
+ await sleep(delayMillis);
563
+ purchase = await this.getPurchase(purchaseId);
564
+ if (isGrantFinished(purchase) || isPurchaseFailed(purchase)) {
565
+ return purchase;
566
+ }
567
+ delayIndex += 1;
568
+ elapsed = Date.now() - startedAt;
569
+ }
570
+ return purchase;
571
+ }
572
+ requireClient() {
573
+ if (this.client === null) {
574
+ throw new HiveNgError("NOT_FOUND", "discovery returned no endpoint for domain: payment");
575
+ }
576
+ return this.client;
577
+ }
578
+ };
579
+ function mapPurchase(message) {
580
+ return {
581
+ id: message.id,
582
+ projectId: message.projectId,
583
+ playerId: message.playerId,
584
+ market: marketName(message.market),
585
+ productType: productTypeName(message.productType),
586
+ productId: message.productId,
587
+ packageName: message.packageName,
588
+ purchaseIntentId: message.purchaseIntentId,
589
+ amountMinor: message.amountMinor,
590
+ currency: message.currency,
591
+ status: purchaseStatusName(message.status),
592
+ grantStatus: message.grantStatus,
593
+ consumeStatus: message.consumeStatus,
594
+ marketOrderId: message.marketOrderId,
595
+ purchasedAt: message.purchasedAt ? timestampDate(message.purchasedAt) : void 0,
596
+ verifiedAt: message.verifiedAt ? timestampDate(message.verifiedAt) : void 0
597
+ };
598
+ }
599
+ function marketName(market) {
600
+ const names = {
601
+ [1 /* GOOGLE_PLAY */]: "google_play",
602
+ [2 /* APP_STORE */]: "app_store",
603
+ [5 /* STEAM */]: "steam",
604
+ [6 /* WEB */]: "web"
605
+ };
606
+ return names[market] ?? "unspecified";
607
+ }
608
+ function productTypeName(productType) {
609
+ const names = {
610
+ [1 /* ONE_TIME */]: "one_time",
611
+ [2 /* SUBSCRIPTION */]: "subscription"
612
+ };
613
+ return names[productType] ?? "unspecified";
614
+ }
615
+ function purchaseStatusName(status) {
616
+ const names = {
617
+ [1 /* PENDING */]: "pending",
618
+ [2 /* VERIFIED */]: "verified",
619
+ [3 /* FAILED */]: "failed",
620
+ [4 /* REFUNDED */]: "refunded",
621
+ [5 /* CANCELED */]: "canceled",
622
+ [6 /* EXPIRED */]: "expired"
623
+ };
624
+ return names[status] ?? "unspecified";
625
+ }
626
+ function isGrantFinished(purchase) {
627
+ return purchase.grantStatus === "delivered" || purchase.grantStatus === "not_required";
628
+ }
629
+ function isPurchaseFailed(purchase) {
630
+ return ["failed", "canceled", "refunded", "expired"].includes(purchase.status);
631
+ }
632
+ function nextDelayMillis(index) {
633
+ if (index < GRANT_POLL_DELAYS_MILLIS.length) {
634
+ return GRANT_POLL_DELAYS_MILLIS[index];
635
+ }
636
+ return GRANT_POLL_DELAYS_MILLIS[GRANT_POLL_DELAYS_MILLIS.length - 1];
637
+ }
638
+ function sleep(millis) {
639
+ return new Promise((resolve) => {
640
+ setTimeout(resolve, millis);
641
+ });
642
+ }
643
+
644
+ // src/storage.ts
645
+ var STORAGE_KEYS = {
646
+ accessToken: "hive-ng.player.token",
647
+ refreshToken: "hive-ng.player.refresh"};
648
+ var MemoryStorage = class {
649
+ map = /* @__PURE__ */ new Map();
650
+ get(key) {
651
+ return this.map.get(key) ?? null;
652
+ }
653
+ set(key, value) {
654
+ this.map.set(key, value);
655
+ }
656
+ remove(key) {
657
+ this.map.delete(key);
658
+ }
659
+ };
660
+ var LocalStorage = class {
661
+ constructor(backing) {
662
+ this.backing = backing;
663
+ }
664
+ backing;
665
+ get(key) {
666
+ return this.backing.getItem(key);
667
+ }
668
+ set(key, value) {
669
+ this.backing.setItem(key, value);
670
+ }
671
+ remove(key) {
672
+ this.backing.removeItem(key);
673
+ }
674
+ };
675
+ function resolveStorage(persist) {
676
+ if (!persist) {
677
+ return new MemoryStorage();
678
+ }
679
+ try {
680
+ const backing = globalThis.localStorage;
681
+ if (backing === void 0) {
682
+ return new MemoryStorage();
683
+ }
684
+ const probeKey = "hive-ng.storage.probe";
685
+ backing.setItem(probeKey, "1");
686
+ backing.removeItem(probeKey);
687
+ return new LocalStorage(backing);
688
+ } catch {
689
+ return new MemoryStorage();
690
+ }
691
+ }
692
+
693
+ // src/session.ts
694
+ var Session = class {
695
+ constructor(storage) {
696
+ this.storage = storage;
697
+ }
698
+ storage;
699
+ onCleared;
700
+ onBanned;
701
+ refreshFn;
702
+ refreshing;
703
+ refreshError;
704
+ get accessToken() {
705
+ return this.storage.get(STORAGE_KEYS.accessToken);
706
+ }
707
+ get refreshToken() {
708
+ return this.storage.get(STORAGE_KEYS.refreshToken);
709
+ }
710
+ save(pair) {
711
+ this.storage.set(STORAGE_KEYS.accessToken, pair.accessToken);
712
+ this.storage.set(STORAGE_KEYS.refreshToken, pair.refreshToken);
713
+ }
714
+ clear() {
715
+ this.storage.remove(STORAGE_KEYS.accessToken);
716
+ this.storage.remove(STORAGE_KEYS.refreshToken);
717
+ this.onCleared?.();
718
+ }
719
+ // 동시 다발 401에서도 refresh는 1회만 수행 (single-flight)
720
+ tryRefresh() {
721
+ if (!this.refreshing) {
722
+ this.refreshError = void 0;
723
+ this.refreshing = this.doRefresh().finally(() => {
724
+ this.refreshing = void 0;
725
+ });
726
+ }
727
+ return this.refreshing;
728
+ }
729
+ consumeRefreshError() {
730
+ const err = this.refreshError;
731
+ this.refreshError = void 0;
732
+ return err;
733
+ }
734
+ async doRefresh() {
735
+ const refreshToken = this.refreshToken;
736
+ if (refreshToken === null || this.refreshFn === void 0) {
737
+ return false;
738
+ }
739
+ try {
740
+ const pair = await this.refreshFn(refreshToken);
741
+ this.save(pair);
742
+ return true;
743
+ } catch (err) {
744
+ const mapped = toHiveNgError(err);
745
+ this.refreshError = mapped;
746
+ if (mapped instanceof BannedError) {
747
+ this.onBanned?.(mapped);
748
+ }
749
+ this.clear();
750
+ return false;
751
+ }
752
+ }
753
+ };
754
+ var defaultTransportFactory = ({ baseUrl, interceptors }) => createConnectTransport({ baseUrl, useBinaryFormat: true, interceptors });
755
+ function createAuthInterceptor(apiKey, language, session) {
756
+ return (next) => async (req) => {
757
+ req.header.set("Authorization", `Bearer ${apiKey}`);
758
+ if (language) {
759
+ req.header.set("X-Hive-Ng-Language", language);
760
+ }
761
+ const accessToken = session.accessToken;
762
+ if (accessToken !== null && req.method.name !== "RefreshToken") {
763
+ req.header.set("X-Player-Token", accessToken);
764
+ } else {
765
+ req.header.delete("X-Player-Token");
766
+ }
767
+ return next(req);
768
+ };
769
+ }
770
+ function createRefreshInterceptor(session) {
771
+ return (next) => async (req) => {
772
+ try {
773
+ return await next(req);
774
+ } catch (err) {
775
+ if (errorCodeOf(err) !== 204 /* SESSION_EXPIRED */) {
776
+ throw err;
777
+ }
778
+ if (req.method.name === "RefreshToken") {
779
+ throw err;
780
+ }
781
+ const refreshed = await session.tryRefresh();
782
+ if (!refreshed) {
783
+ const refreshError = session.consumeRefreshError();
784
+ if (refreshError !== void 0) {
785
+ throw refreshError;
786
+ }
787
+ throw err;
788
+ }
789
+ return next(req);
790
+ }
791
+ };
792
+ }
793
+
794
+ // src/hive-ng.ts
795
+ var HiveNgClient = class {
796
+ auth;
797
+ notice;
798
+ mailbox;
799
+ payment;
800
+ config;
801
+ session;
802
+ factory;
803
+ endpoints = /* @__PURE__ */ new Map();
804
+ ready = false;
805
+ constructor(config) {
806
+ this.config = resolveConfig(config);
807
+ this.session = new Session(resolveStorage(this.config.persistSession));
808
+ this.factory = config.transportFactory ?? defaultTransportFactory;
809
+ this.auth = new AuthApi(this.session);
810
+ this.notice = new NoticeApi(this.config.language);
811
+ this.mailbox = new MailboxApi(this.config.language);
812
+ this.payment = new PaymentApi();
813
+ }
814
+ // 게이트웨이 디스커버리로 도메인별 베이스 URL을 받아 도메인 클라이언트를 구성한다.
815
+ async init() {
816
+ const gatewayTransport = this.factory({
817
+ baseUrl: this.config.gatewayUrl,
818
+ interceptors: []
819
+ });
820
+ const { endpoints } = await resolveEndpoints(
821
+ gatewayTransport,
822
+ this.config.clientVersion,
823
+ this.config.projectId
824
+ );
825
+ this.endpoints = endpoints;
826
+ const authBaseUrl = requireEndpoint(endpoints, "auth");
827
+ const authTransport = this.factory({
828
+ baseUrl: authBaseUrl,
829
+ interceptors: [
830
+ createAuthInterceptor(this.config.apiKey, this.config.language, this.session),
831
+ createRefreshInterceptor(this.session)
832
+ ]
833
+ });
834
+ const authClient = createClient(AuthService, authTransport);
835
+ const noticeBaseUrl = endpoints.get("notice");
836
+ if (noticeBaseUrl) {
837
+ const noticeTransport = this.factory({
838
+ baseUrl: noticeBaseUrl,
839
+ interceptors: [
840
+ createAuthInterceptor(this.config.apiKey, this.config.language, this.session),
841
+ createRefreshInterceptor(this.session)
842
+ ]
843
+ });
844
+ this.notice.bind(createClient(NoticeService, noticeTransport));
845
+ } else {
846
+ this.notice.unbind();
847
+ }
848
+ const mailboxBaseUrl = endpoints.get("mailbox");
849
+ if (mailboxBaseUrl) {
850
+ const mailboxTransport = this.factory({
851
+ baseUrl: mailboxBaseUrl,
852
+ interceptors: [
853
+ createAuthInterceptor(this.config.apiKey, this.config.language, this.session),
854
+ createRefreshInterceptor(this.session)
855
+ ]
856
+ });
857
+ this.mailbox.bind(createClient(MailboxService, mailboxTransport));
858
+ } else {
859
+ this.mailbox.unbind();
860
+ }
861
+ const paymentBaseUrl = endpoints.get("payment");
862
+ if (paymentBaseUrl) {
863
+ const paymentTransport = this.factory({
864
+ baseUrl: paymentBaseUrl,
865
+ interceptors: [
866
+ createAuthInterceptor(this.config.apiKey, this.config.language, this.session),
867
+ createRefreshInterceptor(this.session)
868
+ ]
869
+ });
870
+ this.payment.bind(createClient(PaymentService, paymentTransport));
871
+ } else {
872
+ this.payment.unbind();
873
+ }
874
+ this.session.refreshFn = async (refreshToken) => {
875
+ const res = await authClient.refreshToken({ refreshToken });
876
+ if (!res.tokenPair) {
877
+ throw new HiveNgError("INTERNAL", "refresh response missing token pair");
878
+ }
879
+ return res.tokenPair;
880
+ };
881
+ this.session.onCleared = () => this.auth.clearPlayer();
882
+ this.auth.bind(authClient);
883
+ this.ready = true;
884
+ }
885
+ isReady() {
886
+ return this.ready;
887
+ }
888
+ endpointFor(domain) {
889
+ return this.endpoints.get(domain);
890
+ }
891
+ };
892
+ function createHiveNg(config) {
893
+ return new HiveNgClient(config);
894
+ }
895
+
896
+ export { BannedError, ErrorCode, HiveNgClient, HiveNgError, IdentityProvider, MailType, MaintenanceError, createHiveNg, errorCodeOf, errorDetailOf };
897
+ //# sourceMappingURL=chunk-NWQONJK2.js.map
898
+ //# sourceMappingURL=chunk-NWQONJK2.js.map