From 7e9331987310e11d27e7565a7bebdcfbcb19a2c8 Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 3 Mar 2021 00:25:13 +0900 Subject: wip: better error handling --- src/server/web/boot.js | 83 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 25 deletions(-) (limited to 'src/server') diff --git a/src/server/web/boot.js b/src/server/web/boot.js index 6347c5566e..1c94e6e4f4 100644 --- a/src/server/web/boot.js +++ b/src/server/web/boot.js @@ -11,12 +11,15 @@ 'use strict'; -window.onerror = (e) => { - document.documentElement.innerHTML = '問題が発生しました。'; -}; - // ブロックの中に入れないと、定義した変数がブラウザのグローバルスコープに登録されてしまい邪魔なので (async () => { + window.onerror = (e) => { + renderError('SOMETHING_HAPPENED', e.toString()); + }; + window.onunhandledrejection = (e) => { + renderError('SOMETHING_HAPPENED_IN_PROMISE', e.toString()); + }; + const v = localStorage.getItem('v') || VERSION; //#region Detect language & fetch translations @@ -38,9 +41,17 @@ window.onerror = (e) => { } const res = await fetch(`/assets/locales/${lang}.${v}.json`); - localStorage.setItem('lang', lang); - localStorage.setItem('locale', await res.text()); - localStorage.setItem('localeVersion', v); + if (res.status === 200) { + localStorage.setItem('lang', lang); + localStorage.setItem('locale', await res.text()); + localStorage.setItem('localeVersion', v); + } else if (localeOutdated) { + // nop + } else { + renderError('LOCALE_FETCH_FAILED'); + checkUpdate(); + return; + } } //#endregion @@ -56,24 +67,8 @@ window.onerror = (e) => { script.setAttribute('async', 'true'); script.setAttribute('defer', 'true'); script.addEventListener('error', async () => { - document.documentElement.innerHTML = '読み込みに失敗しました。'; - - // TODO: サーバーが落ちている場合などのエラーハンドリング - const res = await fetch('/api/meta', { - method: 'POST', - cache: 'no-cache' - }); - - const meta = await res.json(); - - if (meta.version != v) { - localStorage.setItem('v', meta.version); - alert( - 'Misskeyの新しいバージョンがあります。ページを再度読み込みします。' + - '\n\n' + - 'New version of Misskey available. The page will be reloaded.'); - refresh(); - } + renderError('APP_FETCH_FAILED'); + checkUpdate(); }); head.appendChild(script); //#endregion @@ -112,6 +107,44 @@ window.onerror = (e) => { document.documentElement.style.backgroundImage = `url(${wallpaper})`; } + // eslint-disable-next-line no-inner-declarations + function renderError(code, details) { + document.documentElement.innerHTML = ` +

⚠エラーが発生しました

+

問題が解決しない場合は管理者までお問い合わせください。以下のオプションを試すこともできます:

+ +
+ ERROR CODE: ${code} +
+ ${details} +
+ `; + } + + // eslint-disable-next-line no-inner-declarations + async function checkUpdate() { + // TODO: サーバーが落ちている場合などのエラーハンドリング + const res = await fetch('/api/meta', { + method: 'POST', + cache: 'no-cache' + }); + + const meta = await res.json(); + + if (meta.version != v) { + localStorage.setItem('v', meta.version); + alert( + 'Misskeyの新しいバージョンがあります。ページを再度読み込みします。' + + '\n\n' + + 'New version of Misskey available. The page will be reloaded.'); + refresh(); + } + } + // eslint-disable-next-line no-inner-declarations function refresh() { // Random -- cgit v1.2.3-freya From 5e9cc09fcb6cb88cc4d2c3040bf085e9e278d22e Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 3 Mar 2021 01:03:29 +0900 Subject: Bios (#7286) * wip * wip * wip --- gulpfile.ts | 4 +- src/client/components/form/link.vue | 6 ++- src/client/components/global/a.vue | 5 +++ src/client/pages/settings/other.vue | 7 ++- src/server/web/bios.css | 40 +++++++++++++++++ src/server/web/bios.js | 87 +++++++++++++++++++++++++++++++++++++ src/server/web/cli.css | 19 ++++++++ src/server/web/cli.js | 55 +++++++++++++++++++++++ src/server/web/index.ts | 12 +++++ src/server/web/views/bios.pug | 20 +++++++++ src/server/web/views/cli.pug | 21 +++++++++ 11 files changed, 271 insertions(+), 5 deletions(-) create mode 100644 src/server/web/bios.css create mode 100644 src/server/web/bios.js create mode 100644 src/server/web/cli.css create mode 100644 src/server/web/cli.js create mode 100644 src/server/web/views/bios.pug create mode 100644 src/server/web/views/cli.pug (limited to 'src/server') diff --git a/gulpfile.ts b/gulpfile.ts index bdc20089cd..b394e4f44c 100644 --- a/gulpfile.ts +++ b/gulpfile.ts @@ -45,7 +45,7 @@ gulp.task('build:copy:locales', cb => { }); gulp.task('build:client:script', () => { - return gulp.src(['./src/server/web/boot.js']) + return gulp.src(['./src/server/web/boot.js', './src/server/web/bios.js', './src/server/web/cli.js']) .pipe(replace('VERSION', JSON.stringify(meta.version))) .pipe(replace('LANGS', JSON.stringify(Object.keys(locales)))) .pipe(terser({ @@ -55,7 +55,7 @@ gulp.task('build:client:script', () => { }); gulp.task('build:client:style', () => { - return gulp.src(['./src/server/web/style.css']) + return gulp.src(['./src/server/web/style.css', './src/server/web/bios.css', './src/server/web/cli.css']) .pipe(cssnano()) .pipe(gulp.dest('./built/server/web/')); }); diff --git a/src/client/components/form/link.vue b/src/client/components/form/link.vue index 7093f50397..2efc6b58c9 100644 --- a/src/client/components/form/link.vue +++ b/src/client/components/form/link.vue @@ -8,7 +8,7 @@ - + @@ -38,6 +38,10 @@ export default defineComponent({ type: Boolean, required: false }, + behavior: { + type: String, + required: false, + }, }, data() { return { diff --git a/src/client/components/global/a.vue b/src/client/components/global/a.vue index cf894deaba..d293cb571f 100644 --- a/src/client/components/global/a.vue +++ b/src/client/components/global/a.vue @@ -98,6 +98,11 @@ export default defineComponent({ }, nav() { + if (this.behavior === 'browser') { + location.href = this.to; + return; + } + if (this.to.startsWith('/my/messaging')) { if (ColdDeviceStorage.get('chatOpenBehavior') === 'window') return this.window(); if (ColdDeviceStorage.get('chatOpenBehavior') === 'popout') return this.popout(); diff --git a/src/client/pages/settings/other.vue b/src/client/pages/settings/other.vue index c0b9625098..a14e101328 100644 --- a/src/client/pages/settings/other.vue +++ b/src/client/pages/settings/other.vue @@ -23,13 +23,16 @@ {{ $ts.registry }} + BIOS + CLI + {{ $ts.closeAccount }}