From c614e6f5d73b3b4314c7f6abf52260e58cc176ad Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 17 Nov 2017 01:24:44 +0900 Subject: #925, #926, and refactoring --- src/web/app/common/scripts/streaming/stream.ts | 95 ++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/web/app/common/scripts/streaming/stream.ts (limited to 'src/web/app/common/scripts/streaming/stream.ts') diff --git a/src/web/app/common/scripts/streaming/stream.ts b/src/web/app/common/scripts/streaming/stream.ts new file mode 100644 index 0000000000..97ebdcdd74 --- /dev/null +++ b/src/web/app/common/scripts/streaming/stream.ts @@ -0,0 +1,95 @@ +import { EventEmitter } from 'eventemitter3'; +import * as ReconnectingWebsocket from 'reconnecting-websocket'; +import CONFIG from '../config'; + +/** + * Misskey stream connection + */ +export default class Connection extends EventEmitter { + private state: string; + private buffer: any[]; + private socket: ReconnectingWebsocket; + + constructor(endpoint, params?) { + super(); + + //#region BIND + this.onOpen = this.onOpen.bind(this); + this.onClose = this.onClose.bind(this); + this.onMessage = this.onMessage.bind(this); + this.send = this.send.bind(this); + this.close = this.close.bind(this); + //#endregion + + this.state = 'initializing'; + this.buffer = []; + + const host = CONFIG.apiUrl.replace('http', 'ws'); + const query = params + ? Object.keys(params) + .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(params[k])) + .join('&') + : null; + + this.socket = new ReconnectingWebsocket(`${host}/${endpoint}${query ? '?' + query : ''}`); + this.socket.addEventListener('open', this.onOpen); + this.socket.addEventListener('close', this.onClose); + this.socket.addEventListener('message', this.onMessage); + } + + /** + * Callback of when open connection + */ + private onOpen() { + this.state = 'connected'; + this.emit('_connected_'); + + // バッファーを処理 + const _buffer = [].concat(this.buffer); // Shallow copy + this.buffer = []; // Clear buffer + _buffer.forEach(message => { + this.send(message); // Resend each buffered messages + }); + } + + /** + * Callback of when close connection + */ + private onClose() { + this.state = 'reconnecting'; + this.emit('_closed_'); + } + + /** + * Callback of when received a message from connection + */ + private onMessage(message) { + try { + const msg = JSON.parse(message.data); + if (msg.type) this.emit(msg.type, msg.body); + } catch (e) { + // noop + } + } + + /** + * Send a message to connection + */ + public send(message) { + // まだ接続が確立されていなかったらバッファリングして次に接続した時に送信する + if (this.state != 'connected') { + this.buffer.push(message); + return; + } + + this.socket.send(JSON.stringify(message)); + } + + /** + * Close this connection + */ + public close() { + this.socket.removeEventListener('open', this.onOpen); + this.socket.removeEventListener('message', this.onMessage); + } +} -- cgit v1.2.3-freya From 3f8ebac466ece8e9598432f3f574ec44e420c03b Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 23 Nov 2017 05:43:00 +0900 Subject: なんかもうめっちゃ変えた MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #940 --- .travis/default.yml | 4 +- .travis/test.yml | 4 +- docs/config.md | 55 ++++++++++++++++++++++ docs/setup.en.md | 27 ++++------- docs/setup.ja.md | 29 ++++-------- src/api/common/push-sw.ts | 6 ++- src/api/private/signup.ts | 2 +- src/config.ts | 31 ++++++------ src/web/app/ch/tags/channel.tag | 13 ++--- src/web/app/ch/tags/header.tag | 6 +-- src/web/app/common/mios.ts | 37 ++++++++++++--- src/web/app/common/scripts/api.ts | 4 +- src/web/app/common/scripts/check-for-update.ts | 6 +-- src/web/app/common/scripts/config.ts | 27 ----------- src/web/app/common/scripts/signout.ts | 4 +- src/web/app/common/scripts/streaming/stream.ts | 5 +- src/web/app/common/scripts/text-compiler.ts | 5 +- src/web/app/common/tags/error.tag | 4 +- src/web/app/common/tags/introduction.tag | 2 +- src/web/app/common/tags/nav-links.tag | 2 +- src/web/app/common/tags/signup.tag | 26 +++++----- src/web/app/common/tags/twitter-setting.tag | 12 ++--- src/web/app/common/tags/uploader.tag | 2 +- src/web/app/desktop/scripts/fuck-ad-block.ts | 2 +- src/web/app/desktop/scripts/update-avatar.ts | 5 +- src/web/app/desktop/scripts/update-banner.ts | 5 +- src/web/app/desktop/tags/analog-clock.tag | 2 +- src/web/app/desktop/tags/drive/browser-window.tag | 6 +-- .../app/desktop/tags/home-widgets/broadcast.tag | 4 +- src/web/app/desktop/tags/home-widgets/channel.tag | 2 +- src/web/app/desktop/tags/home-widgets/version.tag | 4 +- src/web/app/desktop/tags/messaging/room-window.tag | 4 +- src/web/app/desktop/tags/pages/entrance.tag | 2 +- src/web/app/desktop/tags/timeline.tag | 2 +- src/web/app/desktop/tags/ui.tag | 4 +- src/web/app/init.ts | 20 ++++---- src/web/app/mobile/tags/page/settings.tag | 4 +- src/web/app/mobile/tags/timeline.tag | 2 +- src/web/app/mobile/tags/ui.tag | 4 +- src/web/app/stats/tags/index.tag | 2 +- src/web/app/status/tags/index.tag | 2 +- src/web/server.ts | 26 +--------- webpack/module/rules/consts.ts | 36 ++++++++++++++ webpack/module/rules/index.ts | 2 + webpack/plugins/const.ts | 14 ------ webpack/plugins/index.ts | 2 - 46 files changed, 244 insertions(+), 225 deletions(-) create mode 100644 docs/config.md delete mode 100644 src/web/app/common/scripts/config.ts create mode 100644 webpack/module/rules/consts.ts delete mode 100644 webpack/plugins/const.ts (limited to 'src/web/app/common/scripts/streaming/stream.ts') diff --git a/.travis/default.yml b/.travis/default.yml index 1875748d68..471a2a7c46 100644 --- a/.travis/default.yml +++ b/.travis/default.yml @@ -22,5 +22,5 @@ elasticsearch: port: 9200 pass: '' recaptcha: - siteKey: hima - secretKey: saku + site_key: hima + secret_key: saku diff --git a/.travis/test.yml b/.travis/test.yml index f311310c7c..6a115d6ab8 100644 --- a/.travis/test.yml +++ b/.travis/test.yml @@ -22,5 +22,5 @@ elasticsearch: port: 9200 pass: '' recaptcha: - siteKey: hima - secretKey: saku + site_key: hima + secret_key: saku diff --git a/docs/config.md b/docs/config.md new file mode 100644 index 0000000000..0e23e09ae8 --- /dev/null +++ b/docs/config.md @@ -0,0 +1,55 @@ +``` yaml +# サーバーのメンテナ情報 +maintainer: + # メンテナの名前 + name: + + # メンテナの連絡先(URLかmailto形式のURL) + url: + +# プライマリURL +url: + +# セカンダリURL +secondary_url: + +# 待受ポート +port: + +# TLSの設定 +https: + # TLSを有効にするか否か + enable: false + + key: null + cert: null + ca: null + +# MongoDBの設定 +mongodb: + host: localhost + port: 27017 + db: misskey + user: + pass: + +# Redisの設定 +redis: + host: localhost + port: 6379 + pass: + +# reCAPTCHAの設定 +recaptcha: + site_key: + secret_key: + +# ServiceWrokerの設定 +sw: + # VAPIDの公開鍵 + public_key: + + # VAPIDの秘密鍵 + private_key: + +``` diff --git a/docs/setup.en.md b/docs/setup.en.md index 5ad57d5abd..9c31e4f177 100644 --- a/docs/setup.en.md +++ b/docs/setup.en.md @@ -36,6 +36,15 @@ Note that Misskey uses following subdomains: Misskey requires reCAPTCHA tokens. Please visit https://www.google.com/recaptcha/intro/ and generate keys. +*(optional)* Generating VAPID keys +---------------------------------------------------------------- +If you want to enable ServiceWroker, you need to generate VAPID keys: + +``` shell +npm install web-push -g +web-push generate-vapid-keys +``` + *3.* Install dependencies ---------------------------------------------------------------- Please install and setup these softwares: @@ -51,24 +60,6 @@ Please install and setup these softwares: *4.* Install Misskey ---------------------------------------------------------------- -There is **two ways** to install Misskey: - -### WAY 1) Using built code (recommended) -We have the official release of Misskey. -The built code is automatically pushed to https://github.com/syuilo/misskey/tree/release after the CI test succeeds. - -1. `git clone -b release git://github.com/syuilo/misskey.git` -2. `cd misskey` -3. `npm install` - -#### Update -1. `git fetch` -2. `git reset --hard origin/release` -3. `npm install` - -### WAY 2) Using source code -If you want to build Misskey manually, you can do it via the -`build` command after download the source code of Misskey and install dependencies: 1. `git clone -b master git://github.com/syuilo/misskey.git` 2. `cd misskey` diff --git a/docs/setup.ja.md b/docs/setup.ja.md index 602fd9b6a1..1e8bb553fa 100644 --- a/docs/setup.ja.md +++ b/docs/setup.ja.md @@ -37,6 +37,15 @@ Misskeyは以下のサブドメインを使います: MisskeyはreCAPTCHAトークンを必要とします。 https://www.google.com/recaptcha/intro/ にアクセスしてトークンを生成してください。 +*(オプション)* VAPIDキーペアの生成 +---------------------------------------------------------------- +ServiceWorkerを有効にする場合、VAPIDキーペアを生成する必要があります: + +``` shell +npm install web-push -g +web-push generate-vapid-keys +``` + *3.* 依存関係をインストールする ---------------------------------------------------------------- これらのソフトウェアをインストール・設定してください: @@ -52,26 +61,6 @@ https://www.google.com/recaptcha/intro/ にアクセスしてトークンを生 *4.* Misskeyのインストール ---------------------------------------------------------------- -Misskeyをインストールするには**2つの方法**があります: - -### 方法 1) ビルドされたコードを利用する (推奨) -Misskeyには公式のリリースがあります。 -ビルドされたコードはCIテストに合格した後、自動で https://github.com/syuilo/misskey/tree/release にpushされています。 - -1. `git clone -b release git://github.com/syuilo/misskey.git` -2. `cd misskey` -3. `npm install` - -#### アップデートするには: -1. `git fetch` -2. `git reset --hard origin/release` -3. `npm install` - -### 方法 2) ソースコードを利用する -> 注: この方法では正しくビルド・動作できることは保証されません。 - -Misskeyを手動でビルドしたい場合は、Misskeyのソースコードと依存関係をインストールした後、 -`build`コマンドを用いることができます: 1. `git clone -b master git://github.com/syuilo/misskey.git` 2. `cd misskey` diff --git a/src/api/common/push-sw.ts b/src/api/common/push-sw.ts index 782a4a6a6c..2993c760ee 100644 --- a/src/api/common/push-sw.ts +++ b/src/api/common/push-sw.ts @@ -4,7 +4,11 @@ import Subscription from '../models/sw-subscription'; import config from '../../conf'; if (config.sw) { - push.setGCMAPIKey(config.sw.gcm_api_key); + // アプリケーションの連絡先と、サーバーサイドの鍵ペアの情報を登録 + push.setVapidDetails( + config.maintainer.url, + config.sw.public_key, + config.sw.private_key); } export default async function(userId: mongo.ObjectID | string, type, body?) { diff --git a/src/api/private/signup.ts b/src/api/private/signup.ts index e24734f80c..466c6a489f 100644 --- a/src/api/private/signup.ts +++ b/src/api/private/signup.ts @@ -9,7 +9,7 @@ import generateUserToken from '../common/generate-native-user-token'; import config from '../../conf'; recaptcha.init({ - secret_key: config.recaptcha.secretKey + secret_key: config.recaptcha.secret_key }); const home = { diff --git a/src/config.ts b/src/config.ts index e8322d8333..7237b666f2 100644 --- a/src/config.ts +++ b/src/config.ts @@ -3,7 +3,6 @@ */ import * as fs from 'fs'; -import * as URL from 'url'; import * as yaml from 'js-yaml'; import isUrl = require('is-url'); @@ -23,7 +22,19 @@ export const path = process.env.NODE_ENV == 'test' * ユーザーが設定する必要のある情報 */ type Source = { - maintainer: string; + /** + * メンテナ情報 + */ + maintainer: { + /** + * メンテナの名前 + */ + name: string; + /** + * メンテナの連絡先(URLかmailto形式のURL) + */ + url: string; + }; url: string; secondary_url: string; port: number; @@ -52,8 +63,8 @@ type Source = { pass: string; }; recaptcha: { - siteKey: string; - secretKey: string; + site_key: string; + secret_key: string; }; accesslog?: string; accesses?: { @@ -80,8 +91,8 @@ type Source = { * Service Worker */ sw?: { - gcm_sender_id: string; - gcm_api_key: string; + public_key: string; + private_key: string; }; }; @@ -114,14 +125,6 @@ export default function load() { if (!isUrl(config.url)) urlError(config.url); if (!isUrl(config.secondary_url)) urlError(config.secondary_url); - const url = URL.parse(config.url); - const head = url.host.split('.')[0]; - - if (head != 'misskey' && head != 'localhost') { - console.error(`プライマリドメインは、必ず「misskey」ドメインで始まっていなければなりません(現在の設定では「${head}」で始まっています)。例えば「https://misskey.xyz」「http://misskey.my.app.example.com」などが正しいプライマリURLです。`); - process.exit(); - } - config.url = normalizeUrl(config.url); config.secondary_url = normalizeUrl(config.secondary_url); diff --git a/src/web/app/ch/tags/channel.tag b/src/web/app/ch/tags/channel.tag index 8300bd5715..716d61cde4 100644 --- a/src/web/app/ch/tags/channel.tag +++ b/src/web/app/ch/tags/channel.tag @@ -26,11 +26,11 @@
-

参加するにはログインまたは新規登録してください

+

参加するにはログインまたは新規登録してください


- Misskey ver { version } (葵 aoi) + Misskey ver { _VERSION_ } (葵 aoi)
diff --git a/src/web/app/desktop/tags/messaging/room-window.tag b/src/web/app/desktop/tags/messaging/room-window.tag index dca0172be3..1c6ff7c4bc 100644 --- a/src/web/app/desktop/tags/messaging/room-window.tag +++ b/src/web/app/desktop/tags/messaging/room-window.tag @@ -19,11 +19,9 @@ diff --git a/src/web/app/mobile/tags/timeline.tag b/src/web/app/mobile/tags/timeline.tag index 1d6ce23598..074422a20e 100644 --- a/src/web/app/mobile/tags/timeline.tag +++ b/src/web/app/mobile/tags/timeline.tag @@ -164,7 +164,7 @@
-

{ p.channel.title }:

+

{ p.channel.title }:

diff --git a/src/web/app/mobile/tags/ui.tag b/src/web/app/mobile/tags/ui.tag index 0c969d3902..bad6bf73fe 100644 --- a/src/web/app/mobile/tags/ui.tag +++ b/src/web/app/mobile/tags/ui.tag @@ -239,7 +239,7 @@
  • %i18n:mobile.tags.mk-ui-nav.messaging%
  • -

    %i18n:mobile.tags.mk-ui-nav.about%

    +

    %i18n:mobile.tags.mk-ui-nav.about%