@sagi.io/workers-pubsub
Version:
Google Pub/Sub API for Cloudflare Workers
113 lines (74 loc) • 3.87 kB
Markdown
# workers-pubsub
[`@sagi.io/workers-pubsub`](https://www.npmjs.com/package/@sagi.io/workers-pubsub) is a Google Pub/Sub REST API for Cloudflare Workers (can also be used with Node).
⭐ We use it at **[OpenSay](https://opensay.co/s=workers-pubsub)** to efficiently access Google's PubSub REST API with 1 round trip.
[](https://circleci.com/gh/sagi/workers-pubsub)
[](https://coveralls.io/github/sagi/workers-pubsub)
[](http://opensource.org/licenses/MIT)
[](http://npm.im/@sagi.io/workers-pubsub)
## Installation
~~~
$ npm i @sagi.io/workers-pubsub
~~~
## API
We follow [Google's Pub/Sub REST API](https://cloud.google.com/pubsub/docs/reference/rest/) specification. We'll add more methods if there's demand.
See below for concrete examples for Cloudflare Workers and Node.js.
### **`PubSubREST({ ... })`**
Instantiates `PubSub` instance.
Function definition:
```js
const PubSubREST = async ({
serviceAccountJSON,
cryptoImpl = null,
fetchImpl = null,
}) => { ... }
```
Where:
- **`serviceAccountJSON`** *required* Is a Google Cloud service account with a **Pub/Sub Admin** role. An object.
- **`cryptoImpl`** *optional* Not needed when running on Cloudflare Workers. See concrete example below for how to use it with Node.js.
- **`fetchImpl`** *optional* Not needed when running on Cloudflare Workers. See concrete example below for how to use it with Node.js.
### **`PubSub.topics.publish({ ... })`**
Publishes a message to a topic.
Function definition:
```js
const publish = ({ topic, messages } = {}) => { ... }
```
Where:
- **`topic`** *required* The topic to send messages to.
- **`messages`** *required* an array of [Pub/Sub messages](https://cloud.google.com/pubsub/docs/reference/rest/v1/PubsubMessage). You can use the `PubSub.helpers.createPubSubMessage` method to easily create a Pub/Sub message.
### **`PubSub.topics.list({ ... })`**
Lists all topics.
### **`PubSub.helpers.createPubSubMessage({ ... })`**
Helps create a PubSub message easily.
Function definition:
```js
const createPubSubMessage = ({ message = '', attributes = undefined } = {}) => { ... }
```
Where:
- **`message`** *optional* A message string. e.g. `Hello World`.
- **`attributes`** *optional* An object with string values. e.g. `{ type: 'slack-poll' }`.
- **`ordering_key`** *optional* An ordering key to allow subscribers to receive messages in order in the same region. [Read more here](https://cloud.google.com/pubsub/docs/publisher#using_ordering_keys).
Returns a [Pub/Sub message](https://cloud.google.com/pubsub/docs/reference/rest/v1/PubsubMessage).
## Cloudflare Workers Example
~~~js
import base64url from 'base64url'
import PubSubREST from '@sagi.io/workers-pubsub'
const serviceAccountJSON = ...
const PubSub = await PubSubREST({ serviceAccountJSON })
const topic = 'gcf-task'
const psMessage = PubSub.helpers.createPubSubMessage({ message: 'Hello World!' })
const messages = [ psMessage ]
await PubSub.topics.publish({ topic, messages })
~~~
## Node.js Example
~~~js
import fetchImpl from 'cross-fetch'
import { Crypto }from 'node-webcrypto-ossl'
import PubSubREST from '@sagi.io/workers-pubsub'
const cryptoImpl = new Crypto()
const serviceAccountJSON = ...
const PubSub = await PubSubREST({ serviceAccountJSON, cryptoImpl. fetchImpl })
const topic = 'gcf-task'
const psMessage = PubSub.helpers.createPubSubMessage({ message: 'Hello World!' })
const messages = [ psMessage ]
await PubSub.topics.publish({ topic, messages })
~~~