@keetanetwork/anchor 0.0.61 → 0.0.63

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