@chaim-tools/cdk-lib 0.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/README.md +238 -0
- package/lib/binders/base-chaim-binder.d.ts +144 -0
- package/lib/binders/base-chaim-binder.js +532 -0
- package/lib/binders/chaim-dynamodb-binder.d.ts +95 -0
- package/lib/binders/chaim-dynamodb-binder.js +292 -0
- package/lib/config/chaim-endpoints.d.ts +47 -0
- package/lib/config/chaim-endpoints.js +51 -0
- package/lib/index.d.ts +15 -0
- package/lib/index.js +43 -0
- package/lib/lambda-handler/.test-temp/snapshot.json +1 -0
- package/lib/lambda-handler/handler.js +513 -0
- package/lib/lambda-handler/handler.test.ts +365 -0
- package/lib/lambda-handler/package-lock.json +1223 -0
- package/lib/lambda-handler/package.json +14 -0
- package/lib/services/ingestion-service.d.ts +50 -0
- package/lib/services/ingestion-service.js +81 -0
- package/lib/services/os-cache-paths.d.ts +52 -0
- package/lib/services/os-cache-paths.js +123 -0
- package/lib/services/schema-service.d.ts +11 -0
- package/lib/services/schema-service.js +67 -0
- package/lib/services/snapshot-cleanup.d.ts +78 -0
- package/lib/services/snapshot-cleanup.js +220 -0
- package/lib/types/base-binder-props.d.ts +32 -0
- package/lib/types/base-binder-props.js +17 -0
- package/lib/types/credentials.d.ts +57 -0
- package/lib/types/credentials.js +83 -0
- package/lib/types/data-store-metadata.d.ts +67 -0
- package/lib/types/data-store-metadata.js +4 -0
- package/lib/types/failure-mode.d.ts +16 -0
- package/lib/types/failure-mode.js +21 -0
- package/lib/types/ingest-contract.d.ts +110 -0
- package/lib/types/ingest-contract.js +12 -0
- package/lib/types/snapshot-cache-policy.d.ts +52 -0
- package/lib/types/snapshot-cache-policy.js +57 -0
- package/lib/types/snapshot-payload.d.ts +245 -0
- package/lib/types/snapshot-payload.js +3 -0
- package/lib/types/table-binding-config.d.ts +43 -0
- package/lib/types/table-binding-config.js +57 -0
- package/package.json +67 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chaim Ingestion API Contract Types
|
|
3
|
+
*
|
|
4
|
+
* This file defines the request/response types for the Chaim ingestion API.
|
|
5
|
+
* The ingestion flow is:
|
|
6
|
+
* 1. POST /ingest/upload-url → get presigned S3 URL
|
|
7
|
+
* 2. PUT snapshot bytes to presigned URL
|
|
8
|
+
* 3. POST /ingest/snapshot-ref → commit the snapshot reference
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Action type for snapshot-ref endpoint.
|
|
12
|
+
*/
|
|
13
|
+
export type SnapshotAction = 'UPSERT' | 'DELETE';
|
|
14
|
+
/**
|
|
15
|
+
* Request payload for POST /ingest/upload-url
|
|
16
|
+
*/
|
|
17
|
+
export interface UploadUrlRequest {
|
|
18
|
+
/** Application ID */
|
|
19
|
+
readonly appId: string;
|
|
20
|
+
/** Unique event ID (UUID v4) */
|
|
21
|
+
readonly eventId: string;
|
|
22
|
+
/** SHA-256 hash of snapshot bytes (format: "sha256:<hex>") */
|
|
23
|
+
readonly contentHash: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Response from POST /ingest/upload-url
|
|
27
|
+
*/
|
|
28
|
+
export interface UploadUrlResponse {
|
|
29
|
+
/** Presigned S3 URL for uploading snapshot */
|
|
30
|
+
readonly uploadUrl: string;
|
|
31
|
+
/** ISO 8601 timestamp when the URL expires */
|
|
32
|
+
readonly expiresAt: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Request payload for POST /ingest/snapshot-ref (UPSERT action)
|
|
36
|
+
*/
|
|
37
|
+
export interface SnapshotRefUpsertRequest {
|
|
38
|
+
/** Action type */
|
|
39
|
+
readonly action: 'UPSERT';
|
|
40
|
+
/** Application ID */
|
|
41
|
+
readonly appId: string;
|
|
42
|
+
/** Unique event ID (UUID v4) */
|
|
43
|
+
readonly eventId: string;
|
|
44
|
+
/** SHA-256 hash of snapshot bytes */
|
|
45
|
+
readonly contentHash: string;
|
|
46
|
+
/** Data store type (e.g., 'dynamodb') */
|
|
47
|
+
readonly datastoreType: string;
|
|
48
|
+
/** Data store ARN */
|
|
49
|
+
readonly datastoreArn: string;
|
|
50
|
+
/** Resource ID for the binding */
|
|
51
|
+
readonly resourceId: string;
|
|
52
|
+
/** Stack name */
|
|
53
|
+
readonly stackName: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Request payload for POST /ingest/snapshot-ref (DELETE action)
|
|
57
|
+
*/
|
|
58
|
+
export interface SnapshotRefDeleteRequest {
|
|
59
|
+
/** Action type */
|
|
60
|
+
readonly action: 'DELETE';
|
|
61
|
+
/** Application ID */
|
|
62
|
+
readonly appId: string;
|
|
63
|
+
/** Unique event ID (UUID v4) */
|
|
64
|
+
readonly eventId: string;
|
|
65
|
+
/** Resource ID for the binding */
|
|
66
|
+
readonly resourceId: string;
|
|
67
|
+
/** Stack name */
|
|
68
|
+
readonly stackName: string;
|
|
69
|
+
/** Data store type (e.g., 'dynamodb') */
|
|
70
|
+
readonly datastoreType: string;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Union type for snapshot-ref request
|
|
74
|
+
*/
|
|
75
|
+
export type SnapshotRefRequest = SnapshotRefUpsertRequest | SnapshotRefDeleteRequest;
|
|
76
|
+
/**
|
|
77
|
+
* Response from POST /ingest/snapshot-ref
|
|
78
|
+
*/
|
|
79
|
+
export interface SnapshotRefResponse {
|
|
80
|
+
/** Event ID echoed back */
|
|
81
|
+
readonly eventId: string;
|
|
82
|
+
/** Processing status */
|
|
83
|
+
readonly status: 'SUCCESS' | 'FAILED';
|
|
84
|
+
/** ISO 8601 timestamp when processed */
|
|
85
|
+
readonly processedAt: string;
|
|
86
|
+
/** Error message (if status is FAILED) */
|
|
87
|
+
readonly errorMessage?: string;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* CloudFormation custom resource event types.
|
|
91
|
+
*/
|
|
92
|
+
export type CloudFormationRequestType = 'Create' | 'Update' | 'Delete';
|
|
93
|
+
/**
|
|
94
|
+
* CloudFormation custom resource response data.
|
|
95
|
+
* Kept minimal - actual payload is in S3.
|
|
96
|
+
*/
|
|
97
|
+
export interface CustomResourceResponseData {
|
|
98
|
+
/** Event ID for tracking */
|
|
99
|
+
readonly EventId: string;
|
|
100
|
+
/** Ingestion status */
|
|
101
|
+
readonly IngestStatus: 'SUCCESS' | 'FAILED';
|
|
102
|
+
/** Content hash (only for UPSERT) */
|
|
103
|
+
readonly ContentHash?: string;
|
|
104
|
+
/** Action performed */
|
|
105
|
+
readonly Action: SnapshotAction;
|
|
106
|
+
/** Timestamp */
|
|
107
|
+
readonly Timestamp: string;
|
|
108
|
+
/** Error message (if failed) */
|
|
109
|
+
readonly Error?: string;
|
|
110
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Chaim Ingestion API Contract Types
|
|
4
|
+
*
|
|
5
|
+
* This file defines the request/response types for the Chaim ingestion API.
|
|
6
|
+
* The ingestion flow is:
|
|
7
|
+
* 1. POST /ingest/upload-url → get presigned S3 URL
|
|
8
|
+
* 2. PUT snapshot bytes to presigned URL
|
|
9
|
+
* 3. POST /ingest/snapshot-ref → commit the snapshot reference
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5nZXN0LWNvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL2luZ2VzdC1jb250cmFjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7O0dBUUciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENoYWltIEluZ2VzdGlvbiBBUEkgQ29udHJhY3QgVHlwZXNcbiAqIFxuICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIHJlcXVlc3QvcmVzcG9uc2UgdHlwZXMgZm9yIHRoZSBDaGFpbSBpbmdlc3Rpb24gQVBJLlxuICogVGhlIGluZ2VzdGlvbiBmbG93IGlzOlxuICogMS4gUE9TVCAvaW5nZXN0L3VwbG9hZC11cmwg4oaSIGdldCBwcmVzaWduZWQgUzMgVVJMXG4gKiAyLiBQVVQgc25hcHNob3QgYnl0ZXMgdG8gcHJlc2lnbmVkIFVSTFxuICogMy4gUE9TVCAvaW5nZXN0L3NuYXBzaG90LXJlZiDihpIgY29tbWl0IHRoZSBzbmFwc2hvdCByZWZlcmVuY2VcbiAqL1xuXG4vKipcbiAqIEFjdGlvbiB0eXBlIGZvciBzbmFwc2hvdC1yZWYgZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCB0eXBlIFNuYXBzaG90QWN0aW9uID0gJ1VQU0VSVCcgfCAnREVMRVRFJztcblxuLyoqXG4gKiBSZXF1ZXN0IHBheWxvYWQgZm9yIFBPU1QgL2luZ2VzdC91cGxvYWQtdXJsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkVXJsUmVxdWVzdCB7XG4gIC8qKiBBcHBsaWNhdGlvbiBJRCAqL1xuICByZWFkb25seSBhcHBJZDogc3RyaW5nO1xuICBcbiAgLyoqIFVuaXF1ZSBldmVudCBJRCAoVVVJRCB2NCkgKi9cbiAgcmVhZG9ubHkgZXZlbnRJZDogc3RyaW5nO1xuICBcbiAgLyoqIFNIQS0yNTYgaGFzaCBvZiBzbmFwc2hvdCBieXRlcyAoZm9ybWF0OiBcInNoYTI1Njo8aGV4PlwiKSAqL1xuICByZWFkb25seSBjb250ZW50SGFzaDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc3BvbnNlIGZyb20gUE9TVCAvaW5nZXN0L3VwbG9hZC11cmxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGxvYWRVcmxSZXNwb25zZSB7XG4gIC8qKiBQcmVzaWduZWQgUzMgVVJMIGZvciB1cGxvYWRpbmcgc25hcHNob3QgKi9cbiAgcmVhZG9ubHkgdXBsb2FkVXJsOiBzdHJpbmc7XG4gIFxuICAvKiogSVNPIDg2MDEgdGltZXN0YW1wIHdoZW4gdGhlIFVSTCBleHBpcmVzICovXG4gIHJlYWRvbmx5IGV4cGlyZXNBdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlcXVlc3QgcGF5bG9hZCBmb3IgUE9TVCAvaW5nZXN0L3NuYXBzaG90LXJlZiAoVVBTRVJUIGFjdGlvbilcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbmFwc2hvdFJlZlVwc2VydFJlcXVlc3Qge1xuICAvKiogQWN0aW9uIHR5cGUgKi9cbiAgcmVhZG9ubHkgYWN0aW9uOiAnVVBTRVJUJztcbiAgXG4gIC8qKiBBcHBsaWNhdGlvbiBJRCAqL1xuICByZWFkb25seSBhcHBJZDogc3RyaW5nO1xuICBcbiAgLyoqIFVuaXF1ZSBldmVudCBJRCAoVVVJRCB2NCkgKi9cbiAgcmVhZG9ubHkgZXZlbnRJZDogc3RyaW5nO1xuICBcbiAgLyoqIFNIQS0yNTYgaGFzaCBvZiBzbmFwc2hvdCBieXRlcyAqL1xuICByZWFkb25seSBjb250ZW50SGFzaDogc3RyaW5nO1xuICBcbiAgLyoqIERhdGEgc3RvcmUgdHlwZSAoZS5nLiwgJ2R5bmFtb2RiJykgKi9cbiAgcmVhZG9ubHkgZGF0YXN0b3JlVHlwZTogc3RyaW5nO1xuICBcbiAgLyoqIERhdGEgc3RvcmUgQVJOICovXG4gIHJlYWRvbmx5IGRhdGFzdG9yZUFybjogc3RyaW5nO1xuICBcbiAgLyoqIFJlc291cmNlIElEIGZvciB0aGUgYmluZGluZyAqL1xuICByZWFkb25seSByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIFxuICAvKiogU3RhY2sgbmFtZSAqL1xuICByZWFkb25seSBzdGFja05hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXF1ZXN0IHBheWxvYWQgZm9yIFBPU1QgL2luZ2VzdC9zbmFwc2hvdC1yZWYgKERFTEVURSBhY3Rpb24pXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU25hcHNob3RSZWZEZWxldGVSZXF1ZXN0IHtcbiAgLyoqIEFjdGlvbiB0eXBlICovXG4gIHJlYWRvbmx5IGFjdGlvbjogJ0RFTEVURSc7XG4gIFxuICAvKiogQXBwbGljYXRpb24gSUQgKi9cbiAgcmVhZG9ubHkgYXBwSWQ6IHN0cmluZztcbiAgXG4gIC8qKiBVbmlxdWUgZXZlbnQgSUQgKFVVSUQgdjQpICovXG4gIHJlYWRvbmx5IGV2ZW50SWQ6IHN0cmluZztcbiAgXG4gIC8qKiBSZXNvdXJjZSBJRCBmb3IgdGhlIGJpbmRpbmcgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VJZDogc3RyaW5nO1xuICBcbiAgLyoqIFN0YWNrIG5hbWUgKi9cbiAgcmVhZG9ubHkgc3RhY2tOYW1lOiBzdHJpbmc7XG4gIFxuICAvKiogRGF0YSBzdG9yZSB0eXBlIChlLmcuLCAnZHluYW1vZGInKSAqL1xuICByZWFkb25seSBkYXRhc3RvcmVUeXBlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVW5pb24gdHlwZSBmb3Igc25hcHNob3QtcmVmIHJlcXVlc3RcbiAqL1xuZXhwb3J0IHR5cGUgU25hcHNob3RSZWZSZXF1ZXN0ID0gU25hcHNob3RSZWZVcHNlcnRSZXF1ZXN0IHwgU25hcHNob3RSZWZEZWxldGVSZXF1ZXN0O1xuXG4vKipcbiAqIFJlc3BvbnNlIGZyb20gUE9TVCAvaW5nZXN0L3NuYXBzaG90LXJlZlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNuYXBzaG90UmVmUmVzcG9uc2Uge1xuICAvKiogRXZlbnQgSUQgZWNob2VkIGJhY2sgKi9cbiAgcmVhZG9ubHkgZXZlbnRJZDogc3RyaW5nO1xuICBcbiAgLyoqIFByb2Nlc3Npbmcgc3RhdHVzICovXG4gIHJlYWRvbmx5IHN0YXR1czogJ1NVQ0NFU1MnIHwgJ0ZBSUxFRCc7XG4gIFxuICAvKiogSVNPIDg2MDEgdGltZXN0YW1wIHdoZW4gcHJvY2Vzc2VkICovXG4gIHJlYWRvbmx5IHByb2Nlc3NlZEF0OiBzdHJpbmc7XG4gIFxuICAvKiogRXJyb3IgbWVzc2FnZSAoaWYgc3RhdHVzIGlzIEZBSUxFRCkgKi9cbiAgcmVhZG9ubHkgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENsb3VkRm9ybWF0aW9uIGN1c3RvbSByZXNvdXJjZSBldmVudCB0eXBlcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ2xvdWRGb3JtYXRpb25SZXF1ZXN0VHlwZSA9ICdDcmVhdGUnIHwgJ1VwZGF0ZScgfCAnRGVsZXRlJztcblxuLyoqXG4gKiBDbG91ZEZvcm1hdGlvbiBjdXN0b20gcmVzb3VyY2UgcmVzcG9uc2UgZGF0YS5cbiAqIEtlcHQgbWluaW1hbCAtIGFjdHVhbCBwYXlsb2FkIGlzIGluIFMzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbVJlc291cmNlUmVzcG9uc2VEYXRhIHtcbiAgLyoqIEV2ZW50IElEIGZvciB0cmFja2luZyAqL1xuICByZWFkb25seSBFdmVudElkOiBzdHJpbmc7XG4gIFxuICAvKiogSW5nZXN0aW9uIHN0YXR1cyAqL1xuICByZWFkb25seSBJbmdlc3RTdGF0dXM6ICdTVUNDRVNTJyB8ICdGQUlMRUQnO1xuICBcbiAgLyoqIENvbnRlbnQgaGFzaCAob25seSBmb3IgVVBTRVJUKSAqL1xuICByZWFkb25seSBDb250ZW50SGFzaD86IHN0cmluZztcbiAgXG4gIC8qKiBBY3Rpb24gcGVyZm9ybWVkICovXG4gIHJlYWRvbmx5IEFjdGlvbjogU25hcHNob3RBY3Rpb247XG4gIFxuICAvKiogVGltZXN0YW1wICovXG4gIHJlYWRvbmx5IFRpbWVzdGFtcDogc3RyaW5nO1xuICBcbiAgLyoqIEVycm9yIG1lc3NhZ2UgKGlmIGZhaWxlZCkgKi9cbiAgcmVhZG9ubHkgRXJyb3I/OiBzdHJpbmc7XG59XG5cbiJdfQ==
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Policy for managing snapshot cache during CDK synthesis.
|
|
3
|
+
*
|
|
4
|
+
* The snapshot cache stores metadata used by chaim-cli for code generation.
|
|
5
|
+
* Over time, stale snapshots can accumulate and cause issues.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // In cdk.json context
|
|
10
|
+
* {
|
|
11
|
+
* "context": {
|
|
12
|
+
* "chaimSnapshotCachePolicy": "PRUNE_STACK"
|
|
13
|
+
* }
|
|
14
|
+
* }
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare enum SnapshotCachePolicy {
|
|
18
|
+
/**
|
|
19
|
+
* No automatic cleanup (default).
|
|
20
|
+
*
|
|
21
|
+
* Snapshots are written but never deleted automatically.
|
|
22
|
+
* Users must manually clean ~/.chaim/cache/snapshots.
|
|
23
|
+
*
|
|
24
|
+
* **Use when:** You want full control over snapshot lifecycle
|
|
25
|
+
* or are debugging snapshot generation.
|
|
26
|
+
*/
|
|
27
|
+
NONE = "NONE",
|
|
28
|
+
/**
|
|
29
|
+
* Delete stack snapshots before synthesis (recommended).
|
|
30
|
+
*
|
|
31
|
+
* Clears only: ~/.chaim/cache/snapshots/{account}/{region}/{stackName}/
|
|
32
|
+
*
|
|
33
|
+
* This ensures:
|
|
34
|
+
* - No stale snapshots from previous synth runs
|
|
35
|
+
* - No corrupt snapshots from failed synth attempts
|
|
36
|
+
* - Generated code always matches current stack state
|
|
37
|
+
*
|
|
38
|
+
* Other stacks and accounts are preserved.
|
|
39
|
+
*
|
|
40
|
+
* **Use when:** You want clean, predictable snapshot state
|
|
41
|
+
* (recommended for most projects).
|
|
42
|
+
*/
|
|
43
|
+
PRUNE_STACK = "PRUNE_STACK"
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Default snapshot cache policy.
|
|
47
|
+
*/
|
|
48
|
+
export declare const DEFAULT_SNAPSHOT_CACHE_POLICY = SnapshotCachePolicy.NONE;
|
|
49
|
+
/**
|
|
50
|
+
* CDK context key for snapshot cache policy.
|
|
51
|
+
*/
|
|
52
|
+
export declare const SNAPSHOT_CACHE_POLICY_CONTEXT_KEY = "chaimSnapshotCachePolicy";
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SNAPSHOT_CACHE_POLICY_CONTEXT_KEY = exports.DEFAULT_SNAPSHOT_CACHE_POLICY = exports.SnapshotCachePolicy = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Policy for managing snapshot cache during CDK synthesis.
|
|
6
|
+
*
|
|
7
|
+
* The snapshot cache stores metadata used by chaim-cli for code generation.
|
|
8
|
+
* Over time, stale snapshots can accumulate and cause issues.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* // In cdk.json context
|
|
13
|
+
* {
|
|
14
|
+
* "context": {
|
|
15
|
+
* "chaimSnapshotCachePolicy": "PRUNE_STACK"
|
|
16
|
+
* }
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
var SnapshotCachePolicy;
|
|
21
|
+
(function (SnapshotCachePolicy) {
|
|
22
|
+
/**
|
|
23
|
+
* No automatic cleanup (default).
|
|
24
|
+
*
|
|
25
|
+
* Snapshots are written but never deleted automatically.
|
|
26
|
+
* Users must manually clean ~/.chaim/cache/snapshots.
|
|
27
|
+
*
|
|
28
|
+
* **Use when:** You want full control over snapshot lifecycle
|
|
29
|
+
* or are debugging snapshot generation.
|
|
30
|
+
*/
|
|
31
|
+
SnapshotCachePolicy["NONE"] = "NONE";
|
|
32
|
+
/**
|
|
33
|
+
* Delete stack snapshots before synthesis (recommended).
|
|
34
|
+
*
|
|
35
|
+
* Clears only: ~/.chaim/cache/snapshots/{account}/{region}/{stackName}/
|
|
36
|
+
*
|
|
37
|
+
* This ensures:
|
|
38
|
+
* - No stale snapshots from previous synth runs
|
|
39
|
+
* - No corrupt snapshots from failed synth attempts
|
|
40
|
+
* - Generated code always matches current stack state
|
|
41
|
+
*
|
|
42
|
+
* Other stacks and accounts are preserved.
|
|
43
|
+
*
|
|
44
|
+
* **Use when:** You want clean, predictable snapshot state
|
|
45
|
+
* (recommended for most projects).
|
|
46
|
+
*/
|
|
47
|
+
SnapshotCachePolicy["PRUNE_STACK"] = "PRUNE_STACK";
|
|
48
|
+
})(SnapshotCachePolicy = exports.SnapshotCachePolicy || (exports.SnapshotCachePolicy = {}));
|
|
49
|
+
/**
|
|
50
|
+
* Default snapshot cache policy.
|
|
51
|
+
*/
|
|
52
|
+
exports.DEFAULT_SNAPSHOT_CACHE_POLICY = SnapshotCachePolicy.NONE;
|
|
53
|
+
/**
|
|
54
|
+
* CDK context key for snapshot cache policy.
|
|
55
|
+
*/
|
|
56
|
+
exports.SNAPSHOT_CACHE_POLICY_CONTEXT_KEY = 'chaimSnapshotCachePolicy';
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QtY2FjaGUtcG9saWN5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL3NuYXBzaG90LWNhY2hlLXBvbGljeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxJQUFZLG1CQTRCWDtBQTVCRCxXQUFZLG1CQUFtQjtJQUM3Qjs7Ozs7Ozs7T0FRRztJQUNILG9DQUFhLENBQUE7SUFFYjs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILGtEQUEyQixDQUFBO0FBQzdCLENBQUMsRUE1QlcsbUJBQW1CLEdBQW5CLDJCQUFtQixLQUFuQiwyQkFBbUIsUUE0QjlCO0FBRUQ7O0dBRUc7QUFDVSxRQUFBLDZCQUE2QixHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQztBQUV0RTs7R0FFRztBQUNVLFFBQUEsaUNBQWlDLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBvbGljeSBmb3IgbWFuYWdpbmcgc25hcHNob3QgY2FjaGUgZHVyaW5nIENESyBzeW50aGVzaXMuXG4gKiBcbiAqIFRoZSBzbmFwc2hvdCBjYWNoZSBzdG9yZXMgbWV0YWRhdGEgdXNlZCBieSBjaGFpbS1jbGkgZm9yIGNvZGUgZ2VuZXJhdGlvbi5cbiAqIE92ZXIgdGltZSwgc3RhbGUgc25hcHNob3RzIGNhbiBhY2N1bXVsYXRlIGFuZCBjYXVzZSBpc3N1ZXMuXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBJbiBjZGsuanNvbiBjb250ZXh0XG4gKiB7XG4gKiAgIFwiY29udGV4dFwiOiB7XG4gKiAgICAgXCJjaGFpbVNuYXBzaG90Q2FjaGVQb2xpY3lcIjogXCJQUlVORV9TVEFDS1wiXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZW51bSBTbmFwc2hvdENhY2hlUG9saWN5IHtcbiAgLyoqXG4gICAqIE5vIGF1dG9tYXRpYyBjbGVhbnVwIChkZWZhdWx0KS5cbiAgICogXG4gICAqIFNuYXBzaG90cyBhcmUgd3JpdHRlbiBidXQgbmV2ZXIgZGVsZXRlZCBhdXRvbWF0aWNhbGx5LlxuICAgKiBVc2VycyBtdXN0IG1hbnVhbGx5IGNsZWFuIH4vLmNoYWltL2NhY2hlL3NuYXBzaG90cy5cbiAgICogXG4gICAqICoqVXNlIHdoZW46KiogWW91IHdhbnQgZnVsbCBjb250cm9sIG92ZXIgc25hcHNob3QgbGlmZWN5Y2xlXG4gICAqIG9yIGFyZSBkZWJ1Z2dpbmcgc25hcHNob3QgZ2VuZXJhdGlvbi5cbiAgICovXG4gIE5PTkUgPSAnTk9ORScsXG5cbiAgLyoqXG4gICAqIERlbGV0ZSBzdGFjayBzbmFwc2hvdHMgYmVmb3JlIHN5bnRoZXNpcyAocmVjb21tZW5kZWQpLlxuICAgKiBcbiAgICogQ2xlYXJzIG9ubHk6IH4vLmNoYWltL2NhY2hlL3NuYXBzaG90cy97YWNjb3VudH0ve3JlZ2lvbn0ve3N0YWNrTmFtZX0vXG4gICAqIFxuICAgKiBUaGlzIGVuc3VyZXM6XG4gICAqIC0gTm8gc3RhbGUgc25hcHNob3RzIGZyb20gcHJldmlvdXMgc3ludGggcnVuc1xuICAgKiAtIE5vIGNvcnJ1cHQgc25hcHNob3RzIGZyb20gZmFpbGVkIHN5bnRoIGF0dGVtcHRzXG4gICAqIC0gR2VuZXJhdGVkIGNvZGUgYWx3YXlzIG1hdGNoZXMgY3VycmVudCBzdGFjayBzdGF0ZVxuICAgKiBcbiAgICogT3RoZXIgc3RhY2tzIGFuZCBhY2NvdW50cyBhcmUgcHJlc2VydmVkLlxuICAgKiBcbiAgICogKipVc2Ugd2hlbjoqKiBZb3Ugd2FudCBjbGVhbiwgcHJlZGljdGFibGUgc25hcHNob3Qgc3RhdGVcbiAgICogKHJlY29tbWVuZGVkIGZvciBtb3N0IHByb2plY3RzKS5cbiAgICovXG4gIFBSVU5FX1NUQUNLID0gJ1BSVU5FX1NUQUNLJyxcbn1cblxuLyoqXG4gKiBEZWZhdWx0IHNuYXBzaG90IGNhY2hlIHBvbGljeS5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU05BUFNIT1RfQ0FDSEVfUE9MSUNZID0gU25hcHNob3RDYWNoZVBvbGljeS5OT05FO1xuXG4vKipcbiAqIENESyBjb250ZXh0IGtleSBmb3Igc25hcHNob3QgY2FjaGUgcG9saWN5LlxuICovXG5leHBvcnQgY29uc3QgU05BUFNIT1RfQ0FDSEVfUE9MSUNZX0NPTlRFWFRfS0VZID0gJ2NoYWltU25hcHNob3RDYWNoZVBvbGljeSc7XG4iXX0=
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { SchemaData } from '@chaim-tools/chaim-bprint-spec';
|
|
2
|
+
import { GSIMetadata, LSIMetadata } from './data-store-metadata';
|
|
3
|
+
/**
|
|
4
|
+
* Snapshot payload types for Chaim CDK.
|
|
5
|
+
*
|
|
6
|
+
* ⚠️ CONTRACT: These types define the structure of snapshot files consumed by:
|
|
7
|
+
* - chaim-ingest-service (Java): com.chaim.ingest.model.SnapshotPayload
|
|
8
|
+
*
|
|
9
|
+
* When modifying these types:
|
|
10
|
+
* 1. For additive/optional changes: bump minor version (3.0 → 3.1)
|
|
11
|
+
* 2. For breaking changes: bump major version (3.x → 4.0)
|
|
12
|
+
* 3. Coordinate with chaim-ingest-service to add version handling
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Provider/cloud identity metadata.
|
|
16
|
+
* Contains AWS account, region, and deployment system information.
|
|
17
|
+
*/
|
|
18
|
+
export interface ProviderIdentity {
|
|
19
|
+
/** Cloud provider (e.g., 'aws', 'gcp', 'azure') */
|
|
20
|
+
readonly cloud: 'aws';
|
|
21
|
+
/** AWS account ID */
|
|
22
|
+
readonly accountId: string;
|
|
23
|
+
/** AWS region */
|
|
24
|
+
readonly region: string;
|
|
25
|
+
/** Deployment system (CloudFormation, Terraform, etc.) */
|
|
26
|
+
readonly deploymentSystem: 'cloudformation';
|
|
27
|
+
/** CloudFormation stack ID/ARN (may be token in LOCAL mode) */
|
|
28
|
+
readonly deploymentId?: string;
|
|
29
|
+
/** CloudFormation request ID (deploy-time only) */
|
|
30
|
+
readonly requestId?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Binding identity metadata.
|
|
34
|
+
* Contains all information needed to uniquely identify a binding.
|
|
35
|
+
*/
|
|
36
|
+
export interface BindingIdentity {
|
|
37
|
+
/** Application ID */
|
|
38
|
+
readonly appId: string;
|
|
39
|
+
/** Entity name from schema */
|
|
40
|
+
readonly entityName: string;
|
|
41
|
+
/** Strategy used to generate stableResourceKey */
|
|
42
|
+
readonly stableResourceKeyStrategy: 'cdk-construct-path';
|
|
43
|
+
/** Stable resource key (e.g., dynamodb:path:StackName/TableName) */
|
|
44
|
+
readonly stableResourceKey: string;
|
|
45
|
+
/** Generated resource ID: {resourceName}__{entityName}[__N] */
|
|
46
|
+
readonly resourceId: string;
|
|
47
|
+
/** Entity identifier: {appId}:{entityName} */
|
|
48
|
+
readonly entityId: string;
|
|
49
|
+
/** Stable binding identifier: {appId}:{stableResourceKey}:{entityName} */
|
|
50
|
+
readonly bindingId: string;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Operation metadata for tracking this binding operation.
|
|
54
|
+
* Generated at synth-time, updated at deploy-time.
|
|
55
|
+
*/
|
|
56
|
+
export interface OperationMetadata {
|
|
57
|
+
/** UUID for this operation (generated at synth-time) */
|
|
58
|
+
readonly eventId: string;
|
|
59
|
+
/** CloudFormation request type */
|
|
60
|
+
readonly requestType: 'Create' | 'Update' | 'Delete';
|
|
61
|
+
/** Failure handling mode */
|
|
62
|
+
readonly failureMode: 'BEST_EFFORT' | 'STRICT';
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Resolution metadata indicating token resolution status.
|
|
66
|
+
*/
|
|
67
|
+
export interface ResolutionMetadata {
|
|
68
|
+
/** Snapshot mode: LOCAL (synth-time) or PUBLISHED (deploy-time) */
|
|
69
|
+
readonly mode: 'LOCAL' | 'PUBLISHED';
|
|
70
|
+
/** Whether any CDK tokens remain unresolved */
|
|
71
|
+
readonly hasTokens: boolean;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Delete metadata for DELETE snapshots.
|
|
75
|
+
* Provides context about why and what scope was deleted.
|
|
76
|
+
*/
|
|
77
|
+
export interface DeleteMetadata {
|
|
78
|
+
/**
|
|
79
|
+
* Why the resource was deleted (enum).
|
|
80
|
+
* - STACK_DELETED: Entire CloudFormation stack was deleted
|
|
81
|
+
* - BINDER_REMOVED: ChaimBinder construct removed from stack
|
|
82
|
+
* - ENTITY_REMOVED: Entity definition removed but binding may persist
|
|
83
|
+
* - UNKNOWN: Deletion reason could not be determined
|
|
84
|
+
*/
|
|
85
|
+
readonly reason: 'STACK_DELETED' | 'BINDER_REMOVED' | 'ENTITY_REMOVED' | 'UNKNOWN';
|
|
86
|
+
/**
|
|
87
|
+
* What scope is being deleted (enum).
|
|
88
|
+
* - STACK: Entire stack and all bindings
|
|
89
|
+
* - BINDING: Specific entity binding to a data store
|
|
90
|
+
* - ENTITY: Entity definition across bindings
|
|
91
|
+
*
|
|
92
|
+
* Should align with reason:
|
|
93
|
+
* - STACK_DELETED -> STACK
|
|
94
|
+
* - BINDER_REMOVED -> BINDING
|
|
95
|
+
* - ENTITY_REMOVED -> ENTITY
|
|
96
|
+
* - UNKNOWN -> BINDING (default)
|
|
97
|
+
*/
|
|
98
|
+
readonly scope: 'STACK' | 'BINDING' | 'ENTITY';
|
|
99
|
+
/** ISO 8601 timestamp of deletion */
|
|
100
|
+
readonly deletedAt: string;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Hash metadata for content integrity and deduplication.
|
|
104
|
+
*/
|
|
105
|
+
export interface HashMetadata {
|
|
106
|
+
/** SHA-256 hash of schema section (with 'sha256:' prefix) */
|
|
107
|
+
readonly schemaHash: string;
|
|
108
|
+
/** SHA-256 hash of full snapshot content (with 'sha256:' prefix) */
|
|
109
|
+
readonly contentHash: string;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Resource metadata for the data store.
|
|
113
|
+
* Provider-focused, contains only infrastructure metadata.
|
|
114
|
+
*/
|
|
115
|
+
export interface ResourceMetadata {
|
|
116
|
+
/** Provider type (e.g., 'dynamodb', 's3', 'postgres') */
|
|
117
|
+
readonly type: 'dynamodb';
|
|
118
|
+
/** Resource kind (e.g., 'table', 'bucket', 'database') */
|
|
119
|
+
readonly kind?: 'table';
|
|
120
|
+
/** Resource ARN or provider-specific ID */
|
|
121
|
+
readonly id: string;
|
|
122
|
+
/** Resource name */
|
|
123
|
+
readonly name: string;
|
|
124
|
+
/** AWS region */
|
|
125
|
+
readonly region: string;
|
|
126
|
+
readonly partitionKey: string;
|
|
127
|
+
readonly sortKey?: string;
|
|
128
|
+
readonly globalSecondaryIndexes?: GSIMetadata[];
|
|
129
|
+
readonly localSecondaryIndexes?: LSIMetadata[];
|
|
130
|
+
readonly ttlAttribute?: string;
|
|
131
|
+
readonly streamEnabled?: boolean;
|
|
132
|
+
readonly streamViewType?: string;
|
|
133
|
+
readonly billingMode?: 'PAY_PER_REQUEST' | 'PROVISIONED';
|
|
134
|
+
readonly encryptionKeyArn?: string;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Producer metadata for debugging and support.
|
|
138
|
+
* Identifies what component produced the snapshot.
|
|
139
|
+
*/
|
|
140
|
+
export interface ProducerMetadata {
|
|
141
|
+
/** Component name */
|
|
142
|
+
readonly component: 'chaim-cdk';
|
|
143
|
+
/** Component version from package.json */
|
|
144
|
+
readonly version: string;
|
|
145
|
+
/** Lambda runtime (e.g., 'nodejs20.x') */
|
|
146
|
+
readonly runtime: string;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* LOCAL snapshot payload written to OS cache during synthesis (v3.0).
|
|
150
|
+
*
|
|
151
|
+
* This is the primary snapshot type used for CLI code generation
|
|
152
|
+
* and Lambda bundling at synth-time.
|
|
153
|
+
*
|
|
154
|
+
* v3.0 restructures the payload into logical sections for better clarity
|
|
155
|
+
* and multi-provider support.
|
|
156
|
+
*
|
|
157
|
+
* @contract chaim-ingest-service: com.chaim.ingest.model.SnapshotPayload
|
|
158
|
+
*/
|
|
159
|
+
export interface LocalSnapshotPayload {
|
|
160
|
+
/**
|
|
161
|
+
* Snapshot version for backward compatibility.
|
|
162
|
+
* The chaim-ingest-service uses this to parse different payload versions.
|
|
163
|
+
*
|
|
164
|
+
* Versioning strategy:
|
|
165
|
+
* - Minor bump (3.0 → 3.1): Additive, optional field changes
|
|
166
|
+
* - Major bump (3.x → 4.0): Breaking changes (removed/renamed/required fields)
|
|
167
|
+
*
|
|
168
|
+
* @contract chaim-ingest-service: com.chaim.ingest.model.SnapshotPayload
|
|
169
|
+
*/
|
|
170
|
+
readonly snapshotVersion: '3.0';
|
|
171
|
+
/**
|
|
172
|
+
* Action type for this snapshot.
|
|
173
|
+
* - UPSERT: Create or update entity metadata
|
|
174
|
+
* - DELETE: Mark entity as deleted
|
|
175
|
+
*/
|
|
176
|
+
readonly action: 'UPSERT' | 'DELETE';
|
|
177
|
+
/** ISO 8601 timestamp of snapshot creation */
|
|
178
|
+
readonly capturedAt: string;
|
|
179
|
+
/** Provider/cloud identity (AWS account, region, deployment system) */
|
|
180
|
+
readonly providerIdentity: ProviderIdentity;
|
|
181
|
+
/** Binding identity (appId, entityName, resourceId, bindingId, etc.) */
|
|
182
|
+
readonly identity: BindingIdentity;
|
|
183
|
+
/** Operation metadata (eventId, requestType, failureMode) */
|
|
184
|
+
readonly operation: OperationMetadata;
|
|
185
|
+
/** Resolution metadata (mode, hasTokens) */
|
|
186
|
+
readonly resolution: ResolutionMetadata;
|
|
187
|
+
/** Hash metadata (schemaHash, contentHash) */
|
|
188
|
+
readonly hashes: HashMetadata;
|
|
189
|
+
/** Validated .bprint schema data (null for DELETE actions) */
|
|
190
|
+
readonly schema: SchemaData | null;
|
|
191
|
+
/** Resource metadata (simplified, provider-focused) */
|
|
192
|
+
readonly resource: ResourceMetadata;
|
|
193
|
+
/** Producer metadata (component, version, runtime, mode) */
|
|
194
|
+
readonly producer: ProducerMetadata;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* PUBLISHED snapshot payload enhanced by Lambda handler at deploy-time.
|
|
198
|
+
*
|
|
199
|
+
* This extends LocalSnapshotPayload with additional metadata added during deployment:
|
|
200
|
+
* - operation: eventId, cfRequestId, requestType, failureMode
|
|
201
|
+
* - hashes: contentHash, schemaHash
|
|
202
|
+
* - producer: component, version, runtime, mode
|
|
203
|
+
* - delete: (DELETE only) reason, scope, deletedAt
|
|
204
|
+
*
|
|
205
|
+
* This is the format uploaded to S3 and consumed by chaim-ingest-service.
|
|
206
|
+
*/
|
|
207
|
+
export interface PublishedSnapshotPayload extends Omit<LocalSnapshotPayload, 'action' | '_schemaHash' | '_packageVersion'> {
|
|
208
|
+
/** Action is required for published snapshots */
|
|
209
|
+
readonly action: 'UPSERT' | 'DELETE';
|
|
210
|
+
/** Operation metadata (added at deploy-time) */
|
|
211
|
+
readonly operation: OperationMetadata;
|
|
212
|
+
/** Hash metadata (added at deploy-time) */
|
|
213
|
+
readonly hashes: HashMetadata;
|
|
214
|
+
/** Producer metadata (added at deploy-time) */
|
|
215
|
+
readonly producer: ProducerMetadata;
|
|
216
|
+
/** Delete metadata (only for DELETE actions) */
|
|
217
|
+
readonly delete?: DeleteMetadata;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Response from Chaim ingestion API after snapshot-ref commit.
|
|
221
|
+
*/
|
|
222
|
+
export interface IngestResponse {
|
|
223
|
+
/** Event ID echoed back */
|
|
224
|
+
readonly eventId: string;
|
|
225
|
+
/** Ingestion status */
|
|
226
|
+
readonly status: 'SUCCESS' | 'FAILED';
|
|
227
|
+
/** Error message (if failed) */
|
|
228
|
+
readonly errorMessage?: string;
|
|
229
|
+
/** Timestamp when ingestion was processed */
|
|
230
|
+
readonly processedAt: string;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* CloudFormation custom resource response data.
|
|
234
|
+
* Kept minimal - actual payload is in S3.
|
|
235
|
+
*/
|
|
236
|
+
export interface CustomResourceResponseData {
|
|
237
|
+
/** Event ID for tracking */
|
|
238
|
+
readonly EventId: string;
|
|
239
|
+
/** Ingestion status */
|
|
240
|
+
readonly IngestStatus: 'SUCCESS' | 'FAILED';
|
|
241
|
+
/** Content hash for change detection */
|
|
242
|
+
readonly ContentHash: string;
|
|
243
|
+
/** Timestamp */
|
|
244
|
+
readonly Timestamp: string;
|
|
245
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QtcGF5bG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9zbmFwc2hvdC1wYXlsb2FkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTY2hlbWFEYXRhIH0gZnJvbSAnQGNoYWltLXRvb2xzL2NoYWltLWJwcmludC1zcGVjJztcbmltcG9ydCB7IEdTSU1ldGFkYXRhLCBMU0lNZXRhZGF0YSB9IGZyb20gJy4vZGF0YS1zdG9yZS1tZXRhZGF0YSc7XG5cbi8qKlxuICogU25hcHNob3QgcGF5bG9hZCB0eXBlcyBmb3IgQ2hhaW0gQ0RLLlxuICogXG4gKiDimqDvuI8gQ09OVFJBQ1Q6IFRoZXNlIHR5cGVzIGRlZmluZSB0aGUgc3RydWN0dXJlIG9mIHNuYXBzaG90IGZpbGVzIGNvbnN1bWVkIGJ5OlxuICogLSBjaGFpbS1pbmdlc3Qtc2VydmljZSAoSmF2YSk6IGNvbS5jaGFpbS5pbmdlc3QubW9kZWwuU25hcHNob3RQYXlsb2FkXG4gKiBcbiAqIFdoZW4gbW9kaWZ5aW5nIHRoZXNlIHR5cGVzOlxuICogMS4gRm9yIGFkZGl0aXZlL29wdGlvbmFsIGNoYW5nZXM6IGJ1bXAgbWlub3IgdmVyc2lvbiAoMy4wIOKGkiAzLjEpXG4gKiAyLiBGb3IgYnJlYWtpbmcgY2hhbmdlczogYnVtcCBtYWpvciB2ZXJzaW9uICgzLngg4oaSIDQuMClcbiAqIDMuIENvb3JkaW5hdGUgd2l0aCBjaGFpbS1pbmdlc3Qtc2VydmljZSB0byBhZGQgdmVyc2lvbiBoYW5kbGluZ1xuICovXG5cbi8qKlxuICogUHJvdmlkZXIvY2xvdWQgaWRlbnRpdHkgbWV0YWRhdGEuXG4gKiBDb250YWlucyBBV1MgYWNjb3VudCwgcmVnaW9uLCBhbmQgZGVwbG95bWVudCBzeXN0ZW0gaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlkZXJJZGVudGl0eSB7XG4gIC8qKiBDbG91ZCBwcm92aWRlciAoZS5nLiwgJ2F3cycsICdnY3AnLCAnYXp1cmUnKSAqL1xuICByZWFkb25seSBjbG91ZDogJ2F3cyc7XG4gIFxuICAvKiogQVdTIGFjY291bnQgSUQgKi9cbiAgcmVhZG9ubHkgYWNjb3VudElkOiBzdHJpbmc7XG4gIFxuICAvKiogQVdTIHJlZ2lvbiAqL1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcbiAgXG4gIC8qKiBEZXBsb3ltZW50IHN5c3RlbSAoQ2xvdWRGb3JtYXRpb24sIFRlcnJhZm9ybSwgZXRjLikgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudFN5c3RlbTogJ2Nsb3VkZm9ybWF0aW9uJztcbiAgXG4gIC8qKiBDbG91ZEZvcm1hdGlvbiBzdGFjayBJRC9BUk4gKG1heSBiZSB0b2tlbiBpbiBMT0NBTCBtb2RlKSAqL1xuICByZWFkb25seSBkZXBsb3ltZW50SWQ/OiBzdHJpbmc7XG4gIFxuICAvKiogQ2xvdWRGb3JtYXRpb24gcmVxdWVzdCBJRCAoZGVwbG95LXRpbWUgb25seSkgKi9cbiAgcmVhZG9ubHkgcmVxdWVzdElkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEJpbmRpbmcgaWRlbnRpdHkgbWV0YWRhdGEuXG4gKiBDb250YWlucyBhbGwgaW5mb3JtYXRpb24gbmVlZGVkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGEgYmluZGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCaW5kaW5nSWRlbnRpdHkge1xuICAvKiogQXBwbGljYXRpb24gSUQgKi9cbiAgcmVhZG9ubHkgYXBwSWQ6IHN0cmluZztcbiAgXG4gIC8qKiBFbnRpdHkgbmFtZSBmcm9tIHNjaGVtYSAqL1xuICByZWFkb25seSBlbnRpdHlOYW1lOiBzdHJpbmc7XG4gIFxuICAvKiogU3RyYXRlZ3kgdXNlZCB0byBnZW5lcmF0ZSBzdGFibGVSZXNvdXJjZUtleSAqL1xuICByZWFkb25seSBzdGFibGVSZXNvdXJjZUtleVN0cmF0ZWd5OiAnY2RrLWNvbnN0cnVjdC1wYXRoJztcbiAgXG4gIC8qKiBTdGFibGUgcmVzb3VyY2Uga2V5IChlLmcuLCBkeW5hbW9kYjpwYXRoOlN0YWNrTmFtZS9UYWJsZU5hbWUpICovXG4gIHJlYWRvbmx5IHN0YWJsZVJlc291cmNlS2V5OiBzdHJpbmc7XG4gIFxuICAvKiogR2VuZXJhdGVkIHJlc291cmNlIElEOiB7cmVzb3VyY2VOYW1lfV9fe2VudGl0eU5hbWV9W19fTl0gKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VJZDogc3RyaW5nO1xuICBcbiAgLyoqIEVudGl0eSBpZGVudGlmaWVyOiB7YXBwSWR9OntlbnRpdHlOYW1lfSAqL1xuICByZWFkb25seSBlbnRpdHlJZDogc3RyaW5nO1xuICBcbiAgLyoqIFN0YWJsZSBiaW5kaW5nIGlkZW50aWZpZXI6IHthcHBJZH06e3N0YWJsZVJlc291cmNlS2V5fTp7ZW50aXR5TmFtZX0gKi9cbiAgcmVhZG9ubHkgYmluZGluZ0lkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3BlcmF0aW9uIG1ldGFkYXRhIGZvciB0cmFja2luZyB0aGlzIGJpbmRpbmcgb3BlcmF0aW9uLlxuICogR2VuZXJhdGVkIGF0IHN5bnRoLXRpbWUsIHVwZGF0ZWQgYXQgZGVwbG95LXRpbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3BlcmF0aW9uTWV0YWRhdGEge1xuICAvKiogVVVJRCBmb3IgdGhpcyBvcGVyYXRpb24gKGdlbmVyYXRlZCBhdCBzeW50aC10aW1lKSAqL1xuICByZWFkb25seSBldmVudElkOiBzdHJpbmc7XG5cbiAgLyoqIENsb3VkRm9ybWF0aW9uIHJlcXVlc3QgdHlwZSAqL1xuICByZWFkb25seSByZXF1ZXN0VHlwZTogJ0NyZWF0ZScgfCAnVXBkYXRlJyB8ICdEZWxldGUnO1xuXG4gIC8qKiBGYWlsdXJlIGhhbmRsaW5nIG1vZGUgKi9cbiAgcmVhZG9ubHkgZmFpbHVyZU1vZGU6ICdCRVNUX0VGRk9SVCcgfCAnU1RSSUNUJztcbn1cblxuLyoqXG4gKiBSZXNvbHV0aW9uIG1ldGFkYXRhIGluZGljYXRpbmcgdG9rZW4gcmVzb2x1dGlvbiBzdGF0dXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x1dGlvbk1ldGFkYXRhIHtcbiAgLyoqIFNuYXBzaG90IG1vZGU6IExPQ0FMIChzeW50aC10aW1lKSBvciBQVUJMSVNIRUQgKGRlcGxveS10aW1lKSAqL1xuICByZWFkb25seSBtb2RlOiAnTE9DQUwnIHwgJ1BVQkxJU0hFRCc7XG4gIFxuICAvKiogV2hldGhlciBhbnkgQ0RLIHRva2VucyByZW1haW4gdW5yZXNvbHZlZCAqL1xuICByZWFkb25seSBoYXNUb2tlbnM6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGVsZXRlIG1ldGFkYXRhIGZvciBERUxFVEUgc25hcHNob3RzLlxuICogUHJvdmlkZXMgY29udGV4dCBhYm91dCB3aHkgYW5kIHdoYXQgc2NvcGUgd2FzIGRlbGV0ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVsZXRlTWV0YWRhdGEge1xuICAvKipcbiAgICogV2h5IHRoZSByZXNvdXJjZSB3YXMgZGVsZXRlZCAoZW51bSkuXG4gICAqIC0gU1RBQ0tfREVMRVRFRDogRW50aXJlIENsb3VkRm9ybWF0aW9uIHN0YWNrIHdhcyBkZWxldGVkXG4gICAqIC0gQklOREVSX1JFTU9WRUQ6IENoYWltQmluZGVyIGNvbnN0cnVjdCByZW1vdmVkIGZyb20gc3RhY2tcbiAgICogLSBFTlRJVFlfUkVNT1ZFRDogRW50aXR5IGRlZmluaXRpb24gcmVtb3ZlZCBidXQgYmluZGluZyBtYXkgcGVyc2lzdFxuICAgKiAtIFVOS05PV046IERlbGV0aW9uIHJlYXNvbiBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgcmVhc29uOiAnU1RBQ0tfREVMRVRFRCcgfCAnQklOREVSX1JFTU9WRUQnIHwgJ0VOVElUWV9SRU1PVkVEJyB8ICdVTktOT1dOJztcblxuICAvKipcbiAgICogV2hhdCBzY29wZSBpcyBiZWluZyBkZWxldGVkIChlbnVtKS5cbiAgICogLSBTVEFDSzogRW50aXJlIHN0YWNrIGFuZCBhbGwgYmluZGluZ3NcbiAgICogLSBCSU5ESU5HOiBTcGVjaWZpYyBlbnRpdHkgYmluZGluZyB0byBhIGRhdGEgc3RvcmVcbiAgICogLSBFTlRJVFk6IEVudGl0eSBkZWZpbml0aW9uIGFjcm9zcyBiaW5kaW5nc1xuICAgKiBcbiAgICogU2hvdWxkIGFsaWduIHdpdGggcmVhc29uOlxuICAgKiAtIFNUQUNLX0RFTEVURUQgLT4gU1RBQ0tcbiAgICogLSBCSU5ERVJfUkVNT1ZFRCAtPiBCSU5ESU5HXG4gICAqIC0gRU5USVRZX1JFTU9WRUQgLT4gRU5USVRZXG4gICAqIC0gVU5LTk9XTiAtPiBCSU5ESU5HIChkZWZhdWx0KVxuICAgKi9cbiAgcmVhZG9ubHkgc2NvcGU6ICdTVEFDSycgfCAnQklORElORycgfCAnRU5USVRZJztcblxuICAvKiogSVNPIDg2MDEgdGltZXN0YW1wIG9mIGRlbGV0aW9uICovXG4gIHJlYWRvbmx5IGRlbGV0ZWRBdDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEhhc2ggbWV0YWRhdGEgZm9yIGNvbnRlbnQgaW50ZWdyaXR5IGFuZCBkZWR1cGxpY2F0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhhc2hNZXRhZGF0YSB7XG4gIC8qKiBTSEEtMjU2IGhhc2ggb2Ygc2NoZW1hIHNlY3Rpb24gKHdpdGggJ3NoYTI1NjonIHByZWZpeCkgKi9cbiAgcmVhZG9ubHkgc2NoZW1hSGFzaDogc3RyaW5nO1xuXG4gIC8qKiBTSEEtMjU2IGhhc2ggb2YgZnVsbCBzbmFwc2hvdCBjb250ZW50ICh3aXRoICdzaGEyNTY6JyBwcmVmaXgpICovXG4gIHJlYWRvbmx5IGNvbnRlbnRIYXNoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzb3VyY2UgbWV0YWRhdGEgZm9yIHRoZSBkYXRhIHN0b3JlLlxuICogUHJvdmlkZXItZm9jdXNlZCwgY29udGFpbnMgb25seSBpbmZyYXN0cnVjdHVyZSBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZU1ldGFkYXRhIHtcbiAgLyoqIFByb3ZpZGVyIHR5cGUgKGUuZy4sICdkeW5hbW9kYicsICdzMycsICdwb3N0Z3JlcycpICovXG4gIHJlYWRvbmx5IHR5cGU6ICdkeW5hbW9kYic7XG4gIFxuICAvKiogUmVzb3VyY2Uga2luZCAoZS5nLiwgJ3RhYmxlJywgJ2J1Y2tldCcsICdkYXRhYmFzZScpICovXG4gIHJlYWRvbmx5IGtpbmQ/OiAndGFibGUnO1xuICBcbiAgLyoqIFJlc291cmNlIEFSTiBvciBwcm92aWRlci1zcGVjaWZpYyBJRCAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICBcbiAgLyoqIFJlc291cmNlIG5hbWUgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBcbiAgLyoqIEFXUyByZWdpb24gKi9cbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG4gIFxuICAvLyBEeW5hbW9EQi1zcGVjaWZpYyBtZXRhZGF0YVxuICByZWFkb25seSBwYXJ0aXRpb25LZXk6IHN0cmluZztcbiAgcmVhZG9ubHkgc29ydEtleT86IHN0cmluZztcbiAgcmVhZG9ubHkgZ2xvYmFsU2Vjb25kYXJ5SW5kZXhlcz86IEdTSU1ldGFkYXRhW107XG4gIHJlYWRvbmx5IGxvY2FsU2Vjb25kYXJ5SW5kZXhlcz86IExTSU1ldGFkYXRhW107XG4gIHJlYWRvbmx5IHR0bEF0dHJpYnV0ZT86IHN0cmluZztcbiAgcmVhZG9ubHkgc3RyZWFtRW5hYmxlZD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHN0cmVhbVZpZXdUeXBlPzogc3RyaW5nO1xuICByZWFkb25seSBiaWxsaW5nTW9kZT86ICdQQVlfUEVSX1JFUVVFU1QnIHwgJ1BST1ZJU0lPTkVEJztcbiAgcmVhZG9ubHkgZW5jcnlwdGlvbktleUFybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9kdWNlciBtZXRhZGF0YSBmb3IgZGVidWdnaW5nIGFuZCBzdXBwb3J0LlxuICogSWRlbnRpZmllcyB3aGF0IGNvbXBvbmVudCBwcm9kdWNlZCB0aGUgc25hcHNob3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjZXJNZXRhZGF0YSB7XG4gIC8qKiBDb21wb25lbnQgbmFtZSAqL1xuICByZWFkb25seSBjb21wb25lbnQ6ICdjaGFpbS1jZGsnO1xuXG4gIC8qKiBDb21wb25lbnQgdmVyc2lvbiBmcm9tIHBhY2thZ2UuanNvbiAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqIExhbWJkYSBydW50aW1lIChlLmcuLCAnbm9kZWpzMjAueCcpICovXG4gIHJlYWRvbmx5IHJ1bnRpbWU6IHN0cmluZztcblxufVxuXG4vKipcbiAqIExPQ0FMIHNuYXBzaG90IHBheWxvYWQgd3JpdHRlbiB0byBPUyBjYWNoZSBkdXJpbmcgc3ludGhlc2lzICh2My4wKS5cbiAqIFxuICogVGhpcyBpcyB0aGUgcHJpbWFyeSBzbmFwc2hvdCB0eXBlIHVzZWQgZm9yIENMSSBjb2RlIGdlbmVyYXRpb25cbiAqIGFuZCBMYW1iZGEgYnVuZGxpbmcgYXQgc3ludGgtdGltZS5cbiAqIFxuICogdjMuMCByZXN0cnVjdHVyZXMgdGhlIHBheWxvYWQgaW50byBsb2dpY2FsIHNlY3Rpb25zIGZvciBiZXR0ZXIgY2xhcml0eVxuICogYW5kIG11bHRpLXByb3ZpZGVyIHN1cHBvcnQuXG4gKiBcbiAqIEBjb250cmFjdCBjaGFpbS1pbmdlc3Qtc2VydmljZTogY29tLmNoYWltLmluZ2VzdC5tb2RlbC5TbmFwc2hvdFBheWxvYWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhbFNuYXBzaG90UGF5bG9hZCB7XG4gIC8qKlxuICAgKiBTbmFwc2hvdCB2ZXJzaW9uIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgKiBUaGUgY2hhaW0taW5nZXN0LXNlcnZpY2UgdXNlcyB0aGlzIHRvIHBhcnNlIGRpZmZlcmVudCBwYXlsb2FkIHZlcnNpb25zLlxuICAgKiBcbiAgICogVmVyc2lvbmluZyBzdHJhdGVneTpcbiAgICogLSBNaW5vciBidW1wICgzLjAg4oaSIDMuMSk6IEFkZGl0aXZlLCBvcHRpb25hbCBmaWVsZCBjaGFuZ2VzXG4gICAqIC0gTWFqb3IgYnVtcCAoMy54IOKGkiA0LjApOiBCcmVha2luZyBjaGFuZ2VzIChyZW1vdmVkL3JlbmFtZWQvcmVxdWlyZWQgZmllbGRzKVxuICAgKiBcbiAgICogQGNvbnRyYWN0IGNoYWltLWluZ2VzdC1zZXJ2aWNlOiBjb20uY2hhaW0uaW5nZXN0Lm1vZGVsLlNuYXBzaG90UGF5bG9hZFxuICAgKi9cbiAgcmVhZG9ubHkgc25hcHNob3RWZXJzaW9uOiAnMy4wJztcblxuICAvKipcbiAgICogQWN0aW9uIHR5cGUgZm9yIHRoaXMgc25hcHNob3QuXG4gICAqIC0gVVBTRVJUOiBDcmVhdGUgb3IgdXBkYXRlIGVudGl0eSBtZXRhZGF0YVxuICAgKiAtIERFTEVURTogTWFyayBlbnRpdHkgYXMgZGVsZXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uOiAnVVBTRVJUJyB8ICdERUxFVEUnO1xuXG4gIC8qKiBJU08gODYwMSB0aW1lc3RhbXAgb2Ygc25hcHNob3QgY3JlYXRpb24gKi9cbiAgcmVhZG9ubHkgY2FwdHVyZWRBdDogc3RyaW5nO1xuXG4gIC8qKiBQcm92aWRlci9jbG91ZCBpZGVudGl0eSAoQVdTIGFjY291bnQsIHJlZ2lvbiwgZGVwbG95bWVudCBzeXN0ZW0pICovXG4gIHJlYWRvbmx5IHByb3ZpZGVySWRlbnRpdHk6IFByb3ZpZGVySWRlbnRpdHk7XG5cbiAgLyoqIEJpbmRpbmcgaWRlbnRpdHkgKGFwcElkLCBlbnRpdHlOYW1lLCByZXNvdXJjZUlkLCBiaW5kaW5nSWQsIGV0Yy4pICovXG4gIHJlYWRvbmx5IGlkZW50aXR5OiBCaW5kaW5nSWRlbnRpdHk7XG5cbiAgLyoqIE9wZXJhdGlvbiBtZXRhZGF0YSAoZXZlbnRJZCwgcmVxdWVzdFR5cGUsIGZhaWx1cmVNb2RlKSAqL1xuICByZWFkb25seSBvcGVyYXRpb246IE9wZXJhdGlvbk1ldGFkYXRhO1xuXG4gIC8qKiBSZXNvbHV0aW9uIG1ldGFkYXRhIChtb2RlLCBoYXNUb2tlbnMpICovXG4gIHJlYWRvbmx5IHJlc29sdXRpb246IFJlc29sdXRpb25NZXRhZGF0YTtcblxuICAvKiogSGFzaCBtZXRhZGF0YSAoc2NoZW1hSGFzaCwgY29udGVudEhhc2gpICovXG4gIHJlYWRvbmx5IGhhc2hlczogSGFzaE1ldGFkYXRhO1xuXG4gIC8qKiBWYWxpZGF0ZWQgLmJwcmludCBzY2hlbWEgZGF0YSAobnVsbCBmb3IgREVMRVRFIGFjdGlvbnMpICovXG4gIHJlYWRvbmx5IHNjaGVtYTogU2NoZW1hRGF0YSB8IG51bGw7XG5cbiAgLyoqIFJlc291cmNlIG1ldGFkYXRhIChzaW1wbGlmaWVkLCBwcm92aWRlci1mb2N1c2VkKSAqL1xuICByZWFkb25seSByZXNvdXJjZTogUmVzb3VyY2VNZXRhZGF0YTtcblxuICAvKiogUHJvZHVjZXIgbWV0YWRhdGEgKGNvbXBvbmVudCwgdmVyc2lvbiwgcnVudGltZSwgbW9kZSkgKi9cbiAgcmVhZG9ubHkgcHJvZHVjZXI6IFByb2R1Y2VyTWV0YWRhdGE7XG59XG5cbi8qKlxuICogUFVCTElTSEVEIHNuYXBzaG90IHBheWxvYWQgZW5oYW5jZWQgYnkgTGFtYmRhIGhhbmRsZXIgYXQgZGVwbG95LXRpbWUuXG4gKiBcbiAqIFRoaXMgZXh0ZW5kcyBMb2NhbFNuYXBzaG90UGF5bG9hZCB3aXRoIGFkZGl0aW9uYWwgbWV0YWRhdGEgYWRkZWQgZHVyaW5nIGRlcGxveW1lbnQ6XG4gKiAtIG9wZXJhdGlvbjogZXZlbnRJZCwgY2ZSZXF1ZXN0SWQsIHJlcXVlc3RUeXBlLCBmYWlsdXJlTW9kZVxuICogLSBoYXNoZXM6IGNvbnRlbnRIYXNoLCBzY2hlbWFIYXNoXG4gKiAtIHByb2R1Y2VyOiBjb21wb25lbnQsIHZlcnNpb24sIHJ1bnRpbWUsIG1vZGVcbiAqIC0gZGVsZXRlOiAoREVMRVRFIG9ubHkpIHJlYXNvbiwgc2NvcGUsIGRlbGV0ZWRBdFxuICogXG4gKiBUaGlzIGlzIHRoZSBmb3JtYXQgdXBsb2FkZWQgdG8gUzMgYW5kIGNvbnN1bWVkIGJ5IGNoYWltLWluZ2VzdC1zZXJ2aWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFB1Ymxpc2hlZFNuYXBzaG90UGF5bG9hZCBleHRlbmRzIE9taXQ8TG9jYWxTbmFwc2hvdFBheWxvYWQsICdhY3Rpb24nIHwgJ19zY2hlbWFIYXNoJyB8ICdfcGFja2FnZVZlcnNpb24nPiB7XG4gIC8qKiBBY3Rpb24gaXMgcmVxdWlyZWQgZm9yIHB1Ymxpc2hlZCBzbmFwc2hvdHMgKi9cbiAgcmVhZG9ubHkgYWN0aW9uOiAnVVBTRVJUJyB8ICdERUxFVEUnO1xuXG4gIC8qKiBPcGVyYXRpb24gbWV0YWRhdGEgKGFkZGVkIGF0IGRlcGxveS10aW1lKSAqL1xuICByZWFkb25seSBvcGVyYXRpb246IE9wZXJhdGlvbk1ldGFkYXRhO1xuXG4gIC8qKiBIYXNoIG1ldGFkYXRhIChhZGRlZCBhdCBkZXBsb3ktdGltZSkgKi9cbiAgcmVhZG9ubHkgaGFzaGVzOiBIYXNoTWV0YWRhdGE7XG5cbiAgLyoqIFByb2R1Y2VyIG1ldGFkYXRhIChhZGRlZCBhdCBkZXBsb3ktdGltZSkgKi9cbiAgcmVhZG9ubHkgcHJvZHVjZXI6IFByb2R1Y2VyTWV0YWRhdGE7XG5cbiAgLyoqIERlbGV0ZSBtZXRhZGF0YSAob25seSBmb3IgREVMRVRFIGFjdGlvbnMpICovXG4gIHJlYWRvbmx5IGRlbGV0ZT86IERlbGV0ZU1ldGFkYXRhO1xufVxuXG4vKipcbiAqIFJlc3BvbnNlIGZyb20gQ2hhaW0gaW5nZXN0aW9uIEFQSSBhZnRlciBzbmFwc2hvdC1yZWYgY29tbWl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZ2VzdFJlc3BvbnNlIHtcbiAgLyoqIEV2ZW50IElEIGVjaG9lZCBiYWNrICovXG4gIHJlYWRvbmx5IGV2ZW50SWQ6IHN0cmluZztcblxuICAvKiogSW5nZXN0aW9uIHN0YXR1cyAqL1xuICByZWFkb25seSBzdGF0dXM6ICdTVUNDRVNTJyB8ICdGQUlMRUQnO1xuXG4gIC8qKiBFcnJvciBtZXNzYWdlIChpZiBmYWlsZWQpICovXG4gIHJlYWRvbmx5IGVycm9yTWVzc2FnZT86IHN0cmluZztcblxuICAvKiogVGltZXN0YW1wIHdoZW4gaW5nZXN0aW9uIHdhcyBwcm9jZXNzZWQgKi9cbiAgcmVhZG9ubHkgcHJvY2Vzc2VkQXQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDbG91ZEZvcm1hdGlvbiBjdXN0b20gcmVzb3VyY2UgcmVzcG9uc2UgZGF0YS5cbiAqIEtlcHQgbWluaW1hbCAtIGFjdHVhbCBwYXlsb2FkIGlzIGluIFMzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbVJlc291cmNlUmVzcG9uc2VEYXRhIHtcbiAgLyoqIEV2ZW50IElEIGZvciB0cmFja2luZyAqL1xuICByZWFkb25seSBFdmVudElkOiBzdHJpbmc7XG5cbiAgLyoqIEluZ2VzdGlvbiBzdGF0dXMgKi9cbiAgcmVhZG9ubHkgSW5nZXN0U3RhdHVzOiAnU1VDQ0VTUycgfCAnRkFJTEVEJztcblxuICAvKiogQ29udGVudCBoYXNoIGZvciBjaGFuZ2UgZGV0ZWN0aW9uICovXG4gIHJlYWRvbmx5IENvbnRlbnRIYXNoOiBzdHJpbmc7XG5cbiAgLyoqIFRpbWVzdGFtcCAqL1xuICByZWFkb25seSBUaW1lc3RhbXA6IHN0cmluZztcbn1cbiJdfQ==
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { IChaimCredentials } from './credentials';
|
|
2
|
+
import { FailureMode } from './failure-mode';
|
|
3
|
+
/**
|
|
4
|
+
* Configuration for Chaim entity bindings.
|
|
5
|
+
*
|
|
6
|
+
* For single-table design with multiple entities, create one TableBindingConfig
|
|
7
|
+
* and share it across all bindings to ensure consistency.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* // Create config once
|
|
12
|
+
* const config = new TableBindingConfig(
|
|
13
|
+
* 'my-app',
|
|
14
|
+
* ChaimCredentials.fromSecretsManager('chaim/api-credentials')
|
|
15
|
+
* );
|
|
16
|
+
*
|
|
17
|
+
* // Share across multiple entities
|
|
18
|
+
* new ChaimDynamoDBBinder(this, 'UserBinding', {
|
|
19
|
+
* schemaPath: './schemas/user.bprint',
|
|
20
|
+
* table: singleTable,
|
|
21
|
+
* config,
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* new ChaimDynamoDBBinder(this, 'OrderBinding', {
|
|
25
|
+
* schemaPath: './schemas/order.bprint',
|
|
26
|
+
* table: singleTable,
|
|
27
|
+
* config, // Same config ensures consistency
|
|
28
|
+
* });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare class TableBindingConfig {
|
|
32
|
+
readonly appId: string;
|
|
33
|
+
readonly credentials: IChaimCredentials;
|
|
34
|
+
readonly failureMode: FailureMode;
|
|
35
|
+
/**
|
|
36
|
+
* Create a binding configuration.
|
|
37
|
+
*
|
|
38
|
+
* @param appId - Application ID for the Chaim platform
|
|
39
|
+
* @param credentials - API credentials for Chaim ingestion
|
|
40
|
+
* @param failureMode - How to handle ingestion failures (default: BEST_EFFORT)
|
|
41
|
+
*/
|
|
42
|
+
constructor(appId: string, credentials: IChaimCredentials, failureMode?: FailureMode);
|
|
43
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TableBindingConfig = void 0;
|
|
4
|
+
const failure_mode_1 = require("./failure-mode");
|
|
5
|
+
/**
|
|
6
|
+
* Configuration for Chaim entity bindings.
|
|
7
|
+
*
|
|
8
|
+
* For single-table design with multiple entities, create one TableBindingConfig
|
|
9
|
+
* and share it across all bindings to ensure consistency.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* // Create config once
|
|
14
|
+
* const config = new TableBindingConfig(
|
|
15
|
+
* 'my-app',
|
|
16
|
+
* ChaimCredentials.fromSecretsManager('chaim/api-credentials')
|
|
17
|
+
* );
|
|
18
|
+
*
|
|
19
|
+
* // Share across multiple entities
|
|
20
|
+
* new ChaimDynamoDBBinder(this, 'UserBinding', {
|
|
21
|
+
* schemaPath: './schemas/user.bprint',
|
|
22
|
+
* table: singleTable,
|
|
23
|
+
* config,
|
|
24
|
+
* });
|
|
25
|
+
*
|
|
26
|
+
* new ChaimDynamoDBBinder(this, 'OrderBinding', {
|
|
27
|
+
* schemaPath: './schemas/order.bprint',
|
|
28
|
+
* table: singleTable,
|
|
29
|
+
* config, // Same config ensures consistency
|
|
30
|
+
* });
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
class TableBindingConfig {
|
|
34
|
+
appId;
|
|
35
|
+
credentials;
|
|
36
|
+
failureMode;
|
|
37
|
+
/**
|
|
38
|
+
* Create a binding configuration.
|
|
39
|
+
*
|
|
40
|
+
* @param appId - Application ID for the Chaim platform
|
|
41
|
+
* @param credentials - API credentials for Chaim ingestion
|
|
42
|
+
* @param failureMode - How to handle ingestion failures (default: BEST_EFFORT)
|
|
43
|
+
*/
|
|
44
|
+
constructor(appId, credentials, failureMode = failure_mode_1.FailureMode.BEST_EFFORT) {
|
|
45
|
+
this.appId = appId;
|
|
46
|
+
this.credentials = credentials;
|
|
47
|
+
this.failureMode = failureMode;
|
|
48
|
+
if (!appId || appId.trim() === '') {
|
|
49
|
+
throw new Error('TableBindingConfig: appId cannot be empty');
|
|
50
|
+
}
|
|
51
|
+
if (!credentials) {
|
|
52
|
+
throw new Error('TableBindingConfig: credentials are required');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.TableBindingConfig = TableBindingConfig;
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYmluZGluZy1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvdGFibGUtYmluZGluZy1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsaURBQTZDO0FBRTdDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQkc7QUFDSCxNQUFhLGtCQUFrQjtJQVNYO0lBQ0E7SUFDQTtJQVZsQjs7Ozs7O09BTUc7SUFDSCxZQUNrQixLQUFhLEVBQ2IsV0FBOEIsRUFDOUIsY0FBMkIsMEJBQVcsQ0FBQyxXQUFXO1FBRmxELFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixnQkFBVyxHQUFYLFdBQVcsQ0FBbUI7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQXVDO1FBRWxFLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7U0FDOUQ7UUFDRCxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztTQUNqRTtJQUNILENBQUM7Q0FDRjtBQXBCRCxnREFvQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJQ2hhaW1DcmVkZW50aWFscyB9IGZyb20gJy4vY3JlZGVudGlhbHMnO1xuaW1wb3J0IHsgRmFpbHVyZU1vZGUgfSBmcm9tICcuL2ZhaWx1cmUtbW9kZSc7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgQ2hhaW0gZW50aXR5IGJpbmRpbmdzLlxuICogXG4gKiBGb3Igc2luZ2xlLXRhYmxlIGRlc2lnbiB3aXRoIG11bHRpcGxlIGVudGl0aWVzLCBjcmVhdGUgb25lIFRhYmxlQmluZGluZ0NvbmZpZ1xuICogYW5kIHNoYXJlIGl0IGFjcm9zcyBhbGwgYmluZGluZ3MgdG8gZW5zdXJlIGNvbnNpc3RlbmN5LlxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGNvbmZpZyBvbmNlXG4gKiBjb25zdCBjb25maWcgPSBuZXcgVGFibGVCaW5kaW5nQ29uZmlnKFxuICogICAnbXktYXBwJyxcbiAqICAgQ2hhaW1DcmVkZW50aWFscy5mcm9tU2VjcmV0c01hbmFnZXIoJ2NoYWltL2FwaS1jcmVkZW50aWFscycpXG4gKiApO1xuICogXG4gKiAvLyBTaGFyZSBhY3Jvc3MgbXVsdGlwbGUgZW50aXRpZXNcbiAqIG5ldyBDaGFpbUR5bmFtb0RCQmluZGVyKHRoaXMsICdVc2VyQmluZGluZycsIHtcbiAqICAgc2NoZW1hUGF0aDogJy4vc2NoZW1hcy91c2VyLmJwcmludCcsXG4gKiAgIHRhYmxlOiBzaW5nbGVUYWJsZSxcbiAqICAgY29uZmlnLFxuICogfSk7XG4gKiBcbiAqIG5ldyBDaGFpbUR5bmFtb0RCQmluZGVyKHRoaXMsICdPcmRlckJpbmRpbmcnLCB7XG4gKiAgIHNjaGVtYVBhdGg6ICcuL3NjaGVtYXMvb3JkZXIuYnByaW50JyxcbiAqICAgdGFibGU6IHNpbmdsZVRhYmxlLFxuICogICBjb25maWcsIC8vIFNhbWUgY29uZmlnIGVuc3VyZXMgY29uc2lzdGVuY3lcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWJsZUJpbmRpbmdDb25maWcge1xuICAvKipcbiAgICogQ3JlYXRlIGEgYmluZGluZyBjb25maWd1cmF0aW9uLlxuICAgKiBcbiAgICogQHBhcmFtIGFwcElkIC0gQXBwbGljYXRpb24gSUQgZm9yIHRoZSBDaGFpbSBwbGF0Zm9ybVxuICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgLSBBUEkgY3JlZGVudGlhbHMgZm9yIENoYWltIGluZ2VzdGlvblxuICAgKiBAcGFyYW0gZmFpbHVyZU1vZGUgLSBIb3cgdG8gaGFuZGxlIGluZ2VzdGlvbiBmYWlsdXJlcyAoZGVmYXVsdDogQkVTVF9FRkZPUlQpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgYXBwSWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgY3JlZGVudGlhbHM6IElDaGFpbUNyZWRlbnRpYWxzLFxuICAgIHB1YmxpYyByZWFkb25seSBmYWlsdXJlTW9kZTogRmFpbHVyZU1vZGUgPSBGYWlsdXJlTW9kZS5CRVNUX0VGRk9SVFxuICApIHtcbiAgICBpZiAoIWFwcElkIHx8IGFwcElkLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGFibGVCaW5kaW5nQ29uZmlnOiBhcHBJZCBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9XG4gICAgaWYgKCFjcmVkZW50aWFscykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUYWJsZUJpbmRpbmdDb25maWc6IGNyZWRlbnRpYWxzIGFyZSByZXF1aXJlZCcpO1xuICAgIH1cbiAgfVxufVxuIl19
|