summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/web
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2022-06-11 19:31:03 +0900
committerGitHub <noreply@github.com>2022-06-11 19:31:03 +0900
commit182a1bf653ecfbcf76e4530b3077c6252b0d4827 (patch)
tree45d1472747d4cac017e96616f844292f5785ccdd /packages/backend/src/server/web
parent12.110.1 (diff)
parent12.111.0 (diff)
downloadmisskey-182a1bf653ecfbcf76e4530b3077c6252b0d4827.tar.gz
misskey-182a1bf653ecfbcf76e4530b3077c6252b0d4827.tar.bz2
misskey-182a1bf653ecfbcf76e4530b3077c6252b0d4827.zip
Merge pull request #8783 from misskey-dev/develop
Release: 12.111.0
Diffstat (limited to 'packages/backend/src/server/web')
-rw-r--r--packages/backend/src/server/web/boot.js21
-rw-r--r--packages/backend/src/server/web/index.ts37
-rw-r--r--packages/backend/src/server/web/manifest.ts14
-rw-r--r--packages/backend/src/server/web/style.css30
-rw-r--r--packages/backend/src/server/web/url-preview.ts2
-rw-r--r--packages/backend/src/server/web/views/base.pug46
6 files changed, 83 insertions, 67 deletions
diff --git a/packages/backend/src/server/web/boot.js b/packages/backend/src/server/web/boot.js
index 751e8619bf..94329e11c9 100644
--- a/packages/backend/src/server/web/boot.js
+++ b/packages/backend/src/server/web/boot.js
@@ -54,19 +54,11 @@
//#endregion
//#region Script
- const salt = localStorage.getItem('salt')
- ? `?salt=${localStorage.getItem('salt')}`
- : '';
-
- const script = document.createElement('script');
- script.setAttribute('src', `/assets/app.${v}.js${salt}`);
- script.setAttribute('async', 'true');
- script.setAttribute('defer', 'true');
- script.addEventListener('error', async () => {
- await checkUpdate();
- renderError('APP_FETCH_FAILED');
- });
- document.head.appendChild(script);
+ import(`/assets/${CLIENT_ENTRY}`)
+ .catch(async e => {
+ await checkUpdate();
+ renderError('APP_FETCH_FAILED', JSON.stringify(e));
+ })
//#endregion
//#region Theme
@@ -146,9 +138,6 @@
// eslint-disable-next-line no-inner-declarations
function refresh() {
- // Random
- localStorage.setItem('salt', Math.random().toString().substr(2, 8));
-
// Clear cache (service worker)
try {
navigator.serviceWorker.controller.postMessage('clear');
diff --git a/packages/backend/src/server/web/index.ts b/packages/backend/src/server/web/index.ts
index 34d56cfd0c..2feee72be7 100644
--- a/packages/backend/src/server/web/index.ts
+++ b/packages/backend/src/server/web/index.ts
@@ -4,6 +4,7 @@
import { dirname } from 'node:path';
import { fileURLToPath } from 'node:url';
+import { PathOrFileDescriptor, readFileSync } from 'node:fs';
import ms from 'ms';
import Koa from 'koa';
import Router from '@koa/router';
@@ -14,7 +15,7 @@ import { createBullBoard } from '@bull-board/api';
import { BullAdapter } from '@bull-board/api/bullAdapter.js';
import { KoaAdapter } from '@bull-board/koa';
-import { IsNull } from 'typeorm';
+import { In, IsNull } from 'typeorm';
import { fetchMeta } from '@/misc/fetch-meta.js';
import config from '@/config/index.js';
import { Users, Notes, UserProfiles, Pages, Channels, Clips, GalleryPosts } from '@/models/index.js';
@@ -32,6 +33,7 @@ const _dirname = dirname(_filename);
const staticAssets = `${_dirname}/../../../assets/`;
const clientAssets = `${_dirname}/../../../../client/assets/`;
const assets = `${_dirname}/../../../../../built/_client_dist_/`;
+const swAssets = `${_dirname}/../../../../../built/_sw_dist_/`;
// Init app
const app = new Koa();
@@ -72,6 +74,9 @@ app.use(views(_dirname + '/views', {
extension: 'pug',
options: {
version: config.version,
+ getClientEntry: () => process.env.NODE_ENV === 'production' ?
+ config.clientEntry :
+ JSON.parse(readFileSync(`${_dirname}/../../../../../built/_client_dist_/manifest.json`, 'utf-8'))['src/init.ts'],
config,
},
}));
@@ -136,9 +141,10 @@ router.get('/twemoji/(.*)', async ctx => {
});
// ServiceWorker
-router.get('/sw.js', async ctx => {
- await send(ctx as any, `/sw.${config.version}.js`, {
- root: assets,
+router.get(`/sw.js`, async ctx => {
+ await send(ctx as any, `/sw.js`, {
+ root: swAssets,
+ maxage: ms('10 minutes'),
});
});
@@ -241,7 +247,7 @@ router.get(['/@:user', '/@:user/:sub'], async (ctx, next) => {
icon: meta.iconUrl,
themeColor: meta.themeColor,
});
- ctx.set('Cache-Control', 'public, max-age=30');
+ ctx.set('Cache-Control', 'public, max-age=15');
} else {
// リモートユーザーなので
// モデレータがAPI経由で参照可能にするために404にはしない
@@ -266,7 +272,10 @@ router.get('/users/:user', async ctx => {
// Note
router.get('/notes/:note', async (ctx, next) => {
- const note = await Notes.findOneBy({ id: ctx.params.note });
+ const note = await Notes.findOneBy({
+ id: ctx.params.note,
+ visibility: In(['public', 'home']),
+ });
if (note) {
const _note = await Notes.pack(note);
@@ -283,11 +292,7 @@ router.get('/notes/:note', async (ctx, next) => {
themeColor: meta.themeColor,
});
- if (['public', 'home'].includes(note.visibility)) {
- ctx.set('Cache-Control', 'public, max-age=180');
- } else {
- ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
- }
+ ctx.set('Cache-Control', 'public, max-age=15');
return;
}
@@ -324,7 +329,7 @@ router.get('/@:user/pages/:page', async (ctx, next) => {
});
if (['public'].includes(page.visibility)) {
- ctx.set('Cache-Control', 'public, max-age=180');
+ ctx.set('Cache-Control', 'public, max-age=15');
} else {
ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
}
@@ -355,7 +360,7 @@ router.get('/clips/:clip', async (ctx, next) => {
themeColor: meta.themeColor,
});
- ctx.set('Cache-Control', 'public, max-age=180');
+ ctx.set('Cache-Control', 'public, max-age=15');
return;
}
@@ -380,7 +385,7 @@ router.get('/gallery/:post', async (ctx, next) => {
themeColor: meta.themeColor,
});
- ctx.set('Cache-Control', 'public, max-age=180');
+ ctx.set('Cache-Control', 'public, max-age=15');
return;
}
@@ -404,7 +409,7 @@ router.get('/channels/:channel', async (ctx, next) => {
themeColor: meta.themeColor,
});
- ctx.set('Cache-Control', 'public, max-age=180');
+ ctx.set('Cache-Control', 'public, max-age=15');
return;
}
@@ -463,7 +468,7 @@ router.get('(.*)', async ctx => {
icon: meta.iconUrl,
themeColor: meta.themeColor,
});
- ctx.set('Cache-Control', 'public, max-age=300');
+ ctx.set('Cache-Control', 'public, max-age=15');
});
// Register router
diff --git a/packages/backend/src/server/web/manifest.ts b/packages/backend/src/server/web/manifest.ts
index bcbf9b76a7..ee568b8077 100644
--- a/packages/backend/src/server/web/manifest.ts
+++ b/packages/backend/src/server/web/manifest.ts
@@ -1,16 +1,18 @@
import Koa from 'koa';
-import manifest from './manifest.json' assert { type: 'json' };
import { fetchMeta } from '@/misc/fetch-meta.js';
+import manifest from './manifest.json' assert { type: 'json' };
export const manifestHandler = async (ctx: Koa.Context) => {
- const json = JSON.parse(JSON.stringify(manifest));
+ // TODO
+ //const res = structuredClone(manifest);
+ const res = JSON.parse(JSON.stringify(manifest));
const instance = await fetchMeta(true);
- json.short_name = instance.name || 'Misskey';
- json.name = instance.name || 'Misskey';
- if (instance.themeColor) json.theme_color = instance.themeColor;
+ res.short_name = instance.name || 'Misskey';
+ res.name = instance.name || 'Misskey';
+ if (instance.themeColor) res.theme_color = instance.themeColor;
ctx.set('Cache-Control', 'max-age=300');
- ctx.body = json;
+ ctx.body = res;
};
diff --git a/packages/backend/src/server/web/style.css b/packages/backend/src/server/web/style.css
index 9c4cd4b9bf..d59f00fe16 100644
--- a/packages/backend/src/server/web/style.css
+++ b/packages/backend/src/server/web/style.css
@@ -39,28 +39,24 @@ html {
width: 28px;
height: 28px;
transform: translateY(70px);
+ color: var(--accent);
}
-
-#splashSpinner:before,
-#splashSpinner:after {
- content: " ";
- display: block;
- box-sizing: border-box;
+#splashSpinner > .spinner {
+ position: absolute;
+ top: 0;
+ left: 0;
width: 28px;
height: 28px;
- border-radius: 50%;
- border: solid 4px;
+ fill-rule: evenodd;
+ clip-rule: evenodd;
+ stroke-linecap: round;
+ stroke-linejoin: round;
+ stroke-miterlimit: 1.5;
}
-
-#splashSpinner:before {
- border-color: currentColor;
- opacity: 0.3;
+#splashSpinner > .spinner.bg {
+ opacity: 0.275;
}
-
-#splashSpinner:after {
- position: absolute;
- top: 0;
- border-color: currentColor transparent transparent transparent;
+#splashSpinner > .spinner.fg {
animation: splashSpinner 0.5s linear infinite;
}
diff --git a/packages/backend/src/server/web/url-preview.ts b/packages/backend/src/server/web/url-preview.ts
index 6bd8ead5b5..1e259649f9 100644
--- a/packages/backend/src/server/web/url-preview.ts
+++ b/packages/backend/src/server/web/url-preview.ts
@@ -56,7 +56,7 @@ export const urlPreviewHandler = async (ctx: Koa.Context) => {
function wrap(url?: string): string | null {
return url != null
? url.match(/^https?:\/\//)
- ? `${config.url}/proxy/preview.jpg?${query({
+ ? `${config.url}/proxy/preview.webp?${query({
url,
preview: '1',
})}`
diff --git a/packages/backend/src/server/web/views/base.pug b/packages/backend/src/server/web/views/base.pug
index 1513208310..5bb156f0f4 100644
--- a/packages/backend/src/server/web/views/base.pug
+++ b/packages/backend/src/server/web/views/base.pug
@@ -1,17 +1,21 @@
block vars
+block loadClientEntry
+ - const clientEntry = getClientEntry();
+
doctype html
-!= '<!--\n'
-!= ' _____ _ _ \n'
-!= ' | |_|___ ___| |_ ___ _ _ \n'
-!= ' | | | | |_ -|_ -| \'_| -_| | |\n'
-!= ' |_|_|_|_|___|___|_,_|___|_ |\n'
-!= ' |___|\n'
-!= ' Thank you for using Misskey!\n'
-!= ' If you are reading this message... how about joining the development?\n'
-!= ' https://github.com/misskey-dev/misskey'
-!= '\n-->\n'
+//
+ -
+ _____ _ _
+ | |_|___ ___| |_ ___ _ _
+ | | | | |_ -|_ -| '_| -_| | |
+ |_|_|_|_|___|___|_,_|___|_ |
+ |___|
+ Thank you for using Misskey!
+ If you are reading this message... how about joining the development?
+ https://github.com/misskey-dev/misskey
+
html
@@ -30,8 +34,14 @@ html
link(rel='prefetch' href='https://xn--931a.moe/assets/info.jpg')
link(rel='prefetch' href='https://xn--931a.moe/assets/not-found.jpg')
link(rel='prefetch' href='https://xn--931a.moe/assets/error.jpg')
- link(rel='preload' href='/assets/fontawesome/css/all.css' as='style')
link(rel='stylesheet' href='/assets/fontawesome/css/all.css')
+ link(rel='modulepreload' href=`/assets/${clientEntry.file}`)
+
+ each href in clientEntry.css
+ link(rel='preload' href=`/assets/${href}` as='style')
+
+ each href in clientEntry.css
+ link(rel='preload' href=`/assets/${href}` as='style')
title
block title
@@ -50,6 +60,10 @@ html
style
include ../style.css
+ script.
+ var VERSION = "#{version}";
+ var CLIENT_ENTRY = "#{clientEntry.file}";
+
script
include ../boot.js
@@ -61,4 +75,14 @@ html
div#splash
img#splashIcon(src= icon || '/static-assets/splash.png')
div#splashSpinner
+ <svg class="spinner bg" viewBox="0 0 152 152" xmlns="http://www.w3.org/2000/svg">
+ <g transform="matrix(1,0,0,1,12,12)">
+ <circle cx="64" cy="64" r="64" style="fill:none;stroke:currentColor;stroke-width:24px;"/>
+ </g>
+ </svg>
+ <svg class="spinner fg" viewBox="0 0 152 152" xmlns="http://www.w3.org/2000/svg">
+ <g transform="matrix(1,0,0,1,12,12)">
+ <path d="M128,64C128,28.654 99.346,0 64,0C99.346,0 128,28.654 128,64Z" style="fill:none;stroke:currentColor;stroke-width:24px;"/>
+ </g>
+ </svg>
block content