UNPKG

samsara-queue

Version:

The job worker/publisher base on google/pubsub. It might be crawler job worker or export data worker, mail sender...etc.

63 lines (51 loc) 1.66 kB
/** * Module dependencies */ const { PubSub, Topic } = require('@google-cloud/pubsub'); const _ = require('lodash'); class ExtendedPubSub extends PubSub { // Get topic by name async getTopicMatchName(topicName) { const [topics] = await this.getTopics(); const foundTopic = topics.find(topic => topic.name.endsWith(topicName)); // console.log(foundTopic); if (foundTopic) { return foundTopic; } return null; } async createSubscriptionIfNotExists(topicName, name, options = {}) { const topic = await (() => { if (_.isString(topicName)) { return this.createOrGetTopic(topicName); } throw new Error('topicName must be string.'); })(); const [subscriptions] = await topic.getSubscriptions(); if (subscriptions.find(subscription => subscription.name.endsWith(name))) { return Promise.resolve(); } return this.createSubscription(topicName, name, options); } /** * Get topic or create. * @param {string} name The name of the topic * @returns {Topic} */ async createOrGetTopic(name) { const topic = await this.getTopicMatchName(name); if (!topic) { const createdTopic = await this.createTopic(name); // https://googleapis.dev/nodejs/pubsub/1.7.1/PubSub.html#createTopic // [0]: The new topic. // [1]: The full API response. return createdTopic[0]; } return topic; } async createOrGetSubscription(topicOrName, name, options = {}) { await this.createSubscriptionIfNotExists(topicOrName, name, options); return this.subscription(name, options); } } module.exports = ExtendedPubSub;