@shortcm/cloudfront-ip-ranges
Version:
Get Cloudfront IPs for use in trust proxy configurations
57 lines (47 loc) • 1.43 kB
text/typescript
import { Application } from 'express';
import * as https from 'https';
import { Logger } from './logger';
import { IServicePrefix } from './index.d';
export class CloudfrontService {
private readonly _logger: Logger;
constructor(private _apiUrl: string = 'https://ip-ranges.amazonaws.com/ip-ranges.json') {
this._logger = new Logger('CloudfrontIpService');
}
get apiUrl(): string {
return this._apiUrl;
}
private async getJSON() {
return new Promise<IServicePrefix>((resolve, reject) => {
https.get(this.apiUrl, (res) => {
let body: string = '';
res.on('data', (data) => {
body += data;
});
res.on('end', () => {
// @ts-ignore
resolve(JSON.parse(body));
});
})
.on('error', (error) => {
reject(error);
});
});
}
public async getIpRange(service: string = 'CLOUDFRONT'): Promise<string[]> {
const ips: string[] = [];
try {
const results = await this.getJSON();
ips.push(...results.prefixes.filter((p) => p.service === service).map(({ ip_prefix }) => ip_prefix));
}
catch (e) {
this._logger.error(e);
}
return ips;
}
public updateTrustProxy(expressApp: Application) {
return this.getIpRange()
.then((ips: string[]) => {
expressApp.set('trust proxy', ['loopback', 'linklocal', 'uniquelocal', ...ips]);
});
}
}