@tremendo-studio/flyio-broadcast
Version:
A utility library for broadcasting messages between Fly.io app instances.
61 lines (60 loc) • 1.8 kB
JavaScript
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 [];
}
}