async function getReleasesDocument()

in src/support.ts [101:135]


async function getReleasesDocument(): Promise<ReleasesDocument> {
  const downloaded = await new Promise<string | undefined>((ok, ko) => {
    const request = get(
      new URL('https://raw.githubusercontent.com/aws/jsii-compiler/main/releases.json'),
      (response) => {
        if (response.statusCode === 404) {
          return ok(undefined);
        }
        if (response.statusCode !== 200) {
          return ko(`received error response: HTTP ${response.statusCode} - ${response.statusMessage}`);
        }
        response.once('error', ko);
        const chunks = new Array<Buffer>();
        response.on('data', (chunk) => chunks.push(Buffer.from(chunk)));
        response.once('end', () => ok(Buffer.concat(chunks).toString('utf-8')));
      },
    );
    request.once('abort', () => ko('request aborted'));
    request.once('timeout', () => ko('request timed out'));
    request.once('error', ko);
    request.end();
  }).catch((cause) => {
    if (process.env.JSII_DEBUG) {
      console.error(`Could not download releases.json from GitHub: ${cause}`);
    }
    undefined;
  });

  return JSON.parse(downloaded ?? readFileSync(join(__dirname, '..', 'releases.json'), 'utf-8'), (key, value) => {
    if (key !== 'maintenance') {
      return value;
    }
    return Object.fromEntries(Object.entries(value).map(([release, date]) => [release, new Date(date as string)]));
  }) as ReleasesDocument;
}