@ucanto/core
Version:
58 lines (51 loc) • 1.6 kB
JavaScript
import * as API from '@ucanto/interface'
import * as DID from '@ipld/dag-ucan/did'
import * as Schema from './schema.js'
/**
* @template {string} Method
* @extends {Schema.API<API.PrincipalView<API.DID<Method> & API.URI<"did:">>, unknown, void|Method>}
*/
class PrincipalSchema extends Schema.API {
/**
* @param {unknown} source
* @param {void|Method} method
*/
readWith(source, method) {
if (!(source instanceof Uint8Array)) {
return Schema.typeError({ expect: 'Uint8Array', actual: source })
}
let principal
try {
principal = DID.decode(source)
} catch (err) {
return Schema.error(`Unable to decode bytes as DID: ${err}`)
}
const prefix = method ? `did:${method}:` : `did:`
if (!principal.did().startsWith(prefix)) {
return Schema.error(
`Expected a ${prefix} but got "${principal.did()}" instead`
)
}
return { ok: /** @type {API.PrincipalView<API.DID<Method>>} */ (principal) }
}
}
const schema = new PrincipalSchema()
/** A schema that reads byte encoded DIDs. */
export const principal = () => schema
/** @param {unknown} input */
export const read = input => schema.read(input)
/**
* Matches a byte encoded DID.
*
* @template {string} Method
* @param {{ method?: Method }} options
*/
export const match = (options = {}) =>
/** @type {Schema.Schema<API.PrincipalView<API.DID<Method> & API.URI<"did:">>>} */
(new PrincipalSchema(options.method))
/**
* Create a Principal from any input (or throw).
*
* @param {unknown} input
*/
export const from = input => match({}).from(input)