@nestjs/graphql
Version:
Nest - modern, fast, powerful node.js web framework (@graphql)
47 lines (46 loc) • 2.12 kB
JavaScript
import { SetMetadata } from '@nestjs/common';
import { isString } from '@nestjs/common/utils/shared.utils.js';
import 'reflect-metadata';
import { Resolver } from '../enums/resolver.enum.js';
import { SUBSCRIPTION_OPTIONS_METADATA } from '../graphql.constants.js';
import { UndefinedReturnTypeError } from '../schema-builder/errors/undefined-return-type.error.js';
import { LazyMetadataStorage } from '../schema-builder/storages/lazy-metadata.storage.js';
import { TypeMetadataStorage } from '../schema-builder/storages/type-metadata.storage.js';
import { reflectTypeFromMetadata } from '../utils/reflection.utilts.js';
import { addResolverMetadata } from './resolvers.utils.js';
/**
* Subscription handler (method) Decorator. Routes subscriptions to this method.
*
* @publicApi
*/
export function Subscription(nameOrType, options = {}) {
return (target, key, descriptor) => {
const name = isString(nameOrType)
? nameOrType
: (options && options.name) || undefined;
addResolverMetadata(Resolver.SUBSCRIPTION, name, target, key, descriptor);
SetMetadata(SUBSCRIPTION_OPTIONS_METADATA, options)(target, key, descriptor);
LazyMetadataStorage.store(target.constructor, () => {
if (!nameOrType || isString(nameOrType)) {
throw new UndefinedReturnTypeError(Subscription.name, key);
}
const { typeFn, options: typeOptions } = reflectTypeFromMetadata({
metadataKey: 'design:returntype',
prototype: target,
propertyKey: key,
explicitTypeFn: nameOrType,
typeOptions: options,
});
const metadata = {
methodName: key,
schemaName: options.name || key,
target: target.constructor,
typeFn,
returnTypeOptions: typeOptions,
description: options.description,
deprecationReason: options.deprecationReason,
};
TypeMetadataStorage.addSubscriptionMetadata(metadata);
});
};
}