firefish/src/docs/stream.ja-JP.md
syuilo f0a29721c9
Use PostgreSQL instead of MongoDB (#4572)
* wip

* Update note.ts

* Update timeline.ts

* Update core.ts

* wip

* Update generate-visibility-query.ts

* wip

* wip

* wip

* wip

* wip

* Update global-timeline.ts

* wip

* wip

* wip

* Update vote.ts

* wip

* wip

* Update create.ts

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Update files.ts

* wip

* wip

* Update CONTRIBUTING.md

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Update read-notification.ts

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Update cancel.ts

* wip

* wip

* wip

* Update show.ts

* wip

* wip

* Update gen-id.ts

* Update create.ts

* Update id.ts

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* Docker: Update files about Docker (#4599)

* Docker: Use cache if files used by `yarn install` was not updated

This patch reduces the number of times to installing node_modules.
For example, `yarn install` step will be skipped when only ".config/default.yml" is updated.

* Docker: Migrate MongoDB to Postgresql

Misskey uses Postgresql as a database instead of Mongodb since version 11.

* Docker: Uncomment about data persistence

This patch will save a lot of databases.

* wip

* wip

* wip

* Update activitypub.ts

* wip

* wip

* wip

* Update logs.ts

* wip

* Update drive-file.ts

* Update register.ts

* wip

* wip

* Update mentions.ts

* wip

* wip

* wip

* Update recommendation.ts

* wip

* Update index.ts

* wip

* Update recommendation.ts

* Doc: Update docker.ja.md and docker.en.md (#1) (#4608)

Update how to set up misskey.

* wip

* ✌️

* wip

* Update note.ts

* Update postgre.ts

* wip

* wip

* wip

* wip

* Update add-file.ts

* wip

* wip

* wip

* Clean up

* Update logs.ts

* wip

* 🍕

* wip

* Ad notes

* wip

* Update api-visibility.ts

* Update note.ts

* Update add-file.ts

* tests

* tests

* Update postgre.ts

* Update utils.ts

* wip

* wip

* Refactor

* wip

* Refactor

* wip

* wip

* Update show-users.ts

* Update update-instance.ts

* wip

* Update feed.ts

* Update outbox.ts

* Update outbox.ts

* Update user.ts

* wip

* Update list.ts

* Update update-hashtag.ts

* wip

* Update update-hashtag.ts

* Refactor

* Update update.ts

* wip

* wip

* ✌️

* clean up

* docs

* Update push.ts

* wip

* Update api.ts

* wip

* ✌️

* Update make-pagination-query.ts

* ✌️

* Delete hashtags.ts

* Update instances.ts

* Update instances.ts

* Update create.ts

* Update search.ts

* Update reversi-game.ts

* Update signup.ts

* Update user.ts

* id

* Update example.yml

* 🎨

* objectid

* fix

* reversi

* reversi

* Fix bug of chart engine

* Add test of chart engine

* Improve test

* Better testing

* Improve chart engine

* Refactor

* Add test of chart engine

* Refactor

* Add chart test

* Fix bug

* コミットし忘れ

* Refactoring

* ✌️

* Add tests

* Add test

* Extarct note tests

* Refactor

* 存在しないユーザーにメンションできなくなっていた問題を修正

* Fix bug

* Update update-meta.ts

* Fix bug

* Update mention.vue

* Fix bug

* Update meta.ts

* Update CONTRIBUTING.md

* Fix bug

* Fix bug

* Fix bug

* Clean up

* Clean up

* Update notification.ts

* Clean up

* Add mute tests

* Add test

* Refactor

* Add test

* Fix test

* Refactor

* Refactor

* Add tests

* Update utils.ts

* Update utils.ts

* Fix test

* Update package.json

* Update update.ts

* Update manifest.ts

* Fix bug

* Fix bug

* Add test

* 🎨

* Update endpoint permissions

* Updaye permisison

* Update person.ts

#4299

* データベースと同期しないように

* Fix bug

* Fix bug

* Update reversi-game.ts

* Use a feature of Node v11.7.0 to extract a public key (#4644)

* wip

* wip

* ✌️

* Refactoring

#1540

* test

* test

* test

* test

* test

* test

* test

* Fix bug

* Fix test

* 🍣

* wip

* #4471

* Add test for #4335

* Refactor

* Fix test

* Add tests

* 🕓

* Fix bug

* Add test

* Add test

* rename

* Fix bug
2019-04-07 21:50:36 +09:00

14 KiB

ストリーミングAPI

ストリーミングAPIを使うと、リアルタイムで様々な情報(例えばタイムラインに新しい投稿が流れてきた、メッセージが届いた、フォローされた、など)を受け取ったり、様々な操作を行ったりすることができます。

ストリームに接続する

ストリーミングAPIを利用するには、まずMisskeyサーバーにwebsocket接続する必要があります。

以下のURLに、iというパラメータ名で認証情報を含めて、websocket接続してください。例:

%WS_URL%/streaming?i=xxxxxxxxxxxxxxx

認証情報は、自分のAPIキーや、アプリケーションからストリームに接続する際はユーザーのアクセストークンのことを指します。

認証情報の取得については、こちらのドキュメントをご確認ください。


認証情報は省略することもできますが、その場合非ログインでの利用ということになり、受信できる情報や可能な操作は限られます。例:

%WS_URL%/streaming

ストリームに接続すると、後述するAPI操作や、投稿の購読を行ったりすることができます。 しかしまだこの段階では、例えばタイムラインへの新しい投稿を受信したりすることはできません。 それを行うには、ストリーム上で、後述するチャンネルに接続する必要があります。

ストリームでのやり取りはすべてJSONです。

チャンネル

MisskeyのストリーミングAPIにはチャンネルという概念があります。これは、送受信する情報を分離するための仕組みです。 Misskeyのストリームに接続しただけでは、まだリアルタイムでタイムラインの投稿を受信したりはできません。 ストリーム上でチャンネルに接続することで、様々な情報を受け取ったり情報を送信したりすることができるようになります。

チャンネルに接続する

チャンネルに接続するには、次のようなデータをJSONでストリームに送信します:

{
	type: 'connect',
	body: {
		channel: 'xxxxxxxx',
		id: 'foobar',
		params: {
			...
		}
	}
}

ここで、

  • channelには接続したいチャンネル名を設定します。チャンネルの種類については後述します。
  • idにはそのチャンネルとやり取りするための任意のIDを設定します。ストリームでは様々なメッセージが流れるので、そのメッセージがどのチャンネルからのものなのか識別する必要があるからです。このIDは、UUIDや、乱数のようなもので構いません。
  • paramsはチャンネルに接続する際のパラメータです。チャンネルによって接続時に必要とされるパラメータは異なります。パラメータ不要のチャンネルに接続する際は、このプロパティは省略可能です。

IDはチャンネルごとではなく「チャンネルの接続ごと」です。なぜなら、同じチャンネルに異なるパラメータで複数接続するケースもあるからです。

チャンネルからのメッセージを受け取る

例えばタイムラインのチャンネルなら、新しい投稿があった時にメッセージを発します。そのメッセージを受け取ることで、タイムラインに新しい投稿がされたことをリアルタイムで知ることができます。

チャンネルがメッセージを発すると、次のようなデータがJSONでストリームに流れてきます:

{
	type: 'channel',
	body: {
		id: 'foobar',
		type: 'something',
		body: {
			some: 'thing'
		}
	}
}

ここで、

  • idには前述したそのチャンネルに接続する際に設定したIDが設定されています。これで、このメッセージがどのチャンネルからのものなのか知ることができます。
  • typeにはメッセージの種類が設定されます。チャンネルによって、どのような種類のメッセージが流れてくるかは異なります。
  • bodyにはメッセージの内容が設定されます。チャンネルによって、どのような内容のメッセージが流れてくるかは異なります。

チャンネルに向けてメッセージを送信する

チャンネルによっては、メッセージを受け取るだけでなく、こちらから何かメッセージを送信し、何らかの操作を行える場合があります。

チャンネルにメッセージを送信するには、次のようなデータをJSONでストリームに送信します:

{
	type: 'channel',
	body: {
		id: 'foobar',
		type: 'something',
		body: {
			some: 'thing'
		}
	}
}

ここで、

  • idには前述したそのチャンネルに接続する際に設定したIDを設定します。これで、このメッセージがどのチャンネルに向けたものなのか識別させることができます。
  • typeにはメッセージの種類を設定します。チャンネルによって、どのような種類のメッセージを受け付けるかは異なります。
  • bodyにはメッセージの内容を設定します。チャンネルによって、どのような内容のメッセージを受け付けるかは異なります。

チャンネルから切断する

チャンネルから切断するには、次のようなデータをJSONでストリームに送信します:

{
	type: 'disconnect',
	body: {
		id: 'foobar'
	}
}

ここで、

  • idには前述したそのチャンネルに接続する際に設定したIDを設定します。

ストリームを経由してAPIリクエストする

ストリームを経由してAPIリクエストすると、HTTPリクエストを発生させずにAPIを利用できます。そのため、コードを簡潔にできたり、パフォーマンスの向上を見込めるかもしれません。

ストリームを経由してAPIリクエストするには、次のようなデータをJSONでストリームに送信します:

{
	type: 'api',
	id: 'xxxxxxxxxxxxxxxx',
	endpoint: 'notes/create',
	data: {
		text: 'yee haw!'
	}
}

ここで、

  • idには、APIのレスポンスを識別するための、APIリクエストごとの一意なIDを設定する必要があります。UUIDや、簡単な乱数のようなもので構いません。
  • endpointには、あなたがリクエストしたいAPIのエンドポイントを指定します。
  • dataには、エンドポイントのパラメータを含めます。

APIのエンドポイントやパラメータについてはAPIリファレンスをご確認ください。

レスポンスの受信

APIへリクエストすると、レスポンスがストリームから次のような形式で流れてきます。

{
	type: 'api:xxxxxxxxxxxxxxxx',
	body: {
		...
	}
}

ここで、

  • xxxxxxxxxxxxxxxxの部分には、リクエストの際に設定されたidが含まれています。これにより、どのリクエストに対するレスポンスなのか判別することができます。
  • bodyには、レスポンスが含まれています。

投稿のキャプチャ

Misskeyは投稿のキャプチャと呼ばれる仕組みを提供しています。これは、指定した投稿のイベントをストリームで受け取る機能です。

例えばタイムラインを取得してユーザーに表示したとします。ここで誰かがそのタイムラインに含まれるどれかの投稿に対してリアクションしたとします。

しかし、クライアントからするとある投稿にリアクションが付いたことなどは知る由がないため、リアルタイムでリアクションをタイムライン上の投稿に反映して表示するといったことができません。

この問題を解決するために、Misskeyは投稿のキャプチャ機構を用意しています。投稿をキャプチャすると、その投稿に関するイベントを受け取ることができるため、リアルタイムでリアクションを反映させたりすることが可能になります。

投稿をキャプチャする

投稿をキャプチャするには、ストリームに次のようなメッセージを送信します:

{
	type: 'subNote',
	body: {
		id: 'xxxxxxxxxxxxxxxx'
	}
}

ここで、

  • idにキャプチャしたい投稿のidを設定します。

このメッセージを送信すると、Misskeyにキャプチャを要請したことになり、以後、その投稿に関するイベントが流れてくるようになります。

例えば投稿にリアクションが付いたとすると、次のようなメッセージが流れてきます:

{
	type: 'noteUpdated',
	body: {
		id: 'xxxxxxxxxxxxxxxx',
		type: 'reacted',
		body: {
			reaction: 'like',
			userId: 'yyyyyyyyyyyyyyyy'
		}
	}
}

ここで、

  • body内のidに、イベントを発生させた投稿のIDが設定されます。
  • body内のtypeに、イベントの種類が設定されます。
  • body内のbodyに、イベントの詳細が設定されます。

イベントの種類

reacted

その投稿にリアクションがされた時に発生します。

  • reactionに、リアクションの種類が設定されます。
  • userIdに、リアクションを行ったユーザーのIDが設定されます。

例:

{
	type: 'noteUpdated',
	body: {
		id: 'xxxxxxxxxxxxxxxx',
		type: 'reacted',
		body: {
			reaction: 'like',
			userId: 'yyyyyyyyyyyyyyyy'
		}
	}
}
deleted

その投稿が削除された時に発生します。

  • deletedAtに、削除日時が設定されます。

例:

{
	type: 'noteUpdated',
	body: {
		id: 'xxxxxxxxxxxxxxxx',
		type: 'deleted',
		body: {
			deletedAt: '2018-10-22T02:17:09.703Z'
		}
	}
}
pollVoted

その投稿に添付されたアンケートに投票された時に発生します。

  • choiceに、選択肢IDが設定されます。
  • userIdに、投票を行ったユーザーのIDが設定されます。

例:

{
	type: 'noteUpdated',
	body: {
		id: 'xxxxxxxxxxxxxxxx',
		type: 'pollVoted',
		body: {
			choice: 2,
			userId: 'yyyyyyyyyyyyyyyy'
		}
	}
}

投稿のキャプチャを解除する

その投稿がもう画面に表示されなくなったりして、その投稿に関するイベントをもう受け取る必要がなくなったときは、キャプチャの解除を申請してください。

次のメッセージを送信します:

{
	type: 'unsubNote',
	body: {
		id: 'xxxxxxxxxxxxxxxx'
	}
}

ここで、

  • idにキャプチャを解除したい投稿のidを設定します。

このメッセージを送信すると、以後、その投稿に関するイベントは流れてこないようになります。

チャンネル一覧

main

アカウントに関する基本的な情報が流れてきます。このチャンネルにパラメータはありません。

流れてくるイベント一覧

renote

自分の投稿がRenoteされた時に発生するイベントです。自分自身の投稿をRenoteしたときは発生しません。

mention

誰かからメンションされたときに発生するイベントです。

readAllNotifications

自分宛ての通知がすべて既読になったことを表すイベントです。このイベントを利用して、「通知があることを示すアイコン」のようなものをオフにしたりする等のケースが想定されます。

meUpdated

自分の情報が更新されたことを表すイベントです。

follow

自分が誰かをフォローしたときに発生するイベントです。

unfollow

自分が誰かのフォローを解除したときに発生するイベントです。

followed

自分が誰かにフォローされたときに発生するイベントです。

homeTimeline

ホームタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。

流れてくるイベント一覧

note

タイムラインに新しい投稿が流れてきたときに発生するイベントです。

localTimeline

ローカルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。

流れてくるイベント一覧

note

ローカルタイムラインに新しい投稿が流れてきたときに発生するイベントです。

socialTimeline

ソーシャルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。

流れてくるイベント一覧

note

ソーシャルタイムラインに新しい投稿が流れてきたときに発生するイベントです。

globalTimeline

グローバルタイムラインの投稿情報が流れてきます。このチャンネルにパラメータはありません。

流れてくるイベント一覧

note

グローバルタイムラインに新しい投稿が流れてきたときに発生するイベントです。