Commit b86d1270 authored by nanahira's avatar nanahira

pre-check site

parent 0666aa02
Pipeline #20034 passed with stages
in 5 minutes and 19 seconds
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
"version": "0.0.1", "version": "0.0.1",
"license": "UNLICENSED", "license": "UNLICENSED",
"dependencies": { "dependencies": {
"@nestjs/axios": "^2.0.0",
"@nestjs/common": "^9.0.0", "@nestjs/common": "^9.0.0",
"@nestjs/config": "^2.3.1", "@nestjs/config": "^2.3.1",
"@nestjs/core": "^9.0.0", "@nestjs/core": "^9.0.0",
...@@ -1453,6 +1454,17 @@ ...@@ -1453,6 +1454,17 @@
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/@nestjs/axios": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@nestjs/axios/-/axios-2.0.0.tgz",
"integrity": "sha512-F6oceoQLEn031uun8NiommeMkRIojQqVryxQy/mK7fx0CI0KbgkJL3SloCQcsOD+agoEnqKJKXZpEvL6FNswJg==",
"peerDependencies": {
"@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0",
"axios": "^1.3.1",
"reflect-metadata": "^0.1.12",
"rxjs": "^6.0.0 || ^7.0.0"
}
},
"node_modules/@nestjs/cli": { "node_modules/@nestjs/cli": {
"version": "9.2.0", "version": "9.2.0",
"resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.2.0.tgz", "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.2.0.tgz",
...@@ -2775,8 +2787,18 @@ ...@@ -2775,8 +2787,18 @@
"node_modules/asynckit": { "node_modules/asynckit": {
"version": "0.4.0", "version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
"dev": true },
"node_modules/axios": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.3.2.tgz",
"integrity": "sha512-1M3O703bYqYuPhbHeya5bnhpYVsDDRyQSabNja04mZtboLNSuZ4YrltestrLXfHgmzua4TpUqRiVKbiQuo2epw==",
"peer": true,
"dependencies": {
"follow-redirects": "^1.15.0",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
}, },
"node_modules/babel-jest": { "node_modules/babel-jest": {
"version": "28.1.3", "version": "28.1.3",
...@@ -3373,7 +3395,6 @@ ...@@ -3373,7 +3395,6 @@
"version": "1.0.8", "version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dev": true,
"dependencies": { "dependencies": {
"delayed-stream": "~1.0.0" "delayed-stream": "~1.0.0"
}, },
...@@ -3606,7 +3627,6 @@ ...@@ -3606,7 +3627,6 @@
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"dev": true,
"engines": { "engines": {
"node": ">=0.4.0" "node": ">=0.4.0"
} }
...@@ -4487,6 +4507,26 @@ ...@@ -4487,6 +4507,26 @@
"integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
"dev": true "dev": true
}, },
"node_modules/follow-redirects": {
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"peer": true,
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/fork-ts-checker-webpack-plugin": { "node_modules/fork-ts-checker-webpack-plugin": {
"version": "7.3.0", "version": "7.3.0",
"resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.3.0.tgz", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.3.0.tgz",
...@@ -4555,7 +4595,6 @@ ...@@ -4555,7 +4595,6 @@
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"dev": true,
"dependencies": { "dependencies": {
"asynckit": "^0.4.0", "asynckit": "^0.4.0",
"combined-stream": "^1.0.8", "combined-stream": "^1.0.8",
...@@ -10001,6 +10040,12 @@ ...@@ -10001,6 +10040,12 @@
"node-abort-controller": "^3.0.1" "node-abort-controller": "^3.0.1"
} }
}, },
"@nestjs/axios": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/@nestjs/axios/-/axios-2.0.0.tgz",
"integrity": "sha512-F6oceoQLEn031uun8NiommeMkRIojQqVryxQy/mK7fx0CI0KbgkJL3SloCQcsOD+agoEnqKJKXZpEvL6FNswJg==",
"requires": {}
},
"@nestjs/cli": { "@nestjs/cli": {
"version": "9.2.0", "version": "9.2.0",
"resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.2.0.tgz", "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-9.2.0.tgz",
...@@ -10997,8 +11042,18 @@ ...@@ -10997,8 +11042,18 @@
"asynckit": { "asynckit": {
"version": "0.4.0", "version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
"dev": true },
"axios": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.3.2.tgz",
"integrity": "sha512-1M3O703bYqYuPhbHeya5bnhpYVsDDRyQSabNja04mZtboLNSuZ4YrltestrLXfHgmzua4TpUqRiVKbiQuo2epw==",
"peer": true,
"requires": {
"follow-redirects": "^1.15.0",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
}, },
"babel-jest": { "babel-jest": {
"version": "28.1.3", "version": "28.1.3",
...@@ -11424,7 +11479,6 @@ ...@@ -11424,7 +11479,6 @@
"version": "1.0.8", "version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dev": true,
"requires": { "requires": {
"delayed-stream": "~1.0.0" "delayed-stream": "~1.0.0"
} }
...@@ -11605,8 +11659,7 @@ ...@@ -11605,8 +11659,7 @@
"delayed-stream": { "delayed-stream": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
"dev": true
}, },
"denque": { "denque": {
"version": "2.1.0", "version": "2.1.0",
...@@ -12288,6 +12341,12 @@ ...@@ -12288,6 +12341,12 @@
"integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
"dev": true "dev": true
}, },
"follow-redirects": {
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
"peer": true
},
"fork-ts-checker-webpack-plugin": { "fork-ts-checker-webpack-plugin": {
"version": "7.3.0", "version": "7.3.0",
"resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.3.0.tgz", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-7.3.0.tgz",
...@@ -12335,7 +12394,6 @@ ...@@ -12335,7 +12394,6 @@
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"dev": true,
"requires": { "requires": {
"asynckit": "^0.4.0", "asynckit": "^0.4.0",
"combined-stream": "^1.0.8", "combined-stream": "^1.0.8",
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
"test:e2e": "jest --config ./test/jest-e2e.json" "test:e2e": "jest --config ./test/jest-e2e.json"
}, },
"dependencies": { "dependencies": {
"@nestjs/axios": "^2.0.0",
"@nestjs/common": "^9.0.0", "@nestjs/common": "^9.0.0",
"@nestjs/config": "^2.3.1", "@nestjs/config": "^2.3.1",
"@nestjs/core": "^9.0.0", "@nestjs/core": "^9.0.0",
......
...@@ -8,7 +8,7 @@ export class AppController { ...@@ -8,7 +8,7 @@ export class AppController {
@Get('*') @Get('*')
async render(@Req() req: Request, @Res({ passthrough: true }) res: Response) { async render(@Req() req: Request, @Res({ passthrough: true }) res: Response) {
const result = await this.appService.render(req); const result = await this.appService.render(req, res);
res.header('Cache-Control', 'public, max-age=3600, immutable'); res.header('Cache-Control', 'public, max-age=3600, immutable');
return result; return result;
} }
......
...@@ -5,6 +5,7 @@ import { ConfigModule, ConfigService } from '@nestjs/config'; ...@@ -5,6 +5,7 @@ import { ConfigModule, ConfigService } from '@nestjs/config';
import { loadConfig } from './utility/config'; import { loadConfig } from './utility/config';
import { AragamiModule } from 'nestjs-aragami'; import { AragamiModule } from 'nestjs-aragami';
import { PuppeteerService } from './puppeteer/puppeteer.service'; import { PuppeteerService } from './puppeteer/puppeteer.service';
import { HttpModule } from '@nestjs/axios';
@Module({ @Module({
imports: [ imports: [
...@@ -28,6 +29,7 @@ import { PuppeteerService } from './puppeteer/puppeteer.service'; ...@@ -28,6 +29,7 @@ import { PuppeteerService } from './puppeteer/puppeteer.service';
return {}; return {};
}, },
}), }),
HttpModule,
], ],
controllers: [AppController], controllers: [AppController],
providers: [AppService, PuppeteerService], providers: [AppService, PuppeteerService],
......
import { Injectable, ConsoleLogger } from '@nestjs/common'; import { Injectable, ConsoleLogger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { Request } from 'express'; import { Request, Response } from 'express';
import { Aragami, CacheKey, CacheTTL } from 'aragami'; import { Aragami, CacheKey, CacheTTL } from 'aragami';
import { InjectAragami } from 'nestjs-aragami'; import { InjectAragami } from 'nestjs-aragami';
import { PuppeteerService } from './puppeteer/puppeteer.service'; import { PuppeteerService } from './puppeteer/puppeteer.service';
import { BlankReturnMessageDto } from './dto/ReturnMessage.dto'; import { BlankReturnMessageDto } from './dto/ReturnMessage.dto';
import { HttpService } from '@nestjs/axios';
import { lastValueFrom } from 'rxjs';
@CacheTTL(3600000) @CacheTTL(3600000)
class SiteCache { class SiteCache {
...@@ -19,11 +21,12 @@ export class AppService extends ConsoleLogger { ...@@ -19,11 +21,12 @@ export class AppService extends ConsoleLogger {
private readonly config: ConfigService, private readonly config: ConfigService,
@InjectAragami() private readonly aragami: Aragami, @InjectAragami() private readonly aragami: Aragami,
private readonly puppeteerService: PuppeteerService, private readonly puppeteerService: PuppeteerService,
private readonly httpService: HttpService,
) { ) {
super('app'); super('app');
} }
async render(req: Request) { async render(req: Request, res: Response) {
const url = req.originalUrl.startsWith('/') const url = req.originalUrl.startsWith('/')
? req.originalUrl.slice(1) ? req.originalUrl.slice(1)
: req.originalUrl; : req.originalUrl;
...@@ -33,7 +36,28 @@ export class AppService extends ConsoleLogger { ...@@ -33,7 +36,28 @@ export class AppService extends ConsoleLogger {
this.log(`Cache hit for ${url}`); this.log(`Cache hit for ${url}`);
return siteCache.html; return siteCache.html;
} }
this.log(`Rendering ${url}`); const testHead = await lastValueFrom(
this.httpService.head(url, {
validateStatus: () => true,
}),
);
if (testHead.status >= 400) {
throw new BlankReturnMessageDto(
testHead.status,
testHead.statusText,
).toException();
}
if (testHead.status >= 300) {
const location = testHead.headers.location;
if (location) {
res.header('Location', location);
throw new BlankReturnMessageDto(
testHead.status,
testHead.statusText,
).toException();
}
}
this.log(`Rendering ${url} requested by ${req.header('User-Agent')}`);
try { try {
const html = await this.puppeteerService.render(url); const html = await this.puppeteerService.render(url);
await this.aragami.set(SiteCache, { url, html }); await this.aragami.set(SiteCache, { url, html });
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment