@das3mical/adonis-mercure
Version:
A simple AdonisJS provider to interact with Mercure hub
46 lines (37 loc) • 1.29 kB
text/typescript
import { MercurePublishError } from './errors/publish_error.js'
import type { MercureConfig, SendOptions } from './types/main.js'
export class Publisher {
#config: MercureConfig
constructor(config: MercureConfig) {
this.#config = config
}
async publish(
topics: string | string[],
data: Record<string, unknown> = {},
options: SendOptions = {}
): Promise<Response> {
const topicList = Array.isArray(topics) ? topics : [topics]
const form = new URLSearchParams()
for (const topic of topicList) {
form.append('topic', topic)
}
form.append('data', JSON.stringify(data))
if (options.private) form.append('private', 'on')
if (options.id) form.append('id', options.id)
if (options.type) form.append('type', options.type)
if (options.retry !== undefined) form.append('retry', String(options.retry))
const response = await fetch(this.#config.endpoint, {
method: 'POST',
headers: {
'Authorization': `Bearer ${this.#config.adminToken}`,
'Content-Type': 'application/x-www-form-urlencoded',
},
body: form.toString(),
})
if (!response.ok) {
const body = await response.text()
throw new MercurePublishError(response.status, body)
}
return response
}
}