All files / adapters/gcp/pubsub index.ts

91.01% Statements 81/89
100% Branches 0/0
0% Functions 0/1
91.01% Lines 81/89

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 901x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x                 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x  
export {}
const { PubSub } = require('@google-cloud/pubsub')
const GoogleCloudAdapter = require('../GoogleCloudAdapter')
 
const { ErrorUtils } = require('../../../utils/error')
 
const $error = new ErrorUtils()
 
type TConstructorProps = {
  projectId: string | boolean
}
type TPubSubPublish = {
  topic: string
  message: string | Record<string, any>
}
 
export class PubSubAdapter extends GoogleCloudAdapter {
  constructor(props?: TConstructorProps) {
    super()
    this.pubsub
    if (props?.projectId) {
      this.pubsub = new PubSub({ projectId: props.projectId })
    } else {
      this.pubsub = new PubSub()
    }
  }
 
  createTopic = async (name: string) => {
    try {
      const [exists] = await this.pubsub.topic(name).exists()
      if (!exists) {
        await this.pubsub.createTopic(name)
      }
      return true
    } catch (error) {
      throw $error.errorHandler({ error })
    }
  }
 
  getTopics = async () => {
    try {
      let response: Record<string, any>[] = []
      const [topics] = await this.pubsub.getTopics()
      for (let topic of topics) {
        response.push(topic)
      }
      return response
    } catch (error) {
      throw $error.errorHandler({ error })
    }
  }
 
  getTopic = async (name: string) => {
    try {
      const [topic] = await this.pubsub.topic(name)
      return topic
    } catch (error) {
      throw $error.errorHandler({ error })
    }
  }
 
  deleteTopic = async (name: string) => {
    try {
      const [exists] = await this.pubsub.topic(name).exists()
      if (exists) await this.pubsub.topic(name).delete()
      return true
    } catch (error) {
      throw $error.errorHandler({ error })
    }
  }
 
  publishMessage = async (props: TPubSubPublish) => {
    try {
      let { topic, message } = props
      let dataBuffer
      if (typeof message === 'string') {
        dataBuffer = Buffer.from(message)
      } else {
        dataBuffer = Buffer.from(JSON.stringify(message))
      }
      const messageId = await this.pubsub
        .topic(topic)
        .publishMessage({ data: dataBuffer })
      return messageId
    } catch (error) {
      throw $error.errorHandler({ error })
    }
  }
}