@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.
- package/lib/anchor-metadata-server.d.ts +54 -0
- package/lib/anchor-metadata-server.d.ts.map +1 -0
- package/lib/anchor-metadata-server.js +62 -0
- package/lib/anchor-metadata-server.js.map +1 -0
- package/lib/error.d.ts +35 -0
- package/lib/error.d.ts.map +1 -1
- package/lib/error.generated.d.ts +3 -0
- package/lib/error.generated.d.ts.map +1 -0
- package/lib/error.generated.js +104 -0
- package/lib/error.generated.js.map +1 -0
- package/lib/error.js +66 -1
- package/lib/error.js.map +1 -1
- package/lib/http-server/common.d.ts +20 -2
- package/lib/http-server/common.d.ts.map +1 -1
- package/lib/http-server/common.js +47 -0
- package/lib/http-server/common.js.map +1 -1
- package/lib/http-server/index.d.ts +22 -0
- package/lib/http-server/index.d.ts.map +1 -1
- package/lib/http-server/index.js +23 -0
- package/lib/http-server/index.js.map +1 -1
- package/lib/metadata.types.d.ts +40 -0
- package/lib/metadata.types.d.ts.map +1 -1
- package/lib/metadata.types.js.map +1 -1
- package/lib/resolver.d.ts +19 -20
- package/lib/resolver.d.ts.map +1 -1
- package/lib/resolver.js +1420 -681
- package/lib/resolver.js.map +1 -1
- package/lib/utils/certificate-network.d.ts +84 -0
- package/lib/utils/certificate-network.d.ts.map +1 -0
- package/lib/utils/certificate-network.js +104 -0
- package/lib/utils/certificate-network.js.map +1 -0
- package/lib/utils/signing.d.ts +12 -0
- package/lib/utils/signing.d.ts.map +1 -1
- package/lib/utils/signing.js +145 -2
- package/lib/utils/signing.js.map +1 -1
- package/npm-shrinkwrap.json +4 -4
- package/package.json +1 -1
- package/services/asset-movement/common.d.ts.map +1 -1
- package/services/asset-movement/common.js +7 -53
- package/services/asset-movement/common.js.map +1 -1
- package/services/asset-movement/server.d.ts +6 -4
- package/services/asset-movement/server.d.ts.map +1 -1
- package/services/asset-movement/server.js +3 -3
- package/services/asset-movement/server.js.map +1 -1
- package/services/fx/common.js +7 -7
- package/services/fx/server.d.ts +9 -7
- package/services/fx/server.d.ts.map +1 -1
- package/services/fx/server.js +5 -5
- package/services/fx/server.js.map +1 -1
- package/services/kyc/server.d.ts +6 -4
- package/services/kyc/server.d.ts.map +1 -1
- package/services/kyc/server.js +3 -3
- package/services/kyc/server.js.map +1 -1
- package/services/notification/common.d.ts +2 -1
- package/services/notification/common.d.ts.map +1 -1
- package/services/notification/common.generated.js +20 -20
- package/services/notification/common.js +3 -2
- package/services/notification/common.js.map +1 -1
- package/services/notification/server.d.ts +7 -6
- package/services/notification/server.d.ts.map +1 -1
- package/services/notification/server.js +25 -62
- package/services/notification/server.js.map +1 -1
- package/services/storage/common.d.ts +2 -1
- package/services/storage/common.d.ts.map +1 -1
- package/services/storage/common.js +7 -2
- package/services/storage/common.js.map +1 -1
- package/services/storage/server.d.ts +7 -5
- package/services/storage/server.d.ts.map +1 -1
- package/services/storage/server.js +29 -99
- package/services/storage/server.js.map +1 -1
- package/services/username/common.d.ts +2 -1
- package/services/username/common.d.ts.map +1 -1
- package/services/username/common.generated.js +14 -48
- package/services/username/common.generated.js.map +1 -1
- package/services/username/common.js +3 -2
- package/services/username/common.js.map +1 -1
- package/services/username/server.d.ts +7 -6
- package/services/username/server.d.ts.map +1 -1
- package/services/username/server.js +38 -46
- 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 &&
|
|
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: "
|
|
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: "
|
|
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: "
|
|
102
|
+
expected: "HTTPSignedField",
|
|
110
103
|
value: input.signed
|
|
111
|
-
}, _errorFactory)) &&
|
|
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: "
|
|
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:
|
|
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:
|
|
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: "
|
|
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: "
|
|
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:
|
|
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:
|
|
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
|
|
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 {
|
|
4
|
-
import {
|
|
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
|
|
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
|
|
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
|
-
|
|
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;
|
|
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
|
|
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
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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:
|
|
141
|
-
from:
|
|
142
|
-
to:
|
|
129
|
+
username: raw.username,
|
|
130
|
+
from: fromAccount,
|
|
131
|
+
to: toAccount
|
|
143
132
|
});
|
|
144
|
-
const verifiedTransfer = await Signing.VerifySignedData(
|
|
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
|
|
150
|
-
|
|
151
|
-
|
|
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:
|
|
155
|
-
account
|
|
156
|
-
fromUser:
|
|
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
|
|
176
|
-
|
|
177
|
-
return ({
|
|
178
|
-
|
|
179
|
-
|
|
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
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,KAAK,qBAAqB,MAAM,gCAAgC,CAAC;AASxE,OAAO,EACN,wBAAwB,EACxB,uBAAuB,EAEvB,MAAM,EACN,yBAAyB,EACzB,yCAAyC,EACzC,2BAA2B,EAC3B,2CAA2C,EAC3C,0BAA0B,EAC1B,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,KAAK,OAAO,MAAM,4BAA4B,CAAC;AAEtD,SAAS,wBAAwB,CAAC,OAAwB;IACzD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjC,IAAI,CAAC;YACJ,OAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAK,CAAC,IAAI,KAAK,CAAC,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9G,CAAC;IACF,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,KAAK,EAAE,EAAE,CAAC;QAC1B,MAAK,CAAC,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC,CAAC,CAAC,sDAAsD;IAC1H,CAAC;IAED,OAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AACpC,CAAC;AAoBD,MAAM,OAAO,gCAAiC,SAAQ,qBAAqB,CAAC,wBAAyD;IAC3H,QAAQ,CAA2D;IACnE,SAAS,CAA+C;IACxD,MAAM,CAAyD;IAC/D,gBAAgB,CAAU;IAEnC,YAAY,MAAuC;QAClD,KAAK,CAAC,MAAM,CAAC,CAAC;QAEd,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QAClC,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,gBAAgB,GAAG,wBAAwB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAC1E,CAAC;IACF,CAAC;IAED,8BAA8B,CAAC,QAAgB,EAAE,SAAS,GAAG,UAAU;QACtE,uBAAuB,CAAC,QAAQ,EAAE;YACjC,OAAO,EAAE,IAAI,CAAC,gBAAgB;YAC9B,SAAS,EAAE,SAAS;SACpB,CAAC,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,UAAU,CAAC,MAAuC;QACjE,MAAM,MAAM,GAAiC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAEhE,IAAI,UAAU,IAAI,MAAM,EAAE,CAAC;YAC1B,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK;gBACtB,IAAI,YAAoB,CAAC;gBACzB,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBACzC,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC;gBAChC,CAAC;qBAAM,CAAC;oBACP,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;wBACtB,MAAK,CAAC,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC,CAAC;oBACnE,CAAC;oBAED,YAAY,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACxC,CAAC;gBAED,OAAM,CAAC;oBACN,MAAM,EAAE,YAAY;oBACpB,WAAW,EAAE,0BAA0B;iBACvC,CAAC,CAAC;YACJ,CAAC,CAAC;QACH,CAAC;QAED,MAAM,CAAC,6BAA6B,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,EAAE;YACxD,IAAI,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACxC,IAAI,CAAC,SAAS,EAAE,CAAC;gBAChB,MAAK,CAAC,IAAI,oBAAoB,CAAC,6BAA6B,CAAC,CAAC,CAAC;YAChE,CAAC;YAED,IAAI,UAAU,CAAC;YACf,IAAI,OAAO,GAAG,IAAI,CAAC;YACnB,IAAI,QAAQ,GAAG,IAAI,CAAC;YACpB,IAAI,yBAAyB,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1C,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;gBAC9D,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC;oBACJ,SAAS,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBAC3C,CAAC;gBAAC,MAAM,CAAC;oBACR,MAAK,CAAC,IAAI,8BAA8B,CAAC;wBACxC,MAAM,EAAE;4BACP;gCACC,IAAI,EAAE,WAAW;gCACjB,OAAO,EAAE,kDAAkD;gCAC3D,aAAa,EAAE,SAAS;6BACxB;yBACD;qBACD,CAAC,CAAC,CAAC;gBACL,CAAC;gBAED,IAAI,CAAC,8BAA8B,CAAC,SAAS,CAAC,CAAC;gBAC/C,QAAQ,GAAG,SAAS,CAAC;gBACrB,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;YACjE,CAAC;YAED,IAAI,CAAC,UAAU,EAAE,CAAC;gBACjB,MAAK,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,IAAI,SAAS,EAAE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;YACpG,CAAC;YAED,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;gBAC7B,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;oBACzE,MAAK,CAAC,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC,CAAC;gBACjF,CAAC;gBAED,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;YAC9B,CAAC;YAED,IAAI,UAAU,IAAI,UAAU,EAAE,CAAC;gBAC9B,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,UAAU,CAAC,QAAQ,EAAE,CAAC;oBAC3D,MAAK,CAAC,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC,CAAC;gBACnF,CAAC;gBAED,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;YAChC,CAAC;YAED,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC3B,MAAK,CAAC,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC,CAAC;YACjF,CAAC;YAED,OAAM,CAAC;gBACN,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;oBACtB,EAAE,EAAE,IAAI;oBACR,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC;oBACxD,QAAQ,EAAE,QAAQ;iBAClB,CAAC;gBACF,WAAW,EAAE,kBAAkB;aAC/B,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAC1C,IAAI,YAAY,EAAE,CAAC;YAClB,MAAM,CAAC,iBAAiB,CAAC,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;gBAEnD,MAAM,OAAO,GAAoC,CAAC,GAAG,EAAE;oBACtD,MAAM,GAAG,GAAG,yCAAyC,CAAC,IAAI,CAAC,CAAC;oBAE5D,MAAM,GAAG,GAAoC;wBAC5C,QAAQ,EAAE,GAAG,CAAC,QAAQ;wBACtB,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;wBACpD,MAAM,EAAE,GAAG,CAAC,MAAM;qBAClB,CAAC;oBAEF,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;wBAClB,GAAG,CAAC,QAAQ,GAAG;4BACd,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;4BACvD,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM;yBAC3B,CAAC;oBACH,CAAC;oBAED,OAAM,CAAC,GAAG,CAAC,CAAC;gBACb,CAAC,CAAC,EAAE,CAAC;gBAEL,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;gBAElC,IAAI,CAAC,8BAA8B,CAAC,QAAQ,CAAC,CAAC;gBAE9C,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACtB,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;wBACpD,QAAQ,EAAE,OAAO,CAAC,QAAQ;wBAC1B,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;wBAC3B,EAAE,EAAE,OAAO,CAAC,OAAO;qBACnB,CAAC,CAAC;oBAEH,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAE1H,IAAI,CAAC,gBAAgB,EAAE,CAAC;wBACvB,MAAK,CAAC,IAAI,oBAAoB,CAAC,2CAA2C,CAAC,CAAC,CAAC;oBAC9E,CAAC;gBACF,CAAC;gBAED,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE,wBAAwB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBACpH,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACf,MAAK,CAAC,IAAI,oBAAoB,CAAC,kCAAkC,CAAC,CAAC,CAAC;gBACrE,CAAC;gBAED,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC;oBACxC,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,IAAI,IAAI,IAAI;iBACxC,CAAC,CAAC;gBAEH,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;oBACvB,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;wBACzB,MAAK,CAAC,IAAI,MAAM,CAAC,oBAAoB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;oBACtD,CAAC;yBAAM,CAAC;wBACP,MAAK,CAAC,IAAI,oBAAoB,CAAC,yBAAyB,CAAC,CAAC,CAAC;oBAC5D,CAAC;gBACF,CAAC;gBAED,OAAM,CAAC;oBACN,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;oBACpC,WAAW,EAAE,kBAAkB;iBAC/B,CAAC,CAAC;YACJ,CAAC,CAAC;QACH,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;QACtD,IAAI,cAAc,EAAE,CAAC;YACpB,MAAM,CAAC,mBAAmB,CAAC,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;gBACrD,MAAM,OAAO,GAAsC,CAAC,GAAG,EAAE;oBACxD,MAAM,GAAG,GAAG,2CAA2C,CAAC,IAAI,CAAC,CAAC;oBAE9D,OAAM,CAAC;wBACN,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC;wBACpD,MAAM,EAAE,GAAG,CAAC,MAAM;qBAClB,CAAC,CAAC;gBACJ,CAAC,CAAC,EAAE,CAAC;gBAGL,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE,0BAA0B,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBACtH,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACf,MAAK,CAAC,IAAI,oBAAoB,CAAC,kCAAkC,CAAC,CAAC,CAAC;gBACrE,CAAC;gBAED,MAAM,eAAe,GAAG,MAAM,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;gBAE3E,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC;oBACzB,MAAK,CAAC,IAAI,oBAAoB,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBAC3D,CAAC;gBAED,OAAM,CAAC;oBACN,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;oBACpC,WAAW,EAAE,kBAAkB;iBAC/B,CAAC,CAAC;YACJ,CAAC,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QAC5C,IAAI,aAAa,EAAE,CAAC;YACnB,MAAM,CAAC,iBAAiB,CAAC,GAAG,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE;gBACxF,MAAM,OAAO,GAA+C,CAAC,GAAG,EAAE;oBACjE,MAAM,eAAe,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAEvD,IAAI,CAAC,eAAe,EAAE,CAAC;wBACtB,MAAK,CAAC,IAAI,8BAA8B,CAAC;4BACxC,MAAM,EAAE;gCACP;oCACC,IAAI,EAAE,QAAQ;oCACd,OAAO,EAAE,0BAA0B;oCACnC,aAAa,EAAE,eAAe;iCAC9B;6BACD;yBACD,CAAC,CAAC,CAAC;oBACL,CAAC;oBAED,IAAI,CAAC,8BAA8B,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;oBAE/D,OAAM,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;gBACrC,CAAC,CAAC,EAAE,CAAC;gBAEL,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;gBAEpD,MAAM,SAAS,GAA0C;oBACxD,EAAE,EAAE,IAAI;oBACR,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,UAAS,MAAM;wBAClD,OAAM,CAAC;4BACN,QAAQ,EAAE,MAAM,CAAC,QAAQ;4BACzB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,EAAE;yBAC7C,CAAC,CAAC;oBACJ,CAAC,CAAC;iBACF,CAAA;gBAED,OAAM,CAAC;oBACN,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;oBACjC,WAAW,EAAE,kBAAkB;iBAC/B,CAAC,CAAC;YACJ,CAAC,CAAC;QACH,CAAC;QAGD,OAAM,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,eAAe;QACpB,MAAM,UAAU,GAA+E;YAC9F,OAAO,EAAE,CAAC,IAAI,GAAG,CAAC,0BAA0B,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE;SACnE,CAAC;QAEF,MAAM,cAAc,GAAsC;YACzD,MAAM,EAAE,eAAe;YACvB,IAAI,EAAE,UAAU;SAChB,CAAA;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YAC1B,UAAU,CAAC,KAAK,GAAG;gBAClB,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACjD,OAAO,EAAE,EAAE,cAAc,EAAE;aAC3B,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;YACpC,UAAU,CAAC,OAAO,GAAG;gBACpB,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACnD,OAAO,EAAE,EAAE,cAAc,EAAE;aAC3B,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YAC3B,UAAU,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC5E,CAAC;QAED,OAAM,CAAC;YACN,UAAU;YACV,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnF,CAAC,CAAC;IACJ,CAAC;CACD","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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAajD,OAAO,EACN,wBAAwB,EACxB,uBAAuB,EACvB,MAAM,EACN,yBAAyB,EACzB,yCAAyC,EACzC,2BAA2B,EAC3B,2CAA2C,EAC3C,0BAA0B,EAC1B,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,KAAK,OAAO,MAAM,4BAA4B,CAAC;AAEtD,SAAS,wBAAwB,CAAC,OAAwB;IACzD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QACjC,IAAI,CAAC;YACJ,OAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAK,CAAC,IAAI,KAAK,CAAC,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9G,CAAC;IACF,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,KAAK,EAAE,EAAE,CAAC;QAC1B,MAAK,CAAC,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC,CAAC,CAAC,sDAAsD;IAC1H,CAAC;IAED,OAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AACpC,CAAC;AAoBD,MAAM,OAAO,gCAAiC,SAAQ,yBAAwH;IACpK,QAAQ,CAA2D;IACnE,SAAS,CAA+C;IACxD,MAAM,CAAyD;IAC/D,gBAAgB,CAAU;IAEnC,YAAY,MAAuC;QAClD,KAAK,CAAC,MAAM,CAAC,CAAC;QAEd,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QAClC,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YAC1C,IAAI,CAAC,gBAAgB,GAAG,wBAAwB,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAC1E,CAAC;IACF,CAAC;IAED,8BAA8B,CAAC,QAAgB,EAAE,SAAS,GAAG,UAAU;QACtE,uBAAuB,CAAC,QAAQ,EAAE;YACjC,OAAO,EAAE,IAAI,CAAC,gBAAgB;YAC9B,SAAS,EAAE,SAAS;SACpB,CAAC,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,UAAU,CAAC,MAAuC;QACjE,MAAM,MAAM,GAAiC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAEhE,IAAI,UAAU,IAAI,MAAM,EAAE,CAAC;YAC1B,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK;gBACtB,IAAI,YAAoB,CAAC;gBACzB,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBACzC,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC;gBAChC,CAAC;qBAAM,CAAC;oBACP,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;wBACtB,MAAK,CAAC,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC,CAAC;oBACnE,CAAC;oBAED,YAAY,GAAG,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACxC,CAAC;gBAED,OAAM,CAAC;oBACN,MAAM,EAAE,YAAY;oBACpB,WAAW,EAAE,0BAA0B;iBACvC,CAAC,CAAC;YACJ,CAAC,CAAC;QACH,CAAC;QAED,MAAM,CAAC,6BAA6B,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,EAAE;YACxD,IAAI,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACxC,IAAI,CAAC,SAAS,EAAE,CAAC;gBAChB,MAAK,CAAC,IAAI,oBAAoB,CAAC,6BAA6B,CAAC,CAAC,CAAC;YAChE,CAAC;YAED,IAAI,UAAU,CAAC;YACf,IAAI,OAAO,GAAG,IAAI,CAAC;YACnB,IAAI,QAAQ,GAAG,IAAI,CAAC;YACpB,IAAI,yBAAyB,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1C,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;gBAC9D,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC;oBACJ,SAAS,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBAC3C,CAAC;gBAAC,MAAM,CAAC;oBACR,MAAK,CAAC,IAAI,8BAA8B,CAAC;wBACxC,MAAM,EAAE;4BACP;gCACC,IAAI,EAAE,WAAW;gCACjB,OAAO,EAAE,kDAAkD;gCAC3D,aAAa,EAAE,SAAS;6BACxB;yBACD;qBACD,CAAC,CAAC,CAAC;gBACL,CAAC;gBAED,IAAI,CAAC,8BAA8B,CAAC,SAAS,CAAC,CAAC;gBAC/C,QAAQ,GAAG,SAAS,CAAC;gBACrB,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;YACjE,CAAC;YAED,IAAI,CAAC,UAAU,EAAE,CAAC;gBACjB,MAAK,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,QAAQ,IAAI,SAAS,EAAE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC;YACpG,CAAC;YAED,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;gBAC7B,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;oBACzE,MAAK,CAAC,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC,CAAC;gBACjF,CAAC;gBAED,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;YAC9B,CAAC;YAED,IAAI,UAAU,IAAI,UAAU,EAAE,CAAC;gBAC9B,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,UAAU,CAAC,QAAQ,EAAE,CAAC;oBAC3D,MAAK,CAAC,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC,CAAC;gBACnF,CAAC;gBAED,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;YAChC,CAAC;YAED,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC3B,MAAK,CAAC,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC,CAAC;YACjF,CAAC;YAED,OAAM,CAAC;gBACN,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;oBACtB,EAAE,EAAE,IAAI;oBACR,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC;oBACxD,QAAQ,EAAE,QAAQ;iBAClB,CAAC;gBACF,WAAW,EAAE,kBAAkB;aAC/B,CAAC,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAC1C,IAAI,YAAY,EAAE,CAAC;YAClB,MAAM,CAAC,iBAAiB,CAAC,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;gBACnD,MAAM,GAAG,GAAG,yCAAyC,CAAC,IAAI,CAAC,CAAC;gBAE5D,IAAI,CAAC,8BAA8B,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAElD,IAAI,QAAqD,CAAC;gBAC1D,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;oBAClB,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBACtE,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBAC9D,MAAM,gBAAgB,GAAG,2BAA2B,CAAC;wBACpD,QAAQ,EAAE,GAAG,CAAC,QAAQ;wBACtB,IAAI,EAAE,WAAW;wBACjB,EAAE,EAAE,SAAS;qBACb,CAAC,CAAC;oBAEH,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,WAAW,EAAE,gBAAgB,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAC5G,IAAI,CAAC,gBAAgB,EAAE,CAAC;wBACvB,MAAK,CAAC,IAAI,oBAAoB,CAAC,2CAA2C,CAAC,CAAC,CAAC;oBAC9E,CAAC;oBAED,QAAQ,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC/D,CAAC;gBAED,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,UAAS,GAAG;oBACrD,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACjE,MAAM,YAAY,GAA2C;wBAC5D,QAAQ,EAAE,GAAG,CAAC,QAAQ;wBACtB,OAAO,EAAE,YAAY;qBACrB,CAAC;oBACF,IAAI,QAAQ,EAAE,CAAC;wBACd,YAAY,CAAC,QAAQ,GAAG,QAAQ,CAAC;oBAClC,CAAC;oBAED,OAAM,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC,CAAC;gBAChD,CAAC,EAAE,IAAI,CAAC,mCAAmC,CAAC,CAAC;gBAE7C,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC;oBACxC,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,OAAO;oBACP,QAAQ,EAAE,QAAQ,EAAE,IAAI,IAAI,IAAI;iBAChC,CAAC,CAAC;gBAEH,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;oBACvB,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;wBACzB,MAAK,CAAC,IAAI,MAAM,CAAC,oBAAoB,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;oBACpE,CAAC;yBAAM,CAAC;wBACP,MAAK,CAAC,IAAI,oBAAoB,CAAC,yBAAyB,CAAC,CAAC,CAAC;oBAC5D,CAAC;gBACF,CAAC;gBAED,OAAM,CAAC;oBACN,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;oBACpC,WAAW,EAAE,kBAAkB;iBAC/B,CAAC,CAAC;YACJ,CAAC,CAAC;QACH,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;QACtD,IAAI,cAAc,EAAE,CAAC;YACpB,MAAM,CAAC,mBAAmB,CAAC,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;gBACrD,MAAM,GAAG,GAAG,2CAA2C,CAAC,IAAI,CAAC,CAAC;gBAC9D,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,UAAS,GAAG;oBACrD,OAAM,CAAC,0BAA0B,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9F,CAAC,EAAE,IAAI,CAAC,mCAAmC,CAAC,CAAC;gBAE7C,MAAM,eAAe,GAAG,MAAM,cAAc,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;gBAE1D,IAAI,CAAC,eAAe,CAAC,EAAE,EAAE,CAAC;oBACzB,MAAK,CAAC,IAAI,oBAAoB,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBAC3D,CAAC;gBAED,OAAM,CAAC;oBACN,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;oBACpC,WAAW,EAAE,kBAAkB;iBAC/B,CAAC,CAAC;YACJ,CAAC,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QAC5C,IAAI,aAAa,EAAE,CAAC;YACnB,MAAM,CAAC,iBAAiB,CAAC,GAAG,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,EAAE,EAAE;gBACxF,MAAM,OAAO,GAA+C,CAAC,GAAG,EAAE;oBACjE,MAAM,eAAe,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAEvD,IAAI,CAAC,eAAe,EAAE,CAAC;wBACtB,MAAK,CAAC,IAAI,8BAA8B,CAAC;4BACxC,MAAM,EAAE;gCACP;oCACC,IAAI,EAAE,QAAQ;oCACd,OAAO,EAAE,0BAA0B;oCACnC,aAAa,EAAE,eAAe;iCAC9B;6BACD;yBACD,CAAC,CAAC,CAAC;oBACL,CAAC;oBAED,IAAI,CAAC,8BAA8B,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;oBAE/D,OAAM,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;gBACrC,CAAC,CAAC,EAAE,CAAC;gBAEL,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;gBAEpD,MAAM,SAAS,GAA0C;oBACxD,EAAE,EAAE,IAAI;oBACR,OAAO,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,UAAS,MAAM;wBAClD,OAAM,CAAC;4BACN,QAAQ,EAAE,MAAM,CAAC,QAAQ;4BACzB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,EAAE;yBAC7C,CAAC,CAAC;oBACJ,CAAC,CAAC;iBACF,CAAA;gBAED,OAAM,CAAC;oBACN,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;oBACjC,WAAW,EAAE,kBAAkB;iBAC/B,CAAC,CAAC;YACJ,CAAC,CAAC;QACH,CAAC;QAGD,OAAM,CAAC,MAAM,CAAC,CAAC;IAChB,CAAC;IAES,KAAK,CAAC,oBAAoB;QACnC,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACnD,MAAM,UAAU,GAA+E;YAC9F,OAAO,EAAE,CAAC,IAAI,GAAG,CAAC,0BAA0B,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE;SACnE,CAAC;QAEF,MAAM,cAAc,GAAsC;YACzD,MAAM,EAAE,eAAe;YACvB,IAAI,EAAE,UAAU;SAChB,CAAA;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YAC1B,UAAU,CAAC,KAAK,GAAG;gBAClB,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACjD,OAAO,EAAE,EAAE,cAAc,EAAE;aAC3B,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,CAAC;YACpC,UAAU,CAAC,OAAO,GAAG;gBACpB,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACnD,OAAO,EAAE,EAAE,cAAc,EAAE;aAC3B,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YAC3B,UAAU,CAAC,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC5E,CAAC;QAED,OAAM,CAAC;YACN,UAAU;YACV,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnF,GAAG,CAAC,iBAAiB,KAAK,SAAS,IAAI,EAAE,iBAAiB,EAAE,CAAC;SAC7D,CAAC,CAAC;IACJ,CAAC;CACD","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"]}
|