@keetanetwork/anchor 0.0.62 → 0.0.63

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/lib/anchor-metadata-server.d.ts +54 -0
  2. package/lib/anchor-metadata-server.d.ts.map +1 -0
  3. package/lib/anchor-metadata-server.js +62 -0
  4. package/lib/anchor-metadata-server.js.map +1 -0
  5. package/lib/error.d.ts +35 -0
  6. package/lib/error.d.ts.map +1 -1
  7. package/lib/error.generated.d.ts +3 -0
  8. package/lib/error.generated.d.ts.map +1 -0
  9. package/lib/error.generated.js +104 -0
  10. package/lib/error.generated.js.map +1 -0
  11. package/lib/error.js +66 -1
  12. package/lib/error.js.map +1 -1
  13. package/lib/http-server/common.d.ts +20 -2
  14. package/lib/http-server/common.d.ts.map +1 -1
  15. package/lib/http-server/common.js +47 -0
  16. package/lib/http-server/common.js.map +1 -1
  17. package/lib/http-server/index.d.ts +22 -0
  18. package/lib/http-server/index.d.ts.map +1 -1
  19. package/lib/http-server/index.js +23 -0
  20. package/lib/http-server/index.js.map +1 -1
  21. package/lib/metadata.types.d.ts +40 -0
  22. package/lib/metadata.types.d.ts.map +1 -1
  23. package/lib/metadata.types.js.map +1 -1
  24. package/lib/resolver.d.ts +19 -20
  25. package/lib/resolver.d.ts.map +1 -1
  26. package/lib/resolver.js +1420 -681
  27. package/lib/resolver.js.map +1 -1
  28. package/lib/utils/certificate-network.d.ts +84 -0
  29. package/lib/utils/certificate-network.d.ts.map +1 -0
  30. package/lib/utils/certificate-network.js +104 -0
  31. package/lib/utils/certificate-network.js.map +1 -0
  32. package/lib/utils/signing.d.ts +12 -0
  33. package/lib/utils/signing.d.ts.map +1 -1
  34. package/lib/utils/signing.js +145 -2
  35. package/lib/utils/signing.js.map +1 -1
  36. package/npm-shrinkwrap.json +4 -4
  37. package/package.json +1 -1
  38. package/services/asset-movement/common.d.ts.map +1 -1
  39. package/services/asset-movement/common.js +7 -53
  40. package/services/asset-movement/common.js.map +1 -1
  41. package/services/asset-movement/server.d.ts +6 -4
  42. package/services/asset-movement/server.d.ts.map +1 -1
  43. package/services/asset-movement/server.js +3 -3
  44. package/services/asset-movement/server.js.map +1 -1
  45. package/services/fx/common.js +7 -7
  46. package/services/fx/server.d.ts +9 -7
  47. package/services/fx/server.d.ts.map +1 -1
  48. package/services/fx/server.js +5 -5
  49. package/services/fx/server.js.map +1 -1
  50. package/services/kyc/server.d.ts +6 -4
  51. package/services/kyc/server.d.ts.map +1 -1
  52. package/services/kyc/server.js +3 -3
  53. package/services/kyc/server.js.map +1 -1
  54. package/services/notification/common.d.ts +2 -1
  55. package/services/notification/common.d.ts.map +1 -1
  56. package/services/notification/common.generated.js +20 -20
  57. package/services/notification/common.js +3 -2
  58. package/services/notification/common.js.map +1 -1
  59. package/services/notification/server.d.ts +7 -6
  60. package/services/notification/server.d.ts.map +1 -1
  61. package/services/notification/server.js +25 -62
  62. package/services/notification/server.js.map +1 -1
  63. package/services/storage/common.d.ts +2 -1
  64. package/services/storage/common.d.ts.map +1 -1
  65. package/services/storage/common.js +7 -2
  66. package/services/storage/common.js.map +1 -1
  67. package/services/storage/server.d.ts +7 -5
  68. package/services/storage/server.d.ts.map +1 -1
  69. package/services/storage/server.js +29 -99
  70. package/services/storage/server.js.map +1 -1
  71. package/services/username/common.d.ts +2 -1
  72. package/services/username/common.d.ts.map +1 -1
  73. package/services/username/common.generated.js +14 -48
  74. package/services/username/common.generated.js.map +1 -1
  75. package/services/username/common.js +3 -2
  76. package/services/username/common.js.map +1 -1
  77. package/services/username/server.d.ts +7 -6
  78. package/services/username/server.d.ts.map +1 -1
  79. package/services/username/server.js +38 -46
  80. package/services/username/server.js.map +1 -1
@@ -15,29 +15,22 @@ export const assertKeetaUsernameAnchorClaimRequestJSON = (() => { const _io0 = (
15
15
  if (undefined === value)
16
16
  return true;
17
17
  return false;
18
- })); const _io2 = (input, _exceptionable = true) => "string" === typeof input.from && (RegExp(/^keeta_am(.*)/).test(input.from) || RegExp(/^keeta_an(.*)/).test(input.from) || RegExp(/^keeta_ao(.*)/).test(input.from) || RegExp(/^keeta_ap(.*)/).test(input.from) || RegExp(/^tyblocks_am(.*)/).test(input.from) || RegExp(/^tyblocks_an(.*)/).test(input.from) || RegExp(/^tyblocks_ao(.*)/).test(input.from) || RegExp(/^tyblocks_ap(.*)/).test(input.from) || RegExp(/^keeta_aa(.*)/).test(input.from) || RegExp(/^keeta_ab(.*)/).test(input.from) || RegExp(/^keeta_ac(.*)/).test(input.from) || RegExp(/^keeta_ad(.*)/).test(input.from) || RegExp(/^tyblocks_aa(.*)/).test(input.from) || RegExp(/^tyblocks_ab(.*)/).test(input.from) || RegExp(/^tyblocks_ac(.*)/).test(input.from) || RegExp(/^tyblocks_ad(.*)/).test(input.from) || RegExp(/^keeta_ae(.*)/).test(input.from) || RegExp(/^keeta_af(.*)/).test(input.from) || RegExp(/^keeta_ag(.*)/).test(input.from) || RegExp(/^keeta_ah(.*)/).test(input.from) || RegExp(/^tyblocks_ae(.*)/).test(input.from) || RegExp(/^tyblocks_af(.*)/).test(input.from) || RegExp(/^tyblocks_ag(.*)/).test(input.from) || RegExp(/^tyblocks_ah(.*)/).test(input.from) || RegExp(/^keeta_ai(.*)/).test(input.from) || RegExp(/^keeta_aj(.*)/).test(input.from) || RegExp(/^keeta_ak(.*)/).test(input.from) || RegExp(/^keeta_al(.*)/).test(input.from) || RegExp(/^tyblocks_ai(.*)/).test(input.from) || RegExp(/^tyblocks_aj(.*)/).test(input.from) || RegExp(/^tyblocks_ak(.*)/).test(input.from) || RegExp(/^tyblocks_al(.*)/).test(input.from) || RegExp(/^keeta_at(.*)/).test(input.from) || RegExp(/^keeta_aq(.*)/).test(input.from) || RegExp(/^keeta_ar(.*)/).test(input.from) || RegExp(/^keeta_as(.*)/).test(input.from) || RegExp(/^tyblocks_at(.*)/).test(input.from) || RegExp(/^tyblocks_aq(.*)/).test(input.from) || RegExp(/^tyblocks_ar(.*)/).test(input.from) || RegExp(/^tyblocks_as(.*)/).test(input.from) || RegExp(/^keeta_ay(.*)/).test(input.from) || RegExp(/^keeta_az(.*)/).test(input.from) || RegExp(/^keeta_a2(.*)/).test(input.from) || RegExp(/^keeta_a3(.*)/).test(input.from) || RegExp(/^tyblocks_ay(.*)/).test(input.from) || RegExp(/^tyblocks_az(.*)/).test(input.from) || RegExp(/^tyblocks_a2(.*)/).test(input.from) || RegExp(/^tyblocks_a3(.*)/).test(input.from) || RegExp(/^keeta_a4(.*)/).test(input.from) || RegExp(/^keeta_a5(.*)/).test(input.from) || RegExp(/^keeta_a6(.*)/).test(input.from) || RegExp(/^keeta_a7(.*)/).test(input.from) || RegExp(/^tyblocks_a4(.*)/).test(input.from) || RegExp(/^tyblocks_a5(.*)/).test(input.from) || RegExp(/^tyblocks_a6(.*)/).test(input.from) || RegExp(/^tyblocks_a7(.*)/).test(input.from)) && ("object" === typeof input.signed && null !== input.signed && _io3(input.signed, true && _exceptionable)) && (2 === Object.keys(input).length || Object.keys(input).every(key => {
18
+ })); const _io2 = (input, _exceptionable = true) => "string" === typeof input.from && (RegExp(/^keeta_am(.*)/).test(input.from) || RegExp(/^keeta_an(.*)/).test(input.from) || RegExp(/^keeta_ao(.*)/).test(input.from) || RegExp(/^keeta_ap(.*)/).test(input.from) || RegExp(/^tyblocks_am(.*)/).test(input.from) || RegExp(/^tyblocks_an(.*)/).test(input.from) || RegExp(/^tyblocks_ao(.*)/).test(input.from) || RegExp(/^tyblocks_ap(.*)/).test(input.from) || RegExp(/^keeta_aa(.*)/).test(input.from) || RegExp(/^keeta_ab(.*)/).test(input.from) || RegExp(/^keeta_ac(.*)/).test(input.from) || RegExp(/^keeta_ad(.*)/).test(input.from) || RegExp(/^tyblocks_aa(.*)/).test(input.from) || RegExp(/^tyblocks_ab(.*)/).test(input.from) || RegExp(/^tyblocks_ac(.*)/).test(input.from) || RegExp(/^tyblocks_ad(.*)/).test(input.from) || RegExp(/^keeta_ae(.*)/).test(input.from) || RegExp(/^keeta_af(.*)/).test(input.from) || RegExp(/^keeta_ag(.*)/).test(input.from) || RegExp(/^keeta_ah(.*)/).test(input.from) || RegExp(/^tyblocks_ae(.*)/).test(input.from) || RegExp(/^tyblocks_af(.*)/).test(input.from) || RegExp(/^tyblocks_ag(.*)/).test(input.from) || RegExp(/^tyblocks_ah(.*)/).test(input.from) || RegExp(/^keeta_ai(.*)/).test(input.from) || RegExp(/^keeta_aj(.*)/).test(input.from) || RegExp(/^keeta_ak(.*)/).test(input.from) || RegExp(/^keeta_al(.*)/).test(input.from) || RegExp(/^tyblocks_ai(.*)/).test(input.from) || RegExp(/^tyblocks_aj(.*)/).test(input.from) || RegExp(/^tyblocks_ak(.*)/).test(input.from) || RegExp(/^tyblocks_al(.*)/).test(input.from) || RegExp(/^keeta_at(.*)/).test(input.from) || RegExp(/^keeta_aq(.*)/).test(input.from) || RegExp(/^keeta_ar(.*)/).test(input.from) || RegExp(/^keeta_as(.*)/).test(input.from) || RegExp(/^tyblocks_at(.*)/).test(input.from) || RegExp(/^tyblocks_aq(.*)/).test(input.from) || RegExp(/^tyblocks_ar(.*)/).test(input.from) || RegExp(/^tyblocks_as(.*)/).test(input.from) || RegExp(/^keeta_ay(.*)/).test(input.from) || RegExp(/^keeta_az(.*)/).test(input.from) || RegExp(/^keeta_a2(.*)/).test(input.from) || RegExp(/^keeta_a3(.*)/).test(input.from) || RegExp(/^tyblocks_ay(.*)/).test(input.from) || RegExp(/^tyblocks_az(.*)/).test(input.from) || RegExp(/^tyblocks_a2(.*)/).test(input.from) || RegExp(/^tyblocks_a3(.*)/).test(input.from) || RegExp(/^keeta_a4(.*)/).test(input.from) || RegExp(/^keeta_a5(.*)/).test(input.from) || RegExp(/^keeta_a6(.*)/).test(input.from) || RegExp(/^keeta_a7(.*)/).test(input.from) || RegExp(/^tyblocks_a4(.*)/).test(input.from) || RegExp(/^tyblocks_a5(.*)/).test(input.from) || RegExp(/^tyblocks_a6(.*)/).test(input.from) || RegExp(/^tyblocks_a7(.*)/).test(input.from)) && ("object" === typeof input.signed && null !== input.signed && _io1(input.signed, true && _exceptionable)) && (2 === Object.keys(input).length || Object.keys(input).every(key => {
19
19
  if (["from", "signed"].some(prop => key === prop))
20
20
  return true;
21
21
  const value = input[key];
22
22
  if (undefined === value)
23
23
  return true;
24
24
  return false;
25
- })); const _io3 = (input, _exceptionable = true) => "string" === typeof input.nonce && "string" === typeof input.timestamp && "string" === typeof input.signature && (3 === Object.keys(input).length || Object.keys(input).every(key => {
26
- if (["nonce", "timestamp", "signature"].some(prop => key === prop))
27
- return true;
28
- const value = input[key];
29
- if (undefined === value)
30
- return true;
31
- return false;
32
25
  })); const _ao0 = (input, _path, _exceptionable = true) => (("object" === typeof input.signed && null !== input.signed || __typia_transform__assertGuard._assertGuard(_exceptionable, {
33
26
  method: "createAssertEquals",
34
27
  path: _path + ".signed",
35
- expected: "{ nonce: string; timestamp: string; signature: string; } & {}",
28
+ expected: "HTTPSignedField",
36
29
  value: input.signed
37
30
  }, _errorFactory)) && _ao1(input.signed, _path + ".signed", true && _exceptionable) || __typia_transform__assertGuard._assertGuard(_exceptionable, {
38
31
  method: "createAssertEquals",
39
32
  path: _path + ".signed",
40
- expected: "{ nonce: string; timestamp: string; signature: string; } & {}",
33
+ expected: "HTTPSignedField",
41
34
  value: input.signed
42
35
  }, _errorFactory)) && ("string" === typeof input.username || __typia_transform__assertGuard._assertGuard(_exceptionable, {
43
36
  method: "createAssertEquals",
@@ -52,12 +45,12 @@ export const assertKeetaUsernameAnchorClaimRequestJSON = (() => { const _io0 = (
52
45
  }, _errorFactory)) && (undefined === input.transfer || ("object" === typeof input.transfer && null !== input.transfer || __typia_transform__assertGuard._assertGuard(_exceptionable, {
53
46
  method: "createAssertEquals",
54
47
  path: _path + ".transfer",
55
- expected: "(undefined | { from: TokenPublicKeyString | Secp256K1PublicKeyString | ED25519PublicKeyString | NetworkPublicKeyString | StoragePublicKeyString | Secp256R1PublicKeyString | MultisigPublicKeyString; signed: { ...; } & {}; } & {})",
48
+ expected: "(undefined | { from: TokenPublicKeyString | Secp256K1PublicKeyString | ED25519PublicKeyString | NetworkPublicKeyString | StoragePublicKeyString | Secp256R1PublicKeyString | MultisigPublicKeyString; signed: HTTPSignedField; } & {})",
56
49
  value: input.transfer
57
50
  }, _errorFactory)) && _ao2(input.transfer, _path + ".transfer", true && _exceptionable) || __typia_transform__assertGuard._assertGuard(_exceptionable, {
58
51
  method: "createAssertEquals",
59
52
  path: _path + ".transfer",
60
- expected: "(undefined | { from: TokenPublicKeyString | Secp256K1PublicKeyString | ED25519PublicKeyString | NetworkPublicKeyString | StoragePublicKeyString | Secp256R1PublicKeyString | MultisigPublicKeyString; signed: { ...; } & {}; } & {})",
53
+ expected: "(undefined | { from: TokenPublicKeyString | Secp256K1PublicKeyString | ED25519PublicKeyString | NetworkPublicKeyString | StoragePublicKeyString | Secp256R1PublicKeyString | MultisigPublicKeyString; signed: HTTPSignedField; } & {})",
61
54
  value: input.transfer
62
55
  }, _errorFactory)) && (3 === Object.keys(input).length || (false === _exceptionable || Object.keys(input).every(key => {
63
56
  if (["signed", "username", "account", "transfer"].some(prop => key === prop))
@@ -106,12 +99,12 @@ export const assertKeetaUsernameAnchorClaimRequestJSON = (() => { const _io0 = (
106
99
  }, _errorFactory)) && (("object" === typeof input.signed && null !== input.signed || __typia_transform__assertGuard._assertGuard(_exceptionable, {
107
100
  method: "createAssertEquals",
108
101
  path: _path + ".signed",
109
- expected: "{ nonce: string; timestamp: string; signature: string; } & {}.o1",
102
+ expected: "HTTPSignedField",
110
103
  value: input.signed
111
- }, _errorFactory)) && _ao3(input.signed, _path + ".signed", true && _exceptionable) || __typia_transform__assertGuard._assertGuard(_exceptionable, {
104
+ }, _errorFactory)) && _ao1(input.signed, _path + ".signed", true && _exceptionable) || __typia_transform__assertGuard._assertGuard(_exceptionable, {
112
105
  method: "createAssertEquals",
113
106
  path: _path + ".signed",
114
- expected: "{ nonce: string; timestamp: string; signature: string; } & {}.o1",
107
+ expected: "HTTPSignedField",
115
108
  value: input.signed
116
109
  }, _errorFactory)) && (2 === Object.keys(input).length || (false === _exceptionable || Object.keys(input).every(key => {
117
110
  if (["from", "signed"].some(prop => key === prop))
@@ -125,45 +118,18 @@ export const assertKeetaUsernameAnchorClaimRequestJSON = (() => { const _io0 = (
125
118
  expected: "undefined",
126
119
  value: value
127
120
  }, _errorFactory);
128
- }))); const _ao3 = (input, _path, _exceptionable = true) => ("string" === typeof input.nonce || __typia_transform__assertGuard._assertGuard(_exceptionable, {
129
- method: "createAssertEquals",
130
- path: _path + ".nonce",
131
- expected: "string",
132
- value: input.nonce
133
- }, _errorFactory)) && ("string" === typeof input.timestamp || __typia_transform__assertGuard._assertGuard(_exceptionable, {
134
- method: "createAssertEquals",
135
- path: _path + ".timestamp",
136
- expected: "string",
137
- value: input.timestamp
138
- }, _errorFactory)) && ("string" === typeof input.signature || __typia_transform__assertGuard._assertGuard(_exceptionable, {
139
- method: "createAssertEquals",
140
- path: _path + ".signature",
141
- expected: "string",
142
- value: input.signature
143
- }, _errorFactory)) && (3 === Object.keys(input).length || (false === _exceptionable || Object.keys(input).every(key => {
144
- if (["nonce", "timestamp", "signature"].some(prop => key === prop))
145
- return true;
146
- const value = input[key];
147
- if (undefined === value)
148
- return true;
149
- return __typia_transform__assertGuard._assertGuard(_exceptionable, {
150
- method: "createAssertEquals",
151
- path: _path + __typia_transform__accessExpressionAsString._accessExpressionAsString(key),
152
- expected: "undefined",
153
- value: value
154
- }, _errorFactory);
155
121
  }))); const __is = (input, _exceptionable = true) => "object" === typeof input && null !== input && _io0(input, true); let _errorFactory; return (input, errorFactory) => {
156
122
  if (false === __is(input)) {
157
123
  _errorFactory = errorFactory;
158
124
  ((input, _path, _exceptionable = true) => ("object" === typeof input && null !== input || __typia_transform__assertGuard._assertGuard(true, {
159
125
  method: "createAssertEquals",
160
126
  path: _path + "",
161
- expected: "{ signed: { nonce: string; timestamp: string; signature: string; } & {}; username: string; account: TokenPublicKeyString | Secp256K1PublicKeyString | ... 4 more ... | MultisigPublicKeyString; } & { ...; }",
127
+ expected: "{ signed: HTTPSignedField; username: string; account: TokenPublicKeyString | Secp256K1PublicKeyString | ED25519PublicKeyString | NetworkPublicKeyString | StoragePublicKeyString | Secp256R1PublicKeyString | MultisigPublicKeyString; } & { ...; }",
162
128
  value: input
163
129
  }, _errorFactory)) && _ao0(input, _path + "", true) || __typia_transform__assertGuard._assertGuard(true, {
164
130
  method: "createAssertEquals",
165
131
  path: _path + "",
166
- expected: "{ signed: { nonce: string; timestamp: string; signature: string; } & {}; username: string; account: TokenPublicKeyString | Secp256K1PublicKeyString | ... 4 more ... | MultisigPublicKeyString; } & { ...; }",
132
+ expected: "{ signed: HTTPSignedField; username: string; account: TokenPublicKeyString | Secp256K1PublicKeyString | ED25519PublicKeyString | NetworkPublicKeyString | StoragePublicKeyString | Secp256R1PublicKeyString | MultisigPublicKeyString; } & { ...; }",
167
133
  value: input
168
134
  }, _errorFactory))(input, "$input", true);
169
135
  }
@@ -186,12 +152,12 @@ export const assertKeetaUsernameAnchorReleaseRequestJSON = (() => { const _io0 =
186
152
  })); const _ao0 = (input, _path, _exceptionable = true) => (("object" === typeof input.signed && null !== input.signed || __typia_transform__assertGuard._assertGuard(_exceptionable, {
187
153
  method: "createAssertEquals",
188
154
  path: _path + ".signed",
189
- expected: "{ nonce: string; timestamp: string; signature: string; } & {}",
155
+ expected: "HTTPSignedField",
190
156
  value: input.signed
191
157
  }, _errorFactory)) && _ao1(input.signed, _path + ".signed", true && _exceptionable) || __typia_transform__assertGuard._assertGuard(_exceptionable, {
192
158
  method: "createAssertEquals",
193
159
  path: _path + ".signed",
194
- expected: "{ nonce: string; timestamp: string; signature: string; } & {}",
160
+ expected: "HTTPSignedField",
195
161
  value: input.signed
196
162
  }, _errorFactory)) && ("string" === typeof input.account && (RegExp(/^keeta_am(.*)/).test(input.account) || RegExp(/^keeta_an(.*)/).test(input.account) || RegExp(/^keeta_ao(.*)/).test(input.account) || RegExp(/^keeta_ap(.*)/).test(input.account) || RegExp(/^tyblocks_am(.*)/).test(input.account) || RegExp(/^tyblocks_an(.*)/).test(input.account) || RegExp(/^tyblocks_ao(.*)/).test(input.account) || RegExp(/^tyblocks_ap(.*)/).test(input.account) || RegExp(/^keeta_aa(.*)/).test(input.account) || RegExp(/^keeta_ab(.*)/).test(input.account) || RegExp(/^keeta_ac(.*)/).test(input.account) || RegExp(/^keeta_ad(.*)/).test(input.account) || RegExp(/^tyblocks_aa(.*)/).test(input.account) || RegExp(/^tyblocks_ab(.*)/).test(input.account) || RegExp(/^tyblocks_ac(.*)/).test(input.account) || RegExp(/^tyblocks_ad(.*)/).test(input.account) || RegExp(/^keeta_ae(.*)/).test(input.account) || RegExp(/^keeta_af(.*)/).test(input.account) || RegExp(/^keeta_ag(.*)/).test(input.account) || RegExp(/^keeta_ah(.*)/).test(input.account) || RegExp(/^tyblocks_ae(.*)/).test(input.account) || RegExp(/^tyblocks_af(.*)/).test(input.account) || RegExp(/^tyblocks_ag(.*)/).test(input.account) || RegExp(/^tyblocks_ah(.*)/).test(input.account) || RegExp(/^keeta_ai(.*)/).test(input.account) || RegExp(/^keeta_aj(.*)/).test(input.account) || RegExp(/^keeta_ak(.*)/).test(input.account) || RegExp(/^keeta_al(.*)/).test(input.account) || RegExp(/^tyblocks_ai(.*)/).test(input.account) || RegExp(/^tyblocks_aj(.*)/).test(input.account) || RegExp(/^tyblocks_ak(.*)/).test(input.account) || RegExp(/^tyblocks_al(.*)/).test(input.account) || RegExp(/^keeta_at(.*)/).test(input.account) || RegExp(/^keeta_aq(.*)/).test(input.account) || RegExp(/^keeta_ar(.*)/).test(input.account) || RegExp(/^keeta_as(.*)/).test(input.account) || RegExp(/^tyblocks_at(.*)/).test(input.account) || RegExp(/^tyblocks_aq(.*)/).test(input.account) || RegExp(/^tyblocks_ar(.*)/).test(input.account) || RegExp(/^tyblocks_as(.*)/).test(input.account) || RegExp(/^keeta_ay(.*)/).test(input.account) || RegExp(/^keeta_az(.*)/).test(input.account) || RegExp(/^keeta_a2(.*)/).test(input.account) || RegExp(/^keeta_a3(.*)/).test(input.account) || RegExp(/^tyblocks_ay(.*)/).test(input.account) || RegExp(/^tyblocks_az(.*)/).test(input.account) || RegExp(/^tyblocks_a2(.*)/).test(input.account) || RegExp(/^tyblocks_a3(.*)/).test(input.account) || RegExp(/^keeta_a4(.*)/).test(input.account) || RegExp(/^keeta_a5(.*)/).test(input.account) || RegExp(/^keeta_a6(.*)/).test(input.account) || RegExp(/^keeta_a7(.*)/).test(input.account) || RegExp(/^tyblocks_a4(.*)/).test(input.account) || RegExp(/^tyblocks_a5(.*)/).test(input.account) || RegExp(/^tyblocks_a6(.*)/).test(input.account) || RegExp(/^tyblocks_a7(.*)/).test(input.account)) || __typia_transform__assertGuard._assertGuard(_exceptionable, {
197
163
  method: "createAssertEquals",
@@ -243,12 +209,12 @@ export const assertKeetaUsernameAnchorReleaseRequestJSON = (() => { const _io0 =
243
209
  ((input, _path, _exceptionable = true) => ("object" === typeof input && null !== input || __typia_transform__assertGuard._assertGuard(true, {
244
210
  method: "createAssertEquals",
245
211
  path: _path + "",
246
- expected: "{ signed: { nonce: string; timestamp: string; signature: string; } & {}; account: TokenPublicKeyString | Secp256K1PublicKeyString | ... 4 more ... | MultisigPublicKeyString; } & {}",
212
+ expected: "{ signed: HTTPSignedField; account: TokenPublicKeyString | Secp256K1PublicKeyString | ED25519PublicKeyString | NetworkPublicKeyString | StoragePublicKeyString | Secp256R1PublicKeyString | MultisigPublicKeyString; } & {}",
247
213
  value: input
248
214
  }, _errorFactory)) && _ao0(input, _path + "", true) || __typia_transform__assertGuard._assertGuard(true, {
249
215
  method: "createAssertEquals",
250
216
  path: _path + "",
251
- expected: "{ signed: { nonce: string; timestamp: string; signature: string; } & {}; account: TokenPublicKeyString | Secp256K1PublicKeyString | ... 4 more ... | MultisigPublicKeyString; } & {}",
217
+ expected: "{ signed: HTTPSignedField; account: TokenPublicKeyString | Secp256K1PublicKeyString | ED25519PublicKeyString | NetworkPublicKeyString | StoragePublicKeyString | Secp256R1PublicKeyString | MultisigPublicKeyString; } & {}",
252
218
  value: input
253
219
  }, _errorFactory))(input, "$input", true);
254
220
  }
@@ -1 +1 @@
1
- {"version":3,"file":"common.generated.js","sourceRoot":"","sources":["../../../src/services/username/common.generated.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAWrD,MAAM,CAAC,MAAM,yCAAyC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAAwI,CAAC;AAC/L,MAAM,CAAC,MAAM,2CAA2C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAA4I,CAAC;AACrM,MAAM,CAAC,MAAM,wCAAwC;;;;;;;sFAA0H,CAAC;AAChL,MAAM,CAAC,MAAM,sCAAsC;;;;;;;sFAAsH,CAAC;AAC1K,MAAM,CAAC,MAAM,wCAAwC;;;;;;;sFAA0H,CAAC;AAChL,MAAM,CAAC,MAAM,uCAAuC;;;;;;;sFAAwH,CAAC;AAG7K,MAAM,CAAC,MAAM,yBAAyB,yxEAA4E,CAAC","sourcesContent":["import { createAssertEquals, createIs } from 'typia';\nimport type {\n\tKeetaUsernameAnchorClaimRequestJSON,\n\tKeetaUsernameAnchorClaimResponseJSON,\n\tKeetaUsernameAnchorReleaseRequestJSON,\n\tKeetaUsernameAnchorReleaseResponseJSON,\n\tKeetaUsernameAnchorSearchResponseJSON,\n\tKeetaUsernameAnchorResolveResponseJSON\n} from './common.ts';\nimport type { AccountPublicKeyString, IdentifierPublicKeyString } from '@keetanetwork/keetanet-client/lib/account.js';\n\nexport const assertKeetaUsernameAnchorClaimRequestJSON: ReturnType<typeof createAssertEquals<KeetaUsernameAnchorClaimRequestJSON>> = createAssertEquals<KeetaUsernameAnchorClaimRequestJSON>();\nexport const assertKeetaUsernameAnchorReleaseRequestJSON: ReturnType<typeof createAssertEquals<KeetaUsernameAnchorReleaseRequestJSON>> = createAssertEquals<KeetaUsernameAnchorReleaseRequestJSON>();\nexport const isKeetaUsernameAnchorResolveResponseJSON: (input: unknown) => input is KeetaUsernameAnchorResolveResponseJSON = createIs<KeetaUsernameAnchorResolveResponseJSON>();\nexport const isKeetaUsernameAnchorClaimResponseJSON: (input: unknown) => input is KeetaUsernameAnchorClaimResponseJSON = createIs<KeetaUsernameAnchorClaimResponseJSON>();\nexport const isKeetaUsernameAnchorReleaseResponseJSON: (input: unknown) => input is KeetaUsernameAnchorReleaseResponseJSON = createIs<KeetaUsernameAnchorReleaseResponseJSON>();\nexport const isKeetaUsernameAnchorSearchResponseJSON: (input: unknown) => input is KeetaUsernameAnchorSearchResponseJSON = createIs<KeetaUsernameAnchorSearchResponseJSON>();\n\ntype PublicKeyString = IdentifierPublicKeyString | AccountPublicKeyString;\nexport const isKeetaNetPublicKeyString: (input: unknown) => input is PublicKeyString = createIs<PublicKeyString>();\n"]}
1
+ {"version":3,"file":"common.generated.js","sourceRoot":"","sources":["../../../src/services/username/common.generated.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAWrD,MAAM,CAAC,MAAM,yCAAyC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAAwI,CAAC;AAC/L,MAAM,CAAC,MAAM,2CAA2C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAA4I,CAAC;AACrM,MAAM,CAAC,MAAM,wCAAwC;;;;;;;sFAA0H,CAAC;AAChL,MAAM,CAAC,MAAM,sCAAsC;;;;;;;sFAAsH,CAAC;AAC1K,MAAM,CAAC,MAAM,wCAAwC;;;;;;;sFAA0H,CAAC;AAChL,MAAM,CAAC,MAAM,uCAAuC;;;;;;;sFAAwH,CAAC;AAG7K,MAAM,CAAC,MAAM,yBAAyB,yxEAA4E,CAAC","sourcesContent":["import { createAssertEquals, createIs } from 'typia';\nimport type {\n\tKeetaUsernameAnchorClaimRequestJSON,\n\tKeetaUsernameAnchorClaimResponseJSON,\n\tKeetaUsernameAnchorReleaseRequestJSON,\n\tKeetaUsernameAnchorReleaseResponseJSON,\n\tKeetaUsernameAnchorSearchResponseJSON,\n\tKeetaUsernameAnchorResolveResponseJSON\n} from './common.ts';\nimport type { AccountPublicKeyString, IdentifierPublicKeyString } from '@keetanetwork/keetanet-client/lib/account.js';\n\nexport const assertKeetaUsernameAnchorClaimRequestJSON: ReturnType<typeof createAssertEquals<KeetaUsernameAnchorClaimRequestJSON>> = createAssertEquals<KeetaUsernameAnchorClaimRequestJSON>();\nexport const assertKeetaUsernameAnchorReleaseRequestJSON: ReturnType<typeof createAssertEquals<KeetaUsernameAnchorReleaseRequestJSON>> = createAssertEquals<KeetaUsernameAnchorReleaseRequestJSON>();\nexport const isKeetaUsernameAnchorResolveResponseJSON: (input: unknown) => input is KeetaUsernameAnchorResolveResponseJSON = createIs<KeetaUsernameAnchorResolveResponseJSON>();\nexport const isKeetaUsernameAnchorClaimResponseJSON: (input: unknown) => input is KeetaUsernameAnchorClaimResponseJSON = createIs<KeetaUsernameAnchorClaimResponseJSON>();\nexport const isKeetaUsernameAnchorReleaseResponseJSON: (input: unknown) => input is KeetaUsernameAnchorReleaseResponseJSON = createIs<KeetaUsernameAnchorReleaseResponseJSON>();\nexport const isKeetaUsernameAnchorSearchResponseJSON: (input: unknown) => input is KeetaUsernameAnchorSearchResponseJSON = createIs<KeetaUsernameAnchorSearchResponseJSON>();\n\ntype PublicKeyString = IdentifierPublicKeyString | AccountPublicKeyString;\nexport const isKeetaNetPublicKeyString: (input: unknown) => input is PublicKeyString = createIs<PublicKeyString>();\n"]}
@@ -1,5 +1,5 @@
1
1
  import { lib as KeetaNetLib } from '@keetanetwork/keetanet-client';
2
- import { KeetaAnchorUserError, KeetaAnchorUserValidationError } from '../../lib/error.js';
2
+ import { KeetaAnchorCertificateRequiredError, KeetaAnchorUserError, KeetaAnchorUserValidationError } from '../../lib/error.js';
3
3
  export * from './common.generated.js';
4
4
  export const USERNAME_DELIMITER = '$';
5
5
  export const USERNAME_MIN_LENGTH = 1;
@@ -221,6 +221,7 @@ class KeetaUsernameAnchorUserNotFoundError extends KeetaAnchorUserError {
221
221
  }
222
222
  export const Errors = {
223
223
  UsernameAlreadyTaken: KeetaUsernameAnchorUsernameAlreadyTakenError,
224
- UserNotFound: KeetaUsernameAnchorUserNotFoundError
224
+ UserNotFound: KeetaUsernameAnchorUserNotFoundError,
225
+ CertificateRequired: KeetaAnchorCertificateRequiredError
225
226
  };
226
227
  //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/services/username/common.ts"],"names":[],"mappings":"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","sourcesContent":["import { lib as KeetaNetLib } from '@keetanetwork/keetanet-client';\nimport type { ToJSONSerializable } from '../../lib/utils/json.ts';\nimport type { HTTPSignedField } from '../../lib/http-server/common.js';\nimport type { Signable } from '../../lib/utils/signing.js';\nimport { KeetaAnchorUserError, KeetaAnchorUserValidationError } from '../../lib/error.js';\nexport * from './common.generated.js';\n\nexport const USERNAME_DELIMITER = '$';\nexport const USERNAME_MIN_LENGTH = 1;\nexport const USERNAME_MAX_LENGTH = 256;\n\nexport type UsernameValidationReason = 'length' | 'latin1';\n\nexport interface UsernameValidationIssue {\n\treason: UsernameValidationReason;\n\tmessage: string;\n}\n\ntype ValidateUsernameOptions = {\n\tpattern?: string | RegExp | undefined;\n\tfieldPath?: string;\n};\n\nexport function validateUsernameDefault(username: string, options: ValidateUsernameOptions = {}): void {\n\tconst fieldPath = options.fieldPath ?? 'username';\n\n\tif (username.length > USERNAME_MAX_LENGTH || username.length < USERNAME_MIN_LENGTH) {\n\t\tthrow(new KeetaAnchorUserValidationError({\n\t\t\tfields: [\n\t\t\t\t{\n\t\t\t\t\tpath: fieldPath,\n\t\t\t\t\tmessage: `Username must be between ${USERNAME_MIN_LENGTH}-${USERNAME_MAX_LENGTH} characters`,\n\t\t\t\t\treceivedValue: username\n\t\t\t\t}\n\t\t\t]\n\t\t}));\n\t}\n\n\tif (username.includes(USERNAME_DELIMITER)) {\n\t\tthrow(new KeetaAnchorUserValidationError({\n\t\t\tfields: [\n\t\t\t\t{\n\t\t\t\t\tpath: fieldPath,\n\t\t\t\t\tmessage: `Username must not contain \"${USERNAME_DELIMITER}\" character`,\n\t\t\t\t\treceivedValue: username\n\t\t\t\t}\n\t\t\t]\n\t\t}));\n\t}\n\n\tconst isUSAscii = /^[\\x20-\\x7E]*$/.test(username);\n\tif (!isUSAscii) {\n\t\tthrow(new KeetaAnchorUserValidationError({\n\t\t\tfields: [\n\t\t\t\t{\n\t\t\t\t\tpath: fieldPath,\n\t\t\t\t\tmessage: 'Username must contain only US ASCII characters',\n\t\t\t\t\treceivedValue: username\n\t\t\t\t}\n\t\t\t]\n\t\t}));\n\t}\n\n\tif (options.pattern !== undefined) {\n\t\tconst pattern = typeof options.pattern === 'string' ? new RegExp(options.pattern) : options.pattern;\n\t\tpattern.lastIndex = 0;\n\t\tif (!pattern.test(username)) {\n\t\t\tthrow(new KeetaAnchorUserValidationError({\n\t\t\t\tfields: [\n\t\t\t\t\t{\n\t\t\t\t\t\tpath: fieldPath,\n\t\t\t\t\t\tmessage: 'Provider issued name does not match required pattern',\n\t\t\t\t\t\treceivedValue: username,\n\t\t\t\t\t\texpected: pattern.source\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}));\n\t\t}\n\t}\n}\n\nexport type KeetaNetAccount = InstanceType<typeof KeetaNetLib.Account>;\nexport type GloballyIdentifiableUsername = `${string}${typeof USERNAME_DELIMITER}${string}`;\nexport interface UsernameComponents {\n\tusername: string;\n\tproviderID: string;\n};\n\nexport interface KeetaUsernameAnchorAccountResolutionContext { account: KeetaNetAccount; }\n\nexport interface KeetaUsernameAnchorUsernameResolutionContext { username: string; }\n\nexport interface KeetaUsernameAnchorSearchRequestParameters {\n\tsearch: string;\n}\n\nexport interface KeetaUsernameAnchorUsernameWithAccount {\n\tusername: string;\n\taccount: KeetaNetAccount;\n}\n\nexport type KeetaUsernameAnchorSearchResponse = ({\n\tok: true;\n\tresults: KeetaUsernameAnchorUsernameWithAccount[];\n}) | ({\n\tok: false;\n\terror: string;\n})\n\nexport type KeetaUsernameAnchorSearchResponseJSON = ToJSONSerializable<KeetaUsernameAnchorSearchResponse>;\n\nexport type KeetaUsernameAnchorResolveResponse = ({\n\tok: true;\n} & KeetaUsernameAnchorUsernameWithAccount) | ({\n\tok: false;\n\terror: string;\n});\n\nexport type KeetaUsernameAnchorResolveResponseJSON = ToJSONSerializable<KeetaUsernameAnchorResolveResponse>;\n\nexport interface KeetaUsernameAnchorClaimContext {\n\tusername: string;\n\taccount: KeetaNetAccount;\n\tfromUser: KeetaNetAccount | null;\n}\n\nexport interface KeetaUsernameAnchorClaimRequestPayload {\n\ttransfer?: Pick<TransferUsernameOwnershipSignablePayload, 'from'> & {\n\t\tsigned: HTTPSignedField;\n\t};\n\n\tusername: string;\n\taccount: KeetaNetAccount;\n};\n\n\nexport interface KeetaUsernameAnchorClaimRequest extends KeetaUsernameAnchorClaimRequestPayload {\n\tsigned: HTTPSignedField;\n};\n\nexport type KeetaUsernameAnchorClaimRequestJSON = ToJSONSerializable<KeetaUsernameAnchorClaimRequest>;\n\nexport type KeetaUsernameAnchorClaimResponseJSON = ({\n\tok: true;\n}) | ({\n\tok: false;\n\terror: string;\n});\n\n\nexport interface KeetaUsernameAnchorReleaseRequestPayload {\n\taccount: KeetaNetAccount;\n}\n\nexport interface KeetaUsernameAnchorReleaseRequest extends KeetaUsernameAnchorReleaseRequestPayload {\n\tsigned: HTTPSignedField;\n}\n\nexport type KeetaUsernameAnchorReleaseRequestJSON = ToJSONSerializable<KeetaUsernameAnchorReleaseRequest>;\n\nexport type KeetaUsernameAnchorReleaseResponseJSON = ({\n\tok: true;\n}) | ({\n\tok: false;\n\terror: string;\n});\n\nfunction assertSegment(value: string, type: 'provider issued unique name' | 'provider ID'): string {\n\tconst trimmed = value.trim();\n\tif (trimmed.length === 0) {\n\t\tthrow(new Error(`Globally identifiable username ${type} must not be empty`));\n\t}\n\n\tif (trimmed.includes(USERNAME_DELIMITER)) {\n\t\tthrow(new Error(`Globally identifiable username ${type} must not contain \"${USERNAME_DELIMITER}\"`));\n\t}\n\n\treturn(trimmed);\n}\n\nexport function formatGloballyIdentifiableUsername(providerIssuedName: string, providerID: string): GloballyIdentifiableUsername {\n\tconst safeName = assertSegment(providerIssuedName, 'provider issued unique name');\n\tconst safeProviderID = assertSegment(providerID, 'provider ID');\n\n\treturn(`${safeName}${USERNAME_DELIMITER}${safeProviderID}`);\n}\n\nfunction attemptParseGloballyIdentifiableUsername(input: unknown): UsernameComponents {\n\tif (typeof input !== 'string') {\n\t\tthrow(new Error('Globally identifiable username must be a string'));\n\t}\n\n\tconst trimmed = input.trim();\n\n\tif (trimmed.length !== input.length) {\n\t\tthrow(new Error('Globally identifiable username must not have leading or trailing whitespace'));\n\t}\n\n\tconst separatorIndex = trimmed.lastIndexOf(USERNAME_DELIMITER);\n\tif (separatorIndex === -1) {\n\t\tthrow(new Error(`Globally identifiable username must contain \"${USERNAME_DELIMITER}\" separator`));\n\t}\n\n\tconst providerIssuedNameSegment = trimmed.slice(0, separatorIndex);\n\tconst providerIDSegment = trimmed.slice(separatorIndex + 1);\n\n\tconst username = assertSegment(providerIssuedNameSegment, 'provider issued unique name');\n\tconst providerID = assertSegment(providerIDSegment, 'provider ID');\n\n\treturn({\n\t\tusername,\n\t\tproviderID\n\t});\n}\n\nexport function isGloballyIdentifiableUsername(input: unknown): input is GloballyIdentifiableUsername {\n\ttry {\n\t\tattemptParseGloballyIdentifiableUsername(input);\n\t\treturn(true);\n\t} catch {\n\t\treturn(false);\n\t}\n}\n\nexport function parseGloballyIdentifiableUsername(input: GloballyIdentifiableUsername): UsernameComponents {\n\treturn(attemptParseGloballyIdentifiableUsername(input));\n}\n\n// Namespace for the Username Anchor signable claims\nconst usernameNamespace = 'c26e65bf-ad9f-4000-bc81-12c31dc86b8b';\nexport function getUsernameClaimSignable(request: KeetaUsernameAnchorClaimRequestPayload): Signable {\n\treturn([\n\t\tusernameNamespace,\n\t\t'CLAIM_USERNAME',\n\t\trequest.username,\n\t\trequest.account.publicKeyString.get(),\n\n\t\t// Transfer data\n\t\trequest.transfer?.from ?? 0,\n\t\trequest.transfer?.signed.signature ?? 0,\n\t\trequest.transfer?.signed.nonce ?? 0,\n\t\trequest.transfer?.signed.timestamp ?? 0\n\t]);\n}\n\nexport interface TransferUsernameOwnershipSignablePayload {\n\tusername: string;\n\tto: KeetaNetAccount;\n\tfrom: KeetaNetAccount;\n}\n\nexport function getUsernameTransferSignable(payload: TransferUsernameOwnershipSignablePayload): Signable {\n\treturn([\n\t\tusernameNamespace,\n\t\t'TRANSFER_USERNAME',\n\t\tpayload.username,\n\t\tpayload.from,\n\t\tpayload.to\n\t]);\n}\n\n\nexport function getUsernameReleaseSignable(payload: KeetaUsernameAnchorReleaseRequestPayload): Signable {\n\treturn([\n\t\tusernameNamespace,\n\t\t'RELEASE_USERNAME',\n\t\tpayload.account\n\t]);\n}\n\ninterface KeetaUsernameAnchorUsernameAlreadyTakenErrorProperties {\n\tusername: string;\n}\n\ntype KeetaUsernameAnchorUsernameAlreadyTakenErrorJSON = ReturnType<KeetaAnchorUserError['toJSON']> & KeetaUsernameAnchorUsernameAlreadyTakenErrorProperties;\n\nclass KeetaUsernameAnchorUsernameAlreadyTakenError extends KeetaAnchorUserError implements KeetaUsernameAnchorUsernameAlreadyTakenErrorProperties {\n\tstatic override readonly name: string = 'KeetaUsernameAnchorUsernameAlreadyTakenError';\n\tprivate readonly KeetaUsernameAnchorUsernameAlreadyTakenErrorObjectTypeID!: string;\n\tprivate static readonly KeetaUsernameAnchorUsernameAlreadyTakenErrorObjectTypeID = 'e5bba4dd-0217-4d96-8f66-2b9a61069c11';\n\toverride readonly logLevel = 'INFO';\n\treadonly username: string;\n\n\tconstructor(properties: KeetaUsernameAnchorUsernameAlreadyTakenErrorProperties, message?: string) {\n\t\tsuper(message ?? `Username ${properties.username} already taken`);\n\t\tthis.statusCode = 409;\n\n\t\tObject.defineProperty(this, 'KeetaUsernameAnchorUsernameAlreadyTakenErrorObjectTypeID', {\n\t\t\tvalue: KeetaUsernameAnchorUsernameAlreadyTakenError.KeetaUsernameAnchorUsernameAlreadyTakenErrorObjectTypeID,\n\t\t\tenumerable: false\n\t\t});\n\n\t\tthis.username = properties.username;\n\t}\n\n\tstatic isInstance(input: unknown): input is KeetaUsernameAnchorUsernameAlreadyTakenError {\n\t\treturn(this.hasPropWithValue(input, 'KeetaUsernameAnchorUsernameAlreadyTakenErrorObjectTypeID', KeetaUsernameAnchorUsernameAlreadyTakenError.KeetaUsernameAnchorUsernameAlreadyTakenErrorObjectTypeID));\n\t}\n\n\ttoJSON(): KeetaUsernameAnchorUsernameAlreadyTakenErrorJSON {\n\t\treturn({\n\t\t\t...super.toJSON(),\n\t\t\tusername: this.username\n\t\t});\n\t}\n\n\tstatic async fromJSON(input: unknown): Promise<KeetaUsernameAnchorUsernameAlreadyTakenError> {\n\t\tconst { message, other } = this.extractErrorProperties(input, this);\n\n\t\tif (!('username' in other) || typeof other.username !== 'string') {\n\t\t\tthrow(new Error('Invalid KeetaUsernameAnchorUsernameAlreadyTakenError JSON object: missing or invalid username'));\n\t\t}\n\n\t\tconst error = new this({ username: other.username }, message);\n\t\terror.restoreFromJSON(other);\n\t\treturn(error);\n\t}\n}\n\ninterface KeetaUsernameAnchorUserNotFoundErrorProperties {\n\tusername?: string | undefined;\n\taccount?: KeetaNetAccount | undefined;\n}\n\ntype KeetaUsernameAnchorUserNotFoundErrorJSON = ReturnType<KeetaAnchorUserError['toJSON']> & KeetaUsernameAnchorUserNotFoundErrorProperties;\n\nclass KeetaUsernameAnchorUserNotFoundError extends KeetaAnchorUserError implements KeetaUsernameAnchorUserNotFoundErrorProperties {\n\tstatic override readonly name: string = 'KeetaUsernameAnchorUserNotFoundError';\n\tprivate readonly KeetaUsernameAnchorUserNotFoundErrorObjectTypeID!: string;\n\tprivate static readonly KeetaUsernameAnchorUserNotFoundErrorObjectTypeID = 'd4831db5-ca33-4c21-9780-ec86929f2e4c';\n\toverride readonly logLevel = 'INFO';\n\treadonly username: string | undefined;\n\treadonly account: KeetaNetAccount | undefined;\n\n\tconstructor(properties: KeetaUsernameAnchorUserNotFoundErrorProperties, message?: string) {\n\t\tsuper(message ?? `${properties.username ?? properties.account?.publicKeyString.get() ?? '<UNKNOWN>'} not found`);\n\t\tthis.statusCode = 404;\n\n\t\tObject.defineProperty(this, 'KeetaUsernameAnchorUserNotFoundErrorObjectTypeID', {\n\t\t\tvalue: KeetaUsernameAnchorUserNotFoundError.KeetaUsernameAnchorUserNotFoundErrorObjectTypeID,\n\t\t\tenumerable: false\n\t\t});\n\n\t\tthis.username = properties.username;\n\t\tthis.account = properties.account;\n\t}\n\n\tstatic isInstance(input: unknown): input is KeetaUsernameAnchorUserNotFoundError {\n\t\treturn(this.hasPropWithValue(input, 'KeetaUsernameAnchorUserNotFoundErrorObjectTypeID', KeetaUsernameAnchorUserNotFoundError.KeetaUsernameAnchorUserNotFoundErrorObjectTypeID));\n\t}\n\n\ttoJSON(): KeetaUsernameAnchorUserNotFoundErrorJSON {\n\t\treturn({\n\t\t\t...super.toJSON(),\n\t\t\tusername: this.username\n\t\t});\n\t}\n\n\tstatic async fromJSON(input: unknown): Promise<KeetaUsernameAnchorUserNotFoundError> {\n\t\tconst { message, other } = this.extractErrorProperties(input, this);\n\n\t\tconst properties: KeetaUsernameAnchorUserNotFoundErrorProperties = {};\n\t\tif ('username' in other) {\n\t\t\tif (typeof other.username !== 'string') {\n\t\t\t\tthrow(new Error('Invalid KeetaUsernameAnchorUserNotFoundError JSON object: missing or invalid username'));\n\t\t\t}\n\n\t\t\tproperties.username = other.username;\n\t\t}\n\n\t\tif ('account' in other && other.account) {\n\t\t\tif (typeof other.account !== 'string' && !(KeetaNetLib.Account.isInstance(other.account))) {\n\t\t\t\tthrow(new Error('Invalid KeetaUsernameAnchorUserNotFoundError JSON object: account must be a string or KeetaNet Account object'));\n\t\t\t}\n\t\t\tproperties.account = KeetaNetLib.Account.toAccount(other.account);\n\t\t}\n\n\t\tconst error = new this(properties, message);\n\t\terror.restoreFromJSON(other);\n\t\treturn(error);\n\t}\n}\n\nexport const Errors: {\n\tUsernameAlreadyTaken: typeof KeetaUsernameAnchorUsernameAlreadyTakenError;\n\tUserNotFound: typeof KeetaUsernameAnchorUserNotFoundError;\n} = {\n\tUsernameAlreadyTaken: KeetaUsernameAnchorUsernameAlreadyTakenError,\n\tUserNotFound: KeetaUsernameAnchorUserNotFoundError\n};\n"]}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/services/username/common.ts"],"names":[],"mappings":"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","sourcesContent":["import { lib as KeetaNetLib } from '@keetanetwork/keetanet-client';\nimport type { ToJSONSerializable } from '../../lib/utils/json.ts';\nimport type { HTTPSignedField } from '../../lib/http-server/common.js';\nimport type { Signable } from '../../lib/utils/signing.js';\nimport { KeetaAnchorCertificateRequiredError, KeetaAnchorUserError, KeetaAnchorUserValidationError } from '../../lib/error.js';\nexport * from './common.generated.js';\n\nexport const USERNAME_DELIMITER = '$';\nexport const USERNAME_MIN_LENGTH = 1;\nexport const USERNAME_MAX_LENGTH = 256;\n\nexport type UsernameValidationReason = 'length' | 'latin1';\n\nexport interface UsernameValidationIssue {\n\treason: UsernameValidationReason;\n\tmessage: string;\n}\n\ntype ValidateUsernameOptions = {\n\tpattern?: string | RegExp | undefined;\n\tfieldPath?: string;\n};\n\nexport function validateUsernameDefault(username: string, options: ValidateUsernameOptions = {}): void {\n\tconst fieldPath = options.fieldPath ?? 'username';\n\n\tif (username.length > USERNAME_MAX_LENGTH || username.length < USERNAME_MIN_LENGTH) {\n\t\tthrow(new KeetaAnchorUserValidationError({\n\t\t\tfields: [\n\t\t\t\t{\n\t\t\t\t\tpath: fieldPath,\n\t\t\t\t\tmessage: `Username must be between ${USERNAME_MIN_LENGTH}-${USERNAME_MAX_LENGTH} characters`,\n\t\t\t\t\treceivedValue: username\n\t\t\t\t}\n\t\t\t]\n\t\t}));\n\t}\n\n\tif (username.includes(USERNAME_DELIMITER)) {\n\t\tthrow(new KeetaAnchorUserValidationError({\n\t\t\tfields: [\n\t\t\t\t{\n\t\t\t\t\tpath: fieldPath,\n\t\t\t\t\tmessage: `Username must not contain \"${USERNAME_DELIMITER}\" character`,\n\t\t\t\t\treceivedValue: username\n\t\t\t\t}\n\t\t\t]\n\t\t}));\n\t}\n\n\tconst isUSAscii = /^[\\x20-\\x7E]*$/.test(username);\n\tif (!isUSAscii) {\n\t\tthrow(new KeetaAnchorUserValidationError({\n\t\t\tfields: [\n\t\t\t\t{\n\t\t\t\t\tpath: fieldPath,\n\t\t\t\t\tmessage: 'Username must contain only US ASCII characters',\n\t\t\t\t\treceivedValue: username\n\t\t\t\t}\n\t\t\t]\n\t\t}));\n\t}\n\n\tif (options.pattern !== undefined) {\n\t\tconst pattern = typeof options.pattern === 'string' ? new RegExp(options.pattern) : options.pattern;\n\t\tpattern.lastIndex = 0;\n\t\tif (!pattern.test(username)) {\n\t\t\tthrow(new KeetaAnchorUserValidationError({\n\t\t\t\tfields: [\n\t\t\t\t\t{\n\t\t\t\t\t\tpath: fieldPath,\n\t\t\t\t\t\tmessage: 'Provider issued name does not match required pattern',\n\t\t\t\t\t\treceivedValue: username,\n\t\t\t\t\t\texpected: pattern.source\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}));\n\t\t}\n\t}\n}\n\nexport type KeetaNetAccount = InstanceType<typeof KeetaNetLib.Account>;\nexport type GloballyIdentifiableUsername = `${string}${typeof USERNAME_DELIMITER}${string}`;\nexport interface UsernameComponents {\n\tusername: string;\n\tproviderID: string;\n};\n\nexport interface KeetaUsernameAnchorAccountResolutionContext { account: KeetaNetAccount; }\n\nexport interface KeetaUsernameAnchorUsernameResolutionContext { username: string; }\n\nexport interface KeetaUsernameAnchorSearchRequestParameters {\n\tsearch: string;\n}\n\nexport interface KeetaUsernameAnchorUsernameWithAccount {\n\tusername: string;\n\taccount: KeetaNetAccount;\n}\n\nexport type KeetaUsernameAnchorSearchResponse = ({\n\tok: true;\n\tresults: KeetaUsernameAnchorUsernameWithAccount[];\n}) | ({\n\tok: false;\n\terror: string;\n})\n\nexport type KeetaUsernameAnchorSearchResponseJSON = ToJSONSerializable<KeetaUsernameAnchorSearchResponse>;\n\nexport type KeetaUsernameAnchorResolveResponse = ({\n\tok: true;\n} & KeetaUsernameAnchorUsernameWithAccount) | ({\n\tok: false;\n\terror: string;\n});\n\nexport type KeetaUsernameAnchorResolveResponseJSON = ToJSONSerializable<KeetaUsernameAnchorResolveResponse>;\n\nexport interface KeetaUsernameAnchorClaimContext {\n\tusername: string;\n\taccount: KeetaNetAccount;\n\tfromUser: KeetaNetAccount | null;\n}\n\nexport interface KeetaUsernameAnchorClaimRequestPayload {\n\ttransfer?: Pick<TransferUsernameOwnershipSignablePayload, 'from'> & {\n\t\tsigned: HTTPSignedField;\n\t};\n\n\tusername: string;\n\taccount: KeetaNetAccount;\n};\n\n\nexport interface KeetaUsernameAnchorClaimRequest extends KeetaUsernameAnchorClaimRequestPayload {\n\tsigned: HTTPSignedField;\n};\n\nexport type KeetaUsernameAnchorClaimRequestJSON = ToJSONSerializable<KeetaUsernameAnchorClaimRequest>;\n\nexport type KeetaUsernameAnchorClaimResponseJSON = ({\n\tok: true;\n}) | ({\n\tok: false;\n\terror: string;\n});\n\n\nexport interface KeetaUsernameAnchorReleaseRequestPayload {\n\taccount: KeetaNetAccount;\n}\n\nexport interface KeetaUsernameAnchorReleaseRequest extends KeetaUsernameAnchorReleaseRequestPayload {\n\tsigned: HTTPSignedField;\n}\n\nexport type KeetaUsernameAnchorReleaseRequestJSON = ToJSONSerializable<KeetaUsernameAnchorReleaseRequest>;\n\nexport type KeetaUsernameAnchorReleaseResponseJSON = ({\n\tok: true;\n}) | ({\n\tok: false;\n\terror: string;\n});\n\nfunction assertSegment(value: string, type: 'provider issued unique name' | 'provider ID'): string {\n\tconst trimmed = value.trim();\n\tif (trimmed.length === 0) {\n\t\tthrow(new Error(`Globally identifiable username ${type} must not be empty`));\n\t}\n\n\tif (trimmed.includes(USERNAME_DELIMITER)) {\n\t\tthrow(new Error(`Globally identifiable username ${type} must not contain \"${USERNAME_DELIMITER}\"`));\n\t}\n\n\treturn(trimmed);\n}\n\nexport function formatGloballyIdentifiableUsername(providerIssuedName: string, providerID: string): GloballyIdentifiableUsername {\n\tconst safeName = assertSegment(providerIssuedName, 'provider issued unique name');\n\tconst safeProviderID = assertSegment(providerID, 'provider ID');\n\n\treturn(`${safeName}${USERNAME_DELIMITER}${safeProviderID}`);\n}\n\nfunction attemptParseGloballyIdentifiableUsername(input: unknown): UsernameComponents {\n\tif (typeof input !== 'string') {\n\t\tthrow(new Error('Globally identifiable username must be a string'));\n\t}\n\n\tconst trimmed = input.trim();\n\n\tif (trimmed.length !== input.length) {\n\t\tthrow(new Error('Globally identifiable username must not have leading or trailing whitespace'));\n\t}\n\n\tconst separatorIndex = trimmed.lastIndexOf(USERNAME_DELIMITER);\n\tif (separatorIndex === -1) {\n\t\tthrow(new Error(`Globally identifiable username must contain \"${USERNAME_DELIMITER}\" separator`));\n\t}\n\n\tconst providerIssuedNameSegment = trimmed.slice(0, separatorIndex);\n\tconst providerIDSegment = trimmed.slice(separatorIndex + 1);\n\n\tconst username = assertSegment(providerIssuedNameSegment, 'provider issued unique name');\n\tconst providerID = assertSegment(providerIDSegment, 'provider ID');\n\n\treturn({\n\t\tusername,\n\t\tproviderID\n\t});\n}\n\nexport function isGloballyIdentifiableUsername(input: unknown): input is GloballyIdentifiableUsername {\n\ttry {\n\t\tattemptParseGloballyIdentifiableUsername(input);\n\t\treturn(true);\n\t} catch {\n\t\treturn(false);\n\t}\n}\n\nexport function parseGloballyIdentifiableUsername(input: GloballyIdentifiableUsername): UsernameComponents {\n\treturn(attemptParseGloballyIdentifiableUsername(input));\n}\n\n// Namespace for the Username Anchor signable claims\nconst usernameNamespace = 'c26e65bf-ad9f-4000-bc81-12c31dc86b8b';\nexport function getUsernameClaimSignable(request: KeetaUsernameAnchorClaimRequestPayload): Signable {\n\treturn([\n\t\tusernameNamespace,\n\t\t'CLAIM_USERNAME',\n\t\trequest.username,\n\t\trequest.account.publicKeyString.get(),\n\n\t\t// Transfer data\n\t\trequest.transfer?.from ?? 0,\n\t\trequest.transfer?.signed.signature ?? 0,\n\t\trequest.transfer?.signed.nonce ?? 0,\n\t\trequest.transfer?.signed.timestamp ?? 0\n\t]);\n}\n\nexport interface TransferUsernameOwnershipSignablePayload {\n\tusername: string;\n\tto: KeetaNetAccount;\n\tfrom: KeetaNetAccount;\n}\n\nexport function getUsernameTransferSignable(payload: TransferUsernameOwnershipSignablePayload): Signable {\n\treturn([\n\t\tusernameNamespace,\n\t\t'TRANSFER_USERNAME',\n\t\tpayload.username,\n\t\tpayload.from,\n\t\tpayload.to\n\t]);\n}\n\n\nexport function getUsernameReleaseSignable(payload: KeetaUsernameAnchorReleaseRequestPayload): Signable {\n\treturn([\n\t\tusernameNamespace,\n\t\t'RELEASE_USERNAME',\n\t\tpayload.account\n\t]);\n}\n\ninterface KeetaUsernameAnchorUsernameAlreadyTakenErrorProperties {\n\tusername: string;\n}\n\ntype KeetaUsernameAnchorUsernameAlreadyTakenErrorJSON = ReturnType<KeetaAnchorUserError['toJSON']> & KeetaUsernameAnchorUsernameAlreadyTakenErrorProperties;\n\nclass KeetaUsernameAnchorUsernameAlreadyTakenError extends KeetaAnchorUserError implements KeetaUsernameAnchorUsernameAlreadyTakenErrorProperties {\n\tstatic override readonly name: string = 'KeetaUsernameAnchorUsernameAlreadyTakenError';\n\tprivate readonly KeetaUsernameAnchorUsernameAlreadyTakenErrorObjectTypeID!: string;\n\tprivate static readonly KeetaUsernameAnchorUsernameAlreadyTakenErrorObjectTypeID = 'e5bba4dd-0217-4d96-8f66-2b9a61069c11';\n\toverride readonly logLevel = 'INFO';\n\treadonly username: string;\n\n\tconstructor(properties: KeetaUsernameAnchorUsernameAlreadyTakenErrorProperties, message?: string) {\n\t\tsuper(message ?? `Username ${properties.username} already taken`);\n\t\tthis.statusCode = 409;\n\n\t\tObject.defineProperty(this, 'KeetaUsernameAnchorUsernameAlreadyTakenErrorObjectTypeID', {\n\t\t\tvalue: KeetaUsernameAnchorUsernameAlreadyTakenError.KeetaUsernameAnchorUsernameAlreadyTakenErrorObjectTypeID,\n\t\t\tenumerable: false\n\t\t});\n\n\t\tthis.username = properties.username;\n\t}\n\n\tstatic isInstance(input: unknown): input is KeetaUsernameAnchorUsernameAlreadyTakenError {\n\t\treturn(this.hasPropWithValue(input, 'KeetaUsernameAnchorUsernameAlreadyTakenErrorObjectTypeID', KeetaUsernameAnchorUsernameAlreadyTakenError.KeetaUsernameAnchorUsernameAlreadyTakenErrorObjectTypeID));\n\t}\n\n\ttoJSON(): KeetaUsernameAnchorUsernameAlreadyTakenErrorJSON {\n\t\treturn({\n\t\t\t...super.toJSON(),\n\t\t\tusername: this.username\n\t\t});\n\t}\n\n\tstatic async fromJSON(input: unknown): Promise<KeetaUsernameAnchorUsernameAlreadyTakenError> {\n\t\tconst { message, other } = this.extractErrorProperties(input, this);\n\n\t\tif (!('username' in other) || typeof other.username !== 'string') {\n\t\t\tthrow(new Error('Invalid KeetaUsernameAnchorUsernameAlreadyTakenError JSON object: missing or invalid username'));\n\t\t}\n\n\t\tconst error = new this({ username: other.username }, message);\n\t\terror.restoreFromJSON(other);\n\t\treturn(error);\n\t}\n}\n\ninterface KeetaUsernameAnchorUserNotFoundErrorProperties {\n\tusername?: string | undefined;\n\taccount?: KeetaNetAccount | undefined;\n}\n\ntype KeetaUsernameAnchorUserNotFoundErrorJSON = ReturnType<KeetaAnchorUserError['toJSON']> & KeetaUsernameAnchorUserNotFoundErrorProperties;\n\nclass KeetaUsernameAnchorUserNotFoundError extends KeetaAnchorUserError implements KeetaUsernameAnchorUserNotFoundErrorProperties {\n\tstatic override readonly name: string = 'KeetaUsernameAnchorUserNotFoundError';\n\tprivate readonly KeetaUsernameAnchorUserNotFoundErrorObjectTypeID!: string;\n\tprivate static readonly KeetaUsernameAnchorUserNotFoundErrorObjectTypeID = 'd4831db5-ca33-4c21-9780-ec86929f2e4c';\n\toverride readonly logLevel = 'INFO';\n\treadonly username: string | undefined;\n\treadonly account: KeetaNetAccount | undefined;\n\n\tconstructor(properties: KeetaUsernameAnchorUserNotFoundErrorProperties, message?: string) {\n\t\tsuper(message ?? `${properties.username ?? properties.account?.publicKeyString.get() ?? '<UNKNOWN>'} not found`);\n\t\tthis.statusCode = 404;\n\n\t\tObject.defineProperty(this, 'KeetaUsernameAnchorUserNotFoundErrorObjectTypeID', {\n\t\t\tvalue: KeetaUsernameAnchorUserNotFoundError.KeetaUsernameAnchorUserNotFoundErrorObjectTypeID,\n\t\t\tenumerable: false\n\t\t});\n\n\t\tthis.username = properties.username;\n\t\tthis.account = properties.account;\n\t}\n\n\tstatic isInstance(input: unknown): input is KeetaUsernameAnchorUserNotFoundError {\n\t\treturn(this.hasPropWithValue(input, 'KeetaUsernameAnchorUserNotFoundErrorObjectTypeID', KeetaUsernameAnchorUserNotFoundError.KeetaUsernameAnchorUserNotFoundErrorObjectTypeID));\n\t}\n\n\ttoJSON(): KeetaUsernameAnchorUserNotFoundErrorJSON {\n\t\treturn({\n\t\t\t...super.toJSON(),\n\t\t\tusername: this.username\n\t\t});\n\t}\n\n\tstatic async fromJSON(input: unknown): Promise<KeetaUsernameAnchorUserNotFoundError> {\n\t\tconst { message, other } = this.extractErrorProperties(input, this);\n\n\t\tconst properties: KeetaUsernameAnchorUserNotFoundErrorProperties = {};\n\t\tif ('username' in other) {\n\t\t\tif (typeof other.username !== 'string') {\n\t\t\t\tthrow(new Error('Invalid KeetaUsernameAnchorUserNotFoundError JSON object: missing or invalid username'));\n\t\t\t}\n\n\t\t\tproperties.username = other.username;\n\t\t}\n\n\t\tif ('account' in other && other.account) {\n\t\t\tif (typeof other.account !== 'string' && !(KeetaNetLib.Account.isInstance(other.account))) {\n\t\t\t\tthrow(new Error('Invalid KeetaUsernameAnchorUserNotFoundError JSON object: account must be a string or KeetaNet Account object'));\n\t\t\t}\n\t\t\tproperties.account = KeetaNetLib.Account.toAccount(other.account);\n\t\t}\n\n\t\tconst error = new this(properties, message);\n\t\terror.restoreFromJSON(other);\n\t\treturn(error);\n\t}\n}\n\nexport const Errors: {\n\tUsernameAlreadyTaken: typeof KeetaUsernameAnchorUsernameAlreadyTakenError;\n\tUserNotFound: typeof KeetaUsernameAnchorUserNotFoundError;\n\tCertificateRequired: typeof KeetaAnchorCertificateRequiredError;\n} = {\n\tUsernameAlreadyTaken: KeetaUsernameAnchorUsernameAlreadyTakenError,\n\tUserNotFound: KeetaUsernameAnchorUserNotFoundError,\n\tCertificateRequired: KeetaAnchorCertificateRequiredError\n};\n"]}
@@ -1,9 +1,10 @@
1
1
  import { KeetaNet } from '../../client/index.js';
2
- import * as KeetaAnchorHTTPServer from '../../lib/http-server/index.js';
3
- import type { KeetaUsernameAnchorUsernameResolutionContext, KeetaUsernameAnchorAccountResolutionContext, KeetaUsernameAnchorSearchRequestParameters, KeetaUsernameAnchorUsernameWithAccount } from './common.js';
4
- import { type KeetaUsernameAnchorClaimContext } from './common.js';
2
+ import type * as KeetaAnchorHTTPServer from '../../lib/http-server/index.js';
3
+ import type { KeetaAnchorMetadataServerConfig } from '../../lib/anchor-metadata-server.js';
4
+ import type { KeetaUsernameAnchorUsernameResolutionContext, KeetaUsernameAnchorAccountResolutionContext, KeetaUsernameAnchorSearchRequestParameters, KeetaUsernameAnchorUsernameWithAccount, KeetaUsernameAnchorClaimContext } from './common.js';
5
5
  import type { ServiceMetadata } from '../../lib/resolver.ts';
6
6
  import type { Routes } from '../../lib/http-server/index.ts';
7
+ import { KeetaAnchorMetadataServer } from '../../lib/anchor-metadata-server.js';
7
8
  type ClaimHandlerResponse = {
8
9
  ok: true;
9
10
  } | {
@@ -16,7 +17,7 @@ type ClaimHandlerResponse = {
16
17
  type SearchHandlerResponse = {
17
18
  results: KeetaUsernameAnchorUsernameWithAccount[];
18
19
  };
19
- export interface KeetaAnchorUsernameServerConfig extends KeetaAnchorHTTPServer.KeetaAnchorHTTPServerConfig {
20
+ export interface KeetaAnchorUsernameServerConfig extends KeetaAnchorMetadataServerConfig {
20
21
  homepage?: string | (() => Promise<string> | string);
21
22
  usernames: {
22
23
  resolveUsername: (input: KeetaUsernameAnchorUsernameResolutionContext) => Promise<{
@@ -36,14 +37,14 @@ export interface KeetaAnchorUsernameServerConfig extends KeetaAnchorHTTPServer.K
36
37
  routes?: Routes;
37
38
  usernamePattern?: string | RegExp;
38
39
  }
39
- export declare class KeetaNetUsernameAnchorHTTPServer extends KeetaAnchorHTTPServer.KeetaNetAnchorHTTPServer<KeetaAnchorUsernameServerConfig> {
40
+ export declare class KeetaNetUsernameAnchorHTTPServer extends KeetaAnchorMetadataServer<NonNullable<ServiceMetadata['services']['username']>[string], KeetaAnchorUsernameServerConfig> {
40
41
  #private;
41
42
  readonly homepage: NonNullable<KeetaAnchorUsernameServerConfig['homepage']>;
42
43
  readonly usernames: KeetaAnchorUsernameServerConfig['usernames'];
43
44
  readonly routes: NonNullable<KeetaAnchorUsernameServerConfig['routes']>;
44
45
  constructor(config: KeetaAnchorUsernameServerConfig);
45
46
  protected initRoutes(config: KeetaAnchorUsernameServerConfig): Promise<KeetaAnchorHTTPServer.Routes>;
46
- serviceMetadata(): Promise<NonNullable<ServiceMetadata['services']['username']>[string]>;
47
+ protected buildServiceMetadata(): Promise<NonNullable<ServiceMetadata['services']['username']>[string]>;
47
48
  }
48
49
  export {};
49
50
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/services/username/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,KAAK,qBAAqB,MAAM,gCAAgC,CAAC;AACxE,OAAO,KAAK,EACX,4CAA4C,EAC5C,2CAA2C,EAG3C,0CAA0C,EAC1C,sCAAsC,EACC,MAAM,aAAa,CAAC;AAC5D,OAAO,EAGN,KAAK,+BAA+B,EAOpC,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,eAAe,EAAqC,MAAM,uBAAuB,CAAC;AAChG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAoB7D,KAAK,oBAAoB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,IAAI,CAAC;CAAE,CAAC;AACxG,KAAK,qBAAqB,GAAG;IAAE,OAAO,EAAE,sCAAsC,EAAE,CAAA;CAAE,CAAC;AAEnF,MAAM,WAAW,+BAAgC,SAAQ,qBAAqB,CAAC,2BAA2B;IACzG,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;IACrD,SAAS,EAAE;QACV,eAAe,EAAE,CAAC,KAAK,EAAE,4CAA4C,KAAK,OAAO,CAAC;YAAE,OAAO,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;SAAE,GAAG,IAAI,CAAC,CAAC;QAClJ,cAAc,EAAE,CAAC,KAAK,EAAE,2CAA2C,KAAK,OAAO,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;SAAE,GAAG,IAAI,CAAC,CAAC;QAE9G,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE;YAAE,OAAO,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;SAAE,KAAK,OAAO,CAAC;YAAE,EAAE,EAAE,OAAO,CAAC;SAAE,CAAC,CAAC;QAChH,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,+BAA+B,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAEpF,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,0CAA0C,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC;KACjG,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAClC;AAED,qBAAa,gCAAiC,SAAQ,qBAAqB,CAAC,wBAAwB,CAAC,+BAA+B,CAAC;;IACpI,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,+BAA+B,CAAC,UAAU,CAAC,CAAC,CAAC;IAC5E,QAAQ,CAAC,SAAS,EAAE,+BAA+B,CAAC,WAAW,CAAC,CAAC;IACjE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,+BAA+B,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAG5D,MAAM,EAAE,+BAA+B;cAkBnC,UAAU,CAAC,MAAM,EAAE,+BAA+B,GAAG,OAAO,CAAC,qBAAqB,CAAC,MAAM,CAAC;IAyOpG,eAAe,IAAI,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;CAiC9F"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/services/username/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,KAAK,KAAK,qBAAqB,MAAM,gCAAgC,CAAC;AAC7E,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,KAAK,EACX,4CAA4C,EAC5C,2CAA2C,EAG3C,0CAA0C,EAC1C,sCAAsC,EAEtC,+BAA+B,EAC/B,MAAM,aAAa,CAAC;AAWrB,OAAO,KAAK,EAAE,eAAe,EAAqC,MAAM,uBAAuB,CAAC;AAChG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAqBhF,KAAK,oBAAoB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,IAAI,CAAC;CAAE,CAAC;AACxG,KAAK,qBAAqB,GAAG;IAAE,OAAO,EAAE,sCAAsC,EAAE,CAAA;CAAE,CAAC;AAEnF,MAAM,WAAW,+BAAgC,SAAQ,+BAA+B;IACvF,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;IACrD,SAAS,EAAE;QACV,eAAe,EAAE,CAAC,KAAK,EAAE,4CAA4C,KAAK,OAAO,CAAC;YAAE,OAAO,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;SAAE,GAAG,IAAI,CAAC,CAAC;QAClJ,cAAc,EAAE,CAAC,KAAK,EAAE,2CAA2C,KAAK,OAAO,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;SAAE,GAAG,IAAI,CAAC,CAAC;QAE9G,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE;YAAE,OAAO,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;SAAE,KAAK,OAAO,CAAC;YAAE,EAAE,EAAE,OAAO,CAAC;SAAE,CAAC,CAAC;QAChH,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,+BAA+B,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAEpF,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,0CAA0C,KAAK,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC;KACjG,CAAC;IACF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAClC;AAED,qBAAa,gCAAiC,SAAQ,yBAAyB,CAAC,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,+BAA+B,CAAC;;IAC7K,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,+BAA+B,CAAC,UAAU,CAAC,CAAC,CAAC;IAC5E,QAAQ,CAAC,SAAS,EAAE,+BAA+B,CAAC,WAAW,CAAC,CAAC;IACjE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,+BAA+B,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAG5D,MAAM,EAAE,+BAA+B;cAkBnC,UAAU,CAAC,MAAM,EAAE,+BAA+B,GAAG,OAAO,CAAC,qBAAqB,CAAC,MAAM,CAAC;cAuN1F,oBAAoB,IAAI,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;CAmC7G"}
@@ -1,7 +1,8 @@
1
1
  import { KeetaNet } from '../../client/index.js';
2
- import * as KeetaAnchorHTTPServer from '../../lib/http-server/index.js';
3
2
  import { getUsernameClaimSignable, validateUsernameDefault, Errors, isKeetaNetPublicKeyString, assertKeetaUsernameAnchorClaimRequestJSON, getUsernameTransferSignable, assertKeetaUsernameAnchorReleaseRequestJSON, getUsernameReleaseSignable } from './common.js';
3
+ import { KeetaAnchorMetadataServer } from '../../lib/anchor-metadata-server.js';
4
4
  import { KeetaAnchorUserError, KeetaAnchorUserValidationError } from '../../lib/error.js';
5
+ import { verifyBodyAuth } from '../../lib/http-server/common.js';
5
6
  import * as Signing from '../../lib/utils/signing.js';
6
7
  function normalizeUsernamePattern(pattern) {
7
8
  if (typeof pattern === 'string') {
@@ -17,7 +18,7 @@ function normalizeUsernamePattern(pattern) {
17
18
  }
18
19
  return (new RegExp(pattern.source));
19
20
  }
20
- export class KeetaNetUsernameAnchorHTTPServer extends KeetaAnchorHTTPServer.KeetaNetAnchorHTTPServer {
21
+ export class KeetaNetUsernameAnchorHTTPServer extends KeetaAnchorMetadataServer {
21
22
  homepage;
22
23
  usernames;
23
24
  routes;
@@ -118,46 +119,42 @@ export class KeetaNetUsernameAnchorHTTPServer extends KeetaAnchorHTTPServer.Keet
118
119
  const claimHandler = this.usernames.claim;
119
120
  if (claimHandler) {
120
121
  routes['POST /api/claim'] = async (_params, body) => {
121
- const request = (() => {
122
- const raw = assertKeetaUsernameAnchorClaimRequestJSON(body);
123
- const ret = {
124
- username: raw.username,
125
- account: KeetaNet.lib.Account.toAccount(raw.account),
126
- signed: raw.signed
127
- };
128
- if (raw.transfer) {
129
- ret.transfer = {
130
- from: KeetaNet.lib.Account.toAccount(raw.transfer.from),
131
- signed: raw.transfer.signed
132
- };
133
- }
134
- return (ret);
135
- })();
136
- const username = request.username;
137
- this.#assertProviderIssuedNameValid(username);
138
- if (request.transfer) {
122
+ const raw = assertKeetaUsernameAnchorClaimRequestJSON(body);
123
+ this.#assertProviderIssuedNameValid(raw.username);
124
+ let transfer;
125
+ if (raw.transfer) {
126
+ const fromAccount = KeetaNet.lib.Account.toAccount(raw.transfer.from);
127
+ const toAccount = KeetaNet.lib.Account.toAccount(raw.account);
139
128
  const transferSignable = getUsernameTransferSignable({
140
- username: request.username,
141
- from: request.transfer.from,
142
- to: request.account
129
+ username: raw.username,
130
+ from: fromAccount,
131
+ to: toAccount
143
132
  });
144
- const verifiedTransfer = await Signing.VerifySignedData(request.transfer.from, transferSignable, request.transfer.signed);
133
+ const verifiedTransfer = await Signing.VerifySignedData(fromAccount, transferSignable, raw.transfer.signed);
145
134
  if (!verifiedTransfer) {
146
135
  throw (new KeetaAnchorUserError('Invalid username claim transfer signature'));
147
136
  }
137
+ transfer = { from: fromAccount, signed: raw.transfer.signed };
148
138
  }
149
- const verified = await Signing.VerifySignedData(request.account, getUsernameClaimSignable(request), request.signed);
150
- if (!verified) {
151
- throw (new KeetaAnchorUserError('Invalid username claim signature'));
152
- }
139
+ const account = await verifyBodyAuth(raw, function (req) {
140
+ const claimAccount = KeetaNet.lib.Account.toAccount(req.account);
141
+ const claimPayload = {
142
+ username: req.username,
143
+ account: claimAccount
144
+ };
145
+ if (transfer) {
146
+ claimPayload.transfer = transfer;
147
+ }
148
+ return (getUsernameClaimSignable(claimPayload));
149
+ }, this.resolvedCertificateChainRequirement);
153
150
  const claimResponse = await claimHandler({
154
- username: request.username,
155
- account: request.account,
156
- fromUser: request.transfer?.from ?? null
151
+ username: raw.username,
152
+ account,
153
+ fromUser: transfer?.from ?? null
157
154
  });
158
155
  if (!claimResponse.ok) {
159
156
  if (claimResponse.taken) {
160
- throw (new Errors.UsernameAlreadyTaken({ username }));
157
+ throw (new Errors.UsernameAlreadyTaken({ username: raw.username }));
161
158
  }
162
159
  else {
163
160
  throw (new KeetaAnchorUserError('Username claim rejected'));
@@ -172,18 +169,11 @@ export class KeetaNetUsernameAnchorHTTPServer extends KeetaAnchorHTTPServer.Keet
172
169
  const releaseHandler = this.usernames.releaseUsername;
173
170
  if (releaseHandler) {
174
171
  routes['POST /api/release'] = async (_params, body) => {
175
- const request = (() => {
176
- const raw = assertKeetaUsernameAnchorReleaseRequestJSON(body);
177
- return ({
178
- account: KeetaNet.lib.Account.toAccount(raw.account),
179
- signed: raw.signed
180
- });
181
- })();
182
- const verified = await Signing.VerifySignedData(request.account, getUsernameReleaseSignable(request), request.signed);
183
- if (!verified) {
184
- throw (new KeetaAnchorUserError('Invalid username claim signature'));
185
- }
186
- const releaseResponse = await releaseHandler({ account: request.account });
172
+ const raw = assertKeetaUsernameAnchorReleaseRequestJSON(body);
173
+ const account = await verifyBodyAuth(raw, function (req) {
174
+ return (getUsernameReleaseSignable({ account: KeetaNet.lib.Account.toAccount(req.account) }));
175
+ }, this.resolvedCertificateChainRequirement);
176
+ const releaseResponse = await releaseHandler({ account });
187
177
  if (!releaseResponse.ok) {
188
178
  throw (new KeetaAnchorUserError('Release claim rejected'));
189
179
  }
@@ -230,7 +220,8 @@ export class KeetaNetUsernameAnchorHTTPServer extends KeetaAnchorHTTPServer.Keet
230
220
  }
231
221
  return (routes);
232
222
  }
233
- async serviceMetadata() {
223
+ async buildServiceMetadata() {
224
+ const acceptedIssuerDNs = this.acceptedIssuerDNs();
234
225
  const operations = {
235
226
  resolve: (new URL('/api/resolve/{toResolve}', this.url)).toString()
236
227
  };
@@ -255,7 +246,8 @@ export class KeetaNetUsernameAnchorHTTPServer extends KeetaAnchorHTTPServer.Keet
255
246
  }
256
247
  return ({
257
248
  operations,
258
- ...(this.#usernamePattern ? { usernamePattern: this.#usernamePattern.source } : {})
249
+ ...(this.#usernamePattern ? { usernamePattern: this.#usernamePattern.source } : {}),
250
+ ...(acceptedIssuerDNs !== undefined && { acceptedIssuerDNs })
259
251
  });
260
252
  }
261
253
  }
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/services/username/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { KeetaNet } from '../../client/index.js';\nimport * as KeetaAnchorHTTPServer from '../../lib/http-server/index.js';\nimport type {\n\tKeetaUsernameAnchorUsernameResolutionContext,\n\tKeetaUsernameAnchorAccountResolutionContext,\n\tKeetaUsernameAnchorClaimRequest,\n\tKeetaUsernameAnchorReleaseRequest,\n\tKeetaUsernameAnchorSearchRequestParameters,\n\tKeetaUsernameAnchorUsernameWithAccount,\n\tKeetaUsernameAnchorSearchResponseJSON } from './common.js';\nimport {\n\tgetUsernameClaimSignable,\n\tvalidateUsernameDefault,\n\ttype KeetaUsernameAnchorClaimContext,\n\tErrors,\n\tisKeetaNetPublicKeyString,\n\tassertKeetaUsernameAnchorClaimRequestJSON,\n\tgetUsernameTransferSignable,\n\tassertKeetaUsernameAnchorReleaseRequestJSON,\n\tgetUsernameReleaseSignable\n} from './common.js';\nimport type { ServiceMetadata, ServiceMetadataAuthenticationType } from '../../lib/resolver.ts';\nimport type { Routes } from '../../lib/http-server/index.ts';\nimport { KeetaAnchorUserError, KeetaAnchorUserValidationError } from '../../lib/error.js';\nimport * as Signing from '../../lib/utils/signing.js';\n\nfunction normalizeUsernamePattern(pattern: string | RegExp): RegExp {\n\tif (typeof pattern === 'string') {\n\t\ttry {\n\t\t\treturn(new RegExp(pattern));\n\t\t} catch (error) {\n\t\t\tthrow(new Error(`Invalid usernamePattern regex: ${error instanceof Error ? error.message : String(error)}`));\n\t\t}\n\t}\n\n\tif (pattern.flags !== '') {\n\t\tthrow(new Error('usernamePattern RegExp must not specify flags')); // Flags cannot be reliably shared via metadata string\n\t}\n\n\treturn(new RegExp(pattern.source));\n}\n\ntype ClaimHandlerResponse = { ok: true; } | { ok: false; taken?: false; } | { ok: false; taken: true; };\ntype SearchHandlerResponse = { results: KeetaUsernameAnchorUsernameWithAccount[] };\n\nexport interface KeetaAnchorUsernameServerConfig extends KeetaAnchorHTTPServer.KeetaAnchorHTTPServerConfig {\n\thomepage?: string | (() => Promise<string> | string);\n\tusernames: {\n\t\tresolveUsername: (input: KeetaUsernameAnchorUsernameResolutionContext) => Promise<{ account: InstanceType<typeof KeetaNet.lib.Account>; } | null>;\n\t\tresolveAccount: (input: KeetaUsernameAnchorAccountResolutionContext) => Promise<{ username: string; } | null>;\n\n\t\treleaseUsername?: (input: { account: InstanceType<typeof KeetaNet.lib.Account>; }) => Promise<{ ok: boolean; }>;\n\t\tclaim?: ((input: KeetaUsernameAnchorClaimContext) => Promise<ClaimHandlerResponse>);\n\n\t\tsearch?: ((input: KeetaUsernameAnchorSearchRequestParameters) => Promise<SearchHandlerResponse>);\n\t};\n\troutes?: Routes;\n\tusernamePattern?: string | RegExp;\n}\n\nexport class KeetaNetUsernameAnchorHTTPServer extends KeetaAnchorHTTPServer.KeetaNetAnchorHTTPServer<KeetaAnchorUsernameServerConfig> {\n\treadonly homepage: NonNullable<KeetaAnchorUsernameServerConfig['homepage']>;\n\treadonly usernames: KeetaAnchorUsernameServerConfig['usernames'];\n\treadonly routes: NonNullable<KeetaAnchorUsernameServerConfig['routes']>;\n\treadonly #usernamePattern?: RegExp;\n\n\tconstructor(config: KeetaAnchorUsernameServerConfig) {\n\t\tsuper(config);\n\n\t\tthis.homepage = config.homepage ?? '';\n\t\tthis.usernames = config.usernames;\n\t\tthis.routes = config.routes ?? {};\n\t\tif (config.usernamePattern !== undefined) {\n\t\t\tthis.#usernamePattern = normalizeUsernamePattern(config.usernamePattern);\n\t\t}\n\t}\n\n\t#assertProviderIssuedNameValid(username: string, fieldPath = 'username'): void {\n\t\tvalidateUsernameDefault(username, {\n\t\t\tpattern: this.#usernamePattern,\n\t\t\tfieldPath: fieldPath\n\t\t});\n\t}\n\n\tprotected async initRoutes(config: KeetaAnchorUsernameServerConfig): Promise<KeetaAnchorHTTPServer.Routes> {\n\t\tconst routes: KeetaAnchorHTTPServer.Routes = { ...this.routes };\n\n\t\tif ('homepage' in config) {\n\t\t\troutes['GET /'] = async function() {\n\t\t\t\tlet homepageData: string;\n\t\t\t\tif (typeof config.homepage === 'string') {\n\t\t\t\t\thomepageData = config.homepage;\n\t\t\t\t} else {\n\t\t\t\t\tif (!config.homepage) {\n\t\t\t\t\t\tthrow(new Error('internal error: No homepage function provided'));\n\t\t\t\t\t}\n\n\t\t\t\t\thomepageData = await config.homepage();\n\t\t\t\t}\n\n\t\t\t\treturn({\n\t\t\t\t\toutput: homepageData,\n\t\t\t\t\tcontentType: 'text/html; charset=utf-8'\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\t\troutes['GET /api/resolve/:toResolve'] = async (params) => {\n\t\t\tlet toResolve = params.get('toResolve');\n\t\t\tif (!toResolve) {\n\t\t\t\tthrow(new KeetaAnchorUserError('Missing toResolve parameter'));\n\t\t\t}\n\n\t\t\tlet resolution;\n\t\t\tlet account = null;\n\t\t\tlet username = null;\n\t\t\tif (isKeetaNetPublicKeyString(toResolve)) {\n\t\t\t\taccount = KeetaNet.lib.Account.fromPublicKeyString(toResolve);\n\t\t\t\tresolution = await this.usernames.resolveAccount({ account });\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\ttoResolve = decodeURIComponent(toResolve);\n\t\t\t\t} catch {\n\t\t\t\t\tthrow(new KeetaAnchorUserValidationError({\n\t\t\t\t\t\tfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpath: 'toResolve',\n\t\t\t\t\t\t\t\tmessage: 'toResolve parameter is not a valid URI component',\n\t\t\t\t\t\t\t\treceivedValue: toResolve\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t}));\n\t\t\t\t}\n\n\t\t\t\tthis.#assertProviderIssuedNameValid(toResolve);\n\t\t\t\tusername = toResolve;\n\t\t\t\tresolution = await this.usernames.resolveUsername({ username });\n\t\t\t}\n\n\t\t\tif (!resolution) {\n\t\t\t\tthrow(new Errors.UserNotFound({ username: username ?? undefined, account: account ?? undefined }));\n\t\t\t}\n\n\t\t\tif ('account' in resolution) {\n\t\t\t\tif (account !== null && !(account.comparePublicKey(resolution.account))) {\n\t\t\t\t\tthrow(new Error('internal: Resolved account does not match requested account'));\n\t\t\t\t}\n\n\t\t\t\taccount = resolution.account;\n\t\t\t}\n\n\t\t\tif ('username' in resolution) {\n\t\t\t\tif (username !== null && username !== resolution.username) {\n\t\t\t\t\tthrow(new Error('internal: Resolved username does not match requested username'));\n\t\t\t\t}\n\n\t\t\t\tusername = resolution.username;\n\t\t\t}\n\n\t\t\tif (!account || !username) {\n\t\t\t\tthrow(new Error('internal: We should know both the account and username here'));\n\t\t\t}\n\n\t\t\treturn({\n\t\t\t\toutput: JSON.stringify({\n\t\t\t\t\tok: true,\n\t\t\t\t\taccount: KeetaNet.lib.Account.toPublicKeyString(account),\n\t\t\t\t\tusername: username\n\t\t\t\t}),\n\t\t\t\tcontentType: 'application/json'\n\t\t\t});\n\t\t};\n\n\t\tconst claimHandler = this.usernames.claim;\n\t\tif (claimHandler) {\n\t\t\troutes['POST /api/claim'] = async (_params, body) => {\n\n\t\t\t\tconst request: KeetaUsernameAnchorClaimRequest = (() => {\n\t\t\t\t\tconst raw = assertKeetaUsernameAnchorClaimRequestJSON(body);\n\n\t\t\t\t\tconst ret: KeetaUsernameAnchorClaimRequest = {\n\t\t\t\t\t\tusername: raw.username,\n\t\t\t\t\t\taccount: KeetaNet.lib.Account.toAccount(raw.account),\n\t\t\t\t\t\tsigned: raw.signed\n\t\t\t\t\t};\n\n\t\t\t\t\tif (raw.transfer) {\n\t\t\t\t\t\tret.transfer = {\n\t\t\t\t\t\t\tfrom: KeetaNet.lib.Account.toAccount(raw.transfer.from),\n\t\t\t\t\t\t\tsigned: raw.transfer.signed\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn(ret);\n\t\t\t\t})();\n\n\t\t\t\tconst username = request.username;\n\n\t\t\t\tthis.#assertProviderIssuedNameValid(username);\n\n\t\t\t\tif (request.transfer) {\n\t\t\t\t\tconst transferSignable = getUsernameTransferSignable({\n\t\t\t\t\t\tusername: request.username,\n\t\t\t\t\t\tfrom: request.transfer.from,\n\t\t\t\t\t\tto: request.account\n\t\t\t\t\t});\n\n\t\t\t\t\tconst verifiedTransfer = await Signing.VerifySignedData(request.transfer.from, transferSignable, request.transfer.signed);\n\n\t\t\t\t\tif (!verifiedTransfer) {\n\t\t\t\t\t\tthrow(new KeetaAnchorUserError('Invalid username claim transfer signature'));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst verified = await Signing.VerifySignedData(request.account, getUsernameClaimSignable(request), request.signed);\n\t\t\t\tif (!verified) {\n\t\t\t\t\tthrow(new KeetaAnchorUserError('Invalid username claim signature'));\n\t\t\t\t}\n\n\t\t\t\tconst claimResponse = await claimHandler({\n\t\t\t\t\tusername: request.username,\n\t\t\t\t\taccount: request.account,\n\t\t\t\t\tfromUser: request.transfer?.from ?? null\n\t\t\t\t});\n\n\t\t\t\tif (!claimResponse.ok) {\n\t\t\t\t\tif (claimResponse.taken) {\n\t\t\t\t\t\tthrow(new Errors.UsernameAlreadyTaken({ username }));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow(new KeetaAnchorUserError('Username claim rejected'));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn({\n\t\t\t\t\toutput: JSON.stringify({ ok: true }),\n\t\t\t\t\tcontentType: 'application/json'\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\t\tconst releaseHandler = this.usernames.releaseUsername;\n\t\tif (releaseHandler) {\n\t\t\troutes['POST /api/release'] = async (_params, body) => {\n\t\t\t\tconst request: KeetaUsernameAnchorReleaseRequest = (() => {\n\t\t\t\t\tconst raw = assertKeetaUsernameAnchorReleaseRequestJSON(body);\n\n\t\t\t\t\treturn({\n\t\t\t\t\t\taccount: KeetaNet.lib.Account.toAccount(raw.account),\n\t\t\t\t\t\tsigned: raw.signed\n\t\t\t\t\t});\n\t\t\t\t})();\n\n\n\t\t\t\tconst verified = await Signing.VerifySignedData(request.account, getUsernameReleaseSignable(request), request.signed);\n\t\t\t\tif (!verified) {\n\t\t\t\t\tthrow(new KeetaAnchorUserError('Invalid username claim signature'));\n\t\t\t\t}\n\n\t\t\t\tconst releaseResponse = await releaseHandler({ account: request.account });\n\n\t\t\t\tif (!releaseResponse.ok) {\n\t\t\t\t\tthrow(new KeetaAnchorUserError('Release claim rejected'));\n\t\t\t\t}\n\n\t\t\t\treturn({\n\t\t\t\t\toutput: JSON.stringify({ ok: true }),\n\t\t\t\t\tcontentType: 'application/json'\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\t\tconst searchHandler = this.usernames.search;\n\t\tif (searchHandler) {\n\t\t\troutes['GET /api/search'] = async (_ignore_params, _ignore_body, _ignore_headers, url) => {\n\t\t\t\tconst request: KeetaUsernameAnchorSearchRequestParameters = (() => {\n\t\t\t\t\tconst searchParameter = url.searchParams.get('search');\n\n\t\t\t\t\tif (!searchParameter) {\n\t\t\t\t\t\tthrow(new KeetaAnchorUserValidationError({\n\t\t\t\t\t\t\tfields: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpath: 'search',\n\t\t\t\t\t\t\t\t\tmessage: 'Missing search parameter',\n\t\t\t\t\t\t\t\t\treceivedValue: searchParameter\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.#assertProviderIssuedNameValid(searchParameter, 'search');\n\n\t\t\t\t\treturn({ search: searchParameter });\n\t\t\t\t})();\n\n\t\t\t\tconst searchResponse = await searchHandler(request);\n\n\t\t\t\tconst formatted: KeetaUsernameAnchorSearchResponseJSON = {\n\t\t\t\t\tok: true,\n\t\t\t\t\tresults: searchResponse.results.map(function(result) {\n\t\t\t\t\t\treturn({\n\t\t\t\t\t\t\tusername: result.username,\n\t\t\t\t\t\t\taccount: result.account.publicKeyString.get()\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\treturn({\n\t\t\t\t\toutput: JSON.stringify(formatted),\n\t\t\t\t\tcontentType: 'application/json'\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\n\t\treturn(routes);\n\t}\n\n\tasync serviceMetadata(): Promise<NonNullable<ServiceMetadata['services']['username']>[string]> {\n\t\tconst operations: NonNullable<ServiceMetadata['services']['username']>[string]['operations'] = {\n\t\t\tresolve: (new URL('/api/resolve/{toResolve}', this.url)).toString()\n\t\t};\n\n\t\tconst authentication: ServiceMetadataAuthenticationType = {\n\t\t\tmethod: 'keeta-account',\n\t\t\ttype: 'required'\n\t\t}\n\n\t\tif (this.usernames.claim) {\n\t\t\toperations.claim = {\n\t\t\t\turl: (new URL('/api/claim', this.url)).toString(),\n\t\t\t\toptions: { authentication }\n\t\t\t};\n\t\t}\n\n\t\tif (this.usernames.releaseUsername) {\n\t\t\toperations.release = {\n\t\t\t\turl: (new URL('/api/release', this.url)).toString(),\n\t\t\t\toptions: { authentication }\n\t\t\t};\n\t\t}\n\n\t\tif (this.usernames.search) {\n\t\t\toperations.search = { url: (new URL('/api/search', this.url)).toString() };\n\t\t}\n\n\t\treturn({\n\t\t\toperations,\n\t\t\t...(this.#usernamePattern ? { usernamePattern: this.#usernamePattern.source } : {})\n\t\t});\n\t}\n}\n"]}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/services/username/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { KeetaNet } from '../../client/index.js';\nimport type * as KeetaAnchorHTTPServer from '../../lib/http-server/index.js';\nimport type { KeetaAnchorMetadataServerConfig } from '../../lib/anchor-metadata-server.js';\nimport type {\n\tKeetaUsernameAnchorUsernameResolutionContext,\n\tKeetaUsernameAnchorAccountResolutionContext,\n\tKeetaUsernameAnchorClaimRequest,\n\tKeetaUsernameAnchorClaimRequestPayload,\n\tKeetaUsernameAnchorSearchRequestParameters,\n\tKeetaUsernameAnchorUsernameWithAccount,\n\tKeetaUsernameAnchorSearchResponseJSON,\n\tKeetaUsernameAnchorClaimContext\n} from './common.js';\nimport {\n\tgetUsernameClaimSignable,\n\tvalidateUsernameDefault,\n\tErrors,\n\tisKeetaNetPublicKeyString,\n\tassertKeetaUsernameAnchorClaimRequestJSON,\n\tgetUsernameTransferSignable,\n\tassertKeetaUsernameAnchorReleaseRequestJSON,\n\tgetUsernameReleaseSignable\n} from './common.js';\nimport type { ServiceMetadata, ServiceMetadataAuthenticationType } from '../../lib/resolver.ts';\nimport type { Routes } from '../../lib/http-server/index.ts';\nimport { KeetaAnchorMetadataServer } from '../../lib/anchor-metadata-server.js';\nimport { KeetaAnchorUserError, KeetaAnchorUserValidationError } from '../../lib/error.js';\nimport { verifyBodyAuth } from '../../lib/http-server/common.js';\nimport * as Signing from '../../lib/utils/signing.js';\n\nfunction normalizeUsernamePattern(pattern: string | RegExp): RegExp {\n\tif (typeof pattern === 'string') {\n\t\ttry {\n\t\t\treturn(new RegExp(pattern));\n\t\t} catch (error) {\n\t\t\tthrow(new Error(`Invalid usernamePattern regex: ${error instanceof Error ? error.message : String(error)}`));\n\t\t}\n\t}\n\n\tif (pattern.flags !== '') {\n\t\tthrow(new Error('usernamePattern RegExp must not specify flags')); // Flags cannot be reliably shared via metadata string\n\t}\n\n\treturn(new RegExp(pattern.source));\n}\n\ntype ClaimHandlerResponse = { ok: true; } | { ok: false; taken?: false; } | { ok: false; taken: true; };\ntype SearchHandlerResponse = { results: KeetaUsernameAnchorUsernameWithAccount[] };\n\nexport interface KeetaAnchorUsernameServerConfig extends KeetaAnchorMetadataServerConfig {\n\thomepage?: string | (() => Promise<string> | string);\n\tusernames: {\n\t\tresolveUsername: (input: KeetaUsernameAnchorUsernameResolutionContext) => Promise<{ account: InstanceType<typeof KeetaNet.lib.Account>; } | null>;\n\t\tresolveAccount: (input: KeetaUsernameAnchorAccountResolutionContext) => Promise<{ username: string; } | null>;\n\n\t\treleaseUsername?: (input: { account: InstanceType<typeof KeetaNet.lib.Account>; }) => Promise<{ ok: boolean; }>;\n\t\tclaim?: ((input: KeetaUsernameAnchorClaimContext) => Promise<ClaimHandlerResponse>);\n\n\t\tsearch?: ((input: KeetaUsernameAnchorSearchRequestParameters) => Promise<SearchHandlerResponse>);\n\t};\n\troutes?: Routes;\n\tusernamePattern?: string | RegExp;\n}\n\nexport class KeetaNetUsernameAnchorHTTPServer extends KeetaAnchorMetadataServer<NonNullable<ServiceMetadata['services']['username']>[string], KeetaAnchorUsernameServerConfig> {\n\treadonly homepage: NonNullable<KeetaAnchorUsernameServerConfig['homepage']>;\n\treadonly usernames: KeetaAnchorUsernameServerConfig['usernames'];\n\treadonly routes: NonNullable<KeetaAnchorUsernameServerConfig['routes']>;\n\treadonly #usernamePattern?: RegExp;\n\n\tconstructor(config: KeetaAnchorUsernameServerConfig) {\n\t\tsuper(config);\n\n\t\tthis.homepage = config.homepage ?? '';\n\t\tthis.usernames = config.usernames;\n\t\tthis.routes = config.routes ?? {};\n\t\tif (config.usernamePattern !== undefined) {\n\t\t\tthis.#usernamePattern = normalizeUsernamePattern(config.usernamePattern);\n\t\t}\n\t}\n\n\t#assertProviderIssuedNameValid(username: string, fieldPath = 'username'): void {\n\t\tvalidateUsernameDefault(username, {\n\t\t\tpattern: this.#usernamePattern,\n\t\t\tfieldPath: fieldPath\n\t\t});\n\t}\n\n\tprotected async initRoutes(config: KeetaAnchorUsernameServerConfig): Promise<KeetaAnchorHTTPServer.Routes> {\n\t\tconst routes: KeetaAnchorHTTPServer.Routes = { ...this.routes };\n\n\t\tif ('homepage' in config) {\n\t\t\troutes['GET /'] = async function() {\n\t\t\t\tlet homepageData: string;\n\t\t\t\tif (typeof config.homepage === 'string') {\n\t\t\t\t\thomepageData = config.homepage;\n\t\t\t\t} else {\n\t\t\t\t\tif (!config.homepage) {\n\t\t\t\t\t\tthrow(new Error('internal error: No homepage function provided'));\n\t\t\t\t\t}\n\n\t\t\t\t\thomepageData = await config.homepage();\n\t\t\t\t}\n\n\t\t\t\treturn({\n\t\t\t\t\toutput: homepageData,\n\t\t\t\t\tcontentType: 'text/html; charset=utf-8'\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\t\troutes['GET /api/resolve/:toResolve'] = async (params) => {\n\t\t\tlet toResolve = params.get('toResolve');\n\t\t\tif (!toResolve) {\n\t\t\t\tthrow(new KeetaAnchorUserError('Missing toResolve parameter'));\n\t\t\t}\n\n\t\t\tlet resolution;\n\t\t\tlet account = null;\n\t\t\tlet username = null;\n\t\t\tif (isKeetaNetPublicKeyString(toResolve)) {\n\t\t\t\taccount = KeetaNet.lib.Account.fromPublicKeyString(toResolve);\n\t\t\t\tresolution = await this.usernames.resolveAccount({ account });\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\ttoResolve = decodeURIComponent(toResolve);\n\t\t\t\t} catch {\n\t\t\t\t\tthrow(new KeetaAnchorUserValidationError({\n\t\t\t\t\t\tfields: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpath: 'toResolve',\n\t\t\t\t\t\t\t\tmessage: 'toResolve parameter is not a valid URI component',\n\t\t\t\t\t\t\t\treceivedValue: toResolve\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t]\n\t\t\t\t\t}));\n\t\t\t\t}\n\n\t\t\t\tthis.#assertProviderIssuedNameValid(toResolve);\n\t\t\t\tusername = toResolve;\n\t\t\t\tresolution = await this.usernames.resolveUsername({ username });\n\t\t\t}\n\n\t\t\tif (!resolution) {\n\t\t\t\tthrow(new Errors.UserNotFound({ username: username ?? undefined, account: account ?? undefined }));\n\t\t\t}\n\n\t\t\tif ('account' in resolution) {\n\t\t\t\tif (account !== null && !(account.comparePublicKey(resolution.account))) {\n\t\t\t\t\tthrow(new Error('internal: Resolved account does not match requested account'));\n\t\t\t\t}\n\n\t\t\t\taccount = resolution.account;\n\t\t\t}\n\n\t\t\tif ('username' in resolution) {\n\t\t\t\tif (username !== null && username !== resolution.username) {\n\t\t\t\t\tthrow(new Error('internal: Resolved username does not match requested username'));\n\t\t\t\t}\n\n\t\t\t\tusername = resolution.username;\n\t\t\t}\n\n\t\t\tif (!account || !username) {\n\t\t\t\tthrow(new Error('internal: We should know both the account and username here'));\n\t\t\t}\n\n\t\t\treturn({\n\t\t\t\toutput: JSON.stringify({\n\t\t\t\t\tok: true,\n\t\t\t\t\taccount: KeetaNet.lib.Account.toPublicKeyString(account),\n\t\t\t\t\tusername: username\n\t\t\t\t}),\n\t\t\t\tcontentType: 'application/json'\n\t\t\t});\n\t\t};\n\n\t\tconst claimHandler = this.usernames.claim;\n\t\tif (claimHandler) {\n\t\t\troutes['POST /api/claim'] = async (_params, body) => {\n\t\t\t\tconst raw = assertKeetaUsernameAnchorClaimRequestJSON(body);\n\n\t\t\t\tthis.#assertProviderIssuedNameValid(raw.username);\n\n\t\t\t\tlet transfer: KeetaUsernameAnchorClaimRequest['transfer'];\n\t\t\t\tif (raw.transfer) {\n\t\t\t\t\tconst fromAccount = KeetaNet.lib.Account.toAccount(raw.transfer.from);\n\t\t\t\t\tconst toAccount = KeetaNet.lib.Account.toAccount(raw.account);\n\t\t\t\t\tconst transferSignable = getUsernameTransferSignable({\n\t\t\t\t\t\tusername: raw.username,\n\t\t\t\t\t\tfrom: fromAccount,\n\t\t\t\t\t\tto: toAccount\n\t\t\t\t\t});\n\n\t\t\t\t\tconst verifiedTransfer = await Signing.VerifySignedData(fromAccount, transferSignable, raw.transfer.signed);\n\t\t\t\t\tif (!verifiedTransfer) {\n\t\t\t\t\t\tthrow(new KeetaAnchorUserError('Invalid username claim transfer signature'));\n\t\t\t\t\t}\n\n\t\t\t\t\ttransfer = { from: fromAccount, signed: raw.transfer.signed };\n\t\t\t\t}\n\n\t\t\t\tconst account = await verifyBodyAuth(raw, function(req) {\n\t\t\t\t\tconst claimAccount = KeetaNet.lib.Account.toAccount(req.account);\n\t\t\t\t\tconst claimPayload: KeetaUsernameAnchorClaimRequestPayload = {\n\t\t\t\t\t\tusername: req.username,\n\t\t\t\t\t\taccount: claimAccount\n\t\t\t\t\t};\n\t\t\t\t\tif (transfer) {\n\t\t\t\t\t\tclaimPayload.transfer = transfer;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn(getUsernameClaimSignable(claimPayload));\n\t\t\t\t}, this.resolvedCertificateChainRequirement);\n\n\t\t\t\tconst claimResponse = await claimHandler({\n\t\t\t\t\tusername: raw.username,\n\t\t\t\t\taccount,\n\t\t\t\t\tfromUser: transfer?.from ?? null\n\t\t\t\t});\n\n\t\t\t\tif (!claimResponse.ok) {\n\t\t\t\t\tif (claimResponse.taken) {\n\t\t\t\t\t\tthrow(new Errors.UsernameAlreadyTaken({ username: raw.username }));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthrow(new KeetaAnchorUserError('Username claim rejected'));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn({\n\t\t\t\t\toutput: JSON.stringify({ ok: true }),\n\t\t\t\t\tcontentType: 'application/json'\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\t\tconst releaseHandler = this.usernames.releaseUsername;\n\t\tif (releaseHandler) {\n\t\t\troutes['POST /api/release'] = async (_params, body) => {\n\t\t\t\tconst raw = assertKeetaUsernameAnchorReleaseRequestJSON(body);\n\t\t\t\tconst account = await verifyBodyAuth(raw, function(req) {\n\t\t\t\t\treturn(getUsernameReleaseSignable({ account: KeetaNet.lib.Account.toAccount(req.account) }));\n\t\t\t\t}, this.resolvedCertificateChainRequirement);\n\n\t\t\t\tconst releaseResponse = await releaseHandler({ account });\n\n\t\t\t\tif (!releaseResponse.ok) {\n\t\t\t\t\tthrow(new KeetaAnchorUserError('Release claim rejected'));\n\t\t\t\t}\n\n\t\t\t\treturn({\n\t\t\t\t\toutput: JSON.stringify({ ok: true }),\n\t\t\t\t\tcontentType: 'application/json'\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\t\tconst searchHandler = this.usernames.search;\n\t\tif (searchHandler) {\n\t\t\troutes['GET /api/search'] = async (_ignore_params, _ignore_body, _ignore_headers, url) => {\n\t\t\t\tconst request: KeetaUsernameAnchorSearchRequestParameters = (() => {\n\t\t\t\t\tconst searchParameter = url.searchParams.get('search');\n\n\t\t\t\t\tif (!searchParameter) {\n\t\t\t\t\t\tthrow(new KeetaAnchorUserValidationError({\n\t\t\t\t\t\t\tfields: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tpath: 'search',\n\t\t\t\t\t\t\t\t\tmessage: 'Missing search parameter',\n\t\t\t\t\t\t\t\t\treceivedValue: searchParameter\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t}));\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.#assertProviderIssuedNameValid(searchParameter, 'search');\n\n\t\t\t\t\treturn({ search: searchParameter });\n\t\t\t\t})();\n\n\t\t\t\tconst searchResponse = await searchHandler(request);\n\n\t\t\t\tconst formatted: KeetaUsernameAnchorSearchResponseJSON = {\n\t\t\t\t\tok: true,\n\t\t\t\t\tresults: searchResponse.results.map(function(result) {\n\t\t\t\t\t\treturn({\n\t\t\t\t\t\t\tusername: result.username,\n\t\t\t\t\t\t\taccount: result.account.publicKeyString.get()\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\treturn({\n\t\t\t\t\toutput: JSON.stringify(formatted),\n\t\t\t\t\tcontentType: 'application/json'\n\t\t\t\t});\n\t\t\t};\n\t\t}\n\n\n\t\treturn(routes);\n\t}\n\n\tprotected async buildServiceMetadata(): Promise<NonNullable<ServiceMetadata['services']['username']>[string]> {\n\t\tconst acceptedIssuerDNs = this.acceptedIssuerDNs();\n\t\tconst operations: NonNullable<ServiceMetadata['services']['username']>[string]['operations'] = {\n\t\t\tresolve: (new URL('/api/resolve/{toResolve}', this.url)).toString()\n\t\t};\n\n\t\tconst authentication: ServiceMetadataAuthenticationType = {\n\t\t\tmethod: 'keeta-account',\n\t\t\ttype: 'required'\n\t\t}\n\n\t\tif (this.usernames.claim) {\n\t\t\toperations.claim = {\n\t\t\t\turl: (new URL('/api/claim', this.url)).toString(),\n\t\t\t\toptions: { authentication }\n\t\t\t};\n\t\t}\n\n\t\tif (this.usernames.releaseUsername) {\n\t\t\toperations.release = {\n\t\t\t\turl: (new URL('/api/release', this.url)).toString(),\n\t\t\t\toptions: { authentication }\n\t\t\t};\n\t\t}\n\n\t\tif (this.usernames.search) {\n\t\t\toperations.search = { url: (new URL('/api/search', this.url)).toString() };\n\t\t}\n\n\t\treturn({\n\t\t\toperations,\n\t\t\t...(this.#usernamePattern ? { usernamePattern: this.#usernamePattern.source } : {}),\n\t\t\t...(acceptedIssuerDNs !== undefined && { acceptedIssuerDNs })\n\t\t});\n\t}\n}\n"]}