UNPKG

@tremendo-studio/flyio-broadcast

Version:

A utility library for broadcasting messages between Fly.io app instances.

61 lines (60 loc) 1.8 kB
import { promises as dns } from "dns"; const PORT = process.env?.PORT; const PRIVATE_IP = process.env?.FLY_PRIVATE_IP; const isRunningOnFly = !!process?.env?.FLY_APP_NAME; export function createBroadcaster(appName, path) { return { broadcast: (message) => broadcast(path, appName, message), getIPs: () => getAllInstanceIPs(appName), }; } async function broadcast(path, appName, message) { if (!isRunningOnFly) return Promise.resolve([]); const instanceIPs = (await getAllInstanceIPs(appName)).filter((ip) => ip !== PRIVATE_IP); const broadcastPromises = instanceIPs.map(async (ip) => { const url = `http://[${ip}]:${PORT}${path}`; try { const response = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json", }, body: message, }); if (!response.ok) { throw new Error(`Failed to broadcast to ${ip}: ${response.statusText}`); } return { ok: true, ip, data: await response.json(), }; } catch (error) { if (error?.message) { return { ok: false, ip, error: error.message, }; } } return { ok: false, ip, error: "", }; }); return (await Promise.all(broadcastPromises)); } async function getAllInstanceIPs(appName) { if (!isRunningOnFly) return Promise.resolve([]); try { return await dns.resolve6(`${appName}.internal`); } catch (error) { return []; } }