diff --git a/lib/utils/user-info-extraction-utils.js b/lib/utils/user-info-extraction-utils.js --- a/lib/utils/user-info-extraction-utils.js +++ b/lib/utils/user-info-extraction-utils.js @@ -6,16 +6,32 @@ import type { CallSingleKeyserverEndpointResponse } from '../keyserver-conn/call-single-keyserver-endpoint.js'; import { mixedRawThreadInfoValidator } from '../permissions/minimally-encoded-raw-thread-info-validators.js'; import type { Endpoint } from '../types/endpoints.js'; +import type { MixedRawThreadInfos } from '../types/thread-types.js'; import { userInfoValidator } from '../types/user-types.js'; +import type { UserInfo } from '../types/user-types.js'; import { endpointValidators } from '../types/validators/endpoint-validators.js'; import { extractUserIDsFromPayload } from '../utils/conversion-utils.js'; import { tID, tShape } from '../utils/validation-utils.js'; +type AdditionalCookieChange = { + +threadInfos: MixedRawThreadInfos, + +userInfos: $ReadOnlyArray, + +cookieInvalidated?: boolean, + sessionID?: string, + cookie?: string, +}; + +type AdditionalResponseFields = { + +cookieChange: AdditionalCookieChange, + +error?: string, + +payload?: Object, + +success: boolean, +}; + function extendResponderValidatorBase(inputValidator: TType<*>): TType<*> { - return tShape({ - ...inputValidator.meta.props, + const additionalResponseFieldsValidator = tShape({ cookieChange: t.maybe( - tShape({ + tShape({ threadInfos: t.dict(tID, mixedRawThreadInfoValidator), userInfos: t.list(userInfoValidator), cookieInvalidated: t.maybe(t.Boolean), @@ -27,6 +43,23 @@ payload: t.maybe(t.Object), success: t.maybe(t.Boolean), }); + + if (inputValidator.meta.kind === 'union') { + const newTypes = []; + for (const innerValidator of inputValidator.meta.types) { + const newInnerValidator = extendResponderValidatorBase(innerValidator); + newTypes.push(newInnerValidator); + } + // $FlowIgnore + inputValidator.meta.types = newTypes; + + return inputValidator; + } + + return tShape({ + ...inputValidator.meta.props, + ...additionalResponseFieldsValidator.meta.props, + }); } const extendResponderValidator = _memoize(extendResponderValidatorBase);