@shopify/shopify-api
Version:
Shopify API Library for Node - accelerate development with support for authentication, graphql proxy, webhooks
1 lines • 23.7 kB
Source Map (JSON)
{"version":3,"file":"register.mjs","sources":["../../../../../../lib/webhooks/register.ts"],"sourcesContent":["import {graphqlClientClass, GraphqlClient} from '../clients/admin';\nimport {InvalidDeliveryMethodError, ShopifyError} from '../error';\nimport {logger} from '../logger';\nimport {privacyTopics} from '../types';\nimport {ConfigInterface} from '../base-types';\nimport {Session} from '../session/session';\n\nimport {addHostToCallbackUrl, getHandlers, handlerIdentifier} from './registry';\nimport {queryTemplate} from './query-template';\nimport {\n WebhookRegistry,\n RegisterReturn,\n WebhookHandler,\n WebhookCheckResponse,\n DeliveryMethod,\n WebhookCheckResponseNode,\n WebhookOperation,\n RegisterResult,\n RegisterParams,\n} from './types';\n\ninterface RegisterTopicParams {\n config: ConfigInterface;\n session: Session;\n topic: string;\n existingHandlers: WebhookHandler[];\n handlers: WebhookHandler[];\n}\n\ninterface RunMutationsParams {\n config: ConfigInterface;\n client: GraphqlClient;\n topic: string;\n handlers: WebhookHandler[];\n operation: WebhookOperation;\n}\n\ninterface RunMutationParams {\n config: ConfigInterface;\n client: GraphqlClient;\n topic: string;\n handler: WebhookHandler;\n operation: WebhookOperation;\n}\n\nexport function register(\n config: ConfigInterface,\n webhookRegistry: WebhookRegistry,\n) {\n return async function register({\n session,\n }: RegisterParams): Promise<RegisterReturn> {\n const log = logger(config);\n log.info('Registering webhooks', {shop: session.shop});\n\n const registerReturn: RegisterReturn = Object.keys(webhookRegistry).reduce(\n (acc: RegisterReturn, topic) => {\n acc[topic] = [];\n return acc;\n },\n {},\n );\n\n const existingHandlers = await getExistingHandlers(config, session);\n\n log.debug(\n `Existing topics: [${Object.keys(existingHandlers).join(', ')}]`,\n {shop: session.shop},\n );\n\n for (const topic in webhookRegistry) {\n if (!Object.prototype.hasOwnProperty.call(webhookRegistry, topic)) {\n continue;\n }\n\n if (privacyTopics.includes(topic)) {\n continue;\n }\n\n registerReturn[topic] = await registerTopic({\n config,\n session,\n topic,\n existingHandlers: existingHandlers[topic] || [],\n handlers: getHandlers(webhookRegistry)(topic),\n });\n\n // Remove this topic from the list of existing handlers so we have a list of leftovers\n delete existingHandlers[topic];\n }\n\n // Delete any leftover handlers\n for (const topic in existingHandlers) {\n if (!Object.prototype.hasOwnProperty.call(existingHandlers, topic)) {\n continue;\n }\n\n const GraphqlClient = graphqlClientClass({config});\n const client = new GraphqlClient({session});\n\n registerReturn[topic] = await runMutations({\n config,\n client,\n topic,\n handlers: existingHandlers[topic],\n operation: WebhookOperation.Delete,\n });\n }\n\n return registerReturn;\n };\n}\n\nasync function getExistingHandlers(\n config: ConfigInterface,\n session: Session,\n): Promise<WebhookRegistry> {\n const GraphqlClient = graphqlClientClass({config});\n const client = new GraphqlClient({session});\n\n const existingHandlers: WebhookRegistry = {};\n\n let hasNextPage: boolean;\n let endCursor: string | null = null;\n do {\n const query = buildCheckQuery(endCursor);\n\n const response = await client.request<WebhookCheckResponse>(query);\n\n response.data?.webhookSubscriptions?.edges.forEach(\n (edge: WebhookCheckResponseNode) => {\n const handler = buildHandlerFromNode(edge);\n\n if (!existingHandlers[edge.node.topic]) {\n existingHandlers[edge.node.topic] = [];\n }\n\n existingHandlers[edge.node.topic].push(handler);\n },\n );\n\n endCursor = response.data?.webhookSubscriptions?.pageInfo.endCursor!;\n hasNextPage = response.data?.webhookSubscriptions?.pageInfo.hasNextPage!;\n } while (hasNextPage);\n\n return existingHandlers;\n}\n\nfunction buildCheckQuery(endCursor: string | null) {\n return queryTemplate(TEMPLATE_GET_HANDLERS, {\n END_CURSOR: JSON.stringify(endCursor),\n });\n}\n\nfunction buildHandlerFromNode(edge: WebhookCheckResponseNode): WebhookHandler {\n const endpoint = edge.node.endpoint;\n\n let handler: WebhookHandler;\n\n switch (endpoint.__typename) {\n case 'WebhookHttpEndpoint':\n handler = {\n deliveryMethod: DeliveryMethod.Http,\n callbackUrl: endpoint.callbackUrl,\n // This is a dummy for now because we don't really care about it\n callback: async () => {},\n };\n break;\n case 'WebhookEventBridgeEndpoint':\n handler = {\n deliveryMethod: DeliveryMethod.EventBridge,\n arn: endpoint.arn,\n };\n break;\n case 'WebhookPubSubEndpoint':\n handler = {\n deliveryMethod: DeliveryMethod.PubSub,\n pubSubProject: endpoint.pubSubProject,\n pubSubTopic: endpoint.pubSubTopic,\n };\n break;\n }\n\n // Set common fields\n handler.id = edge.node.id;\n handler.includeFields = edge.node.includeFields;\n handler.metafieldNamespaces = edge.node.metafieldNamespaces;\n\n // Sort the array fields to make them cheaper to compare later on\n handler.includeFields?.sort();\n handler.metafieldNamespaces?.sort();\n\n return handler;\n}\n\nasync function registerTopic({\n config,\n session,\n topic,\n existingHandlers,\n handlers,\n}: RegisterTopicParams): Promise<RegisterResult[]> {\n let registerResults: RegisterResult[] = [];\n\n const {toCreate, toUpdate, toDelete} = categorizeHandlers(\n config,\n existingHandlers,\n handlers,\n );\n\n const GraphqlClient = graphqlClientClass({config});\n const client = new GraphqlClient({session});\n\n let operation = WebhookOperation.Create;\n registerResults = registerResults.concat(\n await runMutations({config, client, topic, operation, handlers: toCreate}),\n );\n\n operation = WebhookOperation.Update;\n registerResults = registerResults.concat(\n await runMutations({config, client, topic, operation, handlers: toUpdate}),\n );\n\n operation = WebhookOperation.Delete;\n registerResults = registerResults.concat(\n await runMutations({config, client, topic, operation, handlers: toDelete}),\n );\n\n return registerResults;\n}\n\ntype HandlersByKey = Record<string, WebhookHandler>;\n\nfunction categorizeHandlers(\n config: ConfigInterface,\n existingHandlers: WebhookHandler[],\n handlers: WebhookHandler[],\n) {\n const handlersByKey = handlers.reduce((acc: HandlersByKey, value) => {\n acc[handlerIdentifier(config, value)] = value;\n return acc;\n }, {});\n const existingHandlersByKey = existingHandlers.reduce(\n (acc: HandlersByKey, value) => {\n acc[handlerIdentifier(config, value)] = value;\n return acc;\n },\n {},\n );\n\n const toCreate: HandlersByKey = {...handlersByKey};\n const toUpdate: HandlersByKey = {};\n const toDelete: HandlersByKey = {};\n for (const existingKey in existingHandlersByKey) {\n if (\n !Object.prototype.hasOwnProperty.call(existingHandlersByKey, existingKey)\n ) {\n continue;\n }\n\n const existingHandler = existingHandlersByKey[existingKey];\n const handler = handlersByKey[existingKey];\n\n if (existingKey in handlersByKey) {\n delete toCreate[existingKey];\n\n if (!areHandlerFieldsEqual(existingHandler, handler)) {\n toUpdate[existingKey] = handler;\n toUpdate[existingKey].id = existingHandler.id;\n }\n } else {\n toDelete[existingKey] = existingHandler;\n }\n }\n\n return {\n toCreate: Object.values(toCreate),\n toUpdate: Object.values(toUpdate),\n toDelete: Object.values(toDelete),\n };\n}\nfunction areHandlerFieldsEqual(\n arr1: WebhookHandler,\n arr2: WebhookHandler,\n): boolean {\n const includeFieldsEqual = arraysEqual(\n arr1.includeFields || [],\n arr2.includeFields || [],\n );\n const metafieldNamespacesEqual = arraysEqual(\n arr1.metafieldNamespaces || [],\n arr2.metafieldNamespaces || [],\n );\n\n return includeFieldsEqual && metafieldNamespacesEqual;\n}\n\nfunction arraysEqual(arr1: any[], arr2: any[]): boolean {\n if (arr1.length !== arr2.length) {\n return false;\n }\n\n for (let i = 0; i < arr1.length; i++) {\n if (arr1[i] !== arr2[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nasync function runMutations({\n config,\n client,\n topic,\n handlers,\n operation,\n}: RunMutationsParams): Promise<RegisterResult[]> {\n const registerResults: RegisterResult[] = [];\n\n for (const handler of handlers) {\n registerResults.push(\n await runMutation({config, client, topic, handler, operation}),\n );\n }\n\n return registerResults;\n}\n\nasync function runMutation({\n config,\n client,\n topic,\n handler,\n operation,\n}: RunMutationParams): Promise<RegisterResult> {\n let registerResult: RegisterResult;\n\n logger(config).debug(`Running webhook mutation`, {topic, operation});\n\n try {\n const query = buildMutation(config, topic, handler, operation);\n\n const result = await client.request(query);\n\n registerResult = {\n deliveryMethod: handler.deliveryMethod,\n success: isSuccess(result, handler, operation),\n result,\n operation,\n };\n } catch (error) {\n if (error instanceof InvalidDeliveryMethodError) {\n registerResult = {\n deliveryMethod: handler.deliveryMethod,\n success: false,\n result: {message: error.message},\n operation,\n };\n } else {\n throw error;\n }\n }\n\n return registerResult;\n}\n\nfunction buildMutation(\n config: ConfigInterface,\n topic: string,\n handler: WebhookHandler,\n operation: WebhookOperation,\n): string {\n const params: Record<string, string> = {};\n\n let identifier: string;\n if (handler.id) {\n identifier = `id: \"${handler.id}\"`;\n } else {\n identifier = `topic: ${topic}`;\n }\n\n const mutationArguments = {\n MUTATION_NAME: getMutationName(handler, operation),\n IDENTIFIER: identifier,\n MUTATION_PARAMS: '',\n };\n\n if (operation !== WebhookOperation.Delete) {\n switch (handler.deliveryMethod) {\n case DeliveryMethod.Http:\n params.callbackUrl = `\"${addHostToCallbackUrl(\n config,\n handler.callbackUrl,\n )}\"`;\n break;\n case DeliveryMethod.EventBridge:\n params.arn = `\"${handler.arn}\"`;\n break;\n case DeliveryMethod.PubSub:\n params.pubSubProject = `\"${handler.pubSubProject}\"`;\n params.pubSubTopic = `\"${handler.pubSubTopic}\"`;\n break;\n default:\n throw new InvalidDeliveryMethodError(\n `Unrecognized delivery method '${(handler as any).deliveryMethod}'`,\n );\n }\n\n if (handler.includeFields) {\n params.includeFields = JSON.stringify(handler.includeFields);\n }\n if (handler.metafieldNamespaces) {\n params.metafieldNamespaces = JSON.stringify(handler.metafieldNamespaces);\n }\n\n if (handler.subTopic) {\n const subTopicString = `subTopic: \"${handler.subTopic}\",`;\n mutationArguments.MUTATION_PARAMS = subTopicString;\n }\n\n const paramsString = Object.entries(params)\n .map(([key, value]) => `${key}: ${value}`)\n .join(', ');\n\n mutationArguments.MUTATION_PARAMS += `webhookSubscription: {${paramsString}}`;\n }\n\n return queryTemplate(TEMPLATE_MUTATION, mutationArguments);\n}\n\nfunction getMutationName(\n handler: WebhookHandler,\n operation: WebhookOperation,\n): string {\n switch (operation) {\n case WebhookOperation.Create:\n return `${getEndpoint(handler)}Create`;\n case WebhookOperation.Update:\n return `${getEndpoint(handler)}Update`;\n case WebhookOperation.Delete:\n return 'webhookSubscriptionDelete';\n default:\n throw new ShopifyError(`Unrecognized operation '${operation}'`);\n }\n}\n\nfunction getEndpoint(handler: WebhookHandler): string {\n switch (handler.deliveryMethod) {\n case DeliveryMethod.Http:\n return 'webhookSubscription';\n case DeliveryMethod.EventBridge:\n return 'eventBridgeWebhookSubscription';\n case DeliveryMethod.PubSub:\n return 'pubSubWebhookSubscription';\n default:\n throw new ShopifyError(\n `Unrecognized delivery method '${(handler as any).deliveryMethod}'`,\n );\n }\n}\n\nfunction isSuccess(\n result: any,\n handler: WebhookHandler,\n operation: WebhookOperation,\n): boolean {\n const mutationName = getMutationName(handler, operation);\n\n return Boolean(\n result.data &&\n result.data[mutationName] &&\n result.data[mutationName].userErrors.length === 0,\n );\n}\n\nexport const TEMPLATE_GET_HANDLERS = `query shopifyApiReadWebhookSubscriptions {\n webhookSubscriptions(\n first: 250,\n after: {{END_CURSOR}},\n ) {\n edges {\n node {\n id\n topic\n includeFields\n metafieldNamespaces\n endpoint {\n __typename\n ... on WebhookHttpEndpoint {\n callbackUrl\n }\n ... on WebhookEventBridgeEndpoint {\n arn\n }\n ... on WebhookPubSubEndpoint {\n pubSubProject\n pubSubTopic\n }\n }\n }\n }\n pageInfo {\n endCursor\n hasNextPage\n }\n }\n}`;\n\nexport const TEMPLATE_MUTATION = `\n mutation shopifyApiCreateWebhookSubscription {\n {{MUTATION_NAME}}(\n {{IDENTIFIER}},\n {{MUTATION_PARAMS}}\n ) {\n userErrors {\n field\n message\n }\n }\n }\n`;\n"],"names":[],"mappings":"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"}