@das3mical/adonis-mercure
Version:
Mercure Hub integration for AdonisJS v6 — publish real-time updates via Server-Sent Events (SSE)
43 lines (42 loc) • 1.4 kB
JavaScript
import { TokenGenerator } from './token_generator.js';
import { Publisher } from './publisher.js';
const DEFAULT_TIMEOUT = 5000;
export class Mercure {
#config;
#tokenGenerator;
#publisher;
constructor(config) {
this.#config = config;
this.#tokenGenerator = new TokenGenerator(config);
this.#publisher = new Publisher(config);
}
generate(payload) {
return this.#tokenGenerator.generate(payload);
}
generateSubscribeToken(topics) {
return this.#tokenGenerator.generateSubscribeToken(topics);
}
send(topics, data = {}, isPrivateOrOptions = false) {
const options = typeof isPrivateOrOptions === 'boolean' ? { private: isPrivateOrOptions } : isPrivateOrOptions;
return this.#publisher.publish(topics, data, options);
}
async ping() {
const timeout = this.#config.http?.timeout ?? DEFAULT_TIMEOUT;
const controller = timeout > 0 ? new AbortController() : null;
const timer = controller ? setTimeout(() => controller.abort(), timeout) : null;
try {
await fetch(this.#config.endpoint, {
method: 'HEAD',
signal: controller?.signal,
});
return true;
}
catch {
return false;
}
finally {
if (timer)
clearTimeout(timer);
}
}
}