mixi2-js 1.0.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  <div align="center">
2
2
 
3
- <img src="./img/icon.svg" width="200px" height="200px">
3
+ <a href="https://otoneko1102.github.io/mixi2-js/">
4
+ <img src="./img/icon.svg" width="200px" height="200px">
5
+ </a>
4
6
 
5
7
  # mixi2-js
6
8
 
@@ -17,6 +19,12 @@
17
19
  [![ESLint](https://img.shields.io/badge/ESLint-enabled-4B32C3?logo=eslint&logoColor=white)](eslint.config.js)
18
20
  [![Prettier](https://img.shields.io/badge/Prettier-enabled-F7B93E?logo=prettier&logoColor=white)](https://prettier.io/)
19
21
 
22
+ <div align="center">
23
+
24
+ **[📖 ドキュメント](https://otoneko1102.github.io/mixi2-js/)** | **[npm](https://www.npmjs.com/package/mixi2-js)** | **[JSR](https://jsr.io/@otoneko1102/mixi2-js)**
25
+
26
+ </div>
27
+
20
28
  mixi2 の [Application API](https://developer.mixi.social/docs) を利用するための **非公式** TypeScript/JavaScript SDK です。
21
29
 
22
30
  [公式 Go SDK](https://github.com/mixigroup/mixi2-application-sdk-go) および [公式 API 仕様](https://github.com/mixigroup/mixi2-api) に基づいて作成されています。
@@ -26,34 +34,6 @@ mixi2 の [Application API](https://developer.mixi.social/docs) を利用する
26
34
 
27
35
  ---
28
36
 
29
- ## 目次
30
-
31
- - [インストール](#インストール)
32
- - [機能概要](#機能概要)
33
- - [クイックスタート](#クイックスタート)
34
- - [認証](#認証)
35
- - [API クライアント](#api-クライアント)
36
- - [Webhook サーバー](#webhook-サーバー)
37
- - [gRPC ストリーミング](#grpc-ストリーミング)
38
- - [API リファレンス](#api-リファレンス)
39
- - [OAuth2Authenticator](#oauth2authenticator)
40
- - [Client](#client)
41
- - [WebhookServer](#webhookserver)
42
- - [StreamWatcher](#streamwatcher)
43
- - [EventHandler](#eventhandler)
44
- - [RPC メソッド一覧](#rpc-メソッド一覧)
45
- - [型定義](#型定義)
46
- - [Enum 定義](#enum-定義)
47
- - [環境変数](#環境変数)
48
- - [イベント](#イベント)
49
- - [レート制限](#レート制限)
50
- - [セキュリティ](#セキュリティ)
51
- - [関連リンク](#関連リンク)
52
- - [コントリビュート](#コントリビュート)
53
- - [ライセンス](#ライセンス)
54
-
55
- ---
56
-
57
37
  ## インストール
58
38
 
59
39
  ```bash
@@ -77,536 +57,28 @@ ESM・CommonJS の両方に対応しています。TypeScript の型定義 (`.d.
77
57
  | `WebhookServer` | HTTP Webhook サーバー(Ed25519 署名検証・Ping 自動応答) |
78
58
  | `StreamWatcher` | gRPC ストリーミング(指数バックオフによる自動再接続) |
79
59
 
80
- ---
81
-
82
- ## クイックスタート
83
-
84
- ### 前提条件
85
-
86
- - **Node.js 18 以上**
87
- - [mixi2 Developer Platform](https://developer.mixi.social) で開発者登録が完了していること
88
- - アプリケーションを作成し、認証情報(Client ID / Client Secret / Token URL 等)を取得済みであること
89
-
90
- ### 認証
91
-
92
- ```typescript
93
- // ESM
94
- import { OAuth2Authenticator } from 'mixi2-js';
95
- // CJS
96
- const { OAuth2Authenticator } = require('mixi2-js');
97
-
98
- const authenticator = new OAuth2Authenticator({
99
- clientId: process.env.CLIENT_ID!,
100
- clientSecret: process.env.CLIENT_SECRET!,
101
- tokenUrl: process.env.TOKEN_URL!,
102
- });
103
-
104
- // アクセストークンを取得(キャッシュ済みの場合は即座に返却)
105
- const token = await authenticator.getAccessToken();
106
- ```
107
-
108
- ### API クライアント
109
-
110
- ```typescript
111
- // ESM
112
- import { OAuth2Authenticator, Client, MediaUploadType, LanguageCode } from 'mixi2-js';
113
- // CJS
114
- const { OAuth2Authenticator, Client, MediaUploadType, LanguageCode } = require('mixi2-js');
115
-
116
- const authenticator = new OAuth2Authenticator({
117
- clientId: process.env.CLIENT_ID!,
118
- clientSecret: process.env.CLIENT_SECRET!,
119
- tokenUrl: process.env.TOKEN_URL!,
120
- });
121
-
122
- const client = new Client({
123
- apiAddress: process.env.API_ADDRESS!,
124
- authenticator,
125
- });
126
-
127
- // ユーザー情報取得
128
- const users = await client.getUsers(['user-id-1', 'user-id-2']);
129
-
130
- // ポスト作成
131
- const post = await client.createPost({ text: 'Hello mixi2!' });
132
-
133
- // ポスト情報取得
134
- const posts = await client.getPosts(['post-id-1']);
135
-
136
- // チャットメッセージ送信(ユーザーからの DM 受信後のみ)
137
- const message = await client.sendChatMessage({
138
- roomId: 'room-id',
139
- text: 'Hello!',
140
- });
141
-
142
- // メディアアップロード → ポスト添付の流れ
143
- const upload = await client.initiatePostMediaUpload({
144
- contentType: 'image/png',
145
- dataSize: 1024,
146
- mediaType: MediaUploadType.IMAGE,
147
- });
148
- // upload.uploadUrl に POST でメディアデータを送信
149
- const status = await client.getPostMediaStatus(upload.mediaId);
150
- // status.status === MediaUploadStatus.COMPLETED になったら添付可能
151
- await client.createPost({ text: '画像付き!', mediaIdList: [upload.mediaId] });
152
-
153
- // スタンプ一覧取得
154
- const stamps = await client.getStamps({ officialStampLanguage: LanguageCode.JP });
155
-
156
- // ポストにスタンプを付与
157
- await client.addStampToPost('post-id', 'stamp-id');
158
-
159
- // クライアントを閉じる
160
- client.close();
161
- ```
162
-
163
- ### Webhook サーバー
164
-
165
- ```typescript
166
- // ESM
167
- import { WebhookServer, EventType } from 'mixi2-js';
168
- import type { EventHandler, Event } from 'mixi2-js';
169
- // CJS
170
- const { WebhookServer, EventType } = require('mixi2-js');
171
-
172
- const handler: EventHandler = {
173
- handle: async (event: Event) => {
174
- switch (event.eventType) {
175
- case EventType.POST_CREATED:
176
- console.log('Post created:', event.postCreatedEvent?.post?.text);
177
- break;
178
- case EventType.CHAT_MESSAGE_RECEIVED:
179
- console.log('Chat message:', event.chatMessageReceivedEvent?.message?.text);
180
- break;
181
- }
182
- },
183
- };
184
-
185
- // 公開鍵は Base64 からデコード
186
- const publicKey = Buffer.from(process.env.SIGNATURE_PUBLIC_KEY!, 'base64');
187
-
188
- const server = new WebhookServer({
189
- port: 8080,
190
- publicKey,
191
- handler,
192
- });
193
-
194
- await server.start();
195
- console.log('Webhook server started on :8080');
196
-
197
- // エンドポイント:
198
- // POST /events - イベント受信
199
- // GET /healthz - ヘルスチェック
200
- ```
201
-
202
- サーバーレス環境(Vercel、AWS Lambda など)では `syncHandling: true` を設定してください:
203
-
204
- ```typescript
205
- const server = new WebhookServer({
206
- port: 8080,
207
- publicKey,
208
- handler,
209
- syncHandling: true, // レスポンス後にプロセスが終了する環境向け
210
- });
211
-
212
- export default server.httpServer;
213
- ```
214
-
215
- ### gRPC ストリーミング
216
-
217
- ローカル開発やプロトタイピングに推奨される方式です。外部公開 URL が不要です。
218
-
219
- ```typescript
220
- // ESM
221
- import { OAuth2Authenticator, StreamWatcher, EventType } from 'mixi2-js';
222
- import type { EventHandler, Event } from 'mixi2-js';
223
- // CJS
224
- const { OAuth2Authenticator, StreamWatcher, EventType } = require('mixi2-js');
225
-
226
- const authenticator = new OAuth2Authenticator({
227
- clientId: process.env.CLIENT_ID!,
228
- clientSecret: process.env.CLIENT_SECRET!,
229
- tokenUrl: process.env.TOKEN_URL!,
230
- });
231
-
232
- const handler: EventHandler = {
233
- handle: async (event: Event) => {
234
- console.log('Received event:', event.eventId, EventType[event.eventType]);
235
- },
236
- };
237
-
238
- const watcher = new StreamWatcher({
239
- streamAddress: process.env.STREAM_ADDRESS!,
240
- authenticator,
241
- });
242
-
243
- // イベント監視開始(接続エラー時は自動再接続: 1s → 2s → 4s, 最大 3 回)
244
- await watcher.watch(handler);
245
-
246
- // 停止
247
- watcher.stop();
248
- ```
249
-
250
- ---
251
-
252
- ## API リファレンス
253
-
254
- ### OAuth2Authenticator
255
-
256
- OAuth2 Client Credentials フローによる認証を管理します。
257
-
258
- ```typescript
259
- new OAuth2Authenticator(options: AuthenticatorOptions)
260
- ```
261
-
262
- | プロパティ | 型 | 説明 |
263
- |---|---|---|
264
- | `clientId` | `string` | OAuth2 クライアント ID |
265
- | `clientSecret` | `string` | OAuth2 クライアントシークレット |
266
- | `tokenUrl` | `string` | トークンエンドポイント URL |
267
-
268
- | メソッド | 戻り値 | 説明 |
269
- |---|---|---|
270
- | `getAccessToken()` | `Promise<string>` | アクセストークンを取得。有効期限の 1 分前までキャッシュし、自動更新する |
271
-
272
- `Authenticator` インターフェースを実装しているため、カスタム認証を独自に実装することも可能です。
273
-
274
- ---
275
-
276
- ### Client
277
-
278
- 8 つの RPC メソッドを提供する gRPC API クライアントです。
279
-
280
- ```typescript
281
- new Client(options: ClientOptions)
282
- ```
283
-
284
- | プロパティ | 型 | 必須 | 説明 |
285
- |---|---|---|---|
286
- | `apiAddress` | `string` | ○ | API サーバーアドレス |
287
- | `authenticator` | `Authenticator` | ○ | 認証インスタンス |
288
-
289
- #### RPC メソッド一覧
290
-
291
- | メソッド | 引数 | 戻り値 | 説明 |
292
- |---|---|---|---|
293
- | `getUsers(userIdList)` | `string[]` | `Promise<User[]>` | ユーザー情報を一括取得 |
294
- | `getPosts(postIdList)` | `string[]` | `Promise<Post[]>` | ポスト情報を一括取得 |
295
- | `createPost(request)` | `CreatePostRequest` | `Promise<Post>` | ポストを作成(返信/引用/メディア添付対応) |
296
- | `initiatePostMediaUpload(request)` | `InitiatePostMediaUploadRequest` | `Promise<InitiatePostMediaUploadResponse>` | メディアアップロードを開始 |
297
- | `getPostMediaStatus(mediaId)` | `string` | `Promise<GetPostMediaStatusResponse>` | メディアの処理状況を取得 |
298
- | `sendChatMessage(request)` | `SendChatMessageRequest` | `Promise<ChatMessage>` | チャットメッセージを送信 |
299
- | `getStamps(request?)` | `GetStampsRequest?` | `Promise<OfficialStampSet[]>` | スタンプ一覧を取得 |
300
- | `addStampToPost(postId, stampId)` | `string, string` | `Promise<Post>` | ポストにスタンプを付与 |
301
- | `close()` | - | `void` | gRPC 接続を閉じる |
302
-
303
- #### CreatePostRequest
304
-
305
- | フィールド | 型 | 必須 | 説明 |
306
- |---|---|---|---|
307
- | `text` | `string` | ○ | ポスト本文(最大 149 文字) |
308
- | `inReplyToPostId` | `string` | - | 返信先ポスト ID |
309
- | `quotedPostId` | `string` | - | 引用対象ポスト ID |
310
- | `mediaIdList` | `string[]` | - | 添付メディア ID(最大 4 件) |
311
- | `postMask` | `PostMask` | - | マスク設定(センシティブ/ネタバレ) |
312
- | `publishingType` | `PostPublishingType` | - | 配信設定 |
313
-
314
- > `inReplyToPostId` と `quotedPostId` は同時に指定できません。
315
-
316
- #### InitiatePostMediaUploadRequest
317
-
318
- | フィールド | 型 | 必須 | 説明 |
319
- |---|---|---|---|
320
- | `contentType` | `string` | ○ | Content-Type(例: `image/jpeg`) |
321
- | `dataSize` | `number` | ○ | データサイズ(バイト) |
322
- | `mediaType` | `MediaUploadType` | ○ | メディア種別(`IMAGE` / `VIDEO`) |
323
- | `description` | `string` | - | メディアの説明 |
324
-
325
- #### SendChatMessageRequest
326
-
327
- | フィールド | 型 | 必須 | 説明 |
328
- |---|---|---|---|
329
- | `roomId` | `string` | ○ | 送信先ルーム ID |
330
- | `text` | `string` | △ | テキスト(`text` または `mediaId` のいずれか必須) |
331
- | `mediaId` | `string` | △ | 添付メディア ID |
332
-
333
- ---
334
-
335
- ### WebhookServer
336
-
337
- Ed25519 署名検証付きの HTTP Webhook サーバーです。
60
+ ### Helpers (拡張機能)
338
61
 
339
- ```typescript
340
- new WebhookServer(options: WebhookServerOptions)
341
- ```
342
-
343
- | プロパティ | 型 | 必須 | デフォルト | 説明 |
344
- |---|---|---|---|---|
345
- | `publicKey` | `Buffer` | ○ | - | Ed25519 公開鍵(Base64 をデコードしたもの) |
346
- | `handler` | `EventHandler` | ○ | - | イベントハンドラ |
347
- | `port` | `number` | - | `8080` | リッスンポート |
348
- | `syncHandling` | `boolean` | - | `false` | イベントを同期処理するか |
349
-
350
- | メソッド | 戻り値 | 説明 |
351
- |---|---|---|
352
- | `start()` | `Promise<void>` | サーバーを起動 |
353
- | `shutdown()` | `Promise<void>` | サーバーを停止 |
354
- | `address` | `string` | リッスンアドレス |
355
- | `httpServer` | `http.Server` | 内部の HTTP サーバーインスタンス |
356
- | `eventHandlerFunc` | `Function` | イベントハンドラ関数(フレームワーク統合用) |
357
-
358
- #### エンドポイント
359
-
360
- | パス | メソッド | 説明 |
361
- |---|---|---|
362
- | `/events` | POST | イベント受信(署名検証 → protobuf デコード → ハンドラ呼出) |
363
- | `/healthz` | GET | ヘルスチェック(常に `200 OK`) |
364
-
365
- #### 署名検証の仕様
366
-
367
- | 項目 | 値 |
368
- |---|---|
369
- | 署名ヘッダ | `x-mixi2-application-event-signature`(Base64) |
370
- | タイムスタンプヘッダ | `x-mixi2-application-event-timestamp`(Unix 秒) |
371
- | 署名対象 | リクエストボディ + タイムスタンプ |
372
- | 許容時刻ズレ | ±300 秒(5 分) |
373
- | 署名失敗レスポンス | HTTP 401 |
374
- | 成功レスポンス | HTTP 204 |
375
-
376
- ---
377
-
378
- ### StreamWatcher
379
-
380
- gRPC ストリーミングによるリアルタイムイベント受信を行います。
381
-
382
- ```typescript
383
- new StreamWatcher(options: StreamWatcherOptions)
384
- ```
385
-
386
- | プロパティ | 型 | 必須 | 説明 |
387
- |---|---|---|---|
388
- | `streamAddress` | `string` | ○ | Stream サーバーアドレス |
389
- | `authenticator` | `Authenticator` | ○ | 認証インスタンス |
390
-
391
- | メソッド | 戻り値 | 説明 |
392
- |---|---|---|
393
- | `watch(handler)` | `Promise<void>` | イベント監視を開始 |
394
- | `stop()` | `void` | 監視を停止し接続を閉じる |
395
-
396
- #### 再接続の仕様
397
-
398
- | 項目 | 値 |
399
- |---|---|
400
- | 再接続方式 | 指数バックオフ(1 秒 → 2 秒 → 4 秒) |
401
- | 最大リトライ回数 | 3 回 |
402
- | Ping イベント | SDK 内部で処理(`handle` には渡されない) |
403
-
404
- > 再接続中に発生したイベントは失われます。厳密な到達保証が必要な場合は Webhook 方式を使用してください。
405
-
406
- ---
407
-
408
- ### EventHandler
409
-
410
- Webhook・gRPC ストリーム共通のイベントハンドラインターフェースです。
411
-
412
- ```typescript
413
- interface EventHandler {
414
- handle(event: Event): void | Promise<void>;
415
- }
416
- ```
417
-
418
- - `handle` 内で発生したエラーはログ出力され、処理は継続します
419
- - Ping イベントは SDK 内部で処理されるため `handle` には渡されません
420
- - Webhook 方式では `handle` の結果にかかわらず常に HTTP 204 が返されます
421
-
422
- ---
423
-
424
- ### 型定義
425
-
426
- #### モデル型
427
-
428
- | 型 | 説明 |
429
- |---|---|
430
- | `User` | ユーザー情報(ID・表示名・プロフィール・アバター等) |
431
- | `UserAvatar` | ユーザーアバター画像情報(大小 2 サイズ) |
432
- | `Post` | ポスト情報(本文・作成日時・メディア・マスク・スタンプ等) |
433
- | `PostMedia` | ポスト添付メディア(画像 / 動画) |
434
- | `PostMediaImage` | ポスト添付画像の詳細 |
435
- | `PostMediaVideo` | ポスト添付動画の詳細 |
436
- | `PostMask` | ポストマスク(センシティブ / ネタバレ) |
437
- | `PostStamp` | ポストに付与されたスタンプ(スタンプ情報 + 回数) |
438
- | `Media` | メッセージ添付メディア |
439
- | `MediaImage` | メッセージ添付画像の詳細 |
440
- | `MediaVideo` | メッセージ添付動画の詳細 |
441
- | `MediaStamp` | スタンプ画像情報 |
442
- | `ChatMessage` | チャットメッセージ(ルーム ID・本文・メディア等) |
443
- | `OfficialStampSet` | 公式スタンプセット(名前・スプライト URL・有効期間等) |
444
- | `OfficialStamp` | 個別の公式スタンプ |
445
-
446
- #### イベント型
447
-
448
- | 型 | 説明 |
449
- |---|---|
450
- | `Event` | イベント(ID・種別・イベントボディの oneof) |
451
- | `PingEvent` | 接続確認イベント(フィールドなし) |
452
- | `PostCreatedEvent` | ポスト作成イベント(理由リスト・ポスト・発行者) |
453
- | `ChatMessageReceivedEvent` | チャットメッセージ受信イベント(理由リスト・メッセージ・発行者) |
454
-
455
- #### リクエスト/レスポンス型
62
+ `mixi2-js/helpers` は、公式 API 仕様には含まれない **SDK 独自の便利ユーティリティ**を提供します。
456
63
 
457
- | | 説明 |
64
+ | ヘルパー | 説明 |
458
65
  |---|---|
459
- | `CreatePostRequest` | ポスト作成リクエスト |
460
- | `InitiatePostMediaUploadRequest` | メディアアップロード開始リクエスト |
461
- | `InitiatePostMediaUploadResponse` | メディアアップロード開始レスポンス(`mediaId` / `uploadUrl`) |
462
- | `GetPostMediaStatusResponse` | メディア状況レスポンス(`status`) |
463
- | `SendChatMessageRequest` | チャットメッセージ送信リクエスト |
464
- | `GetStampsRequest` | スタンプ一覧取得リクエスト |
465
-
466
- ---
467
-
468
- ### Enum 定義
469
-
470
- #### EventType
471
-
472
- | 名前 | 値 | 説明 |
473
- |---|---|---|
474
- | `UNSPECIFIED` | 0 | 未指定 |
475
- | `PING` | 1 | 接続確認 |
476
- | `POST_CREATED` | 2 | ポスト作成 |
477
- | `CHAT_MESSAGE_RECEIVED` | 4 | メッセージ受信 |
478
-
479
- #### EventReason
480
-
481
- | 名前 | 値 | 説明 |
482
- |---|---|---|
483
- | `UNSPECIFIED` | 0 | 未指定 |
484
- | `PING` | 1 | 接続確認 |
485
- | `POST_REPLY` | 2 | ポストに返信された |
486
- | `POST_MENTIONED` | 3 | ポストでメンションされた |
487
- | `POST_QUOTED` | 4 | ポストが引用された |
488
- | `DIRECT_MESSAGE_RECEIVED` | 8 | DM を受信した |
489
-
490
- #### PostVisibility / PostAccessLevel
491
-
492
- | Enum | 値 | 説明 |
493
- |---|---|---|
494
- | `PostVisibility.VISIBLE` | 1 | 閲覧可能 |
495
- | `PostVisibility.INVISIBLE` | 2 | 閲覧不可 |
496
- | `PostAccessLevel.PUBLIC` | 1 | 公開 |
497
- | `PostAccessLevel.PRIVATE` | 2 | 非公開 |
498
-
499
- #### PostMaskType
500
-
501
- | 名前 | 値 | 説明 |
502
- |---|---|---|
503
- | `SENSITIVE` | 1 | 刺激的なコンテンツ |
504
- | `SPOILER` | 2 | ネタバレ防止 |
505
-
506
- #### PostPublishingType
507
-
508
- | 名前 | 値 | 説明 |
509
- |---|---|---|
510
- | `UNSPECIFIED` | 0 | フォロワーのタイムラインに公開(デフォルト) |
511
- | `NOT_PUBLISHING` | 1 | プロフィールにのみ公開 |
512
-
513
- #### MediaUploadType / MediaUploadStatus
514
-
515
- | Enum | 値 | 説明 |
516
- |---|---|---|
517
- | `MediaUploadType.IMAGE` | 1 | 画像 |
518
- | `MediaUploadType.VIDEO` | 2 | 動画 |
519
- | `MediaUploadStatus.UPLOAD_PENDING` | 1 | アップロード待機中 |
520
- | `MediaUploadStatus.PROCESSING` | 2 | 処理中 |
521
- | `MediaUploadStatus.COMPLETED` | 3 | 完了 |
522
- | `MediaUploadStatus.FAILED` | 4 | 失敗 |
523
-
524
- #### UserVisibility / UserAccessLevel
525
-
526
- | Enum | 値 | 説明 |
527
- |---|---|---|
528
- | `UserVisibility.VISIBLE` | 1 | 閲覧可能 |
529
- | `UserVisibility.INVISIBLE` | 2 | 閲覧不可 |
530
- | `UserAccessLevel.PUBLIC` | 1 | 公開 |
531
- | `UserAccessLevel.PRIVATE` | 2 | 非公開 |
532
-
533
- #### その他
534
-
535
- | Enum | 値 | 説明 |
536
- |---|---|---|
537
- | `LanguageCode.JP` | 1 | 日本語 |
538
- | `LanguageCode.EN` | 2 | 英語 |
539
- | `MediaType.IMAGE` | 1 | 画像 |
540
- | `MediaType.VIDEO` | 2 | 動画 |
541
- | `PostMediaType.IMAGE` | 1 | 画像 |
542
- | `PostMediaType.VIDEO` | 2 | 動画 |
543
- | `StampSetType.DEFAULT` | 1 | デフォルト |
544
- | `StampSetType.SEASONAL` | 2 | 季節限定 |
545
-
546
- ---
547
-
548
- ## 環境変数
549
-
550
- | 変数名 | 必須 | 説明 |
551
- |---|---|---|
552
- | `CLIENT_ID` | ○ | OAuth2 クライアント ID |
553
- | `CLIENT_SECRET` | ○ | OAuth2 クライアントシークレット |
554
- | `TOKEN_URL` | ○ | トークンエンドポイント URL |
555
- | `API_ADDRESS` | △ | API サーバーアドレス(API クライアント使用時) |
556
- | `STREAM_ADDRESS` | △ | Stream サーバーアドレス(gRPC ストリーミング使用時) |
557
- | `SIGNATURE_PUBLIC_KEY` | △ | イベント署名検証用の公開鍵(Base64)(Webhook 使用時) |
558
- | `PORT` | - | Webhook サーバーポート(デフォルト: `8080`) |
559
-
560
- ---
561
-
562
- ## イベント
563
-
564
- アプリケーションが受信できるイベントの一覧です。
565
-
566
- | イベント種別 | イベントタイプ | 説明 |
567
- |---|---|---|
568
- | ポスト作成 | `EVENT_TYPE_POST_CREATED` | ユーザーがメンション・リプライ・引用を行った場合 |
569
- | メッセージ受信 | `EVENT_TYPE_CHAT_MESSAGE_RECEIVED` | ユーザーが DM を送信した場合 |
570
- | Ping | `EVENT_TYPE_PING` | 接続確認(SDK 内部で処理、ハンドラには渡されない) |
571
-
572
- ### イベント配信の特性
573
-
574
- - **順序保証なし** — イベントは発生順と異なる順序で届く可能性があります
575
- - **Best-effort 配信** — gRPC ストリーム接続中断時のイベントは失われます
576
- - **Webhook リトライ** — 配信失敗時に最大 3 回(30 秒間隔)リトライされます。冪等な処理を推奨します
577
-
578
- ---
579
-
580
- ## レート制限
581
-
582
- API ごとのレート制限(アプリケーション単位で適用):
583
-
584
- | RPC | 制限 | ウィンドウ |
585
- |---|---|---|
586
- | `CreatePost` | 10 回 | 1 分 |
587
- | `SendChatMessage` | 10 回 | 1 分 |
588
- | `InitiatePostMediaUpload` | 10 回 / 100 回 | 1 分 / 1 時間 |
589
- | `AddStampToPost` | 10 回 | 1 分 |
590
- | `GetUsers` | 10 回 | 1 分 |
591
- | `GetPosts` | 10 回 | 1 分 |
592
-
593
- `GetStamps`・`GetPostMediaStatus`・`SubscribeEvents` にはレート制限はありません。
594
-
595
- 制限超過時は gRPC ステータス `RESOURCE_EXHAUSTED` が返されます。`retry-after` ヘッダに従って待機してください。
66
+ | `EventRouter` | イベントタイプ別にハンドラを登録できるルーター |
67
+ | `PostBuilder` | メソッドチェーンでポスト作成リクエストを組み立てるビルダー |
68
+ | `MediaUploader` | メディアアップロードの開始〜完了待機を自動化 |
69
+ | `ReasonFilter` | `EventReason` ベースでイベントをフィルタリング |
596
70
 
597
71
  ---
598
72
 
599
- ## セキュリティ
73
+ ## ドキュメント
600
74
 
601
- - **認証情報の管理** `CLIENT_SECRET` は環境変数またはシークレット管理システムから読み込んでください。ソースコードへのハードコードは禁止です。
602
- - **署名検証** — Webhook リクエストは Ed25519 署名で検証されます。
603
- - **リプレイ攻撃防止** — タイムスタンプ検証により ±5 分を超えるリクエストを拒否します。
604
- - **TLS** — gRPC 接続はすべて TLS で暗号化されます。
75
+ 使い方・API リファレンス・拡張機能の詳細は **[ドキュメントサイト](https://otoneko1102.github.io/mixi2-js/)** を参照してください。
605
76
 
606
77
  ---
607
78
 
608
79
  ## 関連リンク
609
80
 
81
+ - **[mixi2-js ドキュメント](https://otoneko1102.github.io/mixi2-js/)**
610
82
  - [mixi2 Developer Platform 公式ドキュメント](https://developer.mixi.social/docs)
611
83
  - [mixi2-api](https://github.com/mixigroup/mixi2-api) — API 定義(Protocol Buffers)
612
84
  - [mixi2-application-sdk-go](https://github.com/mixigroup/mixi2-application-sdk-go) — 公式 Go SDK