@exabugs/dynamodb-client 1.24.1 → 1.25.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/CHANGELOG.md +41 -0
- package/dist/integrations/react-admin/dataProvider.d.ts +9 -0
- package/dist/integrations/react-admin/dataProvider.d.ts.map +1 -1
- package/dist/integrations/react-admin/dataProvider.js +24 -3
- package/dist/integrations/react-admin/dataProvider.js.map +1 -1
- package/dist/server/handler.cjs +400 -188
- package/dist/server/handler.cjs.map +4 -4
- package/dist/server/media-handler.cjs +17 -12
- package/dist/server/media-handler.cjs.map +3 -3
- package/dist/server/media-process-handler-dlq.cjs +17 -12
- package/dist/server/media-process-handler-dlq.cjs.map +3 -3
- package/dist/server/media-process-handler.cjs +17 -12
- package/dist/server/media-process-handler.cjs.map +3 -3
- package/dist/server/operations/deleteMany.d.ts.map +1 -1
- package/dist/server/operations/deleteMany.js +26 -2
- package/dist/server/operations/deleteMany.js.map +1 -1
- package/dist/server/operations/find/shadowQuery.d.ts.map +1 -1
- package/dist/server/operations/find/shadowQuery.js +59 -50
- package/dist/server/operations/find/shadowQuery.js.map +1 -1
- package/dist/server/operations/find/utils.d.ts.map +1 -1
- package/dist/server/operations/find/utils.js +19 -2
- package/dist/server/operations/find/utils.js.map +1 -1
- package/dist/server/operations/insertMany.d.ts.map +1 -1
- package/dist/server/operations/insertMany.js +36 -2
- package/dist/server/operations/insertMany.js.map +1 -1
- package/dist/server/operations/updateMany.d.ts.map +1 -1
- package/dist/server/operations/updateMany.js +134 -133
- package/dist/server/operations/updateMany.js.map +1 -1
- package/dist/server/utils/revision.d.ts +49 -0
- package/dist/server/utils/revision.d.ts.map +1 -0
- package/dist/server/utils/revision.js +92 -0
- package/dist/server/utils/revision.js.map +1 -0
- package/dist/server/utils/updateOperators.d.ts +25 -0
- package/dist/server/utils/updateOperators.d.ts.map +1 -0
- package/dist/server/utils/updateOperators.js +76 -0
- package/dist/server/utils/updateOperators.js.map +1 -0
- package/dist/sharp-layer.zip +0 -0
- package/package.json +1 -1
|
@@ -14,7 +14,9 @@ import { calculateChunks, executeChunks } from '../utils/chunking.js';
|
|
|
14
14
|
import { CostTracker } from '../utils/cost-tracker.js';
|
|
15
15
|
import { executeDynamoDBOperation, getDBClient, getTableName, removeShadowKeys, } from '../utils/dynamodb.js';
|
|
16
16
|
import { applyJsonMergePatch } from '../utils/mergePatch.js';
|
|
17
|
+
import { REVISION_ATTRIBUTE, nextRevision, notExistsCondition, revisionOf, unchangedCondition, writeWithConflictRetry, } from '../utils/revision.js';
|
|
17
18
|
import { addUpdateTimestamp } from '../utils/timestamps.js';
|
|
19
|
+
import { equalityFieldsOf, resolveUpdateOperators } from '../utils/updateOperators.js';
|
|
18
20
|
import { findAllByFilter } from './findAll.js';
|
|
19
21
|
const logger = createLogger({ service: 'records-lambda' });
|
|
20
22
|
/**
|
|
@@ -44,6 +46,8 @@ export async function handleUpdateMany(resource, params, requestId) {
|
|
|
44
46
|
const upsert = options?.upsert ?? false;
|
|
45
47
|
const startTime = Date.now();
|
|
46
48
|
const costTracker = new CostTracker();
|
|
49
|
+
// $set / $setOnInsert / $unset を解釈する(対応していない演算子は 400。黙って無視しない)
|
|
50
|
+
const update = resolveUpdateOperators(patchData);
|
|
47
51
|
logger.debug('Executing updateMany', {
|
|
48
52
|
requestId,
|
|
49
53
|
resource,
|
|
@@ -93,22 +97,11 @@ export async function handleUpdateMany(resource, params, requestId) {
|
|
|
93
97
|
newId,
|
|
94
98
|
filter: params.filter,
|
|
95
99
|
});
|
|
96
|
-
// filter
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
...patchData.$setOnInsert,
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
else if (patchData.$set) {
|
|
105
|
-
// $setOnInsertがない場合は、filterを$setOnInsertとして追加
|
|
106
|
-
patchData.$setOnInsert = params.filter;
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
// $setも$setOnInsertもない場合は、filterを$setOnInsertとして追加
|
|
110
|
-
patchData.$setOnInsert = params.filter;
|
|
111
|
-
}
|
|
100
|
+
// filter の等値の条件を、新規レコードに入れる($setOnInsert が優先)
|
|
101
|
+
update.setOnInsert = {
|
|
102
|
+
...equalityFieldsOf(params.filter),
|
|
103
|
+
...update.setOnInsert,
|
|
104
|
+
};
|
|
112
105
|
}
|
|
113
106
|
else {
|
|
114
107
|
// upsert: false の場合は空レスポンスを返す
|
|
@@ -126,142 +119,145 @@ export async function handleUpdateMany(resource, params, requestId) {
|
|
|
126
119
|
logLargeBatchWarning('updateMany', ids.length, requestId, resource);
|
|
127
120
|
const dbClient = getDBClient();
|
|
128
121
|
const tableName = getTableName();
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
resource,
|
|
153
|
-
notFoundCount: notFoundIds.length,
|
|
154
|
-
notFoundIds: notFoundIds.slice(0, 10), // 最初の10件のみログ
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
// シャドー設定を取得(環境変数からキャッシュ付き)
|
|
158
|
-
const shadowConfig = getShadowConfig();
|
|
159
|
-
const preparedRecords = [];
|
|
160
|
-
const preparationFailedIds = [];
|
|
161
|
-
const preparationErrors = [];
|
|
162
|
-
// 既存レコードを準備
|
|
163
|
-
for (const item of existingItems) {
|
|
164
|
-
try {
|
|
165
|
-
const existingData = item.data;
|
|
166
|
-
const id = existingData.id;
|
|
167
|
-
// 新構造(トップレベル)→ 旧構造(data内)の順でフォールバック
|
|
168
|
-
const oldShadowKeys = (item.__shadowKeys ?? existingData.__shadowKeys) ?? [];
|
|
169
|
-
// UpdateOperators形式の場合、$set のみを抽出($setOnInsert は無視)
|
|
170
|
-
const actualPatchData = patchData.$set
|
|
171
|
-
? patchData.$set
|
|
172
|
-
: patchData;
|
|
173
|
-
// updatedAt はパッチ側に付ける(クライアントが指定した値があればそれを優先する)。
|
|
174
|
-
// 既存レコードの updatedAt に後勝ちさせると、更新しても値が変わらなくなる
|
|
175
|
-
const timestampedPatch = addUpdateTimestamp(actualPatchData);
|
|
176
|
-
// JSON Merge Patchを適用
|
|
177
|
-
const mergedData = applyJsonMergePatch(removeShadowKeys(existingData), timestampedPatch);
|
|
178
|
-
const updatedData = { ...mergedData, id };
|
|
179
|
-
// 新しいシャドーレコードを生成(自動フィールド検出)
|
|
180
|
-
const newShadowRecords = generateShadowRecords(updatedData, resource, shadowConfig);
|
|
181
|
-
const newShadowKeys = newShadowRecords.map((shadow) => shadow.SK);
|
|
182
|
-
// メインレコードのSKを生成
|
|
183
|
-
const mainSK = generateMainRecordSK(id);
|
|
184
|
-
preparedRecords.push({
|
|
185
|
-
id,
|
|
186
|
-
updatedData,
|
|
187
|
-
oldShadowKeys,
|
|
188
|
-
newShadowKeys,
|
|
189
|
-
mainSK,
|
|
122
|
+
/**
|
|
123
|
+
* 対象を読み、更新後のレコードとシャドーを作る
|
|
124
|
+
*
|
|
125
|
+
* 書き込みが競合したときは、対象を読み直して作り直すために、もう一度呼ぶ。
|
|
126
|
+
*/
|
|
127
|
+
const prepare = async (targetIds) => {
|
|
128
|
+
// BatchGetItemで既存レコードを取得(100件ごとに分割し、UnprocessedKeys は再試行する。
|
|
129
|
+
// 取りこぼすと「存在しない」と誤認して更新・削除の対象から漏れるため、解消しなければエラーにする)
|
|
130
|
+
const existingItems = await batchGetAll(targetIds.map((id) => ({ PK: resource, SK: generateMainRecordSK(id) })), { consistentRead: true, costTracker, requestId });
|
|
131
|
+
// 存在するレコードのIDセットを作成
|
|
132
|
+
const existingIds = new Set(existingItems.map((item) => {
|
|
133
|
+
const data = item.data;
|
|
134
|
+
return data.id;
|
|
135
|
+
}));
|
|
136
|
+
// 存在しないIDを特定
|
|
137
|
+
const notFoundIds = targetIds.filter((id) => !existingIds.has(id));
|
|
138
|
+
// upsert: false の場合、存在しないIDはエラーとして扱う
|
|
139
|
+
if (!upsert && notFoundIds.length > 0) {
|
|
140
|
+
logger.warn('Records not found (upsert: false)', {
|
|
141
|
+
requestId,
|
|
142
|
+
resource,
|
|
143
|
+
notFoundCount: notFoundIds.length,
|
|
144
|
+
notFoundIds: notFoundIds.slice(0, 10), // 最初の10件のみログ
|
|
190
145
|
});
|
|
191
146
|
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
const failedId = existingData.id || 'unknown-id';
|
|
196
|
-
const errorMessage = error instanceof Error ? error.message : 'Unknown preparation error';
|
|
197
|
-
const errorCode = getPreparationErrorCode(error);
|
|
198
|
-
logger.error('Failed to prepare record for update', {
|
|
147
|
+
// upsert: true の場合、存在しないIDに対して新規レコードを作成
|
|
148
|
+
if (upsert && notFoundIds.length > 0) {
|
|
149
|
+
logger.info('Creating new records (upsert: true)', {
|
|
199
150
|
requestId,
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
});
|
|
204
|
-
// 準備失敗をエラーリストに追加
|
|
205
|
-
preparationFailedIds.push(failedId);
|
|
206
|
-
preparationErrors.push({
|
|
207
|
-
id: failedId,
|
|
208
|
-
code: errorCode,
|
|
209
|
-
message: errorMessage,
|
|
151
|
+
resource,
|
|
152
|
+
notFoundCount: notFoundIds.length,
|
|
153
|
+
notFoundIds: notFoundIds.slice(0, 10), // 最初の10件のみログ
|
|
210
154
|
});
|
|
211
155
|
}
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
const
|
|
217
|
-
|
|
156
|
+
// シャドー設定を取得(環境変数からキャッシュ付き)
|
|
157
|
+
const shadowConfig = getShadowConfig();
|
|
158
|
+
const preparedRecords = [];
|
|
159
|
+
const preparationFailedIds = [];
|
|
160
|
+
const preparationErrors = [];
|
|
161
|
+
// 既存レコードを準備
|
|
162
|
+
for (const item of existingItems) {
|
|
218
163
|
try {
|
|
219
|
-
|
|
220
|
-
const
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
//
|
|
225
|
-
const
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
const newData = addCreateTimestamps(mergedData);
|
|
232
|
-
// 新しいシャドーレコードを生成
|
|
233
|
-
const newShadowRecords = generateShadowRecords(newData, resource, shadowConfig);
|
|
164
|
+
const existingData = item.data;
|
|
165
|
+
const id = existingData.id;
|
|
166
|
+
// 新構造(トップレベル)→ 旧構造(data内)の順でフォールバック
|
|
167
|
+
const oldShadowKeys = (item.__shadowKeys ?? existingData.__shadowKeys) ?? [];
|
|
168
|
+
// updatedAt はパッチ側に付ける(クライアントが指定した値があればそれを優先する)。
|
|
169
|
+
// 既存レコードの updatedAt に後勝ちさせると、更新しても値が変わらなくなる
|
|
170
|
+
const timestampedPatch = addUpdateTimestamp(update.patch);
|
|
171
|
+
// JSON Merge Patchを適用
|
|
172
|
+
const mergedData = applyJsonMergePatch(removeShadowKeys(existingData), timestampedPatch);
|
|
173
|
+
const updatedData = { ...mergedData, id };
|
|
174
|
+
// 新しいシャドーレコードを生成(自動フィールド検出)
|
|
175
|
+
const newShadowRecords = generateShadowRecords(updatedData, resource, shadowConfig);
|
|
234
176
|
const newShadowKeys = newShadowRecords.map((shadow) => shadow.SK);
|
|
235
177
|
// メインレコードのSKを生成
|
|
236
178
|
const mainSK = generateMainRecordSK(id);
|
|
237
179
|
preparedRecords.push({
|
|
238
180
|
id,
|
|
239
|
-
updatedData
|
|
240
|
-
oldShadowKeys
|
|
181
|
+
updatedData,
|
|
182
|
+
oldShadowKeys,
|
|
241
183
|
newShadowKeys,
|
|
242
184
|
mainSK,
|
|
185
|
+
isNew: false,
|
|
186
|
+
revision: revisionOf(item),
|
|
243
187
|
});
|
|
244
188
|
}
|
|
245
189
|
catch (error) {
|
|
246
190
|
// 準備段階で失敗したレコードを記録
|
|
191
|
+
const existingData = item.data;
|
|
192
|
+
const failedId = existingData.id || 'unknown-id';
|
|
247
193
|
const errorMessage = error instanceof Error ? error.message : 'Unknown preparation error';
|
|
248
194
|
const errorCode = getPreparationErrorCode(error);
|
|
249
|
-
logger.error('Failed to prepare
|
|
195
|
+
logger.error('Failed to prepare record for update', {
|
|
250
196
|
requestId,
|
|
251
|
-
recordId:
|
|
197
|
+
recordId: failedId,
|
|
252
198
|
error: errorMessage,
|
|
253
199
|
errorCode,
|
|
254
200
|
});
|
|
255
201
|
// 準備失敗をエラーリストに追加
|
|
256
|
-
preparationFailedIds.push(
|
|
202
|
+
preparationFailedIds.push(failedId);
|
|
257
203
|
preparationErrors.push({
|
|
258
|
-
id,
|
|
204
|
+
id: failedId,
|
|
259
205
|
code: errorCode,
|
|
260
206
|
message: errorMessage,
|
|
261
207
|
});
|
|
262
208
|
}
|
|
263
209
|
}
|
|
264
|
-
|
|
210
|
+
// upsert: true の場合、存在しないIDに対して新規レコードを作成
|
|
211
|
+
if (upsert && notFoundIds.length > 0) {
|
|
212
|
+
// タイムスタンプヘルパーをインポート
|
|
213
|
+
const { addCreateTimestamps } = await import('../utils/timestamps.js');
|
|
214
|
+
for (const id of notFoundIds) {
|
|
215
|
+
try {
|
|
216
|
+
// $setOnInsert を先に当て、その後 $set で上書きする。
|
|
217
|
+
// 既存レコードの更新と同じ JSON Merge Patch を使う('a.b' はネスト、null・$unset は入れない)
|
|
218
|
+
const mergedData = {
|
|
219
|
+
...applyJsonMergePatch({}, { ...update.setOnInsert, ...update.patch }),
|
|
220
|
+
id,
|
|
221
|
+
};
|
|
222
|
+
// createdAtとupdatedAtを追加
|
|
223
|
+
const newData = addCreateTimestamps(mergedData);
|
|
224
|
+
// 新しいシャドーレコードを生成
|
|
225
|
+
const newShadowRecords = generateShadowRecords(newData, resource, shadowConfig);
|
|
226
|
+
const newShadowKeys = newShadowRecords.map((shadow) => shadow.SK);
|
|
227
|
+
// メインレコードのSKを生成
|
|
228
|
+
const mainSK = generateMainRecordSK(id);
|
|
229
|
+
preparedRecords.push({
|
|
230
|
+
id,
|
|
231
|
+
updatedData: newData,
|
|
232
|
+
oldShadowKeys: [], // 新規作成なので空
|
|
233
|
+
newShadowKeys,
|
|
234
|
+
mainSK,
|
|
235
|
+
isNew: true,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
// 準備段階で失敗したレコードを記録
|
|
240
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown preparation error';
|
|
241
|
+
const errorCode = getPreparationErrorCode(error);
|
|
242
|
+
logger.error('Failed to prepare new record for upsert', {
|
|
243
|
+
requestId,
|
|
244
|
+
recordId: id,
|
|
245
|
+
error: errorMessage,
|
|
246
|
+
errorCode,
|
|
247
|
+
});
|
|
248
|
+
// 準備失敗をエラーリストに追加
|
|
249
|
+
preparationFailedIds.push(id);
|
|
250
|
+
preparationErrors.push({
|
|
251
|
+
id,
|
|
252
|
+
code: errorCode,
|
|
253
|
+
message: errorMessage,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return { preparedRecords, notFoundIds, preparationFailedIds, preparationErrors };
|
|
259
|
+
};
|
|
260
|
+
const { preparedRecords, notFoundIds, preparationFailedIds, preparationErrors } = await prepare(ids);
|
|
265
261
|
// アイテム数計算関数(1 + 削除シャドー数 + 追加シャドー数)
|
|
266
262
|
const getItemCount = (record) => {
|
|
267
263
|
const shadowDiff = calculateShadowDiff(record.oldShadowKeys, record.newShadowKeys);
|
|
@@ -273,7 +269,7 @@ export async function handleUpdateMany(resource, params, requestId) {
|
|
|
273
269
|
const preparationRiskInfo = calculateTimeoutRisk(startTime);
|
|
274
270
|
logPreparationTimeoutRisk(requestId, resource, preparedRecords.length, chunks.length, preparationRiskInfo);
|
|
275
271
|
// チャンク実行関数
|
|
276
|
-
const
|
|
272
|
+
const writeChunk = async (chunk) => {
|
|
277
273
|
const transactItems = [];
|
|
278
274
|
// チャンク内の各レコードをTransactItemsに変換
|
|
279
275
|
for (const record of chunk) {
|
|
@@ -287,10 +283,13 @@ export async function handleUpdateMany(resource, params, requestId) {
|
|
|
287
283
|
PK: resource,
|
|
288
284
|
SK: record.mainSK,
|
|
289
285
|
__shadowKeys: record.newShadowKeys,
|
|
286
|
+
[REVISION_ATTRIBUTE]: nextRevision(record.revision),
|
|
290
287
|
data: {
|
|
291
288
|
...record.updatedData,
|
|
292
289
|
},
|
|
293
290
|
},
|
|
291
|
+
// 読んでから書くまでの間に、ほかの書き込みが入っていないこと(楽観ロック)
|
|
292
|
+
...(record.isNew ? notExistsCondition() : unchangedCondition(record.revision)),
|
|
294
293
|
},
|
|
295
294
|
});
|
|
296
295
|
// 旧シャドーを削除
|
|
@@ -333,9 +332,16 @@ export async function handleUpdateMany(resource, params, requestId) {
|
|
|
333
332
|
else {
|
|
334
333
|
costTracker.add(result.ConsumedCapacity);
|
|
335
334
|
}
|
|
336
|
-
// 成功したレコードを返す
|
|
337
|
-
return chunk;
|
|
338
335
|
};
|
|
336
|
+
// 競合したら(ほかの書き込みが先に入ったら)、読み直して作り直し、やり直す
|
|
337
|
+
const executeChunk = (chunk) => writeWithConflictRetry(chunk, writeChunk, async (stale) => {
|
|
338
|
+
const fresh = await prepare(stale.map((record) => record.id));
|
|
339
|
+
if (fresh.preparedRecords.length !== stale.length) {
|
|
340
|
+
// 読み直したら対象が消えていた(同時に削除された)・作り直せなかった
|
|
341
|
+
throw new AppError(ErrorCode.INTERNAL_ERROR, 'Records changed concurrently and could not be re-read for update', 409);
|
|
342
|
+
}
|
|
343
|
+
return fresh.preparedRecords;
|
|
344
|
+
});
|
|
339
345
|
// チャンクを順次実行
|
|
340
346
|
const { successRecords, failedIds: chunkFailedIds, errors: chunkErrors, } = await executeChunks(chunks, executeChunk, (record) => record.id);
|
|
341
347
|
// 統一レスポンス形式を構築
|
|
@@ -345,11 +351,6 @@ export async function handleUpdateMany(resource, params, requestId) {
|
|
|
345
351
|
const items = [];
|
|
346
352
|
const failedIdsMap = {};
|
|
347
353
|
const errorsMap = {};
|
|
348
|
-
// UpdateOperators形式の場合、$set のみを抽出($setOnInsert は無視)
|
|
349
|
-
const actualPatchData = patchData.$set ? patchData.$set : patchData;
|
|
350
|
-
const setOnInsertData = patchData.$setOnInsert
|
|
351
|
-
? patchData.$setOnInsert
|
|
352
|
-
: {};
|
|
353
354
|
// 成功したレコードのインデックスを特定
|
|
354
355
|
const successIdSet = new Set(successRecords.map((r) => r.id));
|
|
355
356
|
for (let i = 0; i < ids.length; i++) {
|
|
@@ -360,15 +361,15 @@ export async function handleUpdateMany(resource, params, requestId) {
|
|
|
360
361
|
if (upsert && notFoundIds.includes(id)) {
|
|
361
362
|
items.push({
|
|
362
363
|
id,
|
|
363
|
-
...
|
|
364
|
-
...
|
|
364
|
+
...update.setOnInsert,
|
|
365
|
+
...update.returned,
|
|
365
366
|
});
|
|
366
367
|
}
|
|
367
368
|
else {
|
|
368
369
|
// 既存レコード更新の場合は、$setのみ
|
|
369
370
|
items.push({
|
|
370
371
|
id,
|
|
371
|
-
...
|
|
372
|
+
...update.returned,
|
|
372
373
|
});
|
|
373
374
|
}
|
|
374
375
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateMany.js","sourceRoot":"","sources":["../../../src/server/operations/updateMany.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/E,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EACL,wBAAwB,EACxB,WAAW,EACX,YAAY,EACZ,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;AAkB3D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,MAAwB,EACxB,SAAiB;IAEjB,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAC5C,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,KAAK,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;IAEtC,MAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE;QACnC,SAAS;QACT,QAAQ;QACR,MAAM;KACP,CAAC,CAAC;IAEH,+BAA+B;IAC/B,IAAI,GAAa,CAAC;IAElB,IAAI,KAAK,IAAI,MAAM,EAAE,CAAC;QACpB,gBAAgB;QAChB,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QAEjB,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE;YAC5C,SAAS;YACT,QAAQ;YACR,KAAK,EAAE,GAAG,CAAC,MAAM;SAClB,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,mBAAmB;QACnB,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE;YAC/C,SAAS;YACT,QAAQ;YACR,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC,CAAC;QAEH,wCAAwC;QACxC,2CAA2C;QAC3C,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAiC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvE,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,gBAAgB,EAC1B,+CAA+C,EAC/C,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,wCAAwC;QACxC,MAAM,OAAO,GAAG,MAAM,eAAe,CACnC,QAAQ,EACR,MAAM,CAAC,MAAiC,EACxC,SAAS,CACV,CAAC;QAEF,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAY,CAAC,CAAC;QAE/C,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE;YACxC,SAAS;YACT,QAAQ;YACR,KAAK,EAAE,GAAG,CAAC,MAAM;SAClB,CAAC,CAAC;QAEH,wBAAwB;QACxB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,IAAI,MAAM,EAAE,CAAC;gBACX,6BAA6B;gBAC7B,WAAW;gBACX,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC;gBACrB,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;gBAEd,MAAM,CAAC,IAAI,CAAC,gDAAgD,EAAE;oBAC5D,SAAS;oBACT,QAAQ;oBACR,KAAK;oBACL,MAAM,EAAE,MAAM,CAAC,MAAM;iBACtB,CAAC,CAAC;gBAEH,6BAA6B;gBAC7B,sCAAsC;gBACtC,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;oBAC3B,SAAS,CAAC,YAAY,GAAG;wBACvB,GAAG,MAAM,CAAC,MAAM;wBAChB,GAAG,SAAS,CAAC,YAAY;qBAC1B,CAAC;gBACJ,CAAC;qBAAM,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;oBAC1B,8CAA8C;oBAC9C,SAAS,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACN,mDAAmD;oBACnD,SAAS,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;gBACzC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,8BAA8B;gBAC9B,OAAO;oBACL,KAAK,EAAE,CAAC;oBACR,UAAU,EAAE,EAAE;oBACd,SAAS,EAAE,EAAE;oBACb,MAAM,EAAE,EAAE;oBACV,gBAAgB,EAAE,WAAW,CAAC,aAAa,EAAE;iBAC9C,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,8BAA8B;IAC9B,oBAAoB,CAAC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEpE,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IAEjC,4DAA4D;IAC5D,mDAAmD;IACnD,MAAM,aAAa,GAAG,MAAM,WAAW,CACrC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,oBAAoB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACjE,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CACjD,CAAC;IAEF,oBAAoB;IACpB,MAAM,WAAW,GAAG,IAAI,GAAG,CACzB,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAA+B,CAAC;QAClD,OAAO,IAAI,CAAC,EAAY,CAAC;IAC3B,CAAC,CAAC,CACH,CAAC;IAEF,aAAa;IACb,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAE7D,qCAAqC;IACrC,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE;YAC/C,SAAS;YACT,QAAQ;YACR,aAAa,EAAE,WAAW,CAAC,MAAM;YACjC,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,aAAa;SACrD,CAAC,CAAC;IACL,CAAC;IAED,wCAAwC;IACxC,IAAI,MAAM,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE;YACjD,SAAS;YACT,QAAQ;YACR,aAAa,EAAE,WAAW,CAAC,MAAM;YACjC,WAAW,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,aAAa;SACrD,CAAC,CAAC;IACL,CAAC;IAED,2BAA2B;IAC3B,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IAEvC,MAAM,eAAe,GAA2B,EAAE,CAAC;IACnD,MAAM,oBAAoB,GAAa,EAAE,CAAC;IAC1C,MAAM,iBAAiB,GAAqB,EAAE,CAAC;IAE/C,YAAY;IACZ,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,IAA+B,CAAC;YAC1D,MAAM,EAAE,GAAG,YAAY,CAAC,EAAY,CAAC;YACrC,oCAAoC;YACpC,MAAM,aAAa,GAAI,CAAC,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,YAAY,CAAc,IAAI,EAAE,CAAC;YAE3F,oDAAoD;YACpD,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI;gBACpC,CAAC,CAAE,SAAS,CAAC,IAAgC;gBAC7C,CAAC,CAAC,SAAS,CAAC;YAEd,gDAAgD;YAChD,4CAA4C;YAC5C,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,eAAe,CAAC,CAAC;YAE7D,sBAAsB;YACtB,MAAM,UAAU,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,YAAY,CAAC,EAAE,gBAAgB,CAAC,CAAC;YAEzF,MAAM,WAAW,GAA4B,EAAE,GAAG,UAAU,EAAE,EAAE,EAAE,CAAC;YAEnE,4BAA4B;YAC5B,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;YACpF,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAElE,gBAAgB;YAChB,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,CAAC,CAAC;YAExC,eAAe,CAAC,IAAI,CAAC;gBACnB,EAAE;gBACF,WAAW;gBACX,aAAa;gBACb,aAAa;gBACb,MAAM;aACP,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,mBAAmB;YACnB,MAAM,YAAY,GAAG,IAAI,CAAC,IAA+B,CAAC;YAC1D,MAAM,QAAQ,GAAI,YAAY,CAAC,EAAa,IAAI,YAAY,CAAC;YAC7D,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC;YAC1F,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;YAEjD,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE;gBAClD,SAAS;gBACT,QAAQ,EAAE,QAAQ;gBAClB,KAAK,EAAE,YAAY;gBACnB,SAAS;aACV,CAAC,CAAC;YAEH,iBAAiB;YACjB,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpC,iBAAiB,CAAC,IAAI,CAAC;gBACrB,EAAE,EAAE,QAAQ;gBACZ,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,YAAY;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,IAAI,MAAM,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,oBAAoB;QACpB,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QAEvE,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,iCAAiC;gBACjC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAE,SAAS,CAAC,IAAgC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACzF,MAAM,eAAe,GAAG,SAAS,CAAC,YAAY;oBAC5C,CAAC,CAAE,SAAS,CAAC,YAAwC;oBACrD,CAAC,CAAC,EAAE,CAAC;gBAEP,iCAAiC;gBACjC,MAAM,UAAU,GAAG;oBACjB,GAAG,eAAe;oBAClB,GAAG,OAAO;oBACV,EAAE;iBACH,CAAC;gBAEF,yBAAyB;gBACzB,MAAM,OAAO,GAA4B,mBAAmB,CAAC,UAAU,CAAC,CAAC;gBAEzE,iBAAiB;gBACjB,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;gBAChF,MAAM,aAAa,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAElE,gBAAgB;gBAChB,MAAM,MAAM,GAAG,oBAAoB,CAAC,EAAE,CAAC,CAAC;gBAExC,eAAe,CAAC,IAAI,CAAC;oBACnB,EAAE;oBACF,WAAW,EAAE,OAAO;oBACpB,aAAa,EAAE,EAAE,EAAE,WAAW;oBAC9B,aAAa;oBACb,MAAM;iBACP,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,mBAAmB;gBACnB,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC;gBAC1F,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;gBAEjD,MAAM,CAAC,KAAK,CAAC,yCAAyC,EAAE;oBACtD,SAAS;oBACT,QAAQ,EAAE,EAAE;oBACZ,KAAK,EAAE,YAAY;oBACnB,SAAS;iBACV,CAAC,CAAC;gBAEH,iBAAiB;gBACjB,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC9B,iBAAiB,CAAC,IAAI,CAAC;oBACrB,EAAE;oBACF,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,YAAY;iBACtB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,mCAAmC;IACnC,MAAM,YAAY,GAAG,CAAC,MAA4B,EAAU,EAAE;QAC5D,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;IAClE,CAAC,CAAC;IAEF,SAAS;IACT,MAAM,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;IAElE,4BAA4B;IAC5B,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC5D,yBAAyB,CACvB,SAAS,EACT,QAAQ,EACR,eAAe,CAAC,MAAM,EACtB,MAAM,CAAC,MAAM,EACb,mBAAmB,CACpB,CAAC;IAEF,WAAW;IACX,MAAM,YAAY,GAAG,KAAK,EAAE,KAA6B,EAAmC,EAAE;QAC5F,MAAM,aAAa,GAGd,EAAE,CAAC;QAER,+BAA+B;QAC/B,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,CAAC;YAC3B,YAAY;YACZ,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;YAEnF,aAAa;YACb,aAAa,CAAC,IAAI,CAAC;gBACjB,GAAG,EAAE;oBACH,SAAS,EAAE,SAAS;oBACpB,IAAI,EAAE;wBACJ,EAAE,EAAE,QAAQ;wBACZ,EAAE,EAAE,MAAM,CAAC,MAAM;wBACjB,YAAY,EAAE,MAAM,CAAC,aAAa;wBAClC,IAAI,EAAE;4BACJ,GAAG,MAAM,CAAC,WAAW;yBACtB;qBACF;iBACF;aACF,CAAC,CAAC;YAEH,WAAW;YACX,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;gBAC3C,aAAa,CAAC,IAAI,CAAC;oBACjB,MAAM,EAAE;wBACN,SAAS,EAAE,SAAS;wBACpB,GAAG,EAAE;4BACH,EAAE,EAAE,QAAQ;4BACZ,EAAE,EAAE,QAAQ;yBACb;qBACF;iBACF,CAAC,CAAC;YACL,CAAC;YAED,WAAW;YACX,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;gBACxC,aAAa,CAAC,IAAI,CAAC;oBACjB,GAAG,EAAE;wBACH,SAAS,EAAE,SAAS;wBACpB,IAAI,EAAE;4BACJ,EAAE,EAAE,QAAQ;4BACZ,EAAE,EAAE,QAAQ;4BACZ,IAAI,EAAE,EAAE;yBACT;qBACF;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,wBAAwB;QACxB,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAC3C,GAAG,EAAE,CACH,QAAQ,CAAC,IAAI,CACX,IAAI,oBAAoB,CAAC;YACvB,aAAa,EAAE,aAAa;YAC5B,sBAAsB,EAAE,OAAO;SAChC,CAAC,CACH,EACH,oBAAoB,CACrB,CAAC;QAEF,2CAA2C;QAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC3C,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAC/C,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC3C,CAAC;QAED,cAAc;QACd,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,YAAY;IACZ,MAAM,EACJ,cAAc,EACd,SAAS,EAAE,cAAc,EACzB,MAAM,EAAE,WAAW,GACpB,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAErE,eAAe;IACf,mDAAmD;IACnD,uCAAuC;IACvC,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAmC,EAAE,CAAC;IACjD,MAAM,YAAY,GAA2B,EAAE,CAAC;IAChD,MAAM,SAAS,GAAmC,EAAE,CAAC;IAErD,oDAAoD;IACpD,MAAM,eAAe,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAE,SAAS,CAAC,IAAgC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjG,MAAM,eAAe,GAAG,SAAS,CAAC,YAAY;QAC5C,CAAC,CAAE,SAAS,CAAC,YAAwC;QACrD,CAAC,CAAC,EAAE,CAAC;IAEP,qBAAqB;IACrB,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACzB,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YAEnB,wCAAwC;YACxC,IAAI,MAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE;oBACF,GAAG,eAAe;oBAClB,GAAG,eAAe;iBACnB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,sBAAsB;gBACtB,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE;oBACF,GAAG,eAAe;iBACnB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAClB,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC7B,YAAY,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;gBACrB,SAAS,CAAC,CAAC,CAAC,GAAG;oBACb,EAAE;oBACF,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,qBAAqB,EAAE,EAAE;iBACnC,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,oBAAoB,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACtC,YAAY,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YACzD,IAAI,KAAK,EAAE,CAAC;gBACV,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YAChC,YAAY,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YACnD,IAAI,KAAK,EAAE,CAAC;gBACV,SAAS,CAAC,CAAC,CAAC,GAAG;oBACb,EAAE,EAAE,KAAK,CAAC,EAAE;oBACZ,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC;IAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAEjD,sBAAsB;IACtB,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAE3D,wBAAwB,CACtB,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,GAAG,CAAC,MAAM,EACV,KAAK,EACL,YAAY,CAAC,MAAM,EACnB,kBAAkB,EAClB;QACE,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,qBAAqB;QAChE,iBAAiB,EAAE,oBAAoB,CAAC,MAAM;QAC9C,oBAAoB,EAAE,cAAc,CAAC,MAAM;QAC3C,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,yBAAyB;KACrE,CACF,CAAC;IAEF,0BAA0B;IAC1B,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,iBAAiB,CACf,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,GAAG,CAAC,MAAM,EACV,KAAK,EACL,YAAY,CAAC,MAAM,EACnB,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAC3C;YACE,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,qBAAqB;YACrE,mBAAmB,EAAE,oBAAoB,CAAC,MAAM;YAChD,sBAAsB,EAAE,cAAc,CAAC,MAAM;SAC9C,CACF,CAAC;IACJ,CAAC;IAED,eAAe;IACf,OAAO;QACL,KAAK;QACL,UAAU;QACV,SAAS,EAAE,YAAY;QACvB,MAAM,EAAE,SAAS;QACjB,KAAK,EAAE,gCAAgC;QACvC,gBAAgB,EAAE,WAAW,CAAC,aAAa,EAAE;KAC9C,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,uBAAuB,CAAC,KAAc;IAC7C,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,UAAU;QACV,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtD,OAAO,KAAK,CAAC,IAAI,CAAC;QACpB,CAAC;QACD,cAAc;QACd,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtD,OAAO,KAAK,CAAC,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC,gBAAgB,CAAC;AACpC,CAAC"}
|
|
1
|
+
{"version":3,"file":"updateMany.js","sourceRoot":"","sources":["../../../src/server/operations/updateMany.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 楽観ロック(本体レコードの版 `__rev`)
|
|
3
|
+
*
|
|
4
|
+
* 更新・削除は「読む → 作り直す → 書く」の順に行う。読んでから書くまでの間に、ほかの書き込みが
|
|
5
|
+
* 入ると、(1) 相手の変更を上書きして失い、(2) シャドーの差分を古い一覧から計算するので、
|
|
6
|
+
* 消すべきシャドーが残り、一覧(`__shadowKeys`)と実物が食い違う。
|
|
7
|
+
*
|
|
8
|
+
* 本体レコードに版を持たせ、書き込みに「読んだときの版のまま」という条件を付ける。
|
|
9
|
+
* 条件に外れたら(= ほかの書き込みが先に入ったら)、読み直してやり直す。
|
|
10
|
+
* 条件は本体の Put / Delete に付けるだけなので、読み書きの容量は増えない。
|
|
11
|
+
*
|
|
12
|
+
* - 版は、項目の最上位の属性(`data` の外)。クライアントには返らない
|
|
13
|
+
* - 版の無いレコード(この仕組みの前に書かれたもの)は、「版が無いまま」を条件にする
|
|
14
|
+
*/
|
|
15
|
+
/** 本体レコードの版の属性名(最上位。`__shadowKeys` と同じ並び) */
|
|
16
|
+
export declare const REVISION_ATTRIBUTE = "__rev";
|
|
17
|
+
/** 競合したときに読み直してやり直す回数の上限 */
|
|
18
|
+
export declare const MAX_CONFLICT_RETRIES = 5;
|
|
19
|
+
type Condition = {
|
|
20
|
+
ConditionExpression: string;
|
|
21
|
+
ExpressionAttributeNames?: Record<string, string>;
|
|
22
|
+
ExpressionAttributeValues?: Record<string, unknown>;
|
|
23
|
+
};
|
|
24
|
+
/** 読んだ項目の版(無ければ undefined) */
|
|
25
|
+
export declare function revisionOf(item: Record<string, unknown>): number | undefined;
|
|
26
|
+
/** 次に書く版 */
|
|
27
|
+
export declare function nextRevision(current: number | undefined): number;
|
|
28
|
+
/** 条件: レコードがまだ無い(新規作成) */
|
|
29
|
+
export declare function notExistsCondition(): Condition;
|
|
30
|
+
/** 条件: レコードが、読んだときの版のまま(更新・削除) */
|
|
31
|
+
export declare function unchangedCondition(revision: number | undefined): Condition;
|
|
32
|
+
/**
|
|
33
|
+
* ほかの書き込みとの競合か(読み直せば通る失敗か)
|
|
34
|
+
*
|
|
35
|
+
* TransactWriteItems は、条件に外れた・同じ項目を別のトランザクションが処理中、のどちらでも
|
|
36
|
+
* TransactionCanceledException を返す。理由が競合だけのときに限って、やり直す。
|
|
37
|
+
*/
|
|
38
|
+
export declare function isWriteConflict(error: unknown): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* 書き込みを実行し、競合したら、読み直して作り直したレコードでやり直す
|
|
41
|
+
*
|
|
42
|
+
* @param initial - 最初に書くレコード(読んだ時点の内容から作ったもの)
|
|
43
|
+
* @param write - 1 回のトランザクションで書く
|
|
44
|
+
* @param refresh - 最新を読み直して、同じ対象のレコードを作り直す
|
|
45
|
+
* @returns 実際に書いたレコード
|
|
46
|
+
*/
|
|
47
|
+
export declare function writeWithConflictRetry<T>(initial: T[], write: (records: T[]) => Promise<void>, refresh: (stale: T[]) => Promise<T[]>, baseDelayMs?: number): Promise<T[]>;
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=revision.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revision.d.ts","sourceRoot":"","sources":["../../../src/server/utils/revision.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,6CAA6C;AAC7C,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAE1C,4BAA4B;AAC5B,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,KAAK,SAAS,GAAG;IACf,mBAAmB,EAAE,MAAM,CAAC;IAC5B,wBAAwB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClD,yBAAyB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrD,CAAC;AAEF,8BAA8B;AAC9B,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAG5E;AAED,YAAY;AACZ,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAEhE;AAED,0BAA0B;AAC1B,wBAAgB,kBAAkB,IAAI,SAAS,CAE9C;AAED,kCAAkC;AAClC,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAa1E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAavD;AAMD;;;;;;;GAOG;AACH,wBAAsB,sBAAsB,CAAC,CAAC,EAC5C,OAAO,EAAE,CAAC,EAAE,EACZ,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,EACtC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,EACrC,WAAW,SAAK,GACf,OAAO,CAAC,CAAC,EAAE,CAAC,CAYd"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 楽観ロック(本体レコードの版 `__rev`)
|
|
3
|
+
*
|
|
4
|
+
* 更新・削除は「読む → 作り直す → 書く」の順に行う。読んでから書くまでの間に、ほかの書き込みが
|
|
5
|
+
* 入ると、(1) 相手の変更を上書きして失い、(2) シャドーの差分を古い一覧から計算するので、
|
|
6
|
+
* 消すべきシャドーが残り、一覧(`__shadowKeys`)と実物が食い違う。
|
|
7
|
+
*
|
|
8
|
+
* 本体レコードに版を持たせ、書き込みに「読んだときの版のまま」という条件を付ける。
|
|
9
|
+
* 条件に外れたら(= ほかの書き込みが先に入ったら)、読み直してやり直す。
|
|
10
|
+
* 条件は本体の Put / Delete に付けるだけなので、読み書きの容量は増えない。
|
|
11
|
+
*
|
|
12
|
+
* - 版は、項目の最上位の属性(`data` の外)。クライアントには返らない
|
|
13
|
+
* - 版の無いレコード(この仕組みの前に書かれたもの)は、「版が無いまま」を条件にする
|
|
14
|
+
*/
|
|
15
|
+
/** 本体レコードの版の属性名(最上位。`__shadowKeys` と同じ並び) */
|
|
16
|
+
export const REVISION_ATTRIBUTE = '__rev';
|
|
17
|
+
/** 競合したときに読み直してやり直す回数の上限 */
|
|
18
|
+
export const MAX_CONFLICT_RETRIES = 5;
|
|
19
|
+
/** 読んだ項目の版(無ければ undefined) */
|
|
20
|
+
export function revisionOf(item) {
|
|
21
|
+
const rev = item[REVISION_ATTRIBUTE];
|
|
22
|
+
return typeof rev === 'number' ? rev : undefined;
|
|
23
|
+
}
|
|
24
|
+
/** 次に書く版 */
|
|
25
|
+
export function nextRevision(current) {
|
|
26
|
+
return (current ?? 0) + 1;
|
|
27
|
+
}
|
|
28
|
+
/** 条件: レコードがまだ無い(新規作成) */
|
|
29
|
+
export function notExistsCondition() {
|
|
30
|
+
return { ConditionExpression: 'attribute_not_exists(PK)' };
|
|
31
|
+
}
|
|
32
|
+
/** 条件: レコードが、読んだときの版のまま(更新・削除) */
|
|
33
|
+
export function unchangedCondition(revision) {
|
|
34
|
+
const names = { '#rev': REVISION_ATTRIBUTE };
|
|
35
|
+
if (revision === undefined) {
|
|
36
|
+
return {
|
|
37
|
+
ConditionExpression: 'attribute_exists(PK) AND attribute_not_exists(#rev)',
|
|
38
|
+
ExpressionAttributeNames: names,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
ConditionExpression: '#rev = :rev',
|
|
43
|
+
ExpressionAttributeNames: names,
|
|
44
|
+
ExpressionAttributeValues: { ':rev': revision },
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* ほかの書き込みとの競合か(読み直せば通る失敗か)
|
|
49
|
+
*
|
|
50
|
+
* TransactWriteItems は、条件に外れた・同じ項目を別のトランザクションが処理中、のどちらでも
|
|
51
|
+
* TransactionCanceledException を返す。理由が競合だけのときに限って、やり直す。
|
|
52
|
+
*/
|
|
53
|
+
export function isWriteConflict(error) {
|
|
54
|
+
if (!error || typeof error !== 'object')
|
|
55
|
+
return false;
|
|
56
|
+
const { name, CancellationReasons } = error;
|
|
57
|
+
if (name === 'TransactionConflictException')
|
|
58
|
+
return true;
|
|
59
|
+
if (name !== 'TransactionCanceledException' || !Array.isArray(CancellationReasons))
|
|
60
|
+
return false;
|
|
61
|
+
const codes = CancellationReasons.map((r) => r?.Code).filter((c) => c && c !== 'None');
|
|
62
|
+
return (codes.length > 0 &&
|
|
63
|
+
codes.every((c) => c === 'ConditionalCheckFailed' || c === 'TransactionConflict'));
|
|
64
|
+
}
|
|
65
|
+
function sleep(ms) {
|
|
66
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* 書き込みを実行し、競合したら、読み直して作り直したレコードでやり直す
|
|
70
|
+
*
|
|
71
|
+
* @param initial - 最初に書くレコード(読んだ時点の内容から作ったもの)
|
|
72
|
+
* @param write - 1 回のトランザクションで書く
|
|
73
|
+
* @param refresh - 最新を読み直して、同じ対象のレコードを作り直す
|
|
74
|
+
* @returns 実際に書いたレコード
|
|
75
|
+
*/
|
|
76
|
+
export async function writeWithConflictRetry(initial, write, refresh, baseDelayMs = 20) {
|
|
77
|
+
let records = initial;
|
|
78
|
+
for (let attempt = 0;; attempt++) {
|
|
79
|
+
try {
|
|
80
|
+
if (records.length > 0)
|
|
81
|
+
await write(records);
|
|
82
|
+
return records;
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
if (!isWriteConflict(error) || attempt >= MAX_CONFLICT_RETRIES)
|
|
86
|
+
throw error;
|
|
87
|
+
await sleep(baseDelayMs * 2 ** attempt * (0.5 + Math.random() / 2));
|
|
88
|
+
records = await refresh(records);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=revision.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revision.js","sourceRoot":"","sources":["../../../src/server/utils/revision.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface ResolvedUpdate {
|
|
2
|
+
/** 既存レコードに当てる JSON Merge Patch($set の値。$unset の項目は null = 削除) */
|
|
3
|
+
patch: Record<string, unknown>;
|
|
4
|
+
/** 新規作成のときだけ入れる値($setOnInsert) */
|
|
5
|
+
setOnInsert: Record<string, unknown>;
|
|
6
|
+
/** レスポンスの items に返す値($set の値。演算子が無ければパッチそのもの) */
|
|
7
|
+
returned: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* 更新のデータを解釈する
|
|
11
|
+
*
|
|
12
|
+
* - 演算子(`$` で始まるキー)が無ければ、全体を JSON Merge Patch として扱う
|
|
13
|
+
* - 演算子があれば、$set / $setOnInsert / $unset だけを受け付ける(ほかは 400)
|
|
14
|
+
*
|
|
15
|
+
* @throws AppError VALIDATION_ERROR(400)
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveUpdateOperators(data: Record<string, unknown>): ResolvedUpdate;
|
|
18
|
+
/**
|
|
19
|
+
* フィルタから、新規作成(upsert)のレコードに入れる値を取り出す
|
|
20
|
+
*
|
|
21
|
+
* 等値の条件(`{ field: 値 }`)だけを使う。演算子つき(`{ field: { $gte: … } }`、`'field:$in'`)は、
|
|
22
|
+
* 値として保存できないので使わない。
|
|
23
|
+
*/
|
|
24
|
+
export declare function equalityFieldsOf(filter: Record<string, unknown>): Record<string, unknown>;
|
|
25
|
+
//# sourceMappingURL=updateOperators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updateOperators.d.ts","sourceRoot":"","sources":["../../../src/server/utils/updateOperators.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,cAAc;IAC7B,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AA0BD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,CAuBpF;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQzF"}
|