@studion/infra-code-blocks
Version:
Studion common infra components
50 lines (49 loc) • 1.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PluginReady = void 0;
const pulumi = require("@pulumi/pulumi");
const exponential_backoff_1 = require("exponential-backoff");
const undici_1 = require("undici");
class PluginReady extends pulumi.dynamic.Resource {
constructor(name, props, opts) {
super(new PluginReadyProvider(), name, props, opts);
}
}
exports.PluginReady = PluginReady;
class PluginReadyProvider {
async create(inputs) {
const { grafanaToken, grafanaUrl, slug } = inputs;
const url = new URL(`/api/plugins/${slug}/settings`, grafanaUrl).href;
let data;
try {
data = await (0, exponential_backoff_1.backOff)(async () => {
const { statusCode, body } = await (0, undici_1.request)(url, {
method: 'GET',
headers: {
Authorization: `Bearer ${grafanaToken}`,
'Content-Type': 'application/json',
},
});
if (statusCode === 200) {
return (await body.json());
}
if (statusCode !== 404) {
throw new Error(`Unexpected status code: ${statusCode}`);
}
throw new Error('Plugin not ready yet');
}, {
delayFirstAttempt: true,
numOfAttempts: 11,
startingDelay: 500,
maxDelay: 60000,
timeMultiple: 2,
jitter: 'none',
retry: (err) => err.message === 'Plugin not ready yet',
});
}
catch {
throw new Error(`Timed out waiting for plugin "${slug}" to become ready`);
}
return { id: data.id, outs: {} };
}
}