openxiangda-nest 2.0.0-alpha.100

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.
Files changed (106) hide show
  1. package/README.md +158 -0
  2. package/dist/application-credentials.d.ts +19 -0
  3. package/dist/application-credentials.d.ts.map +1 -0
  4. package/dist/application-credentials.js +158 -0
  5. package/dist/application-credentials.js.map +1 -0
  6. package/dist/assignee-provider.d.ts +35 -0
  7. package/dist/assignee-provider.d.ts.map +1 -0
  8. package/dist/assignee-provider.js +223 -0
  9. package/dist/assignee-provider.js.map +1 -0
  10. package/dist/authz.d.ts +28 -0
  11. package/dist/authz.d.ts.map +1 -0
  12. package/dist/authz.js +207 -0
  13. package/dist/authz.js.map +1 -0
  14. package/dist/bootstrap.d.ts +15 -0
  15. package/dist/bootstrap.d.ts.map +1 -0
  16. package/dist/bootstrap.js +40 -0
  17. package/dist/bootstrap.js.map +1 -0
  18. package/dist/business-action-context.d.ts +14 -0
  19. package/dist/business-action-context.d.ts.map +1 -0
  20. package/dist/business-action-context.js +41 -0
  21. package/dist/business-action-context.js.map +1 -0
  22. package/dist/business-directory.d.ts +14 -0
  23. package/dist/business-directory.d.ts.map +1 -0
  24. package/dist/business-directory.js +40 -0
  25. package/dist/business-directory.js.map +1 -0
  26. package/dist/business-notification.d.ts +23 -0
  27. package/dist/business-notification.d.ts.map +1 -0
  28. package/dist/business-notification.js +58 -0
  29. package/dist/business-notification.js.map +1 -0
  30. package/dist/business-process.d.ts +23 -0
  31. package/dist/business-process.d.ts.map +1 -0
  32. package/dist/business-process.js +106 -0
  33. package/dist/business-process.js.map +1 -0
  34. package/dist/data-api.d.ts +116 -0
  35. package/dist/data-api.d.ts.map +1 -0
  36. package/dist/data-api.js +248 -0
  37. package/dist/data-api.js.map +1 -0
  38. package/dist/event-context.d.ts +15 -0
  39. package/dist/event-context.d.ts.map +1 -0
  40. package/dist/event-context.js +33 -0
  41. package/dist/event-context.js.map +1 -0
  42. package/dist/event-handler.d.ts +36 -0
  43. package/dist/event-handler.d.ts.map +1 -0
  44. package/dist/event-handler.js +174 -0
  45. package/dist/event-handler.js.map +1 -0
  46. package/dist/events.d.ts +64 -0
  47. package/dist/events.d.ts.map +1 -0
  48. package/dist/events.js +513 -0
  49. package/dist/events.js.map +1 -0
  50. package/dist/gateway-transport.d.ts +53 -0
  51. package/dist/gateway-transport.d.ts.map +1 -0
  52. package/dist/gateway-transport.js +369 -0
  53. package/dist/gateway-transport.js.map +1 -0
  54. package/dist/health.d.ts +36 -0
  55. package/dist/health.d.ts.map +1 -0
  56. package/dist/health.js +105 -0
  57. package/dist/health.js.map +1 -0
  58. package/dist/index.d.ts +25 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +25 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/infrastructure-controller.d.ts +8 -0
  63. package/dist/infrastructure-controller.d.ts.map +1 -0
  64. package/dist/infrastructure-controller.js +15 -0
  65. package/dist/infrastructure-controller.js.map +1 -0
  66. package/dist/logger.d.ts +20 -0
  67. package/dist/logger.d.ts.map +1 -0
  68. package/dist/logger.js +62 -0
  69. package/dist/logger.js.map +1 -0
  70. package/dist/module.d.ts +6 -0
  71. package/dist/module.d.ts.map +1 -0
  72. package/dist/module.js +293 -0
  73. package/dist/module.js.map +1 -0
  74. package/dist/notification.d.ts +18 -0
  75. package/dist/notification.d.ts.map +1 -0
  76. package/dist/notification.js +52 -0
  77. package/dist/notification.js.map +1 -0
  78. package/dist/platform-client.d.ts +115 -0
  79. package/dist/platform-client.d.ts.map +1 -0
  80. package/dist/platform-client.js +506 -0
  81. package/dist/platform-client.js.map +1 -0
  82. package/dist/runtime.d.ts +56 -0
  83. package/dist/runtime.d.ts.map +1 -0
  84. package/dist/runtime.js +253 -0
  85. package/dist/runtime.js.map +1 -0
  86. package/dist/standard-operations.d.ts +62 -0
  87. package/dist/standard-operations.d.ts.map +1 -0
  88. package/dist/standard-operations.js +169 -0
  89. package/dist/standard-operations.js.map +1 -0
  90. package/dist/todo.d.ts +20 -0
  91. package/dist/todo.d.ts.map +1 -0
  92. package/dist/todo.js +48 -0
  93. package/dist/todo.js.map +1 -0
  94. package/dist/tokens.d.ts +5 -0
  95. package/dist/tokens.d.ts.map +1 -0
  96. package/dist/tokens.js +5 -0
  97. package/dist/tokens.js.map +1 -0
  98. package/dist/types.d.ts +178 -0
  99. package/dist/types.d.ts.map +1 -0
  100. package/dist/types.js +2 -0
  101. package/dist/types.js.map +1 -0
  102. package/dist/workflow.d.ts +41 -0
  103. package/dist/workflow.d.ts.map +1 -0
  104. package/dist/workflow.js +97 -0
  105. package/dist/workflow.js.map +1 -0
  106. package/package.json +64 -0
package/dist/events.js ADDED
@@ -0,0 +1,513 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { createHmac, timingSafeEqual } from 'node:crypto';
14
+ import { BadRequestException, HttpException, Inject, Injectable, ServiceUnavailableException, UnauthorizedException } from '@nestjs/common';
15
+ import { Ajv2020 } from 'ajv/dist/2020.js';
16
+ import { DATA_EVENT_TYPES_V2, DATA_RECORD_EVENT_DATA_SCHEMA_V2, EVENT_DATA_MAX_BYTES_V2, SCHEMA_VERSIONS, WORKFLOW_EVENT_DATA_SCHEMA_V2, WORKFLOW_EVENT_TYPES_V2, eventDeliverySignatureContentV2, sha256Digest, } from 'openxiangda-contracts';
17
+ import { OPENXIANGDA_EVENT_RECEIPT_STORE, OPENXIANGDA_MODULE_OPTIONS } from './tokens.js';
18
+ import { OpenXiangdaEventContext, } from './event-context.js';
19
+ class OpenXiangdaEventReceiptBusyError extends Error {
20
+ }
21
+ export class OpenXiangdaEventRetryableError extends HttpException {
22
+ constructor(code, message = '事件处理暂时不可用', status = 503) {
23
+ if (![408, 409, 425, 429].includes(status) && status < 500) {
24
+ throw new Error('retryable event status 必须是 408/409/425/429/5xx');
25
+ }
26
+ super({ code, message, retryable: true }, status);
27
+ }
28
+ }
29
+ export class OpenXiangdaEventDeterministicError extends HttpException {
30
+ constructor(code, message = '事件业务请求不可处理', status = 422) {
31
+ if (status < 400 || status >= 500 || [408, 409, 425, 429].includes(status)) {
32
+ throw new Error('deterministic event status 必须是非重试 4xx');
33
+ }
34
+ super({ code, message, retryable: false }, status);
35
+ }
36
+ }
37
+ /**
38
+ * Resolves only declared event subscription credentials from the standard
39
+ * platform environment contract. A staged next secret is first so a rolling
40
+ * deployment can acknowledge deliveries with the credential being activated.
41
+ */
42
+ export function eventSigningSecretsFromEnvironment(subscriptionCodes, environment = process.env) {
43
+ return Object.fromEntries([...new Set(subscriptionCodes.map(String))].sort().flatMap(code => {
44
+ const envCode = code.toUpperCase().replace(/[^A-Z0-9]+/g, '_');
45
+ const active = String(environment[`OPENXIANGDA_EVENT_SECRET_${envCode}`] || '').trim();
46
+ const next = String(environment[`OPENXIANGDA_EVENT_SECRET_${envCode}_NEXT`] || '').trim();
47
+ const values = [next, active].filter(Boolean);
48
+ return values.length ? [[code, values]] : [];
49
+ }));
50
+ }
51
+ let InMemoryOpenXiangdaEventReceiptStore = class InMemoryOpenXiangdaEventReceiptStore {
52
+ receipts = new Map();
53
+ async claim(receipt) {
54
+ const key = this.key(receipt);
55
+ const current = this.receipts.get(key);
56
+ if (current === 'processing')
57
+ return 'busy';
58
+ if (current === 'succeeded')
59
+ return 'duplicate';
60
+ this.receipts.set(key, 'processing');
61
+ return 'claimed';
62
+ }
63
+ async complete(receipt) {
64
+ this.receipts.set(this.key(receipt), 'succeeded');
65
+ }
66
+ async release(receipt) {
67
+ const key = this.key(receipt);
68
+ if (this.receipts.get(key) === 'processing')
69
+ this.receipts.delete(key);
70
+ }
71
+ key(receipt) {
72
+ return `${receipt.tenantId}:${receipt.appCode}:${receipt.environmentKey}:${receipt.subscriptionCode}:${receipt.eventId}`;
73
+ }
74
+ };
75
+ InMemoryOpenXiangdaEventReceiptStore = __decorate([
76
+ Injectable()
77
+ ], InMemoryOpenXiangdaEventReceiptStore);
78
+ export { InMemoryOpenXiangdaEventReceiptStore };
79
+ /**
80
+ * Production receipt store backed by the OpenXiangda platform database.
81
+ * The event subscription secret authenticates every command; no app OAuth
82
+ * credential or local database is required.
83
+ */
84
+ let PlatformOpenXiangdaEventReceiptStore = class PlatformOpenXiangdaEventReceiptStore {
85
+ options;
86
+ claimTokens = new Map();
87
+ constructor(options) {
88
+ this.options = options;
89
+ }
90
+ async claim(receipt) {
91
+ let result;
92
+ try {
93
+ result = await this.execute(receipt, 'claim');
94
+ }
95
+ catch (error) {
96
+ if (error instanceof OpenXiangdaEventReceiptBusyError)
97
+ return 'busy';
98
+ throw error;
99
+ }
100
+ if (result.outcome === 'claimed' && result.claimToken) {
101
+ this.claimTokens.set(this.key(receipt), result.claimToken);
102
+ return 'claimed';
103
+ }
104
+ if (result.outcome === 'duplicate' && result.status === 'succeeded') {
105
+ return 'duplicate';
106
+ }
107
+ if (result.outcome === 'duplicate' && result.status === 'processing') {
108
+ return 'busy';
109
+ }
110
+ throw new ServiceUnavailableException('平台返回了不一致的事件回执领取状态');
111
+ }
112
+ async complete(receipt) {
113
+ await this.finish(receipt, 'complete');
114
+ this.claimTokens.delete(this.key(receipt));
115
+ }
116
+ async release(receipt) {
117
+ try {
118
+ await this.finish(receipt, 'release');
119
+ }
120
+ finally {
121
+ this.claimTokens.delete(this.key(receipt));
122
+ }
123
+ }
124
+ async finish(receipt, action) {
125
+ const key = this.key(receipt);
126
+ const claimToken = this.claimTokens.get(key);
127
+ if (!claimToken) {
128
+ throw new ServiceUnavailableException('当前事件缺少平台回执 claimToken');
129
+ }
130
+ const maxAttempts = Math.max(1, Math.min(5, Math.floor(this.options.eventReceiptMaxAttempts || 3)));
131
+ const baseDelay = Math.max(0, Math.min(2_000, Math.floor(this.options.eventReceiptRetryDelayMs ?? 150)));
132
+ for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
133
+ try {
134
+ const result = await this.execute(receipt, action, claimToken);
135
+ const expectedOutcome = action === 'complete' ? 'completed' : 'released';
136
+ if (result.outcome !== expectedOutcome &&
137
+ !(action === 'release' && result.outcome === 'completed')) {
138
+ throw new ServiceUnavailableException(`平台事件回执 ${action} 返回状态不一致`);
139
+ }
140
+ return;
141
+ }
142
+ catch (error) {
143
+ if (!(error instanceof ServiceUnavailableException) ||
144
+ attempt >= maxAttempts) {
145
+ throw error;
146
+ }
147
+ await this.delay(baseDelay * 2 ** (attempt - 1));
148
+ }
149
+ }
150
+ }
151
+ async delay(milliseconds) {
152
+ if (milliseconds <= 0)
153
+ return;
154
+ await new Promise(resolve => setTimeout(resolve, milliseconds));
155
+ }
156
+ async execute(receipt, action, claimToken) {
157
+ const secret = this.signingSecrets(receipt.subscriptionCode)[0];
158
+ if (!secret) {
159
+ throw new UnauthorizedException('事件订阅签名密钥未配置');
160
+ }
161
+ const command = {
162
+ schemaVersion: SCHEMA_VERSIONS.eventReceiptCommand,
163
+ action,
164
+ ...receipt,
165
+ ...(claimToken ? { claimToken } : {}),
166
+ };
167
+ const timestamp = String(Math.floor(Date.now() / 1000));
168
+ const signature = createHmac('sha256', secret)
169
+ .update(this.signatureContent(command, timestamp))
170
+ .digest('hex');
171
+ const controller = new AbortController();
172
+ const timeout = setTimeout(() => controller.abort(), Math.max(1_000, this.options.requestTimeoutMs || 10_000));
173
+ let response;
174
+ try {
175
+ const fetcher = this.options.fetch || globalThis.fetch;
176
+ response = await fetcher(this.receiptUrl(), {
177
+ method: 'POST',
178
+ headers: {
179
+ 'Content-Type': 'application/json',
180
+ 'X-OpenXiangda-Timestamp': timestamp,
181
+ 'X-OpenXiangda-Signature': `v1=${signature}`,
182
+ },
183
+ body: JSON.stringify(command),
184
+ signal: controller.signal,
185
+ });
186
+ }
187
+ catch (error) {
188
+ throw new ServiceUnavailableException(error instanceof Error && error.name === 'AbortError'
189
+ ? '平台事件回执请求超时'
190
+ : '平台事件回执请求失败');
191
+ }
192
+ finally {
193
+ clearTimeout(timeout);
194
+ }
195
+ let envelope;
196
+ try {
197
+ envelope = (await response.json());
198
+ }
199
+ catch {
200
+ throw new ServiceUnavailableException('平台事件回执返回的不是有效 JSON');
201
+ }
202
+ const code = Number(envelope.code ?? response.status);
203
+ if (!response.ok || code >= 400) {
204
+ if (action === 'claim' &&
205
+ response.status === 409 &&
206
+ envelope.errorCode === 'EVENT_V2_RECEIPT_IN_PROGRESS') {
207
+ throw new OpenXiangdaEventReceiptBusyError();
208
+ }
209
+ const message = String(envelope.errorCode || envelope.message || '').trim() ||
210
+ `平台事件回执请求失败 (${response.status})`;
211
+ if (response.status === 401 || response.status === 403) {
212
+ throw new UnauthorizedException(message);
213
+ }
214
+ throw new ServiceUnavailableException(message);
215
+ }
216
+ const result = envelope.data;
217
+ if (!result ||
218
+ result.schemaVersion !== SCHEMA_VERSIONS.eventReceiptResult ||
219
+ result.eventId !== receipt.eventId ||
220
+ result.deliveryId !== receipt.deliveryId ||
221
+ !Number.isInteger(result.attempts)) {
222
+ throw new ServiceUnavailableException('平台事件回执响应不符合 v2 协议');
223
+ }
224
+ return result;
225
+ }
226
+ signatureContent(command, timestamp) {
227
+ return [
228
+ SCHEMA_VERSIONS.eventReceiptCommand,
229
+ timestamp,
230
+ command.action,
231
+ command.tenantId,
232
+ command.appCode,
233
+ command.environmentKey,
234
+ command.subscriptionCode,
235
+ command.eventId,
236
+ command.deliveryId,
237
+ command.claimToken || '',
238
+ ].join('\n');
239
+ }
240
+ receiptUrl() {
241
+ return new URL('openxiangda-api/v2/event-receipts', this.options.platformBaseUrl.endsWith('/')
242
+ ? this.options.platformBaseUrl
243
+ : `${this.options.platformBaseUrl}/`).toString();
244
+ }
245
+ signingSecrets(subscriptionCode) {
246
+ const configured = this.options.eventSigningSecrets?.[subscriptionCode] ||
247
+ this.options.eventSigningSecret;
248
+ return (Array.isArray(configured) ? configured : [configured])
249
+ .map(secret => String(secret || '').trim())
250
+ .filter(Boolean);
251
+ }
252
+ key(receipt) {
253
+ return `${receipt.tenantId}:${receipt.appCode}:${receipt.environmentKey}:${receipt.subscriptionCode}:${receipt.eventId}`;
254
+ }
255
+ };
256
+ PlatformOpenXiangdaEventReceiptStore = __decorate([
257
+ Injectable(),
258
+ __param(0, Inject(OPENXIANGDA_MODULE_OPTIONS)),
259
+ __metadata("design:paramtypes", [Object])
260
+ ], PlatformOpenXiangdaEventReceiptStore);
261
+ export { PlatformOpenXiangdaEventReceiptStore };
262
+ let OpenXiangdaEventReceiver = class OpenXiangdaEventReceiver {
263
+ options;
264
+ receipts;
265
+ eventContext;
266
+ validators = new Map();
267
+ constructor(options, receipts, eventContext) {
268
+ this.options = options;
269
+ this.receipts = receipts;
270
+ this.eventContext = eventContext;
271
+ const ajv = new Ajv2020({
272
+ allErrors: true,
273
+ strict: false,
274
+ allowUnionTypes: true,
275
+ });
276
+ const register = (eventType, dataSchemaVersion, jsonSchema) => {
277
+ const key = this.schemaKey(eventType, dataSchemaVersion);
278
+ if (this.validators.has(key)) {
279
+ throw new Error(`事件 Schema 重复: ${eventType}@${dataSchemaVersion}`);
280
+ }
281
+ this.validators.set(key, ajv.compile(jsonSchema));
282
+ };
283
+ for (const eventType of DATA_EVENT_TYPES_V2) {
284
+ register(eventType, '2.0.0', DATA_RECORD_EVENT_DATA_SCHEMA_V2);
285
+ }
286
+ for (const eventType of WORKFLOW_EVENT_TYPES_V2) {
287
+ register(eventType, '2.0.0', WORKFLOW_EVENT_DATA_SCHEMA_V2);
288
+ }
289
+ for (const schema of this.options.eventSchemas || []) {
290
+ registerSchema(register, schema);
291
+ }
292
+ }
293
+ async accept(contract, headers, rawBody, handler) {
294
+ const bytes = Buffer.isBuffer(rawBody)
295
+ ? rawBody.byteLength
296
+ : Buffer.byteLength(String(rawBody || ''), 'utf8');
297
+ if (bytes > Math.min(contract.maxBodyBytes, EVENT_DATA_MAX_BYTES_V2)) {
298
+ throw new BadRequestException('事件 raw body 超过 handler 上限');
299
+ }
300
+ const body = Buffer.isBuffer(rawBody)
301
+ ? rawBody.toString('utf8')
302
+ : String(rawBody || '');
303
+ if (!body)
304
+ throw new BadRequestException('事件 raw body 不能为空');
305
+ const event = this.parseEvent(body);
306
+ const subscriptionCode = this.header(headers, 'x-openxiangda-subscription-code');
307
+ const timestamp = this.header(headers, 'x-openxiangda-timestamp');
308
+ const signature = this.header(headers, 'x-openxiangda-signature');
309
+ const deliveryId = this.header(headers, 'x-openxiangda-delivery-id');
310
+ const eventId = this.header(headers, 'x-openxiangda-event-id');
311
+ const signingKeyVersion = this.header(headers, 'x-openxiangda-signing-key-version');
312
+ const handlerManifestDigest = this.header(headers, 'x-openxiangda-handler-manifest-digest');
313
+ this.assertContentType(headers);
314
+ if (subscriptionCode !== contract.code) {
315
+ throw new UnauthorizedException('事件订阅与 handler 不一致');
316
+ }
317
+ if (eventId !== event.id) {
318
+ throw new UnauthorizedException('事件 ID header 与 body 不一致');
319
+ }
320
+ if (!/^[1-9]\d*$/.test(signingKeyVersion)) {
321
+ throw new UnauthorizedException('事件签名 key version 无效');
322
+ }
323
+ if (handlerManifestDigest !== this.manifestDigest()) {
324
+ throw new UnauthorizedException('事件 handler manifest 与运行版本不一致');
325
+ }
326
+ this.assertTimestamp(timestamp);
327
+ this.assertSignature(subscriptionCode, timestamp, signature, signingKeyVersion, deliveryId, eventId, handlerManifestDigest, body);
328
+ if (event.appcode !== this.options.appCode) {
329
+ throw new UnauthorizedException('事件 appCode 与当前应用不一致');
330
+ }
331
+ if (event.environment !== this.options.environmentKey) {
332
+ throw new UnauthorizedException('事件 environment 与当前环境不一致');
333
+ }
334
+ this.assertEventSchema(contract, event);
335
+ const receipt = {
336
+ tenantId: event.tenantid,
337
+ appCode: event.appcode,
338
+ environmentKey: event.environment,
339
+ subscriptionCode,
340
+ eventId: event.id,
341
+ deliveryId,
342
+ };
343
+ const claim = await this.receipts.claim(receipt);
344
+ if (claim === 'duplicate') {
345
+ return this.ack(event.id, deliveryId, true);
346
+ }
347
+ if (claim === 'busy') {
348
+ throw new OpenXiangdaEventRetryableError('OPENXIANGDA_EVENT_RECEIPT_BUSY', '事件已由另一个实例处理中,请稍后重试', 425);
349
+ }
350
+ try {
351
+ await this.eventContext.run(event, deliveryId, subscriptionCode, async (context) => await handler(event, context));
352
+ }
353
+ catch (handlerError) {
354
+ try {
355
+ await this.receipts.release(receipt);
356
+ }
357
+ catch (receiptError) {
358
+ const combined = new ServiceUnavailableException({
359
+ status: 'event_receipt_release_failed',
360
+ message: '业务处理失败,且平台事件回执释放失败',
361
+ handlerError: handlerError instanceof Error
362
+ ? handlerError.message
363
+ : String(handlerError),
364
+ receiptError: receiptError instanceof Error
365
+ ? receiptError.message
366
+ : String(receiptError),
367
+ });
368
+ combined.cause = handlerError;
369
+ throw combined;
370
+ }
371
+ throw handlerError;
372
+ }
373
+ // The handler has already committed its side effects. Completion is
374
+ // idempotent and retried by the receipt store; never release here, or a
375
+ // transient acknowledgement failure would invite immediate re-execution.
376
+ await this.receipts.complete(receipt);
377
+ return this.ack(event.id, deliveryId, false);
378
+ }
379
+ parseEvent(body) {
380
+ let value;
381
+ try {
382
+ value = JSON.parse(body);
383
+ }
384
+ catch {
385
+ throw new BadRequestException('事件 body 不是有效 JSON');
386
+ }
387
+ const event = value;
388
+ if (!event ||
389
+ event.specversion !== '1.0' ||
390
+ !String(event.id || '').trim() ||
391
+ !String(event.type || '').trim() ||
392
+ !String(event.source || '').trim() ||
393
+ !String(event.time || '').trim() ||
394
+ !String(event.tenantid || '').trim() ||
395
+ !String(event.appcode || '').trim() ||
396
+ !String(event.environment || '').trim() ||
397
+ event.datacontenttype !== 'application/json' ||
398
+ !String(event.schemaversion || '').trim() ||
399
+ !event.data ||
400
+ typeof event.data !== 'object' ||
401
+ Array.isArray(event.data)) {
402
+ throw new BadRequestException('事件不符合 CloudEvents 1.0 协议');
403
+ }
404
+ return event;
405
+ }
406
+ assertTimestamp(value) {
407
+ const timestamp = Number(value);
408
+ const maxAgeSeconds = Math.max(30, this.options.eventMaxAgeSeconds || 300);
409
+ if (!Number.isSafeInteger(timestamp) ||
410
+ Math.abs(Math.floor(Date.now() / 1000) - timestamp) > maxAgeSeconds) {
411
+ throw new UnauthorizedException('事件签名时间戳无效或已过期');
412
+ }
413
+ }
414
+ assertSignature(subscriptionCode, timestamp, value, signingKeyVersion, deliveryId, eventId, handlerManifestDigest, body) {
415
+ const configured = this.options.eventSigningSecrets?.[subscriptionCode] ||
416
+ this.options.eventSigningSecret;
417
+ const secrets = (Array.isArray(configured) ? configured : [configured])
418
+ .map(secret => String(secret || '').trim())
419
+ .filter(Boolean);
420
+ if (!secrets.length) {
421
+ throw new UnauthorizedException('事件订阅签名密钥未配置');
422
+ }
423
+ const actual = value.startsWith('v2=') ? value.slice(3) : '';
424
+ if (!/^[0-9a-f]{64}$/i.test(actual)) {
425
+ throw new UnauthorizedException('事件签名无效');
426
+ }
427
+ const actualBuffer = Buffer.from(actual, 'hex');
428
+ const valid = secrets.some(secret => {
429
+ const expectedBuffer = Buffer.from(createHmac('sha256', secret)
430
+ .update(eventDeliverySignatureContentV2({
431
+ timestamp,
432
+ signingKeyVersion,
433
+ deliveryId,
434
+ eventId,
435
+ subscriptionCode,
436
+ handlerManifestDigest,
437
+ rawBody: body,
438
+ }))
439
+ .digest('hex'), 'hex');
440
+ return (actualBuffer.length === expectedBuffer.length &&
441
+ timingSafeEqual(actualBuffer, expectedBuffer));
442
+ });
443
+ if (!valid) {
444
+ throw new UnauthorizedException('事件签名无效');
445
+ }
446
+ }
447
+ assertContentType(headers) {
448
+ const value = this.header(headers, 'content-type').toLowerCase();
449
+ if (!value.startsWith('application/cloudevents+json')) {
450
+ throw new BadRequestException('事件 Content-Type 必须是 structured CloudEvents JSON');
451
+ }
452
+ }
453
+ assertEventSchema(contract, event) {
454
+ if (!contract.eventTypes.includes(event.type)) {
455
+ throw new BadRequestException('事件类型不在 handler manifest 中');
456
+ }
457
+ if (!contract.dataSchemaVersions.includes(event.schemaversion)) {
458
+ throw new BadRequestException('事件 data schema version 不受 handler 支持');
459
+ }
460
+ const validate = this.validators.get(this.schemaKey(event.type, event.schemaversion));
461
+ if (!validate) {
462
+ throw new BadRequestException('事件 data schema 未随应用版本声明');
463
+ }
464
+ if (!validate(event.data)) {
465
+ throw new BadRequestException('事件 data 不符合声明的 JSON Schema');
466
+ }
467
+ }
468
+ manifestDigest() {
469
+ const manifest = this.options.eventHandlerManifest;
470
+ if (!manifest ||
471
+ manifest.schemaVersion !== SCHEMA_VERSIONS.eventHandlerManifest ||
472
+ manifest.appCode !== this.options.appCode) {
473
+ throw new ServiceUnavailableException('运行版本缺少事件 handler manifest');
474
+ }
475
+ return sha256Digest(manifest);
476
+ }
477
+ schemaKey(eventType, dataSchemaVersion) {
478
+ return `${eventType}\u0000${dataSchemaVersion}`;
479
+ }
480
+ ack(eventId, deliveryId, duplicate) {
481
+ return {
482
+ schemaVersion: SCHEMA_VERSIONS.eventDeliveryAck,
483
+ accepted: true,
484
+ duplicate,
485
+ eventId,
486
+ deliveryId,
487
+ receiptStatus: 'succeeded',
488
+ };
489
+ }
490
+ header(headers, name) {
491
+ const value = headers[name] ?? headers[name.toLowerCase()];
492
+ const normalized = Array.isArray(value) ? value[0] : value;
493
+ if (!String(normalized || '').trim()) {
494
+ throw new UnauthorizedException(`缺少事件头 ${name}`);
495
+ }
496
+ return String(normalized).trim();
497
+ }
498
+ };
499
+ OpenXiangdaEventReceiver = __decorate([
500
+ Injectable(),
501
+ __param(0, Inject(OPENXIANGDA_MODULE_OPTIONS)),
502
+ __param(1, Inject(OPENXIANGDA_EVENT_RECEIPT_STORE)),
503
+ __param(2, Inject(OpenXiangdaEventContext)),
504
+ __metadata("design:paramtypes", [Object, Object, OpenXiangdaEventContext])
505
+ ], OpenXiangdaEventReceiver);
506
+ export { OpenXiangdaEventReceiver };
507
+ function registerSchema(register, schema) {
508
+ if (schema.owner !== 'application') {
509
+ throw new Error(`应用 eventSchemas 不能覆盖平台 Schema: ${schema.eventType}`);
510
+ }
511
+ register(schema.eventType, schema.dataSchemaVersion, schema.jsonSchema);
512
+ }
513
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../src/events.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,MAAM,EACN,UAAU,EACV,2BAA2B,EAC3B,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,OAAO,EAAyB,MAAM,kBAAkB,CAAC;AAClE,OAAO,EACL,mBAAmB,EACnB,gCAAgC,EAChC,uBAAuB,EACvB,eAAe,EACf,6BAA6B,EAC7B,uBAAuB,EACvB,+BAA+B,EAC/B,YAAY,GAOb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,+BAA+B,EAC/B,0BAA0B,EAC3B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,uBAAuB,GAExB,MAAM,oBAAoB,CAAC;AAS5B,MAAM,gCAAiC,SAAQ,KAAK;CAAG;AAEvD,MAAM,OAAO,8BAA+B,SAAQ,aAAa;IAC/D,YACE,IAAY,EACZ,OAAO,GAAG,WAAW,EACrB,MAAM,GAAG,GAAG;QAEZ,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QACD,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,OAAO,kCAAmC,SAAQ,aAAa;IACnE,YAAY,IAAY,EAAE,OAAO,GAAG,YAAY,EAAE,MAAM,GAAG,GAAG;QAC5D,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QACD,KAAK,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,UAAU,kCAAkC,CAChD,iBAAoC,EACpC,cAAkD,OAAO,CAAC,GAAG;IAE7D,OAAO,MAAM,CAAC,WAAW,CACvB,CAAC,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,MAAM,CACnB,WAAW,CAAC,4BAA4B,OAAO,EAAE,CAAC,IAAI,EAAE,CACzD,CAAC,IAAI,EAAE,CAAC;QACT,MAAM,IAAI,GAAG,MAAM,CACjB,WAAW,CAAC,4BAA4B,OAAO,OAAO,CAAC,IAAI,EAAE,CAC9D,CAAC,IAAI,EAAE,CAAC;QACT,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9C,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/C,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAGM,IAAM,oCAAoC,GAA1C,MAAM,oCAAoC;IAC9B,QAAQ,GAAG,IAAI,GAAG,EAAsC,CAAC;IAE1E,KAAK,CAAC,KAAK,CACT,OAAuC;QAEvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,OAAO,KAAK,YAAY;YAAE,OAAO,MAAM,CAAC;QAC5C,IAAI,OAAO,KAAK,WAAW;YAAE,OAAO,WAAW,CAAC;QAChD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAuC;QACpD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuC;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,YAAY;YAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACzE,CAAC;IAEO,GAAG,CAAC,OAAuC;QACjD,OAAO,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3H,CAAC;CACF,CAAA;AA1BY,oCAAoC;IADhD,UAAU,EAAE;GACA,oCAAoC,CA0BhD;;AAED;;;;GAIG;AAEI,IAAM,oCAAoC,GAA1C,MAAM,oCAAoC;IAO5B;IAJF,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEzD,YAEmB,OAAiC;QAAjC,YAAO,GAAP,OAAO,CAA0B;IACjD,CAAC;IAEJ,KAAK,CAAC,KAAK,CACT,OAAuC;QAEvC,IAAI,MAA0B,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,gCAAgC;gBAAE,OAAO,MAAM,CAAC;YACrE,MAAM,KAAK,CAAC;QACd,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YAC3D,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;YACpE,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,IAAI,MAAM,CAAC,OAAO,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;YACrE,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,MAAM,IAAI,2BAA2B,CACnC,mBAAmB,CACpB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAuC;QACpD,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACvC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAuC;QACnD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACxC,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,MAAM,CAClB,OAAuC,EACvC,MAA8B;QAE9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,2BAA2B,CAAC,uBAAuB,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAC1B,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,IAAI,CAAC,CAAC,CAAC,CACnE,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CACxB,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,wBAAwB,IAAI,GAAG,CAAC,CAAC,CAC1E,CAAC;QACF,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;gBAC/D,MAAM,eAAe,GACnB,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC;gBACnD,IACE,MAAM,CAAC,OAAO,KAAK,eAAe;oBAClC,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,WAAW,CAAC,EACzD,CAAC;oBACD,MAAM,IAAI,2BAA2B,CACnC,UAAU,MAAM,UAAU,CAC3B,CAAC;gBACJ,CAAC;gBACD,OAAO;YACT,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IACE,CAAC,CAAC,KAAK,YAAY,2BAA2B,CAAC;oBAC/C,OAAO,IAAI,WAAW,EACtB,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,YAAoB;QACtC,IAAI,YAAY,IAAI,CAAC;YAAE,OAAO;QAC9B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IAClE,CAAC;IAEO,KAAK,CAAC,OAAO,CACnB,OAAuC,EACvC,MAAqC,EACrC,UAAmB;QAEnB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,qBAAqB,CAAC,aAAa,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,OAAO,GAAwB;YACnC,aAAa,EAAE,eAAe,CAAC,mBAAmB;YAClD,MAAM;YACN,GAAG,OAAO;YACV,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtC,CAAC;QACF,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;aAC3C,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;aACjD,MAAM,CAAC,KAAK,CAAC,CAAC;QACjB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CACxB,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EACxB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,MAAM,CAAC,CACzD,CAAC;QACF,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;YACvD,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;gBAC1C,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,kBAAkB;oBAClC,yBAAyB,EAAE,SAAS;oBACpC,yBAAyB,EAAE,MAAM,SAAS,EAAE;iBAC7C;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,2BAA2B,CACnC,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;gBACnD,CAAC,CAAC,YAAY;gBACd,CAAC,CAAC,YAAY,CACjB,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,QAKH,CAAC;QACF,IAAI,CAAC;YACH,QAAQ,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAoB,CAAC;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,2BAA2B,CAAC,oBAAoB,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC;YAChC,IACE,MAAM,KAAK,OAAO;gBAClB,QAAQ,CAAC,MAAM,KAAK,GAAG;gBACvB,QAAQ,CAAC,SAAS,KAAK,8BAA8B,EACrD,CAAC;gBACD,MAAM,IAAI,gCAAgC,EAAE,CAAC;YAC/C,CAAC;YACD,MAAM,OAAO,GACX,MAAM,CAAC,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;gBAC3D,eAAe,QAAQ,CAAC,MAAM,GAAG,CAAC;YACpC,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvD,MAAM,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;YACD,MAAM,IAAI,2BAA2B,CAAC,OAAO,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAA+C,CAAC;QACxE,IACE,CAAC,MAAM;YACP,MAAM,CAAC,aAAa,KAAK,eAAe,CAAC,kBAAkB;YAC3D,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO;YAClC,MAAM,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU;YACxC,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,EAClC,CAAC;YACD,MAAM,IAAI,2BAA2B,CAAC,mBAAmB,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,MAA4B,CAAC;IACtC,CAAC;IAEO,gBAAgB,CAAC,OAA4B,EAAE,SAAiB;QACtE,OAAO;YACL,eAAe,CAAC,mBAAmB;YACnC,SAAS;YACT,OAAO,CAAC,MAAM;YACd,OAAO,CAAC,QAAQ;YAChB,OAAO,CAAC,OAAO;YACf,OAAO,CAAC,cAAc;YACtB,OAAO,CAAC,gBAAgB;YACxB,OAAO,CAAC,OAAO;YACf,OAAO,CAAC,UAAU;YAClB,OAAO,CAAC,UAAU,IAAI,EAAE;SACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAEO,UAAU;QAChB,OAAO,IAAI,GAAG,CACZ,mCAAmC,EACnC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC;YACxC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe;YAC9B,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,GAAG,CACvC,CAAC,QAAQ,EAAE,CAAC;IACf,CAAC;IAEO,cAAc,CAAC,gBAAwB;QAC7C,MAAM,UAAU,GACd,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,gBAAgB,CAAC;YACpD,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAClC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;aAC3D,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;aAC1C,MAAM,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAEO,GAAG,CAAC,OAAuC;QACjD,OAAO,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3H,CAAC;CACF,CAAA;AA3NY,oCAAoC;IADhD,UAAU,EAAE;IAOR,WAAA,MAAM,CAAC,0BAA0B,CAAC,CAAA;;GAN1B,oCAAoC,CA2NhD;;AAGM,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IAKhB;IAEA;IAEA;IARF,UAAU,GAAG,IAAI,GAAG,EAA4B,CAAC;IAElE,YAEmB,OAAiC,EAEjC,QAAsC,EAEtC,YAAqC;QAJrC,YAAO,GAAP,OAAO,CAA0B;QAEjC,aAAQ,GAAR,QAAQ,CAA8B;QAEtC,iBAAY,GAAZ,YAAY,CAAyB;QAEtD,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC;YACtB,SAAS,EAAE,IAAI;YACf,MAAM,EAAE,KAAK;YACb,eAAe,EAAE,IAAI;SACtB,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,CACf,SAAiB,EACjB,iBAAyB,EACzB,UAAmC,EACnC,EAAE;YACF,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;YACzD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,iBAAiB,SAAS,IAAI,iBAAiB,EAAE,CAAC,CAAC;YACrE,CAAC;YACD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QACpD,CAAC,CAAC;QACF,KAAK,MAAM,SAAS,IAAI,mBAAmB,EAAE,CAAC;YAC5C,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,gCAAgC,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,uBAAuB,EAAE,CAAC;YAChD,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,6BAA6B,CAAC,CAAC;QAC9D,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;YACrD,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,QAAiC,EACjC,OAAsD,EACtD,OAAwB,EACxB,OAG+B;QAE/B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YACpC,CAAC,CAAC,OAAO,CAAC,UAAU;YACpB,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACrD,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,EAAE,uBAAuB,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,mBAAmB,CAAC,2BAA2B,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YACnC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC1B,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;QAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAClC,OAAO,EACP,iCAAiC,CAClC,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAAC;QAClE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,yBAAyB,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,2BAA2B,CAAC,CAAC;QACrE,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,wBAAwB,CAAC,CAAC;QAC/D,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CACnC,OAAO,EACP,mCAAmC,CACpC,CAAC;QACF,MAAM,qBAAqB,GAAG,IAAI,CAAC,MAAM,CACvC,OAAO,EACP,uCAAuC,CACxC,CAAC;QACF,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,gBAAgB,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;YACvC,MAAM,IAAI,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC;YACzB,MAAM,IAAI,qBAAqB,CAAC,yBAAyB,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,qBAAqB,CAAC,qBAAqB,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,qBAAqB,KAAK,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YACpD,MAAM,IAAI,qBAAqB,CAAC,8BAA8B,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,CAAC,eAAe,CAClB,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,UAAU,EACV,OAAO,EACP,qBAAqB,EACrB,IAAI,CACL,CAAC;QACF,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC3C,MAAM,IAAI,qBAAqB,CAAC,qBAAqB,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YACtD,MAAM,IAAI,qBAAqB,CAAC,yBAAyB,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,OAAO,GAAmC;YAC9C,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,cAAc,EAAE,KAAK,CAAC,WAAW;YACjC,gBAAgB;YAChB,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,UAAU;SACX,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjD,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,MAAM,IAAI,8BAA8B,CACtC,gCAAgC,EAChC,oBAAoB,EACpB,GAAG,CACJ,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CACzB,KAAK,EACL,UAAU,EACV,gBAAgB,EAChB,KAAK,EAAC,OAAO,EAAC,EAAE,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAC/C,CAAC;QACJ,CAAC;QAAC,OAAO,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,YAAY,EAAE,CAAC;gBACtB,MAAM,QAAQ,GAAG,IAAI,2BAA2B,CAAC;oBAC/C,MAAM,EAAE,8BAA8B;oBACtC,OAAO,EAAE,oBAAoB;oBAC7B,YAAY,EACV,YAAY,YAAY,KAAK;wBAC3B,CAAC,CAAC,YAAY,CAAC,OAAO;wBACtB,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;oBAC1B,YAAY,EACV,YAAY,YAAY,KAAK;wBAC3B,CAAC,CAAC,YAAY,CAAC,OAAO;wBACtB,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;iBAC3B,CAAsD,CAAC;gBACxD,QAAQ,CAAC,KAAK,GAAG,YAAY,CAAC;gBAC9B,MAAM,QAAQ,CAAC;YACjB,CAAC;YACD,MAAM,YAAY,CAAC;QACrB,CAAC;QACD,oEAAoE;QACpE,wEAAwE;QACxE,yEAAyE;QACzE,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAC/C,CAAC;IAEO,UAAU,CAAC,IAAY;QAC7B,IAAI,KAAc,CAAC;QACnB,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,KAAK,GAAG,KAA4B,CAAC;QAC3C,IACE,CAAC,KAAK;YACN,KAAK,CAAC,WAAW,KAAK,KAAK;YAC3B,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAC9B,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAChC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAClC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YAChC,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YACpC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YACnC,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YACvC,KAAK,CAAC,eAAe,KAAK,kBAAkB;YAC5C,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;YACzC,CAAC,KAAK,CAAC,IAAI;YACX,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAC9B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EACzB,CAAC;YACD,MAAM,IAAI,mBAAmB,CAAC,0BAA0B,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,KAAmB,CAAC;IAC7B,CAAC;IAEO,eAAe,CAAC,KAAa;QACnC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB,IAAI,GAAG,CAAC,CAAC;QAC3E,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,aAAa,EACnE,CAAC;YACD,MAAM,IAAI,qBAAqB,CAAC,eAAe,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAEO,eAAe,CACrB,gBAAwB,EACxB,SAAiB,EACjB,KAAa,EACb,iBAAyB,EACzB,UAAkB,EAClB,OAAe,EACf,qBAA6B,EAC7B,IAAY;QAEZ,MAAM,UAAU,GACd,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,gBAAgB,CAAC;YACpD,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAClC,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;aACpE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;aAC1C,MAAM,CAAC,OAAO,CAAC,CAAC;QACnB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,qBAAqB,CAAC,aAAa,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;YAClC,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAChC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;iBACzB,MAAM,CACL,+BAA+B,CAAC;gBAC9B,SAAS;gBACT,iBAAiB;gBACjB,UAAU;gBACV,OAAO;gBACP,gBAAgB;gBAChB,qBAAqB;gBACrB,OAAO,EAAE,IAAI;aACd,CAAC,CACH;iBACA,MAAM,CAAC,KAAK,CAAC,EAChB,KAAK,CACN,CAAC;YACF,OAAO,CACL,YAAY,CAAC,MAAM,KAAK,cAAc,CAAC,MAAM;gBAC7C,eAAe,CAAC,YAAY,EAAE,cAAc,CAAC,CAC9C,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAEO,iBAAiB,CACvB,OAAsD;QAEtD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;QACjE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,8BAA8B,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,mBAAmB,CAAC,iDAAiD,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAEO,iBAAiB,CACvB,QAAiC,EACjC,KAAiB;QAEjB,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,mBAAmB,CAAC,2BAA2B,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,mBAAmB,CAAC,sCAAsC,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAClC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC,CAChD,CAAC;QACF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,mBAAmB,CAAC,yBAAyB,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,mBAAmB,CAAC,4BAA4B,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC;QACnD,IACE,CAAC,QAAQ;YACT,QAAQ,CAAC,aAAa,KAAK,eAAe,CAAC,oBAAoB;YAC/D,QAAQ,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO,EACzC,CAAC;YACD,MAAM,IAAI,2BAA2B,CAAC,2BAA2B,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAEO,SAAS,CAAC,SAAiB,EAAE,iBAAyB;QAC5D,OAAO,GAAG,SAAS,SAAS,iBAAiB,EAAE,CAAC;IAClD,CAAC;IAEO,GAAG,CACT,OAAe,EACf,UAAkB,EAClB,SAAkB;QAElB,OAAO;YACL,aAAa,EAAE,eAAe,CAAC,gBAAgB;YAC/C,QAAQ,EAAE,IAAI;YACd,SAAS;YACT,OAAO;YACP,UAAU;YACV,aAAa,EAAE,WAAW;SAC3B,CAAC;IACJ,CAAC;IAEO,MAAM,CACZ,OAAsD,EACtD,IAAY;QAEZ,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC3D,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACrC,MAAM,IAAI,qBAAqB,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;IACnC,CAAC;CACF,CAAA;AAlUY,wBAAwB;IADpC,UAAU,EAAE;IAKR,WAAA,MAAM,CAAC,0BAA0B,CAAC,CAAA;IAElC,WAAA,MAAM,CAAC,+BAA+B,CAAC,CAAA;IAEvC,WAAA,MAAM,CAAC,uBAAuB,CAAC,CAAA;qDACD,uBAAuB;GAT7C,wBAAwB,CAkUpC;;AAED,SAAS,cAAc,CACrB,QAIS,EACT,MAA6B;IAE7B,IAAI,MAAM,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { CanActivate, ExecutionContext } from "@nestjs/common";
2
+ import { OpenXiangdaPlatformClient } from "./platform-client.js";
3
+ import type { OpenXiangdaHttpRequest, OpenXiangdaModuleOptions } from "./types.js";
4
+ interface GatewayAssertionPayload {
5
+ assertion_contract: "native-2";
6
+ iss: "openxiangda-platform-gateway";
7
+ aud: "openxiangda-app-backend";
8
+ tenant_id: string;
9
+ app_code: string;
10
+ environment_id: string;
11
+ environment_key: string;
12
+ app_version_id: string;
13
+ deployment_run_id: string;
14
+ head_revision: number;
15
+ backend_revision_id: string;
16
+ method: string;
17
+ normalized_path: string;
18
+ canonical_query_digest: string;
19
+ body_digest: string;
20
+ invocation_token_digest: string;
21
+ perspective_code: string | null;
22
+ jti: string;
23
+ iat: number;
24
+ nbf: number;
25
+ exp: number;
26
+ }
27
+ export declare class OpenXiangdaGatewayAssertionVerifier {
28
+ private readonly platform;
29
+ private readonly options;
30
+ private keys;
31
+ private keysExpireAt;
32
+ constructor(platform: OpenXiangdaPlatformClient, options: OpenXiangdaModuleOptions);
33
+ verify(input: {
34
+ assertion: string;
35
+ invocationToken: string;
36
+ request: OpenXiangdaHttpRequest;
37
+ }): Promise<GatewayAssertionPayload>;
38
+ private assertPayload;
39
+ private key;
40
+ private fail;
41
+ }
42
+ export declare class OpenXiangdaGatewayTransportGuard implements CanActivate {
43
+ private readonly verifier;
44
+ private readonly platform;
45
+ private readonly options;
46
+ constructor(verifier: OpenXiangdaGatewayAssertionVerifier, platform: OpenXiangdaPlatformClient, options: OpenXiangdaModuleOptions);
47
+ canActivate(context: ExecutionContext): Promise<boolean>;
48
+ private acceptConnectedDevelopment;
49
+ private assertInvocation;
50
+ private fail;
51
+ }
52
+ export {};
53
+ //# sourceMappingURL=gateway-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-transport.d.ts","sourceRoot":"","sources":["../src/gateway-transport.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,gBAAgB,EAIjB,MAAM,gBAAgB,CAAC;AAQxB,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,OAAO,KAAK,EACV,sBAAsB,EACtB,wBAAwB,EACzB,MAAM,YAAY,CAAC;AAEpB,UAAU,uBAAuB;IAC/B,kBAAkB,EAAE,UAAU,CAAC;IAC/B,GAAG,EAAE,8BAA8B,CAAC;IACpC,GAAG,EAAE,yBAAyB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB,EAAE,MAAM,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AAED,qBACa,mCAAmC;IAM5C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAEzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAP1B,OAAO,CAAC,IAAI,CAA0C;IACtD,OAAO,CAAC,YAAY,CAAK;gBAIN,QAAQ,EAAE,yBAAyB,EAEnC,OAAO,EAAE,wBAAwB;IAG9C,MAAM,CAAC,KAAK,EAAE;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,eAAe,EAAE,MAAM,CAAC;QACxB,OAAO,EAAE,sBAAsB,CAAC;KACjC,GAAG,OAAO,CAAC,uBAAuB,CAAC;IA8CpC,OAAO,CAAC,aAAa;YAwCP,GAAG;IA6BjB,OAAO,CAAC,IAAI;CAGb;AAED,qBACa,gCAAiC,YAAW,WAAW;IAGhE,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAEzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAEzB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAJP,QAAQ,EAAE,mCAAmC,EAE7C,QAAQ,EAAE,yBAAyB,EAEnC,OAAO,EAAE,wBAAwB;IAG9C,WAAW,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;YAqChD,0BAA0B;IA6ExC,OAAO,CAAC,gBAAgB;IA+BxB,OAAO,CAAC,IAAI;CAGb"}