UNPKG

@nestjs/graphql

Version:

Nest - modern, fast, powerful node.js web framework (@graphql)

47 lines (46 loc) 2.12 kB
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); }); }; }