import * as x from 'x-value'; import type {GeneralXBackStatesInReturn} from './back-state/index.js'; import {getXBackStatesInReturn} from './back-state/index.js'; export class ProcedureDefinition< TXParameter extends x.XTypeOfValue, TXReturn extends x.XTypeOfValue, > { path?: string; private ReturnWithBackStates_: | x.IntersectionType<[TXReturn, GeneralXBackStatesInReturn]> | undefined; constructor( readonly Parameter: TXParameter, private Return_: TXReturn, ) {} get Return(): x.IntersectionType<[TXReturn, GeneralXBackStatesInReturn]> { if (!this.ReturnWithBackStates_) { const BackStatesInReturn = getXBackStatesInReturn(); this.ReturnWithBackStates_ = x.intersection([ this.Return_, BackStatesInReturn, ]); } return this.ReturnWithBackStates_; } } export function procedure< TXParameter extends x.XTypeOfValue, TXReturn extends x.XTypeOfValue, >( Parameter: TXParameter, Return: TXReturn, ): ProcedureDefinition { return new ProcedureDefinition(Parameter, Return); } export type RPCResult = | { return: T; } | { throw: { code: string; message: string; }; };