@exabugs/dynamodb-client 1.9.0 → 1.11.0
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/CHANGELOG.md +26 -0
- package/README.md +1 -0
- package/dist/integrations/react-admin/dataProvider.d.ts.map +1 -1
- package/dist/integrations/react-admin/dataProvider.js +3 -26
- package/dist/integrations/react-admin/dataProvider.js.map +1 -1
- package/dist/notify/channels/email.d.ts +32 -0
- package/dist/notify/channels/email.d.ts.map +1 -0
- package/dist/notify/channels/email.js +67 -0
- package/dist/notify/channels/email.js.map +1 -0
- package/dist/notify/channels/slack.d.ts +12 -0
- package/dist/notify/channels/slack.d.ts.map +1 -0
- package/dist/notify/channels/slack.js +46 -0
- package/dist/notify/channels/slack.js.map +1 -0
- package/dist/notify/format.d.ts +7 -0
- package/dist/notify/format.d.ts.map +1 -0
- package/dist/notify/format.js +29 -0
- package/dist/notify/format.js.map +1 -0
- package/dist/notify/handler.d.ts +42 -0
- package/dist/notify/handler.d.ts.map +1 -0
- package/dist/notify/handler.js +175 -0
- package/dist/notify/handler.js.map +1 -0
- package/dist/notify/index.d.ts +18 -0
- package/dist/notify/index.d.ts.map +1 -0
- package/dist/notify/index.js +14 -0
- package/dist/notify/index.js.map +1 -0
- package/dist/notify/logger.d.ts +6 -0
- package/dist/notify/logger.d.ts.map +1 -0
- package/dist/notify/logger.js +11 -0
- package/dist/notify/logger.js.map +1 -0
- package/dist/notify/normalize.d.ts +11 -0
- package/dist/notify/normalize.d.ts.map +1 -0
- package/dist/notify/normalize.js +245 -0
- package/dist/notify/normalize.js.map +1 -0
- package/dist/notify/policy.d.ts +15 -0
- package/dist/notify/policy.d.ts.map +1 -0
- package/dist/notify/policy.js +36 -0
- package/dist/notify/policy.js.map +1 -0
- package/dist/notify/store.d.ts +22 -0
- package/dist/notify/store.d.ts.map +1 -0
- package/dist/notify/store.js +119 -0
- package/dist/notify/store.js.map +1 -0
- package/dist/notify/types.d.ts +63 -0
- package/dist/notify/types.d.ts.map +1 -0
- package/dist/notify/types.js +8 -0
- package/dist/notify/types.js.map +1 -0
- package/dist/server/handler.cjs +577 -495
- package/dist/server/handler.cjs.map +4 -4
- package/dist/server/media-handler.cjs +2 -2
- package/dist/server/media-process-handler-dlq.cjs +438 -340
- package/dist/server/media-process-handler-dlq.cjs.map +4 -4
- package/dist/server/media-process-handler.cjs +437 -339
- package/dist/server/media-process-handler.cjs.map +4 -4
- package/dist/server/operations/deleteMany.d.ts.map +1 -1
- package/dist/server/operations/deleteMany.js +15 -30
- package/dist/server/operations/deleteMany.js.map +1 -1
- package/dist/server/operations/deleteOne.d.ts.map +1 -1
- package/dist/server/operations/deleteOne.js +7 -4
- package/dist/server/operations/deleteOne.js.map +1 -1
- package/dist/server/operations/find/nearQuery.d.ts.map +1 -1
- package/dist/server/operations/find/nearQuery.js +41 -40
- package/dist/server/operations/find/nearQuery.js.map +1 -1
- package/dist/server/operations/find/shadowQuery.d.ts +7 -0
- package/dist/server/operations/find/shadowQuery.d.ts.map +1 -1
- package/dist/server/operations/find/shadowQuery.js +10 -34
- package/dist/server/operations/find/shadowQuery.js.map +1 -1
- package/dist/server/operations/findAll.d.ts +8 -0
- package/dist/server/operations/findAll.d.ts.map +1 -0
- package/dist/server/operations/findAll.js +46 -0
- package/dist/server/operations/findAll.js.map +1 -0
- package/dist/server/operations/findMany.d.ts.map +1 -1
- package/dist/server/operations/findMany.js +9 -26
- package/dist/server/operations/findMany.js.map +1 -1
- package/dist/server/operations/findManyReference.d.ts.map +1 -1
- package/dist/server/operations/findManyReference.js +4 -14
- package/dist/server/operations/findManyReference.js.map +1 -1
- package/dist/server/operations/parameterConverter.d.ts.map +1 -1
- package/dist/server/operations/parameterConverter.js +16 -8
- package/dist/server/operations/parameterConverter.js.map +1 -1
- package/dist/server/operations/updateMany.d.ts.map +1 -1
- package/dist/server/operations/updateMany.js +15 -30
- package/dist/server/operations/updateMany.js.map +1 -1
- package/dist/server/operations/updateOne.d.ts.map +1 -1
- package/dist/server/operations/updateOne.js +8 -6
- package/dist/server/operations/updateOne.js.map +1 -1
- package/dist/server/utils/batchGet.d.ts +21 -0
- package/dist/server/utils/batchGet.d.ts.map +1 -0
- package/dist/server/utils/batchGet.js +73 -0
- package/dist/server/utils/batchGet.js.map +1 -0
- package/dist/server/utils/scanWarning.d.ts +1 -1
- package/dist/server/utils/scanWarning.d.ts.map +1 -1
- package/dist/shared/utils/index.d.ts +1 -0
- package/dist/shared/utils/index.d.ts.map +1 -1
- package/dist/shared/utils/index.js +1 -0
- package/dist/shared/utils/index.js.map +1 -1
- package/dist/shared/utils/scanSort.d.ts +16 -0
- package/dist/shared/utils/scanSort.d.ts.map +1 -0
- package/dist/shared/utils/scanSort.js +33 -0
- package/dist/shared/utils/scanSort.js.map +1 -0
- package/dist/sharp-layer.zip +0 -0
- package/docs/NOTIFY.md +103 -0
- package/package.json +8 -3
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [1.11.0] - 2026-10-12
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **運用通知 `@exabugs/dynamodb-client/notify`**(#59): ログ(`warn` 以上)・CloudWatch アラーム・直接呼び出しを `Notice` にそろえ、重複抑制・流量制限のうえ、Slack・メールへ配信する部品。サブパスの追加のみで、既存の挙動は変わらない(Records Lambda のバンドルも変わらない)。`@aws-sdk/client-sesv2` は、アプリが静的に import して渡す(依存に追加しない)。詳細は [docs/NOTIFY.md](docs/NOTIFY.md)
|
|
15
|
+
|
|
16
|
+
## [1.10.0] - 2026-10-12
|
|
17
|
+
|
|
18
|
+
結果を黙って欠く・変える経路を直した (#55)。**挙動が変わる変更を含む**ので、アップグレード時はこの節を確認すること。
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
|
|
22
|
+
- **BatchGet の `UnprocessedKeys` を再試行する。** スロットリング時に一部のレコードが黙って欠けていた(`fetchMainRecords`・`$near`・`findMany`・`findManyReference`・`updateMany`・`deleteMany`)。100 件ごとに分割し、指数バックオフで再試行し、解消しなければ一部だけを返さず 503 で失敗する
|
|
23
|
+
- **`updateMany` / `deleteMany` が 101 件以上で失敗していた**(BatchGet のキーを分割していなかった)問題を修正
|
|
24
|
+
- **`$near` 検索が 1MB を超える分を黙って捨てていた**問題を修正(`LastEvaluatedKey` をたどる)。SPARSE_SCAN の警告対象(`near-search`)にもなった
|
|
25
|
+
- **`findMany({ filter })` が 1 ページ分だけを返していた**問題を修正。全ページを返す
|
|
26
|
+
- **シャドーの SK から id を取り違えて、一致したレコードを黙って欠く問題**を修正。値に空白や `#` を含み、エスケープ後に `#id#` が現れる文字列(例: `"x id y"`)で、別の id を取り出していた(`extractRecordIds` を最後の `#id#` で区切るようにした)
|
|
27
|
+
|
|
28
|
+
### Changed
|
|
29
|
+
|
|
30
|
+
- **`updateMany` / `deleteMany` の filter が効くようになった。** `filter` が `{ id: { $in } }` 以外のとき、これまでは対象が空(`ids: []`)になり**何も起きずに成功**していた(asanowa の `deleteMany({ userId })` / `updateMany({ userId }, …)` など)。filter に一致する**全件**を対象にする。**アップグレード後は、これらの呼び出しが実際にデータを更新・削除する**
|
|
31
|
+
- 条件なし(`{}`)の filter は、全件操作の事故を防ぐため 400 で拒否する(従来は 0 件で正常終了していた)
|
|
32
|
+
- `$near` を含む filter は、近傍検索の件数上限までが対象になる
|
|
33
|
+
- **`updateOne` / `deleteOne` の filter は、一致する 1 件だけを対象にする。** これまでは filter が `updateMany` / `deleteMany` にそのまま渡り、一致した複数件(先頭ページ分)が更新・削除されていた
|
|
34
|
+
- 一致を探す全件読み取りは、短い文字列の単一等価フィルタならそのフィールド順(キー条件。O(一致件数))、それ以外は id 順(カーソル)で読む
|
|
35
|
+
|
|
10
36
|
## [1.9.0] - 2026-10-12
|
|
11
37
|
|
|
12
38
|
### Changed
|
package/README.md
CHANGED
|
@@ -196,6 +196,7 @@ const article = await articles.findOne({ title: 'Hello DynamoDB' });
|
|
|
196
196
|
- **[React Admin Integration](docs/react-admin-integration.md)** - Admin UI setup and many-to-many relationships
|
|
197
197
|
- **[Authorization & Secure Setup](docs/AUTHORIZATION.md)** - 認可モデルと安全な構成(必読。JWT の有効性しか検証しない/管理者専用ユーザープール/`aud` 検証)
|
|
198
198
|
- **[疎な検索の警告と対応](docs/SCAN_WARNING.md)** - 検索を打ち切らず、警告(SPARSE_SCAN)で気づいてインデックス・スキーマ・ロジックを見直す
|
|
199
|
+
- **[運用通知](docs/NOTIFY.md)** - ログ・アラームを、Slack・メールで管理者へ通知する部品(`@exabugs/dynamodb-client/notify`)
|
|
199
200
|
- **[Deployment](docs/DEPLOYMENT.md)** - Production deployment guide
|
|
200
201
|
- **[Terraform Modules](terraform/README.md)** - Infrastructure as Code
|
|
201
202
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataProvider.d.ts","sourceRoot":"","sources":["../../../src/integrations/react-admin/dataProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"dataProvider.d.ts","sourceRoot":"","sources":["../../../src/integrations/react-admin/dataProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAK3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAwKtD,yDAAyD;AACzD,MAAM,MAAM,kBAAkB,GAAG,YAAY,GAAG;IAC9C,UAAU,EAAE,CAAC,UAAU,SAAS;QAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,GAAG,EAC3D,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,IAAI,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,KAClF,OAAO,CAAC;QAAE,IAAI,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC,CAAC;CACtC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,kBAAkB,CAmenF"}
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
* ```
|
|
32
32
|
*/
|
|
33
33
|
import { DynamoClient } from '../../client/index.cognito.js';
|
|
34
|
+
import { chooseScanSortField } from '../../shared/utils/scanSort.js';
|
|
34
35
|
/**
|
|
35
36
|
* react-adminのフィルタをDynamoDB Client SDKのFilter型に変換
|
|
36
37
|
*
|
|
@@ -146,34 +147,10 @@ function getNextTokenFromCache(resource, page) {
|
|
|
146
147
|
return nextTokenCache[resource]?.[page];
|
|
147
148
|
}
|
|
148
149
|
/**
|
|
149
|
-
*
|
|
150
|
-
*
|
|
151
|
-
* フィルタが「単一フィールドの等価($eq)で、値が短い普通の文字列」だけなら、そのフィールドで並べ替えて読む。
|
|
152
|
-
* シャドーのキー条件で一致するレコードだけを読めるので(O(一致件数))、中間テーブルが大きくても
|
|
153
|
-
* SPARSE_SCAN にならない。それ以外は不変の id 順(カーソル方式。全件で O(件数))。
|
|
154
|
-
* 注意: 読んでいる最中にそのフィールドの値が書き換わると取りこぼしうる(中間テーブルの外部キーは
|
|
155
|
-
* 通常変更されない)。
|
|
150
|
+
* 全件読み取り用の並べ替えキーを選ぶ(選び方は chooseScanSortField を参照)
|
|
156
151
|
*/
|
|
157
152
|
function chooseScanSort(filter) {
|
|
158
|
-
|
|
159
|
-
if (keys.length === 1) {
|
|
160
|
-
const [key] = keys;
|
|
161
|
-
const value = filter[key];
|
|
162
|
-
const isPlainField = !key.includes(':') && !key.includes('.') && key !== 'id';
|
|
163
|
-
// シャドーの SK は書き込み時に型ごとに変換される(数値はオフセット付き、真偽値は 1/0、
|
|
164
|
-
// 日時形式の文字列は toISOString、長い文字列は SHADOW_STRING_MAX_BYTES で切り詰め)。
|
|
165
|
-
// 検索側の $eq はこれと同じ変換をしないため、キー条件が一致せず 0 件になりうる。
|
|
166
|
-
// 変換が不要な「短い普通の文字列」だけに限る。長さの上限はサーバー設定(既定 100 バイト)より
|
|
167
|
-
// 十分小さい 64 バイトにしている
|
|
168
|
-
const isSafeString = typeof value === 'string' &&
|
|
169
|
-
value.length > 0 &&
|
|
170
|
-
new TextEncoder().encode(value).length <= 64 &&
|
|
171
|
-
!/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(value);
|
|
172
|
-
if (isPlainField && isSafeString) {
|
|
173
|
-
return { [key]: 'asc' };
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
return { id: 'asc' };
|
|
153
|
+
return { [chooseScanSortField(filter)]: 'asc' };
|
|
177
154
|
}
|
|
178
155
|
/** 並べ替え(昇順/降順)。値が無いものは末尾 */
|
|
179
156
|
function sortInMemory(rows, field, order) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataProvider.js","sourceRoot":"","sources":["../../../src/integrations/react-admin/dataProvider.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dataProvider.js","sourceRoot":"","sources":["../../../src/integrations/react-admin/dataProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Channel, Notice } from '../types.js';
|
|
2
|
+
export interface EmailMessage {
|
|
3
|
+
from: string;
|
|
4
|
+
/** 宛先は Bcc だけ(管理者どうしにアドレスが見えない。To に送信元を入れない: 受信できないアドレスだとバウンスする) */
|
|
5
|
+
bcc: string[];
|
|
6
|
+
subject: string;
|
|
7
|
+
text: string;
|
|
8
|
+
}
|
|
9
|
+
export type EmailSender = (message: EmailMessage) => Promise<void>;
|
|
10
|
+
export declare function emailText(notices: Notice[]): string;
|
|
11
|
+
export interface EmailOptions {
|
|
12
|
+
from: string;
|
|
13
|
+
send: EmailSender;
|
|
14
|
+
}
|
|
15
|
+
export declare function createEmailChannel(options: EmailOptions): Channel;
|
|
16
|
+
interface SesCommandCtor {
|
|
17
|
+
new (input: unknown): unknown;
|
|
18
|
+
}
|
|
19
|
+
interface SesClientLike {
|
|
20
|
+
send(command: unknown): Promise<unknown>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* SES v2 で送る。アプリが `@aws-sdk/client-sesv2` を静的に import して渡す(バンドラが依存を解決でき、
|
|
24
|
+
* Lambda のバンドルに含まれる):
|
|
25
|
+
* sesSender({ client: new SESv2Client({ region: 'us-east-1' }), SendEmailCommand })
|
|
26
|
+
*/
|
|
27
|
+
export declare function sesSender(options: {
|
|
28
|
+
client: SesClientLike;
|
|
29
|
+
SendEmailCommand: SesCommandCtor;
|
|
30
|
+
}): EmailSender;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=email.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../../src/notify/channels/email.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAKnE,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAKnD;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAoCjE;AAED,UAAU,cAAc;IACtB,KAAK,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;CAC/B;AACD,UAAU,aAAa;IACrB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1C;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE;IACjC,MAAM,EAAE,aAAa,CAAC;IACtB,gBAAgB,EAAE,cAAc,CAAC;CAClC,GAAG,WAAW,CAed"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* メール(SES v2)。宛先(管理者)は Bcc にまとめて送る(管理者どうしにアドレスが見えない)。
|
|
3
|
+
* 送信は注入できる(`sesSender` は @aws-sdk/client-sesv2 を使う。アプリが渡す)。
|
|
4
|
+
*/
|
|
5
|
+
import { bodyOf, subjectOf } from '../format.js';
|
|
6
|
+
const BCC_BATCH = 50;
|
|
7
|
+
const EMAIL = /^[^\s@<>,;]+@[^\s@<>,;]+\.[^\s@<>,;]+$/;
|
|
8
|
+
export function emailText(notices) {
|
|
9
|
+
return (notices.map((n) => `${subjectOf(n)}\n\n${bodyOf(n)}`).join('\n\n----------\n\n') +
|
|
10
|
+
'\n\n(このメールは送信専用です。返信はできません)\n');
|
|
11
|
+
}
|
|
12
|
+
export function createEmailChannel(options) {
|
|
13
|
+
return {
|
|
14
|
+
name: 'email',
|
|
15
|
+
needsRecipients: true,
|
|
16
|
+
async send(notices, recipients) {
|
|
17
|
+
if (notices.length === 0)
|
|
18
|
+
return;
|
|
19
|
+
const valid = [...new Set(recipients.map((r) => r.trim().toLowerCase()))].filter((r) => EMAIL.test(r));
|
|
20
|
+
if (valid.length === 0)
|
|
21
|
+
throw new Error('メールの宛先がありません(管理者のメールアドレスが空・不正)');
|
|
22
|
+
const subject = notices.length === 1
|
|
23
|
+
? subjectOf(notices[0])
|
|
24
|
+
: `[${notices[0].app}/${notices[0].env}] 通知 ${notices.length} 件`;
|
|
25
|
+
const text = emailText(notices);
|
|
26
|
+
let failed = 0;
|
|
27
|
+
let firstError;
|
|
28
|
+
for (let i = 0; i < valid.length; i += BCC_BATCH) {
|
|
29
|
+
try {
|
|
30
|
+
await options.send({
|
|
31
|
+
from: options.from,
|
|
32
|
+
bcc: valid.slice(i, i + BCC_BATCH),
|
|
33
|
+
subject,
|
|
34
|
+
text,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
failed += 1;
|
|
39
|
+
// 原因(SES のエラー名など)を残す。宛先のアドレスは含めない
|
|
40
|
+
firstError ??= e instanceof Error ? `${e.name}: ${e.message}` : 'unknown error';
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (failed > 0)
|
|
44
|
+
throw new Error(`メールの送信に失敗した組があります (${failed} 組): ${firstError}`);
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* SES v2 で送る。アプリが `@aws-sdk/client-sesv2` を静的に import して渡す(バンドラが依存を解決でき、
|
|
50
|
+
* Lambda のバンドルに含まれる):
|
|
51
|
+
* sesSender({ client: new SESv2Client({ region: 'us-east-1' }), SendEmailCommand })
|
|
52
|
+
*/
|
|
53
|
+
export function sesSender(options) {
|
|
54
|
+
return async (m) => {
|
|
55
|
+
await options.client.send(new options.SendEmailCommand({
|
|
56
|
+
FromEmailAddress: m.from,
|
|
57
|
+
Destination: { BccAddresses: m.bcc },
|
|
58
|
+
Content: {
|
|
59
|
+
Simple: {
|
|
60
|
+
Subject: { Data: m.subject, Charset: 'UTF-8' },
|
|
61
|
+
Body: { Text: { Data: m.text, Charset: 'UTF-8' } },
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
}));
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=email.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../../src/notify/channels/email.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Channel, Notice } from '../types.js';
|
|
2
|
+
export declare function slackText(notices: Notice[]): string;
|
|
3
|
+
export interface SlackOptions {
|
|
4
|
+
/** Webhook の URL(SSM など。呼び出しごとに取得してよい) */
|
|
5
|
+
getWebhookUrl: () => Promise<string>;
|
|
6
|
+
/** Webhook の URL が、この文字列で始まること(既定 https://hooks.slack.com/)。不正な URL への送信を防ぐ */
|
|
7
|
+
urlPrefix?: string;
|
|
8
|
+
fetchImpl?: typeof fetch;
|
|
9
|
+
timeoutMs?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function createSlackChannel(options: SlackOptions): Channel;
|
|
12
|
+
//# sourceMappingURL=slack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../../src/notify/channels/slack.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAQnD,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAKnD;AAED,MAAM,WAAW,YAAY;IAC3B,0CAA0C;IAC1C,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CA0BjE"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slack(Incoming Webhook)。チャンネル宛なので、宛先(管理者)は不要。
|
|
3
|
+
* Webhook の URL は秘密。エラーにも出さない。
|
|
4
|
+
*/
|
|
5
|
+
import { bodyOf, mark, subjectOf } from '../format.js';
|
|
6
|
+
const MAX_PER_MESSAGE = 10;
|
|
7
|
+
/** Slack の mrkdwn で特別な文字を無害にする */
|
|
8
|
+
const esc = (s) => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
9
|
+
export function slackText(notices) {
|
|
10
|
+
const shown = notices.slice(0, MAX_PER_MESSAGE);
|
|
11
|
+
const parts = shown.map((n) => `${mark(n)} *${esc(subjectOf(n))}*\n${esc(bodyOf(n))}`);
|
|
12
|
+
if (notices.length > shown.length)
|
|
13
|
+
parts.push(`…ほか ${notices.length - shown.length} 件`);
|
|
14
|
+
return parts.join('\n\n');
|
|
15
|
+
}
|
|
16
|
+
export function createSlackChannel(options) {
|
|
17
|
+
const doFetch = options.fetchImpl ?? fetch;
|
|
18
|
+
return {
|
|
19
|
+
name: 'slack',
|
|
20
|
+
needsRecipients: false,
|
|
21
|
+
async send(notices) {
|
|
22
|
+
if (notices.length === 0)
|
|
23
|
+
return;
|
|
24
|
+
const url = await options.getWebhookUrl();
|
|
25
|
+
if (!url.startsWith(options.urlPrefix ?? 'https://hooks.slack.com/')) {
|
|
26
|
+
throw new Error('Slack の Webhook の URL が不正です(許可した接頭辞で始まっていません)');
|
|
27
|
+
}
|
|
28
|
+
let res;
|
|
29
|
+
try {
|
|
30
|
+
res = await doFetch(url, {
|
|
31
|
+
method: 'POST',
|
|
32
|
+
headers: { 'Content-Type': 'application/json' },
|
|
33
|
+
body: JSON.stringify({ text: slackText(notices) }),
|
|
34
|
+
signal: AbortSignal.timeout(options.timeoutMs ?? 5000),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
// fetch のエラーには URL(秘密)が入ることがあるので、原因の種類だけを残す
|
|
39
|
+
throw new Error(`Slack への送信に失敗しました (${e instanceof Error ? e.name : 'error'})`);
|
|
40
|
+
}
|
|
41
|
+
if (!res.ok)
|
|
42
|
+
throw new Error(`Slack への送信に失敗しました (HTTP ${res.status})`);
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=slack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../../../src/notify/channels/slack.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGvD,MAAM,eAAe,GAAG,EAAE,CAAC;AAE3B,kCAAkC;AAClC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAChC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAEvE,MAAM,UAAU,SAAS,CAAC,OAAiB;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACvF,IAAI,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IACxF,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAWD,MAAM,UAAU,kBAAkB,CAAC,OAAqB;IACtD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAC3C,OAAO;QACL,IAAI,EAAE,OAAO;QACb,eAAe,EAAE,KAAK;QACtB,KAAK,CAAC,IAAI,CAAC,OAAO;YAChB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YACjC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1C,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,IAAI,0BAA0B,CAAC,EAAE,CAAC;gBACrE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YACnE,CAAC;YACD,IAAI,GAAa,CAAC;YAClB,IAAI,CAAC;gBACH,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE;oBACvB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;oBAClD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;iBACvD,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,4CAA4C;gBAC5C,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;YAClF,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QACzE,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Notice } from './types.js';
|
|
2
|
+
export declare const LEVEL_LABEL: Record<Notice['level'], string>;
|
|
3
|
+
export declare const mark: (n: Notice) => string;
|
|
4
|
+
export declare function subjectOf(n: Notice): string;
|
|
5
|
+
/** 本文(プレーンテキスト)。Slack・メールで共通 */
|
|
6
|
+
export declare function bodyOf(n: Notice): string;
|
|
7
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/notify/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,CAKvD,CAAC;AASF,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,KAAG,MAA6B,CAAC;AAE/D,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,gCAAgC;AAChC,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAOxC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export const LEVEL_LABEL = {
|
|
2
|
+
warn: 'WARNING',
|
|
3
|
+
error: 'ERROR',
|
|
4
|
+
fatal: 'FATAL',
|
|
5
|
+
ok: '復旧',
|
|
6
|
+
};
|
|
7
|
+
const LEVEL_MARK = {
|
|
8
|
+
warn: '⚠️',
|
|
9
|
+
error: '🚨',
|
|
10
|
+
fatal: '🔥',
|
|
11
|
+
ok: '✅',
|
|
12
|
+
};
|
|
13
|
+
export const mark = (n) => LEVEL_MARK[n.level];
|
|
14
|
+
export function subjectOf(n) {
|
|
15
|
+
return `[${n.app}/${n.env}] ${LEVEL_LABEL[n.level]} ${n.event}`.replace(/[\r\n]+/g, ' ');
|
|
16
|
+
}
|
|
17
|
+
/** 本文(プレーンテキスト)。Slack・メールで共通 */
|
|
18
|
+
export function bodyOf(n) {
|
|
19
|
+
const lines = [n.message];
|
|
20
|
+
if (n.target)
|
|
21
|
+
lines.push(`対象: ${n.target}`);
|
|
22
|
+
if (n.action)
|
|
23
|
+
lines.push(`対策: ${n.action}`);
|
|
24
|
+
if (n.suppressed > 0)
|
|
25
|
+
lines.push(`直近の窓で抑制した同種の通知: ${n.suppressed} 件`);
|
|
26
|
+
lines.push(`発生: ${n.occurredAt}`);
|
|
27
|
+
return lines.join('\n');
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/notify/format.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAoC;IAC1D,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,EAAE,EAAE,IAAI;CACT,CAAC;AAEF,MAAM,UAAU,GAAoC;IAClD,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,IAAI;IACX,KAAK,EAAE,IAAI;IACX,EAAE,EAAE,GAAG;CACR,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAE/D,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,OAAO,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AAC3F,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,MAAM,CAAC,CAAS;IAC9B,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC1B,IAAI,CAAC,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,IAAI,CAAC,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC;IACtE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;IAClC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { AdminDirectory, Channel, Notice, NoticeLevel, NoticeStore, NotifyLogger } from './types.js';
|
|
2
|
+
export interface NotifyHandlerOptions {
|
|
3
|
+
app: string;
|
|
4
|
+
env: string;
|
|
5
|
+
channels: Channel[];
|
|
6
|
+
store: NoticeStore;
|
|
7
|
+
/** メールなど、宛先が必要なチャネルがあるときに必要 */
|
|
8
|
+
admins?: AdminDirectory;
|
|
9
|
+
windows?: Partial<Record<NoticeLevel, number>>;
|
|
10
|
+
rate?: {
|
|
11
|
+
windowSec: number;
|
|
12
|
+
limit: number;
|
|
13
|
+
};
|
|
14
|
+
/** 管理者の一覧のキャッシュ(秒)。既定 300 */
|
|
15
|
+
adminCacheSec?: number;
|
|
16
|
+
/** 送らず、計画(何を・どこへ)だけを返す。store には触れない */
|
|
17
|
+
dryRun?: boolean;
|
|
18
|
+
/** 1 つでもチャネルが失敗したら例外にする(既定: 全チャネルが失敗したときだけ) */
|
|
19
|
+
failOnAnyChannelError?: boolean;
|
|
20
|
+
now?: () => Date;
|
|
21
|
+
logger?: NotifyLogger;
|
|
22
|
+
}
|
|
23
|
+
export interface NotifyResult {
|
|
24
|
+
/** 正規化した通知の数(同じバッチの重複をまとめる前) */
|
|
25
|
+
received: number;
|
|
26
|
+
/** 1 つ以上のチャネルに届いた通知の数(省略の通知は含まない) */
|
|
27
|
+
sent: number;
|
|
28
|
+
/** 重複抑制で送らなかった通知の数 */
|
|
29
|
+
suppressed: number;
|
|
30
|
+
/** 流量制限で、あるチャネルに送らなかった通知の延べ数 */
|
|
31
|
+
throttled: number;
|
|
32
|
+
/** 失敗したチャネル */
|
|
33
|
+
failedChannels: string[];
|
|
34
|
+
/** dry-run のときの計画 */
|
|
35
|
+
plan?: Array<{
|
|
36
|
+
channel: string;
|
|
37
|
+
recipients: string[];
|
|
38
|
+
notices: Notice[];
|
|
39
|
+
}>;
|
|
40
|
+
}
|
|
41
|
+
export declare function createNotifyHandler(options: NotifyHandlerOptions): (event: unknown) => Promise<NotifyResult>;
|
|
42
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/notify/handler.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACV,cAAc,EACd,OAAO,EACP,MAAM,EACN,WAAW,EACX,WAAW,EACX,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE,WAAW,CAAC;IACnB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,IAAI,CAAC,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,6BAA6B;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe;IACf,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,qBAAqB;IACrB,IAAI,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC5E;AASD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,oBAAoB,IAoCjD,OAAO,OAAO,KAAG,OAAO,CAAC,YAAY,CAAC,CA6HrD"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 通知ハンドラ(Lambda)。入力 → Notice → 同じバッチの重複をまとめる → 重複抑制 → 流量制限 → チャネルへ配信。
|
|
3
|
+
*
|
|
4
|
+
* - 重複抑制: 先に確保 → 送信 → どのチャネルにも届かなかった分は確保を解放(次の発生で、窓を待たずに通知できる)
|
|
5
|
+
* - 流量制限: チャネルごとに、窓の中の件数の上限。超えたら「省略」の 1 通だけ送る
|
|
6
|
+
* - 全チャネルが失敗したら例外を投げる(Lambda の失敗先に流す)。一部の失敗は `failedChannels` に入る
|
|
7
|
+
* - アラームの状態変化(`ALARM:` で始まる event)は、変化したときにしか届かないので、抑制しない
|
|
8
|
+
* - dry-run は記録(store)に触れない
|
|
9
|
+
* - このハンドラのロググループは購読しないこと(ループになる)
|
|
10
|
+
*/
|
|
11
|
+
import { consoleNotifyLogger } from './logger.js';
|
|
12
|
+
import { normalize } from './normalize.js';
|
|
13
|
+
import { DEFAULT_RATE, DEFAULT_WINDOWS, fingerprintOf } from './policy.js';
|
|
14
|
+
export function createNotifyHandler(options) {
|
|
15
|
+
const now = options.now ?? (() => new Date());
|
|
16
|
+
const logger = options.logger ?? consoleNotifyLogger;
|
|
17
|
+
const windows = { ...DEFAULT_WINDOWS, ...options.windows };
|
|
18
|
+
const rate = options.rate ?? DEFAULT_RATE;
|
|
19
|
+
const adminCacheSec = options.adminCacheSec ?? 300;
|
|
20
|
+
const ctx = { app: options.app, env: options.env, now };
|
|
21
|
+
if (!options.admins && options.channels.some((c) => c.needsRecipients)) {
|
|
22
|
+
throw new Error('宛先が必要なチャネルがあるのに、admins が指定されていません');
|
|
23
|
+
}
|
|
24
|
+
let cache;
|
|
25
|
+
const recipients = async () => {
|
|
26
|
+
if (!options.admins)
|
|
27
|
+
throw new Error('admins が指定されていません');
|
|
28
|
+
const t = now().getTime();
|
|
29
|
+
if (cache && cache.until > t)
|
|
30
|
+
return cache.emails;
|
|
31
|
+
const emails = await options.admins.listEmails();
|
|
32
|
+
cache = { emails, until: t + adminCacheSec * 1000 };
|
|
33
|
+
return emails;
|
|
34
|
+
};
|
|
35
|
+
const windowOf = (n) => (n.event.startsWith('ALARM:') ? 0 : windows[n.level]);
|
|
36
|
+
/** 同じ指紋・同じレベルの通知を、バッチの中で 1 つにまとめる */
|
|
37
|
+
const group = (notices) => {
|
|
38
|
+
const map = new Map();
|
|
39
|
+
for (const n of notices) {
|
|
40
|
+
const fp = fingerprintOf(n);
|
|
41
|
+
const key = `${n.level}#${fp}`;
|
|
42
|
+
const g = map.get(key);
|
|
43
|
+
if (g)
|
|
44
|
+
g.count += 1;
|
|
45
|
+
else
|
|
46
|
+
map.set(key, { notice: n, count: 1, fp });
|
|
47
|
+
}
|
|
48
|
+
return [...map.values()];
|
|
49
|
+
};
|
|
50
|
+
return async (event) => {
|
|
51
|
+
const notices = normalize(event, ctx);
|
|
52
|
+
const result = {
|
|
53
|
+
received: notices.length,
|
|
54
|
+
sent: 0,
|
|
55
|
+
suppressed: 0,
|
|
56
|
+
throttled: 0,
|
|
57
|
+
failedChannels: [],
|
|
58
|
+
};
|
|
59
|
+
const nowSec = Math.floor(now().getTime() / 1000);
|
|
60
|
+
const groups = group(notices);
|
|
61
|
+
const candidates = [];
|
|
62
|
+
const delivered = new Set();
|
|
63
|
+
try {
|
|
64
|
+
for (const g of groups) {
|
|
65
|
+
const windowSec = windowOf(g.notice);
|
|
66
|
+
if (windowSec > 0 && !options.dryRun) {
|
|
67
|
+
const c = await options.store.claim(g.fp, windowSec, nowSec, g.count);
|
|
68
|
+
if (!c.granted) {
|
|
69
|
+
result.suppressed += g.count;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
g.claim = { token: c.token, prev: c.suppressed };
|
|
73
|
+
g.notice = { ...g.notice, suppressed: c.suppressed + g.count - 1 };
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
g.notice = { ...g.notice, suppressed: g.count - 1 };
|
|
77
|
+
}
|
|
78
|
+
candidates.push(g);
|
|
79
|
+
}
|
|
80
|
+
if (candidates.length === 0)
|
|
81
|
+
return result;
|
|
82
|
+
const plan = [];
|
|
83
|
+
for (const ch of options.channels) {
|
|
84
|
+
let to = [];
|
|
85
|
+
if (ch.needsRecipients) {
|
|
86
|
+
// 宛先の取得の失敗は、そのチャネルの失敗にする(他のチャネルは送る)
|
|
87
|
+
try {
|
|
88
|
+
to = await recipients();
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
result.failedChannels.push(ch.name);
|
|
92
|
+
logger.error('宛先(管理者)の取得に失敗しました', {
|
|
93
|
+
channel: ch.name,
|
|
94
|
+
error: e instanceof Error ? e.message : String(e),
|
|
95
|
+
});
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
let allowed = candidates;
|
|
100
|
+
let extra;
|
|
101
|
+
if (!options.dryRun) {
|
|
102
|
+
const total = await options.store.consume(ch.name, rate.windowSec, nowSec, candidates.length);
|
|
103
|
+
const before = total - candidates.length;
|
|
104
|
+
allowed = candidates.slice(0, Math.max(0, rate.limit - before));
|
|
105
|
+
const over = candidates.length - allowed.length;
|
|
106
|
+
if (over > 0) {
|
|
107
|
+
result.throttled += over;
|
|
108
|
+
// 上限を超えた最初のバッチにだけ、省略の通知を 1 通出す
|
|
109
|
+
if (before <= rate.limit) {
|
|
110
|
+
extra = {
|
|
111
|
+
level: 'warn',
|
|
112
|
+
event: 'NOTIFY_THROTTLED',
|
|
113
|
+
message: `通知が多いため、${rate.windowSec} 秒間の上限(${rate.limit} 件)を超えた分を省略します(このバッチで ${over} 件)`,
|
|
114
|
+
app: options.app,
|
|
115
|
+
env: options.env,
|
|
116
|
+
occurredAt: now().toISOString(),
|
|
117
|
+
suppressed: 0,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const batch = [...allowed.map((g) => g.notice), ...(extra ? [extra] : [])];
|
|
123
|
+
if (batch.length === 0)
|
|
124
|
+
continue;
|
|
125
|
+
if (options.dryRun) {
|
|
126
|
+
plan.push({ channel: ch.name, recipients: to, notices: batch });
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
await ch.send(batch, to);
|
|
131
|
+
for (const g of allowed)
|
|
132
|
+
delivered.add(g);
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
result.failedChannels.push(ch.name);
|
|
136
|
+
logger.error('通知の送信に失敗しました', {
|
|
137
|
+
channel: ch.name,
|
|
138
|
+
error: e instanceof Error ? e.message : String(e),
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (options.dryRun)
|
|
143
|
+
return { ...result, plan };
|
|
144
|
+
result.sent = delivered.size;
|
|
145
|
+
// どのチャネルにも届かなかった通知は、確保を解放する(流量制限で省かれた分も)
|
|
146
|
+
await releaseUndelivered(candidates, delivered);
|
|
147
|
+
const failedAll = options.channels.length > 0 && result.failedChannels.length === options.channels.length;
|
|
148
|
+
if (failedAll || (options.failOnAnyChannelError && result.failedChannels.length > 0)) {
|
|
149
|
+
throw new Error(`通知チャネルの送信に失敗しました: ${result.failedChannels.join(', ')}`);
|
|
150
|
+
}
|
|
151
|
+
return result;
|
|
152
|
+
}
|
|
153
|
+
catch (e) {
|
|
154
|
+
// 途中で例外になったときも、まだ送っていない確保を残さない(その指紋が窓の間、黙ってしまう)
|
|
155
|
+
await releaseUndelivered(groups, delivered).catch(() => undefined);
|
|
156
|
+
throw e;
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
async function releaseUndelivered(all, delivered) {
|
|
160
|
+
for (const g of all) {
|
|
161
|
+
if (delivered.has(g) || !g.claim)
|
|
162
|
+
continue;
|
|
163
|
+
try {
|
|
164
|
+
await options.store.release(g.fp, g.claim.token, g.claim.prev + g.count);
|
|
165
|
+
}
|
|
166
|
+
catch (e) {
|
|
167
|
+
logger.error('確保の解放に失敗しました', {
|
|
168
|
+
error: e instanceof Error ? e.message : String(e),
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
g.claim = undefined;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=handler.js.map
|