5f43c2faa2
* Never return broken notifications #409 Since notifications are stored in Redis, we can't expect relational integrity: deleting a user will *not* delete notifications that mention it. But if we return notifications with missing bits (a `follow` without a `user`, for example), the frontend will get very confused and throw an exception while trying to render them. This change makes sure we never expose those broken notifications. For uniformity, I've applied the same logic to notes and roles mentioned in notifications, even if nobody reported breakage in those cases. Tested by creating a few types of notifications with a `notifierId`, then deleting their user. (cherry picked from commit 421f8d49e5d7a8dc3a798cc54716c767df8be3cb) * Update Changelog * Update CHANGELOG.md * enhance: 通知がミュートを考慮するようにする * enhance: 通知が凍結も考慮するようにする * fix: notifierIdがない通知が消えてしまう問題 * Add tests (通知がミュートを考慮しているかどうか) * fix: notifierIdがない通知が消えてしまう問題 (grouped) * Remove unused import * Fix: typo * Revert "enhance: 通知が凍結も考慮するようにする" This reverts commit b1e57e571dfd9a7d8b2430294473c2053cc3ea33. * Revert API handling * Remove unused imports * enhance: Check if notifierId is valid in NotificationEntityService * 通知作成時にpackしてnullになったらあとの処理をやめる * Remove duplication of valid notifier check * add filter notification is not null * Revert "Remove duplication of valid notifier check" This reverts commit 239a6952f717add53d52c3e701e7362eb1987645. * Improve performance * Fix packGrouped * Refactor: 判定部分を共通化 * Fix condition * use isNotNull * Update CHANGELOG.md * filterの改善 * Refactor: DONT REPEAT YOURSELF Note: GroupedNotificationはNotificationの拡張なのでその例外だけ書けば基本的に共通の処理になり複雑な個別の処理は増えにくいと思われる * Add groupedNotificationTypes * Update misskey-js typedef * Refactor: less sql calls * refactor * clean up * filter notes to mark as read * packed noteがmapなのでそちらを使う * if (notesToRead.size > 0) * if (notes.length === 0) return; * fix * Revert "if (notes.length === 0) return;" This reverts commit 22e2324f9633bddba50769ef838bc5ddb4564c88. * 🎨 * console.error * err * remove try-catch * 不要なジェネリクスを除去 * Revert (既読処理をpack内で行うものを元に戻す) * Clean * Update packages/backend/src/core/entities/NotificationEntityService.ts * Update packages/backend/src/core/entities/NotificationEntityService.ts * Update packages/backend/src/core/entities/NotificationEntityService.ts * Update packages/backend/src/core/entities/NotificationEntityService.ts * Update packages/backend/src/core/NotificationService.ts * Clean --------- Co-authored-by: dakkar <dakkar@thenautilus.net> Co-authored-by: kakkokari-gtyih <daisho7308+f@gmail.com> Co-authored-by: かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> Co-authored-by: tamaina <tamaina@hotmail.co.jp> Co-authored-by: syuilo <4439005+syuilo@users.noreply.github.com> |
||
---|---|---|
.. | ||
docs | ||
etc | ||
generator | ||
src | ||
test | ||
test-d | ||
.eslintignore | ||
.eslintrc.cjs | ||
.swcrc | ||
api-extractor.json | ||
CONTRIBUTING.md | ||
jest.config.cjs | ||
LICENSE | ||
package.json | ||
README.md | ||
tsconfig.json |
misskey.js
Strongly-typed official Misskey SDK for browsers/Node.js.
JavaScript(TypeScript)用の公式MisskeySDKです。ブラウザ/Node.js上で動作します。
以下が提供されています:
- ユーザー認証
- APIリクエスト
- ストリーミング
- ユーティリティ関数
- Misskeyの各種型定義
対応するMisskeyのバージョンは12以上です。
Install
npm i misskey-js
Usage
インポートは以下のようにまとめて行うと便利です。
import * as Misskey from 'misskey-js';
便宜上、以後のコード例は上記のように* as Misskey
としてインポートしている前提のものになります。
ただし、このインポート方法だとTree-Shakingできなくなるので、コードサイズが重要なユースケースでは以下のような個別インポートをお勧めします。
import { api as misskeyApi } from 'misskey-js';
Authenticate
todo
API request
APIを利用する際は、利用するサーバーの情報とアクセストークンを与えてAPIClient
クラスのインスタンスを初期化し、そのインスタンスのrequest
メソッドを呼び出してリクエストを行います。
const cli = new Misskey.api.APIClient({
origin: 'https://misskey.test',
credential: 'TOKEN',
});
const meta = await cli.request('meta', { detail: true });
request
の第一引数には呼び出すエンドポイント名、第二引数にはパラメータオブジェクトを渡します。レスポンスはPromiseとして返ります。
Streaming
misskey.jsのストリーミングでは、二つのクラスが提供されます。
ひとつは、ストリーミングのコネクション自体を司るStream
クラスと、もうひとつはストリーミング上のチャンネルの概念を表すChannel
クラスです。
ストリーミングを利用する際は、まずStream
クラスのインスタンスを初期化し、その後でStream
インスタンスのメソッドを利用してChannel
クラスのインスタンスを取得する形になります。
const stream = new Misskey.Stream('https://misskey.test', { token: 'TOKEN' });
const mainChannel = stream.useChannel('main');
mainChannel.on('notification', notification => {
console.log('notification received', notification);
});
コネクションが途切れても自動で再接続されます。
チャンネルへの接続
チャンネルへの接続はStream
クラスのuseChannel
メソッドを使用します。
パラメータなし
const stream = new Misskey.Stream('https://misskey.test', { token: 'TOKEN' });
const mainChannel = stream.useChannel('main');
パラメータあり
const stream = new Misskey.Stream('https://misskey.test', { token: 'TOKEN' });
const messagingChannel = stream.useChannel('messaging', {
otherparty: 'xxxxxxxxxx',
});
チャンネルから切断
Channel
クラスのdispose
メソッドを呼び出します。
const stream = new Misskey.Stream('https://misskey.test', { token: 'TOKEN' });
const mainChannel = stream.useChannel('main');
mainChannel.dispose();
メッセージの受信
Channel
クラスはEventEmitterを継承しており、メッセージがサーバーから受信されると受け取ったイベント名でペイロードをemitします。
const stream = new Misskey.Stream('https://misskey.test', { token: 'TOKEN' });
const mainChannel = stream.useChannel('main');
mainChannel.on('notification', notification => {
console.log('notification received', notification);
});
メッセージの送信
Channel
クラスのsend
メソッドを使用してメッセージをサーバーに送信することができます。
const stream = new Misskey.Stream('https://misskey.test', { token: 'TOKEN' });
const messagingChannel = stream.useChannel('messaging', {
otherparty: 'xxxxxxxxxx',
});
messagingChannel.send('read', {
id: 'xxxxxxxxxx'
});
コネクション確立イベント
Stream
クラスの_connected_
イベントが利用可能です。
const stream = new Misskey.Stream('https://misskey.test', { token: 'TOKEN' });
stream.on('_connected_', () => {
console.log('connected');
});
コネクション切断イベント
Stream
クラスの_disconnected_
イベントが利用可能です。
const stream = new Misskey.Stream('https://misskey.test', { token: 'TOKEN' });
stream.on('_disconnected_', () => {
console.log('disconnected');
});
コネクションの状態
Stream
クラスのstate
プロパティで確認できます。
initializing
: 接続確立前connected
: 接続完了reconnecting
: 再接続中