shelving
Version:
Toolkit for using data in JavaScript.
21 lines (20 loc) • 1.16 kB
JavaScript
import { ResponseError } from "../../error/ResponseError.js";
import { ThroughAPIProvider } from "./ThroughAPIProvider.js";
/** Validate an asynchronous source provider (source can have any type because validation guarantees the type). */
export class ValidationAPIProvider extends ThroughAPIProvider {
createRequest(endpoint, payload, options, caller = this.createRequest) {
// Validate payload — let thrown strings bubble up as user-readable messages for e.g. form handlers.
return super.createRequest(endpoint, endpoint.payload.validate(payload), options, caller);
}
async parseResponse(endpoint, response, caller = this.parseResponse) {
try {
// Validate result — wrap in ResponseError as this is a server/transport problem, not user error.
return endpoint.result.validate(await super.parseResponse(endpoint, response, caller));
}
catch (thrown) {
if (typeof thrown === "string")
throw new ResponseError(`Invalid result for ${endpoint}:\n${thrown}`, { provider: this, endpoint, code: 422, caller });
throw thrown;
}
}
}