@mbc-cqrs-serverless/core 1.0.26 → 1.1.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/dist/commands/command.event.handler.d.ts +1 -1
- package/dist/commands/command.event.handler.js +1 -1
- package/dist/commands/command.event.handler.js.map +1 -1
- package/dist/commands/command.service.d.ts +0 -10
- package/dist/commands/command.service.js +0 -35
- package/dist/commands/command.service.js.map +1 -1
- package/dist/constants/tenant.d.ts +21 -1
- package/dist/constants/tenant.js +28 -2
- package/dist/constants/tenant.js.map +1 -1
- package/dist/context/user.d.ts +10 -0
- package/dist/context/user.js +17 -2
- package/dist/context/user.js.map +1 -1
- package/dist/guard/roles.guard.d.ts +53 -0
- package/dist/guard/roles.guard.js +79 -4
- package/dist/guard/roles.guard.js.map +1 -1
- package/dist/helpers/index.d.ts +1 -1
- package/dist/helpers/index.js +2 -2
- package/dist/helpers/index.js.map +1 -1
- package/dist/integration/utilities/aws-error-factory.d.ts +141 -0
- package/dist/integration/utilities/aws-error-factory.js +392 -0
- package/dist/integration/utilities/aws-error-factory.js.map +1 -0
- package/dist/integration/utilities/aws-mock-manager.d.ts +136 -0
- package/dist/integration/utilities/aws-mock-manager.js +336 -0
- package/dist/integration/utilities/aws-mock-manager.js.map +1 -0
- package/dist/integration/utilities/index.d.ts +22 -0
- package/dist/integration/utilities/index.js +99 -0
- package/dist/integration/utilities/index.js.map +1 -0
- package/dist/integration/utilities/test-assertions.d.ts +112 -0
- package/dist/integration/utilities/test-assertions.js +345 -0
- package/dist/integration/utilities/test-assertions.js.map +1 -0
- package/dist/integration/utilities/test-data-builders.d.ts +202 -0
- package/dist/integration/utilities/test-data-builders.js +320 -0
- package/dist/integration/utilities/test-data-builders.js.map +1 -0
- package/dist/interfaces/notification.interface.d.ts +13 -0
- package/dist/notifications/email.service.js +16 -4
- package/dist/notifications/email.service.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AWS Error Factory
|
|
3
|
+
*
|
|
4
|
+
* Provides standardized factory functions for creating AWS SDK errors
|
|
5
|
+
* used in integration tests. This eliminates code duplication across
|
|
6
|
+
* test files and ensures consistent error structure.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* import { createDynamoDBError, createS3Error } from './utilities/aws-error-factory'
|
|
10
|
+
*
|
|
11
|
+
* const error = createDynamoDBError('ProvisionedThroughputExceededException', {
|
|
12
|
+
* message: 'Rate exceeded',
|
|
13
|
+
* httpStatusCode: 400,
|
|
14
|
+
* throttling: true,
|
|
15
|
+
* })
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Base AWS error structure used across all AWS SDK errors
|
|
19
|
+
*/
|
|
20
|
+
export interface AWSErrorMetadata {
|
|
21
|
+
httpStatusCode?: number;
|
|
22
|
+
requestId?: string;
|
|
23
|
+
extendedRequestId?: string;
|
|
24
|
+
cfId?: string;
|
|
25
|
+
attempts?: number;
|
|
26
|
+
totalRetryDelay?: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Extended error type that matches AWS SDK v3 error structure
|
|
30
|
+
*/
|
|
31
|
+
export interface AWSError extends Error {
|
|
32
|
+
name: string;
|
|
33
|
+
$metadata: AWSErrorMetadata;
|
|
34
|
+
$fault?: 'client' | 'server';
|
|
35
|
+
$retryable?: {
|
|
36
|
+
throttling?: boolean;
|
|
37
|
+
};
|
|
38
|
+
$service?: string;
|
|
39
|
+
code?: string;
|
|
40
|
+
retryAfterSeconds?: number;
|
|
41
|
+
time?: Date;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Options for creating AWS errors
|
|
45
|
+
*/
|
|
46
|
+
export interface CreateAWSErrorOptions {
|
|
47
|
+
message?: string;
|
|
48
|
+
httpStatusCode?: number;
|
|
49
|
+
requestId?: string;
|
|
50
|
+
throttling?: boolean;
|
|
51
|
+
fault?: 'client' | 'server';
|
|
52
|
+
retryAfterSeconds?: number;
|
|
53
|
+
code?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Common DynamoDB error names
|
|
57
|
+
*/
|
|
58
|
+
export type DynamoDBErrorName = 'ProvisionedThroughputExceededException' | 'ResourceNotFoundException' | 'ConditionalCheckFailedException' | 'ValidationException' | 'TransactionCanceledException' | 'TransactionConflictException' | 'ItemCollectionSizeLimitExceededException' | 'RequestLimitExceeded' | 'InternalServerError' | 'ServiceUnavailable' | 'ThrottlingException' | 'AccessDeniedException';
|
|
59
|
+
/**
|
|
60
|
+
* Creates a DynamoDB-specific error
|
|
61
|
+
*/
|
|
62
|
+
export declare function createDynamoDBError(name: DynamoDBErrorName, options?: CreateAWSErrorOptions): AWSError;
|
|
63
|
+
/**
|
|
64
|
+
* Common S3 error names
|
|
65
|
+
*/
|
|
66
|
+
export type S3ErrorName = 'NoSuchKey' | 'NoSuchBucket' | 'BucketNotEmpty' | 'BucketAlreadyExists' | 'BucketAlreadyOwnedByYou' | 'AccessDenied' | 'InvalidAccessKeyId' | 'SignatureDoesNotMatch' | 'EntityTooLarge' | 'EntityTooSmall' | 'InvalidPart' | 'InvalidPartOrder' | 'NoSuchUpload' | 'SlowDown' | 'InternalError' | 'ServiceUnavailable';
|
|
67
|
+
/**
|
|
68
|
+
* Creates an S3-specific error
|
|
69
|
+
*/
|
|
70
|
+
export declare function createS3Error(name: S3ErrorName, options?: CreateAWSErrorOptions): AWSError;
|
|
71
|
+
/**
|
|
72
|
+
* Common SQS error names
|
|
73
|
+
*/
|
|
74
|
+
export type SQSErrorName = 'QueueDoesNotExist' | 'QueueDeletedRecently' | 'QueueNameExists' | 'InvalidMessageContents' | 'MessageNotInflight' | 'ReceiptHandleIsInvalid' | 'PurgeQueueInProgress' | 'BatchEntryIdsNotDistinct' | 'BatchRequestTooLong' | 'EmptyBatchRequest' | 'InvalidBatchEntryId' | 'TooManyEntriesInBatchRequest' | 'OverLimit' | 'ThrottlingException' | 'AccessDeniedException';
|
|
75
|
+
/**
|
|
76
|
+
* Creates an SQS-specific error
|
|
77
|
+
*/
|
|
78
|
+
export declare function createSQSError(name: SQSErrorName, options?: CreateAWSErrorOptions): AWSError;
|
|
79
|
+
/**
|
|
80
|
+
* Common SNS error names
|
|
81
|
+
*/
|
|
82
|
+
export type SNSErrorName = 'NotFoundException' | 'TopicLimitExceededException' | 'SubscriptionLimitExceededException' | 'InvalidParameterException' | 'InvalidParameterValueException' | 'EndpointDisabledException' | 'PlatformApplicationDisabledException' | 'AuthorizationErrorException' | 'ThrottledException' | 'InternalErrorException';
|
|
83
|
+
/**
|
|
84
|
+
* Creates an SNS-specific error
|
|
85
|
+
*/
|
|
86
|
+
export declare function createSNSError(name: SNSErrorName, options?: CreateAWSErrorOptions): AWSError;
|
|
87
|
+
/**
|
|
88
|
+
* Common Step Functions error names
|
|
89
|
+
*/
|
|
90
|
+
export type SFNErrorName = 'ExecutionDoesNotExist' | 'ExecutionAlreadyExists' | 'ExecutionLimitExceeded' | 'InvalidArn' | 'InvalidDefinition' | 'InvalidExecutionInput' | 'InvalidName' | 'InvalidToken' | 'StateMachineDoesNotExist' | 'StateMachineLimitExceeded' | 'TaskDoesNotExist' | 'TaskTimedOut' | 'ActivityDoesNotExist' | 'ActivityLimitExceeded' | 'ResourceNotFound' | 'ThrottlingException' | 'ServiceQuotaExceededException';
|
|
91
|
+
/**
|
|
92
|
+
* Creates a Step Functions-specific error
|
|
93
|
+
*/
|
|
94
|
+
export declare function createSFNError(name: SFNErrorName, options?: CreateAWSErrorOptions): AWSError;
|
|
95
|
+
/**
|
|
96
|
+
* Common SES error names
|
|
97
|
+
*/
|
|
98
|
+
export type SESErrorName = 'MessageRejected' | 'MailFromDomainNotVerifiedException' | 'ConfigurationSetDoesNotExistException' | 'AccountSendingPausedException' | 'LimitExceededException' | 'NotFoundException' | 'TooManyRequestsException' | 'BadRequestException';
|
|
99
|
+
/**
|
|
100
|
+
* Creates an SES-specific error
|
|
101
|
+
*/
|
|
102
|
+
export declare function createSESError(name: SESErrorName, options?: CreateAWSErrorOptions): AWSError;
|
|
103
|
+
/**
|
|
104
|
+
* Network error codes
|
|
105
|
+
*/
|
|
106
|
+
export type NetworkErrorCode = 'ECONNRESET' | 'ECONNREFUSED' | 'ETIMEDOUT' | 'ENETUNREACH' | 'ENOTFOUND' | 'EPIPE' | 'EAI_AGAIN';
|
|
107
|
+
/**
|
|
108
|
+
* Creates a network-level error
|
|
109
|
+
*/
|
|
110
|
+
export declare function createNetworkError(code: NetworkErrorCode, message?: string): Error & {
|
|
111
|
+
code: string;
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* Creates a timeout error
|
|
115
|
+
*/
|
|
116
|
+
export declare function createTimeoutError(message?: string): Error & {
|
|
117
|
+
name: string;
|
|
118
|
+
code?: string;
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Creates an error for a specific HTTP status code
|
|
122
|
+
*/
|
|
123
|
+
export declare function createHttpStatusError(statusCode: number, options?: {
|
|
124
|
+
name?: string;
|
|
125
|
+
message?: string;
|
|
126
|
+
requestId?: string;
|
|
127
|
+
}): AWSError;
|
|
128
|
+
/**
|
|
129
|
+
* Checks if an error is retriable based on AWS SDK v3 patterns
|
|
130
|
+
*/
|
|
131
|
+
export declare function isRetriableAWSError(error: AWSError): boolean;
|
|
132
|
+
/**
|
|
133
|
+
* Checks if an error is a throttling error
|
|
134
|
+
*/
|
|
135
|
+
export declare function isThrottlingError(error: AWSError): boolean;
|
|
136
|
+
/**
|
|
137
|
+
* Checks if an error is a network error
|
|
138
|
+
*/
|
|
139
|
+
export declare function isNetworkError(error: Error & {
|
|
140
|
+
code?: string;
|
|
141
|
+
}): boolean;
|
|
@@ -0,0 +1,392 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AWS Error Factory
|
|
4
|
+
*
|
|
5
|
+
* Provides standardized factory functions for creating AWS SDK errors
|
|
6
|
+
* used in integration tests. This eliminates code duplication across
|
|
7
|
+
* test files and ensures consistent error structure.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* import { createDynamoDBError, createS3Error } from './utilities/aws-error-factory'
|
|
11
|
+
*
|
|
12
|
+
* const error = createDynamoDBError('ProvisionedThroughputExceededException', {
|
|
13
|
+
* message: 'Rate exceeded',
|
|
14
|
+
* httpStatusCode: 400,
|
|
15
|
+
* throttling: true,
|
|
16
|
+
* })
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.createDynamoDBError = createDynamoDBError;
|
|
20
|
+
exports.createS3Error = createS3Error;
|
|
21
|
+
exports.createSQSError = createSQSError;
|
|
22
|
+
exports.createSNSError = createSNSError;
|
|
23
|
+
exports.createSFNError = createSFNError;
|
|
24
|
+
exports.createSESError = createSESError;
|
|
25
|
+
exports.createNetworkError = createNetworkError;
|
|
26
|
+
exports.createTimeoutError = createTimeoutError;
|
|
27
|
+
exports.createHttpStatusError = createHttpStatusError;
|
|
28
|
+
exports.isRetriableAWSError = isRetriableAWSError;
|
|
29
|
+
exports.isThrottlingError = isThrottlingError;
|
|
30
|
+
exports.isNetworkError = isNetworkError;
|
|
31
|
+
/**
|
|
32
|
+
* Creates a base AWS error with the standard structure
|
|
33
|
+
*/
|
|
34
|
+
function createBaseAWSError(name, options = {}) {
|
|
35
|
+
const { message = name, httpStatusCode = 400, requestId = `test-request-${Date.now()}`, throttling, fault = httpStatusCode >= 500 ? 'server' : 'client', retryAfterSeconds, code, } = options;
|
|
36
|
+
const error = new Error(message);
|
|
37
|
+
error.name = name;
|
|
38
|
+
error.$metadata = {
|
|
39
|
+
httpStatusCode,
|
|
40
|
+
requestId,
|
|
41
|
+
};
|
|
42
|
+
error.$fault = fault;
|
|
43
|
+
if (throttling !== undefined) {
|
|
44
|
+
error.$retryable = { throttling };
|
|
45
|
+
}
|
|
46
|
+
if (retryAfterSeconds !== undefined) {
|
|
47
|
+
error.retryAfterSeconds = retryAfterSeconds;
|
|
48
|
+
}
|
|
49
|
+
if (code !== undefined) {
|
|
50
|
+
error.code = code;
|
|
51
|
+
}
|
|
52
|
+
return error;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Creates a DynamoDB-specific error
|
|
56
|
+
*/
|
|
57
|
+
function createDynamoDBError(name, options = {}) {
|
|
58
|
+
const defaultOptions = {};
|
|
59
|
+
// Set default properties based on error type
|
|
60
|
+
switch (name) {
|
|
61
|
+
case 'ProvisionedThroughputExceededException':
|
|
62
|
+
case 'ThrottlingException':
|
|
63
|
+
case 'RequestLimitExceeded':
|
|
64
|
+
defaultOptions.throttling = true;
|
|
65
|
+
defaultOptions.httpStatusCode = 400;
|
|
66
|
+
break;
|
|
67
|
+
case 'InternalServerError':
|
|
68
|
+
defaultOptions.httpStatusCode = 500;
|
|
69
|
+
defaultOptions.fault = 'server';
|
|
70
|
+
break;
|
|
71
|
+
case 'ServiceUnavailable':
|
|
72
|
+
defaultOptions.httpStatusCode = 503;
|
|
73
|
+
defaultOptions.fault = 'server';
|
|
74
|
+
break;
|
|
75
|
+
case 'ValidationException':
|
|
76
|
+
case 'ConditionalCheckFailedException':
|
|
77
|
+
case 'ResourceNotFoundException':
|
|
78
|
+
defaultOptions.httpStatusCode = 400;
|
|
79
|
+
defaultOptions.fault = 'client';
|
|
80
|
+
break;
|
|
81
|
+
case 'TransactionCanceledException':
|
|
82
|
+
case 'TransactionConflictException':
|
|
83
|
+
defaultOptions.httpStatusCode = 400;
|
|
84
|
+
break;
|
|
85
|
+
case 'ItemCollectionSizeLimitExceededException':
|
|
86
|
+
defaultOptions.httpStatusCode = 400;
|
|
87
|
+
break;
|
|
88
|
+
case 'AccessDeniedException':
|
|
89
|
+
defaultOptions.httpStatusCode = 403;
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
const error = createBaseAWSError(name, { ...defaultOptions, ...options });
|
|
93
|
+
error.$service = 'DynamoDB';
|
|
94
|
+
return error;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Creates an S3-specific error
|
|
98
|
+
*/
|
|
99
|
+
function createS3Error(name, options = {}) {
|
|
100
|
+
const defaultOptions = {};
|
|
101
|
+
switch (name) {
|
|
102
|
+
case 'NoSuchKey':
|
|
103
|
+
case 'NoSuchBucket':
|
|
104
|
+
case 'NoSuchUpload':
|
|
105
|
+
defaultOptions.httpStatusCode = 404;
|
|
106
|
+
break;
|
|
107
|
+
case 'AccessDenied':
|
|
108
|
+
case 'InvalidAccessKeyId':
|
|
109
|
+
case 'SignatureDoesNotMatch':
|
|
110
|
+
defaultOptions.httpStatusCode = 403;
|
|
111
|
+
break;
|
|
112
|
+
case 'EntityTooLarge':
|
|
113
|
+
defaultOptions.httpStatusCode = 400;
|
|
114
|
+
break;
|
|
115
|
+
case 'SlowDown':
|
|
116
|
+
defaultOptions.httpStatusCode = 503;
|
|
117
|
+
defaultOptions.throttling = true;
|
|
118
|
+
break;
|
|
119
|
+
case 'InternalError':
|
|
120
|
+
defaultOptions.httpStatusCode = 500;
|
|
121
|
+
defaultOptions.fault = 'server';
|
|
122
|
+
break;
|
|
123
|
+
case 'ServiceUnavailable':
|
|
124
|
+
defaultOptions.httpStatusCode = 503;
|
|
125
|
+
defaultOptions.fault = 'server';
|
|
126
|
+
break;
|
|
127
|
+
case 'BucketNotEmpty':
|
|
128
|
+
case 'BucketAlreadyExists':
|
|
129
|
+
case 'BucketAlreadyOwnedByYou':
|
|
130
|
+
defaultOptions.httpStatusCode = 409;
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
const error = createBaseAWSError(name, { ...defaultOptions, ...options });
|
|
134
|
+
error.$service = 'S3';
|
|
135
|
+
return error;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Creates an SQS-specific error
|
|
139
|
+
*/
|
|
140
|
+
function createSQSError(name, options = {}) {
|
|
141
|
+
const defaultOptions = {};
|
|
142
|
+
switch (name) {
|
|
143
|
+
case 'QueueDoesNotExist':
|
|
144
|
+
defaultOptions.httpStatusCode = 400;
|
|
145
|
+
break;
|
|
146
|
+
case 'ThrottlingException':
|
|
147
|
+
case 'OverLimit':
|
|
148
|
+
defaultOptions.throttling = true;
|
|
149
|
+
defaultOptions.httpStatusCode = 400;
|
|
150
|
+
break;
|
|
151
|
+
case 'AccessDeniedException':
|
|
152
|
+
defaultOptions.httpStatusCode = 403;
|
|
153
|
+
break;
|
|
154
|
+
case 'InvalidMessageContents':
|
|
155
|
+
case 'BatchEntryIdsNotDistinct':
|
|
156
|
+
case 'BatchRequestTooLong':
|
|
157
|
+
case 'EmptyBatchRequest':
|
|
158
|
+
case 'InvalidBatchEntryId':
|
|
159
|
+
case 'TooManyEntriesInBatchRequest':
|
|
160
|
+
defaultOptions.httpStatusCode = 400;
|
|
161
|
+
break;
|
|
162
|
+
case 'MessageNotInflight':
|
|
163
|
+
case 'ReceiptHandleIsInvalid':
|
|
164
|
+
defaultOptions.httpStatusCode = 400;
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
const error = createBaseAWSError(name, { ...defaultOptions, ...options });
|
|
168
|
+
error.$service = 'SQS';
|
|
169
|
+
return error;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Creates an SNS-specific error
|
|
173
|
+
*/
|
|
174
|
+
function createSNSError(name, options = {}) {
|
|
175
|
+
const defaultOptions = {};
|
|
176
|
+
switch (name) {
|
|
177
|
+
case 'NotFoundException':
|
|
178
|
+
defaultOptions.httpStatusCode = 404;
|
|
179
|
+
break;
|
|
180
|
+
case 'TopicLimitExceededException':
|
|
181
|
+
case 'SubscriptionLimitExceededException':
|
|
182
|
+
case 'ThrottledException':
|
|
183
|
+
defaultOptions.throttling = true;
|
|
184
|
+
defaultOptions.httpStatusCode = 400;
|
|
185
|
+
break;
|
|
186
|
+
case 'AuthorizationErrorException':
|
|
187
|
+
defaultOptions.httpStatusCode = 403;
|
|
188
|
+
break;
|
|
189
|
+
case 'InternalErrorException':
|
|
190
|
+
defaultOptions.httpStatusCode = 500;
|
|
191
|
+
defaultOptions.fault = 'server';
|
|
192
|
+
break;
|
|
193
|
+
case 'InvalidParameterException':
|
|
194
|
+
case 'InvalidParameterValueException':
|
|
195
|
+
defaultOptions.httpStatusCode = 400;
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
const error = createBaseAWSError(name, { ...defaultOptions, ...options });
|
|
199
|
+
error.$service = 'SNS';
|
|
200
|
+
return error;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Creates a Step Functions-specific error
|
|
204
|
+
*/
|
|
205
|
+
function createSFNError(name, options = {}) {
|
|
206
|
+
const defaultOptions = {};
|
|
207
|
+
switch (name) {
|
|
208
|
+
case 'ExecutionDoesNotExist':
|
|
209
|
+
case 'StateMachineDoesNotExist':
|
|
210
|
+
case 'TaskDoesNotExist':
|
|
211
|
+
case 'ActivityDoesNotExist':
|
|
212
|
+
case 'ResourceNotFound':
|
|
213
|
+
defaultOptions.httpStatusCode = 400;
|
|
214
|
+
break;
|
|
215
|
+
case 'ExecutionAlreadyExists':
|
|
216
|
+
defaultOptions.httpStatusCode = 400;
|
|
217
|
+
break;
|
|
218
|
+
case 'ThrottlingException':
|
|
219
|
+
case 'ExecutionLimitExceeded':
|
|
220
|
+
case 'StateMachineLimitExceeded':
|
|
221
|
+
case 'ActivityLimitExceeded':
|
|
222
|
+
case 'ServiceQuotaExceededException':
|
|
223
|
+
defaultOptions.throttling = true;
|
|
224
|
+
defaultOptions.httpStatusCode = 400;
|
|
225
|
+
break;
|
|
226
|
+
case 'InvalidArn':
|
|
227
|
+
case 'InvalidDefinition':
|
|
228
|
+
case 'InvalidExecutionInput':
|
|
229
|
+
case 'InvalidName':
|
|
230
|
+
case 'InvalidToken':
|
|
231
|
+
defaultOptions.httpStatusCode = 400;
|
|
232
|
+
break;
|
|
233
|
+
case 'TaskTimedOut':
|
|
234
|
+
defaultOptions.httpStatusCode = 400;
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
const error = createBaseAWSError(name, { ...defaultOptions, ...options });
|
|
238
|
+
error.$service = 'StepFunctions';
|
|
239
|
+
return error;
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Creates an SES-specific error
|
|
243
|
+
*/
|
|
244
|
+
function createSESError(name, options = {}) {
|
|
245
|
+
const defaultOptions = {};
|
|
246
|
+
switch (name) {
|
|
247
|
+
case 'MessageRejected':
|
|
248
|
+
defaultOptions.httpStatusCode = 400;
|
|
249
|
+
break;
|
|
250
|
+
case 'MailFromDomainNotVerifiedException':
|
|
251
|
+
defaultOptions.httpStatusCode = 400;
|
|
252
|
+
break;
|
|
253
|
+
case 'ConfigurationSetDoesNotExistException':
|
|
254
|
+
case 'NotFoundException':
|
|
255
|
+
defaultOptions.httpStatusCode = 404;
|
|
256
|
+
break;
|
|
257
|
+
case 'AccountSendingPausedException':
|
|
258
|
+
defaultOptions.httpStatusCode = 400;
|
|
259
|
+
break;
|
|
260
|
+
case 'LimitExceededException':
|
|
261
|
+
case 'TooManyRequestsException':
|
|
262
|
+
defaultOptions.throttling = true;
|
|
263
|
+
defaultOptions.httpStatusCode = 429;
|
|
264
|
+
break;
|
|
265
|
+
case 'BadRequestException':
|
|
266
|
+
defaultOptions.httpStatusCode = 400;
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
const error = createBaseAWSError(name, { ...defaultOptions, ...options });
|
|
270
|
+
error.$service = 'SES';
|
|
271
|
+
return error;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Creates a network-level error
|
|
275
|
+
*/
|
|
276
|
+
function createNetworkError(code, message) {
|
|
277
|
+
const defaultMessages = {
|
|
278
|
+
ECONNRESET: 'read ECONNRESET',
|
|
279
|
+
ECONNREFUSED: 'connect ECONNREFUSED',
|
|
280
|
+
ETIMEDOUT: 'connect ETIMEDOUT',
|
|
281
|
+
ENETUNREACH: 'network unreachable',
|
|
282
|
+
ENOTFOUND: 'getaddrinfo ENOTFOUND',
|
|
283
|
+
EPIPE: 'write EPIPE',
|
|
284
|
+
EAI_AGAIN: 'getaddrinfo EAI_AGAIN',
|
|
285
|
+
};
|
|
286
|
+
const error = new Error(message || defaultMessages[code]);
|
|
287
|
+
error.code = code;
|
|
288
|
+
return error;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Creates a timeout error
|
|
292
|
+
*/
|
|
293
|
+
function createTimeoutError(message = 'Request timeout') {
|
|
294
|
+
const error = new Error(message);
|
|
295
|
+
error.name = 'TimeoutError';
|
|
296
|
+
error.code = 'ETIMEDOUT';
|
|
297
|
+
return error;
|
|
298
|
+
}
|
|
299
|
+
// ============================================================================
|
|
300
|
+
// Generic HTTP Status Errors
|
|
301
|
+
// ============================================================================
|
|
302
|
+
/**
|
|
303
|
+
* Creates an error for a specific HTTP status code
|
|
304
|
+
*/
|
|
305
|
+
function createHttpStatusError(statusCode, options = {}) {
|
|
306
|
+
const statusMessages = {
|
|
307
|
+
400: 'Bad Request',
|
|
308
|
+
401: 'Unauthorized',
|
|
309
|
+
403: 'Forbidden',
|
|
310
|
+
404: 'Not Found',
|
|
311
|
+
408: 'Request Timeout',
|
|
312
|
+
429: 'Too Many Requests',
|
|
313
|
+
500: 'Internal Server Error',
|
|
314
|
+
502: 'Bad Gateway',
|
|
315
|
+
503: 'Service Unavailable',
|
|
316
|
+
504: 'Gateway Timeout',
|
|
317
|
+
};
|
|
318
|
+
const name = options.name || statusMessages[statusCode] || 'UnknownError';
|
|
319
|
+
const message = options.message || statusMessages[statusCode] || 'Error';
|
|
320
|
+
return createBaseAWSError(name, {
|
|
321
|
+
message,
|
|
322
|
+
httpStatusCode: statusCode,
|
|
323
|
+
requestId: options.requestId,
|
|
324
|
+
fault: statusCode >= 500 ? 'server' : 'client',
|
|
325
|
+
throttling: statusCode === 429,
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
// ============================================================================
|
|
329
|
+
// Utility Functions
|
|
330
|
+
// ============================================================================
|
|
331
|
+
/**
|
|
332
|
+
* Checks if an error is retriable based on AWS SDK v3 patterns
|
|
333
|
+
*/
|
|
334
|
+
function isRetriableAWSError(error) {
|
|
335
|
+
// Check $retryable flag
|
|
336
|
+
if (error.$retryable) {
|
|
337
|
+
return true;
|
|
338
|
+
}
|
|
339
|
+
// Check HTTP status codes
|
|
340
|
+
const statusCode = error.$metadata?.httpStatusCode;
|
|
341
|
+
if (statusCode) {
|
|
342
|
+
// 5xx errors are retriable
|
|
343
|
+
if (statusCode >= 500 && statusCode < 600) {
|
|
344
|
+
return true;
|
|
345
|
+
}
|
|
346
|
+
// 429 Too Many Requests
|
|
347
|
+
if (statusCode === 429) {
|
|
348
|
+
return true;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
// Check error names
|
|
352
|
+
const retriableErrorNames = [
|
|
353
|
+
'ProvisionedThroughputExceededException',
|
|
354
|
+
'ThrottlingException',
|
|
355
|
+
'InternalServerError',
|
|
356
|
+
'ServiceUnavailable',
|
|
357
|
+
'RequestLimitExceeded',
|
|
358
|
+
'SlowDown',
|
|
359
|
+
'TooManyRequestsException',
|
|
360
|
+
];
|
|
361
|
+
return retriableErrorNames.includes(error.name);
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Checks if an error is a throttling error
|
|
365
|
+
*/
|
|
366
|
+
function isThrottlingError(error) {
|
|
367
|
+
return error.$retryable?.throttling === true;
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Checks if an error is a network error
|
|
371
|
+
*/
|
|
372
|
+
function isNetworkError(error) {
|
|
373
|
+
const networkErrorCodes = [
|
|
374
|
+
'ECONNRESET',
|
|
375
|
+
'ECONNREFUSED',
|
|
376
|
+
'ETIMEDOUT',
|
|
377
|
+
'ENETUNREACH',
|
|
378
|
+
'ENOTFOUND',
|
|
379
|
+
'EPIPE',
|
|
380
|
+
'EAI_AGAIN',
|
|
381
|
+
];
|
|
382
|
+
if (error.code &&
|
|
383
|
+
networkErrorCodes.includes(error.code)) {
|
|
384
|
+
return true;
|
|
385
|
+
}
|
|
386
|
+
const message = error.message.toLowerCase();
|
|
387
|
+
return (message.includes('socket hang up') ||
|
|
388
|
+
message.includes('network error') ||
|
|
389
|
+
message.includes('connection reset') ||
|
|
390
|
+
message.includes('connection refused'));
|
|
391
|
+
}
|
|
392
|
+
//# sourceMappingURL=aws-error-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-error-factory.js","sourceRoot":"","sources":["../../../src/integration/utilities/aws-error-factory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AWS Mock Manager
|
|
3
|
+
*
|
|
4
|
+
* Provides standardized setup and teardown for AWS SDK mock clients
|
|
5
|
+
* in integration tests. This eliminates repetitive mock configuration
|
|
6
|
+
* across test files and ensures consistent mock behavior.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* import { AWSMockManager, createDynamoDBMock } from './utilities/aws-mock-manager'
|
|
10
|
+
*
|
|
11
|
+
* // Option 1: Use individual mock creators
|
|
12
|
+
* const { mock, client, reset, restore } = createDynamoDBMock()
|
|
13
|
+
*
|
|
14
|
+
* // Option 2: Use the manager for multiple services
|
|
15
|
+
* const manager = new AWSMockManager()
|
|
16
|
+
* const dynamoDB = manager.getDynamoDB()
|
|
17
|
+
* const s3 = manager.getS3()
|
|
18
|
+
*
|
|
19
|
+
* beforeEach(() => manager.resetAll())
|
|
20
|
+
* afterAll(() => manager.restoreAll())
|
|
21
|
+
*/
|
|
22
|
+
import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
|
|
23
|
+
import { S3Client } from '@aws-sdk/client-s3';
|
|
24
|
+
import { SESv2Client } from '@aws-sdk/client-sesv2';
|
|
25
|
+
import { SFNClient } from '@aws-sdk/client-sfn';
|
|
26
|
+
import { SNSClient } from '@aws-sdk/client-sns';
|
|
27
|
+
import { SQSClient } from '@aws-sdk/client-sqs';
|
|
28
|
+
import { AwsClientStub } from 'aws-sdk-client-mock';
|
|
29
|
+
/**
|
|
30
|
+
* Configuration options for mock clients
|
|
31
|
+
*/
|
|
32
|
+
export interface MockClientOptions {
|
|
33
|
+
region?: string;
|
|
34
|
+
maxAttempts?: number;
|
|
35
|
+
retryMode?: 'standard' | 'adaptive';
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Result from creating a mock client
|
|
39
|
+
*/
|
|
40
|
+
export interface MockClientResult<TClient> {
|
|
41
|
+
/** The mock client stub for configuring responses */
|
|
42
|
+
mock: AwsClientStub<TClient>;
|
|
43
|
+
/** The actual client instance configured with the mock */
|
|
44
|
+
client: TClient;
|
|
45
|
+
/** Reset the mock to clear all configured behaviors */
|
|
46
|
+
reset: () => void;
|
|
47
|
+
/** Restore the mock and destroy the client */
|
|
48
|
+
restore: () => void;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Creates a mocked DynamoDB client
|
|
52
|
+
*/
|
|
53
|
+
export declare function createDynamoDBMock(options?: MockClientOptions): MockClientResult<DynamoDBClient>;
|
|
54
|
+
/**
|
|
55
|
+
* Creates a mocked S3 client
|
|
56
|
+
*/
|
|
57
|
+
export declare function createS3Mock(options?: MockClientOptions): MockClientResult<S3Client>;
|
|
58
|
+
/**
|
|
59
|
+
* Creates a mocked SQS client
|
|
60
|
+
*/
|
|
61
|
+
export declare function createSQSMock(options?: MockClientOptions): MockClientResult<SQSClient>;
|
|
62
|
+
/**
|
|
63
|
+
* Creates a mocked SNS client
|
|
64
|
+
*/
|
|
65
|
+
export declare function createSNSMock(options?: MockClientOptions): MockClientResult<SNSClient>;
|
|
66
|
+
/**
|
|
67
|
+
* Creates a mocked Step Functions client
|
|
68
|
+
*/
|
|
69
|
+
export declare function createSFNMock(options?: MockClientOptions): MockClientResult<SFNClient>;
|
|
70
|
+
/**
|
|
71
|
+
* Creates a mocked SES v2 client
|
|
72
|
+
*/
|
|
73
|
+
export declare function createSESMock(options?: MockClientOptions): MockClientResult<SESv2Client>;
|
|
74
|
+
/**
|
|
75
|
+
* Manages multiple AWS mock clients for test suites
|
|
76
|
+
*/
|
|
77
|
+
export declare class AWSMockManager {
|
|
78
|
+
private dynamoDB?;
|
|
79
|
+
private s3?;
|
|
80
|
+
private sqs?;
|
|
81
|
+
private sns?;
|
|
82
|
+
private sfn?;
|
|
83
|
+
private ses?;
|
|
84
|
+
private options;
|
|
85
|
+
constructor(options?: MockClientOptions);
|
|
86
|
+
/**
|
|
87
|
+
* Gets or creates the DynamoDB mock
|
|
88
|
+
*/
|
|
89
|
+
getDynamoDB(): MockClientResult<DynamoDBClient>;
|
|
90
|
+
/**
|
|
91
|
+
* Gets or creates the S3 mock
|
|
92
|
+
*/
|
|
93
|
+
getS3(): MockClientResult<S3Client>;
|
|
94
|
+
/**
|
|
95
|
+
* Gets or creates the SQS mock
|
|
96
|
+
*/
|
|
97
|
+
getSQS(): MockClientResult<SQSClient>;
|
|
98
|
+
/**
|
|
99
|
+
* Gets or creates the SNS mock
|
|
100
|
+
*/
|
|
101
|
+
getSNS(): MockClientResult<SNSClient>;
|
|
102
|
+
/**
|
|
103
|
+
* Gets or creates the Step Functions mock
|
|
104
|
+
*/
|
|
105
|
+
getSFN(): MockClientResult<SFNClient>;
|
|
106
|
+
/**
|
|
107
|
+
* Gets or creates the SES mock
|
|
108
|
+
*/
|
|
109
|
+
getSES(): MockClientResult<SESv2Client>;
|
|
110
|
+
/**
|
|
111
|
+
* Resets all active mocks
|
|
112
|
+
*/
|
|
113
|
+
resetAll(): void;
|
|
114
|
+
/**
|
|
115
|
+
* Restores all mocks and destroys clients
|
|
116
|
+
*/
|
|
117
|
+
restoreAll(): void;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Creates a standard test setup with beforeEach/afterAll hooks
|
|
121
|
+
* for use with Jest describe blocks
|
|
122
|
+
*/
|
|
123
|
+
export declare function setupAWSMocks(services: Array<'dynamodb' | 's3' | 'sqs' | 'sns' | 'sfn' | 'ses'>, options?: MockClientOptions): {
|
|
124
|
+
manager: AWSMockManager;
|
|
125
|
+
beforeEachHook: () => void;
|
|
126
|
+
afterAllHook: () => void;
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* Quick setup function that returns individual mocks for common patterns
|
|
130
|
+
*/
|
|
131
|
+
export declare function createTestMocks<T extends Array<'dynamodb' | 's3' | 'sqs' | 'sns' | 'sfn' | 'ses'>>(services: T, options?: MockClientOptions): {
|
|
132
|
+
[K in T[number]]: K extends 'dynamodb' ? MockClientResult<DynamoDBClient> : K extends 's3' ? MockClientResult<S3Client> : K extends 'sqs' ? MockClientResult<SQSClient> : K extends 'sns' ? MockClientResult<SNSClient> : K extends 'sfn' ? MockClientResult<SFNClient> : K extends 'ses' ? MockClientResult<SESv2Client> : never;
|
|
133
|
+
} & {
|
|
134
|
+
resetAll: () => void;
|
|
135
|
+
restoreAll: () => void;
|
|
136
|
+
};
|