@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,95 @@
|
|
|
1
|
+
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
|
|
2
|
+
import { Construct } from 'constructs';
|
|
3
|
+
import { BaseChaimBinder } from './base-chaim-binder';
|
|
4
|
+
import { BaseBinderProps } from '../types/base-binder-props';
|
|
5
|
+
import { DynamoDBMetadata } from '../types/data-store-metadata';
|
|
6
|
+
/**
|
|
7
|
+
* Properties for ChaimDynamoDBBinder construct.
|
|
8
|
+
*/
|
|
9
|
+
export interface ChaimDynamoDBBinderProps extends BaseBinderProps {
|
|
10
|
+
/** DynamoDB table to bind with the schema */
|
|
11
|
+
table: dynamodb.ITable;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* CDK construct for binding a .bprint schema to a DynamoDB table.
|
|
15
|
+
*
|
|
16
|
+
* Publishes schema and table metadata to Chaim SaaS platform via
|
|
17
|
+
* S3 presigned upload and snapshot-ref commit.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* import { ChaimDynamoDBBinder, ChaimCredentials, FailureMode } from '@chaim-tools/cdk-lib';
|
|
22
|
+
*
|
|
23
|
+
* const table = new dynamodb.Table(this, 'UsersTable', {
|
|
24
|
+
* partitionKey: { name: 'userId', type: dynamodb.AttributeType.STRING },
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* // failureMode defaults to BEST_EFFORT
|
|
28
|
+
* new ChaimDynamoDBBinder(this, 'UserSchema', {
|
|
29
|
+
* schemaPath: './schemas/user.bprint',
|
|
30
|
+
* table,
|
|
31
|
+
* appId: 'my-app',
|
|
32
|
+
* credentials: ChaimCredentials.fromSecretsManager('chaim/api-credentials'),
|
|
33
|
+
* failureMode: FailureMode.STRICT, // Optional - rolls back on failure
|
|
34
|
+
* });
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare class ChaimDynamoDBBinder extends BaseChaimBinder {
|
|
38
|
+
/** The DynamoDB table being bound */
|
|
39
|
+
readonly table: dynamodb.ITable;
|
|
40
|
+
/** DynamoDB-specific metadata */
|
|
41
|
+
readonly dynamoDBMetadata: DynamoDBMetadata;
|
|
42
|
+
private readonly dynamoDBProps;
|
|
43
|
+
constructor(scope: Construct, id: string, props: ChaimDynamoDBBinderProps);
|
|
44
|
+
/**
|
|
45
|
+
* Override to resolve the actual table name when possible.
|
|
46
|
+
*
|
|
47
|
+
* Uses stack.resolve() to convert CDK tokens to actual values for explicit table names
|
|
48
|
+
* (e.g., 'acme-product-catalog') and dynamic names (e.g., `${stack.stackName}-orders`).
|
|
49
|
+
* Falls back to construct node ID for auto-generated names or cross-stack references.
|
|
50
|
+
*
|
|
51
|
+
* Note: This is called from BaseChaimBinder constructor before this.table is set,
|
|
52
|
+
* so we access the table from baseProps instead.
|
|
53
|
+
*/
|
|
54
|
+
protected getResourceName(): string;
|
|
55
|
+
/**
|
|
56
|
+
* Extract DynamoDB table metadata.
|
|
57
|
+
*/
|
|
58
|
+
protected extractMetadata(): DynamoDBMetadata;
|
|
59
|
+
/**
|
|
60
|
+
* Validate that the table is a concrete DynamoDB Table construct.
|
|
61
|
+
*
|
|
62
|
+
* Note: We use duck typing for instanceof check to handle cross-package
|
|
63
|
+
* type compatibility issues in monorepo setups (e.g., pnpm with isolated node_modules).
|
|
64
|
+
*/
|
|
65
|
+
private validateTable;
|
|
66
|
+
/**
|
|
67
|
+
* Get the underlying CloudFormation table resource.
|
|
68
|
+
* Uses duck typing for cross-package compatibility.
|
|
69
|
+
*/
|
|
70
|
+
private getCfnTable;
|
|
71
|
+
/**
|
|
72
|
+
* Extract partition key and sort key from key schema.
|
|
73
|
+
*/
|
|
74
|
+
private extractKeySchema;
|
|
75
|
+
/**
|
|
76
|
+
* Extract Global Secondary Index metadata.
|
|
77
|
+
*/
|
|
78
|
+
private extractGSIs;
|
|
79
|
+
/**
|
|
80
|
+
* Extract Local Secondary Index metadata.
|
|
81
|
+
*/
|
|
82
|
+
private extractLSIs;
|
|
83
|
+
/**
|
|
84
|
+
* Extract TTL attribute name.
|
|
85
|
+
*/
|
|
86
|
+
private extractTTL;
|
|
87
|
+
/**
|
|
88
|
+
* Extract stream configuration.
|
|
89
|
+
*/
|
|
90
|
+
private extractStreamInfo;
|
|
91
|
+
/**
|
|
92
|
+
* Extract billing mode.
|
|
93
|
+
*/
|
|
94
|
+
private extractBillingMode;
|
|
95
|
+
}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.ChaimDynamoDBBinder = void 0;
|
|
27
|
+
const cdk = __importStar(require("aws-cdk-lib"));
|
|
28
|
+
const dynamodb = __importStar(require("aws-cdk-lib/aws-dynamodb"));
|
|
29
|
+
const base_chaim_binder_1 = require("./base-chaim-binder");
|
|
30
|
+
/**
|
|
31
|
+
* CDK construct for binding a .bprint schema to a DynamoDB table.
|
|
32
|
+
*
|
|
33
|
+
* Publishes schema and table metadata to Chaim SaaS platform via
|
|
34
|
+
* S3 presigned upload and snapshot-ref commit.
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* import { ChaimDynamoDBBinder, ChaimCredentials, FailureMode } from '@chaim-tools/cdk-lib';
|
|
39
|
+
*
|
|
40
|
+
* const table = new dynamodb.Table(this, 'UsersTable', {
|
|
41
|
+
* partitionKey: { name: 'userId', type: dynamodb.AttributeType.STRING },
|
|
42
|
+
* });
|
|
43
|
+
*
|
|
44
|
+
* // failureMode defaults to BEST_EFFORT
|
|
45
|
+
* new ChaimDynamoDBBinder(this, 'UserSchema', {
|
|
46
|
+
* schemaPath: './schemas/user.bprint',
|
|
47
|
+
* table,
|
|
48
|
+
* appId: 'my-app',
|
|
49
|
+
* credentials: ChaimCredentials.fromSecretsManager('chaim/api-credentials'),
|
|
50
|
+
* failureMode: FailureMode.STRICT, // Optional - rolls back on failure
|
|
51
|
+
* });
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
class ChaimDynamoDBBinder extends base_chaim_binder_1.BaseChaimBinder {
|
|
55
|
+
/** The DynamoDB table being bound */
|
|
56
|
+
table;
|
|
57
|
+
/** DynamoDB-specific metadata */
|
|
58
|
+
dynamoDBMetadata;
|
|
59
|
+
dynamoDBProps;
|
|
60
|
+
constructor(scope, id, props) {
|
|
61
|
+
// Store props before calling super (which calls extractMetadata)
|
|
62
|
+
super(scope, id, props);
|
|
63
|
+
this.dynamoDBProps = props;
|
|
64
|
+
this.table = props.table;
|
|
65
|
+
this.dynamoDBMetadata = this.dataStoreMetadata;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Override to resolve the actual table name when possible.
|
|
69
|
+
*
|
|
70
|
+
* Uses stack.resolve() to convert CDK tokens to actual values for explicit table names
|
|
71
|
+
* (e.g., 'acme-product-catalog') and dynamic names (e.g., `${stack.stackName}-orders`).
|
|
72
|
+
* Falls back to construct node ID for auto-generated names or cross-stack references.
|
|
73
|
+
*
|
|
74
|
+
* Note: This is called from BaseChaimBinder constructor before this.table is set,
|
|
75
|
+
* so we access the table from baseProps instead.
|
|
76
|
+
*/
|
|
77
|
+
getResourceName() {
|
|
78
|
+
const props = this.baseProps;
|
|
79
|
+
const cfnTable = props.table.node.defaultChild;
|
|
80
|
+
const stack = cdk.Stack.of(this);
|
|
81
|
+
// Try to resolve the table name token
|
|
82
|
+
// This works for explicit names like 'acme-product-catalog'
|
|
83
|
+
// and dynamic names like `${stack.stackName}-orders`
|
|
84
|
+
const resolvedName = stack.resolve(cfnTable.tableName);
|
|
85
|
+
// Check if it's still an unresolved token
|
|
86
|
+
if (!resolvedName || cdk.Token.isUnresolved(resolvedName)) {
|
|
87
|
+
// Fallback to construct ID for auto-generated names
|
|
88
|
+
return props.table.node.id;
|
|
89
|
+
}
|
|
90
|
+
// Return the actual resolved table name
|
|
91
|
+
return resolvedName;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Extract DynamoDB table metadata.
|
|
95
|
+
*/
|
|
96
|
+
extractMetadata() {
|
|
97
|
+
const props = this.baseProps;
|
|
98
|
+
const table = props.table;
|
|
99
|
+
const stack = cdk.Stack.of(this);
|
|
100
|
+
// Validate table
|
|
101
|
+
this.validateTable(table);
|
|
102
|
+
// Get CloudFormation resource for detailed metadata
|
|
103
|
+
const cfnTable = this.getCfnTable(table);
|
|
104
|
+
// Extract key schema
|
|
105
|
+
const { partitionKey, sortKey } = this.extractKeySchema(cfnTable);
|
|
106
|
+
// Extract indexes
|
|
107
|
+
const globalSecondaryIndexes = this.extractGSIs(cfnTable);
|
|
108
|
+
const localSecondaryIndexes = this.extractLSIs(cfnTable);
|
|
109
|
+
// Extract TTL
|
|
110
|
+
const ttlAttribute = this.extractTTL(cfnTable);
|
|
111
|
+
// Extract stream info
|
|
112
|
+
const { streamEnabled, streamViewType } = this.extractStreamInfo(cfnTable);
|
|
113
|
+
// Extract billing mode
|
|
114
|
+
const billingMode = this.extractBillingMode(cfnTable);
|
|
115
|
+
// Resolve table name from token (same logic as getResourceName)
|
|
116
|
+
const resolvedTableName = stack.resolve(cfnTable.tableName);
|
|
117
|
+
const tableName = (!resolvedTableName || cdk.Token.isUnresolved(resolvedTableName))
|
|
118
|
+
? table.tableName // Keep token if can't resolve
|
|
119
|
+
: resolvedTableName;
|
|
120
|
+
return {
|
|
121
|
+
type: 'dynamodb',
|
|
122
|
+
// Removed duplicate fields in v1.1:
|
|
123
|
+
// - arn (use tableArn instead)
|
|
124
|
+
// - name (use tableName instead)
|
|
125
|
+
// - account (use top-level accountId instead)
|
|
126
|
+
tableName,
|
|
127
|
+
tableArn: table.tableArn,
|
|
128
|
+
region: stack.region,
|
|
129
|
+
partitionKey,
|
|
130
|
+
sortKey,
|
|
131
|
+
globalSecondaryIndexes,
|
|
132
|
+
localSecondaryIndexes,
|
|
133
|
+
ttlAttribute,
|
|
134
|
+
streamEnabled,
|
|
135
|
+
streamViewType,
|
|
136
|
+
billingMode,
|
|
137
|
+
encryptionKeyArn: table.encryptionKey?.keyArn,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Validate that the table is a concrete DynamoDB Table construct.
|
|
142
|
+
*
|
|
143
|
+
* Note: We use duck typing for instanceof check to handle cross-package
|
|
144
|
+
* type compatibility issues in monorepo setups (e.g., pnpm with isolated node_modules).
|
|
145
|
+
*/
|
|
146
|
+
validateTable(table) {
|
|
147
|
+
if (!table) {
|
|
148
|
+
throw new Error('DynamoDB table is required');
|
|
149
|
+
}
|
|
150
|
+
// Duck typing check: a concrete Table has node.defaultChild (CfnTable)
|
|
151
|
+
// This handles cross-package type compatibility in monorepos
|
|
152
|
+
const isConcreteTable = table instanceof dynamodb.Table ||
|
|
153
|
+
(table.node && table.node.defaultChild &&
|
|
154
|
+
table.node.defaultChild.cfnResourceType === 'AWS::DynamoDB::Table');
|
|
155
|
+
if (!isConcreteTable) {
|
|
156
|
+
throw new Error('Table must be a concrete DynamoDB Table construct. Imported tables are not supported.');
|
|
157
|
+
}
|
|
158
|
+
if (!table.tableName) {
|
|
159
|
+
throw new Error('Table must have a valid table name');
|
|
160
|
+
}
|
|
161
|
+
if (!table.tableArn) {
|
|
162
|
+
throw new Error('Table must have a valid table ARN');
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Get the underlying CloudFormation table resource.
|
|
167
|
+
* Uses duck typing for cross-package compatibility.
|
|
168
|
+
*/
|
|
169
|
+
getCfnTable(table) {
|
|
170
|
+
// Use duck typing check for cross-package compatibility
|
|
171
|
+
const cfnTable = table.node?.defaultChild;
|
|
172
|
+
if (!cfnTable || cfnTable.cfnResourceType !== 'AWS::DynamoDB::Table') {
|
|
173
|
+
throw new Error('Cannot access CloudFormation resource for imported table');
|
|
174
|
+
}
|
|
175
|
+
return cfnTable;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Extract partition key and sort key from key schema.
|
|
179
|
+
*/
|
|
180
|
+
extractKeySchema(cfnTable) {
|
|
181
|
+
const keySchema = cfnTable.keySchema;
|
|
182
|
+
if (!keySchema || !Array.isArray(keySchema) || keySchema.length === 0) {
|
|
183
|
+
throw new Error('Table must have a key schema');
|
|
184
|
+
}
|
|
185
|
+
let partitionKey;
|
|
186
|
+
let sortKey;
|
|
187
|
+
for (const key of keySchema) {
|
|
188
|
+
if (typeof key === 'object' && 'attributeName' in key && 'keyType' in key) {
|
|
189
|
+
if (key.keyType === 'HASH') {
|
|
190
|
+
partitionKey = key.attributeName;
|
|
191
|
+
}
|
|
192
|
+
else if (key.keyType === 'RANGE') {
|
|
193
|
+
sortKey = key.attributeName;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (!partitionKey) {
|
|
198
|
+
throw new Error('Cannot extract partition key from table key schema');
|
|
199
|
+
}
|
|
200
|
+
return { partitionKey, sortKey };
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Extract Global Secondary Index metadata.
|
|
204
|
+
*/
|
|
205
|
+
extractGSIs(cfnTable) {
|
|
206
|
+
const gsis = cfnTable.globalSecondaryIndexes;
|
|
207
|
+
if (!gsis || !Array.isArray(gsis) || gsis.length === 0) {
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
return gsis.map((gsi) => {
|
|
211
|
+
const keySchema = gsi.keySchema || [];
|
|
212
|
+
let partitionKey = '';
|
|
213
|
+
let sortKey;
|
|
214
|
+
for (const key of keySchema) {
|
|
215
|
+
if (key.keyType === 'HASH') {
|
|
216
|
+
partitionKey = key.attributeName;
|
|
217
|
+
}
|
|
218
|
+
else if (key.keyType === 'RANGE') {
|
|
219
|
+
sortKey = key.attributeName;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return {
|
|
223
|
+
indexName: gsi.indexName,
|
|
224
|
+
partitionKey,
|
|
225
|
+
sortKey,
|
|
226
|
+
projectionType: gsi.projection?.projectionType || 'ALL',
|
|
227
|
+
nonKeyAttributes: gsi.projection?.nonKeyAttributes,
|
|
228
|
+
};
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Extract Local Secondary Index metadata.
|
|
233
|
+
*/
|
|
234
|
+
extractLSIs(cfnTable) {
|
|
235
|
+
const lsis = cfnTable.localSecondaryIndexes;
|
|
236
|
+
if (!lsis || !Array.isArray(lsis) || lsis.length === 0) {
|
|
237
|
+
return undefined;
|
|
238
|
+
}
|
|
239
|
+
return lsis.map((lsi) => {
|
|
240
|
+
const keySchema = lsi.keySchema || [];
|
|
241
|
+
let sortKey = '';
|
|
242
|
+
for (const key of keySchema) {
|
|
243
|
+
if (key.keyType === 'RANGE') {
|
|
244
|
+
sortKey = key.attributeName;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
indexName: lsi.indexName,
|
|
249
|
+
sortKey,
|
|
250
|
+
projectionType: lsi.projection?.projectionType || 'ALL',
|
|
251
|
+
nonKeyAttributes: lsi.projection?.nonKeyAttributes,
|
|
252
|
+
};
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Extract TTL attribute name.
|
|
257
|
+
*/
|
|
258
|
+
extractTTL(cfnTable) {
|
|
259
|
+
const ttlSpec = cfnTable.timeToLiveSpecification;
|
|
260
|
+
if (ttlSpec && typeof ttlSpec === 'object' && 'enabled' in ttlSpec) {
|
|
261
|
+
if (ttlSpec.enabled && 'attributeName' in ttlSpec) {
|
|
262
|
+
return ttlSpec.attributeName;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return undefined;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Extract stream configuration.
|
|
269
|
+
*/
|
|
270
|
+
extractStreamInfo(cfnTable) {
|
|
271
|
+
const streamSpec = cfnTable.streamSpecification;
|
|
272
|
+
if (streamSpec && typeof streamSpec === 'object' && 'streamViewType' in streamSpec) {
|
|
273
|
+
return {
|
|
274
|
+
streamEnabled: true,
|
|
275
|
+
streamViewType: streamSpec.streamViewType,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
return { streamEnabled: false };
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Extract billing mode.
|
|
282
|
+
*/
|
|
283
|
+
extractBillingMode(cfnTable) {
|
|
284
|
+
const billingMode = cfnTable.billingMode;
|
|
285
|
+
if (billingMode === 'PAY_PER_REQUEST' || billingMode === 'PROVISIONED') {
|
|
286
|
+
return billingMode;
|
|
287
|
+
}
|
|
288
|
+
return undefined;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
exports.ChaimDynamoDBBinder = ChaimDynamoDBBinder;
|
|
292
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW0tZHluYW1vZGItYmluZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2JpbmRlcnMvY2hhaW0tZHluYW1vZGItYmluZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQW1DO0FBQ25DLG1FQUFxRDtBQUdyRCwyREFBc0Q7QUFnQnREOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILE1BQWEsbUJBQW9CLFNBQVEsbUNBQWU7SUFDdEQscUNBQXFDO0lBQ3JCLEtBQUssQ0FBa0I7SUFFdkMsaUNBQWlDO0lBQ2pCLGdCQUFnQixDQUFtQjtJQUVsQyxhQUFhLENBQTJCO0lBRXpELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBK0I7UUFDdkUsaUVBQWlFO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGlCQUFxQyxDQUFDO0lBQ3JFLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDTyxlQUFlO1FBQ3ZCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFxQyxDQUFDO1FBQ3pELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQWlDLENBQUM7UUFDcEUsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFakMsc0NBQXNDO1FBQ3RDLDREQUE0RDtRQUM1RCxxREFBcUQ7UUFDckQsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7UUFF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T0FBTyxFQUFFO1lBQ2xFLElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxlQUFlLElBQUksT0FBTyxFQUFFO2dCQUNqRCxPQUFPLE9BQU8sQ0FBQyxhQUF1QixDQUFDO2FBQ3hDO1NBQ0Y7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7O09BRUc7SUFDSyxpQkFBaUIsQ0FBQyxRQUEyQjtRQUluRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsbUJBQW1CLENBQUM7UUFDaEQsSUFBSSxVQUFVLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLGdCQUFnQixJQUFJLFVBQVUsRUFBRTtZQUNsRixPQUFPO2dCQUNMLGFBQWEsRUFBRSxJQUFJO2dCQUNuQixjQUFjLEVBQUUsVUFBVSxDQUFDLGNBQXdCO2FBQ3BELENBQUM7U0FDSDtRQUNELE9BQU8sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssa0JBQWtCLENBQUMsUUFBMkI7UUFDcEQsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxJQUFJLFdBQVcsS0FBSyxpQkFBaUIsSUFBSSxXQUFXLEtBQUssYUFBYSxFQUFFO1lBQ3RFLE9BQU8sV0FBVyxDQUFDO1NBQ3BCO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztDQUNGO0FBN1JELGtEQTZSQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBkeW5hbW9kYiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbmltcG9ydCB7IEJhc2VDaGFpbUJpbmRlciB9IGZyb20gJy4vYmFzZS1jaGFpbS1iaW5kZXInO1xuaW1wb3J0IHsgQmFzZUJpbmRlclByb3BzIH0gZnJvbSAnLi4vdHlwZXMvYmFzZS1iaW5kZXItcHJvcHMnO1xuaW1wb3J0IHtcbiAgRHluYW1vREJNZXRhZGF0YSxcbiAgR1NJTWV0YWRhdGEsXG4gIExTSU1ldGFkYXRhLFxufSBmcm9tICcuLi90eXBlcy9kYXRhLXN0b3JlLW1ldGFkYXRhJztcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBDaGFpbUR5bmFtb0RCQmluZGVyIGNvbnN0cnVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDaGFpbUR5bmFtb0RCQmluZGVyUHJvcHMgZXh0ZW5kcyBCYXNlQmluZGVyUHJvcHMge1xuICAvKiogRHluYW1vREIgdGFibGUgdG8gYmluZCB3aXRoIHRoZSBzY2hlbWEgKi9cbiAgdGFibGU6IGR5bmFtb2RiLklUYWJsZTtcbn1cblxuLyoqXG4gKiBDREsgY29uc3RydWN0IGZvciBiaW5kaW5nIGEgLmJwcmludCBzY2hlbWEgdG8gYSBEeW5hbW9EQiB0YWJsZS5cbiAqXG4gKiBQdWJsaXNoZXMgc2NoZW1hIGFuZCB0YWJsZSBtZXRhZGF0YSB0byBDaGFpbSBTYWFTIHBsYXRmb3JtIHZpYVxuICogUzMgcHJlc2lnbmVkIHVwbG9hZCBhbmQgc25hcHNob3QtcmVmIGNvbW1pdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgQ2hhaW1EeW5hbW9EQkJpbmRlciwgQ2hhaW1DcmVkZW50aWFscywgRmFpbHVyZU1vZGUgfSBmcm9tICdAY2hhaW0tdG9vbHMvY2RrLWxpYic7XG4gKlxuICogY29uc3QgdGFibGUgPSBuZXcgZHluYW1vZGIuVGFibGUodGhpcywgJ1VzZXJzVGFibGUnLCB7XG4gKiAgIHBhcnRpdGlvbktleTogeyBuYW1lOiAndXNlcklkJywgdHlwZTogZHluYW1vZGIuQXR0cmlidXRlVHlwZS5TVFJJTkcgfSxcbiAqIH0pO1xuICpcbiAqIC8vIGZhaWx1cmVNb2RlIGRlZmF1bHRzIHRvIEJFU1RfRUZGT1JUXG4gKiBuZXcgQ2hhaW1EeW5hbW9EQkJpbmRlcih0aGlzLCAnVXNlclNjaGVtYScsIHtcbiAqICAgc2NoZW1hUGF0aDogJy4vc2NoZW1hcy91c2VyLmJwcmludCcsXG4gKiAgIHRhYmxlLFxuICogICBhcHBJZDogJ215LWFwcCcsXG4gKiAgIGNyZWRlbnRpYWxzOiBDaGFpbUNyZWRlbnRpYWxzLmZyb21TZWNyZXRzTWFuYWdlcignY2hhaW0vYXBpLWNyZWRlbnRpYWxzJyksXG4gKiAgIGZhaWx1cmVNb2RlOiBGYWlsdXJlTW9kZS5TVFJJQ1QsICAvLyBPcHRpb25hbCAtIHJvbGxzIGJhY2sgb24gZmFpbHVyZVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIENoYWltRHluYW1vREJCaW5kZXIgZXh0ZW5kcyBCYXNlQ2hhaW1CaW5kZXIge1xuICAvKiogVGhlIER5bmFtb0RCIHRhYmxlIGJlaW5nIGJvdW5kICovXG4gIHB1YmxpYyByZWFkb25seSB0YWJsZTogZHluYW1vZGIuSVRhYmxlO1xuXG4gIC8qKiBEeW5hbW9EQi1zcGVjaWZpYyBtZXRhZGF0YSAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZHluYW1vREJNZXRhZGF0YTogRHluYW1vREJNZXRhZGF0YTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGR5bmFtb0RCUHJvcHM6IENoYWltRHluYW1vREJCaW5kZXJQcm9wcztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQ2hhaW1EeW5hbW9EQkJpbmRlclByb3BzKSB7XG4gICAgLy8gU3RvcmUgcHJvcHMgYmVmb3JlIGNhbGxpbmcgc3VwZXIgKHdoaWNoIGNhbGxzIGV4dHJhY3RNZXRhZGF0YSlcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMuZHluYW1vREJQcm9wcyA9IHByb3BzO1xuICAgIHRoaXMudGFibGUgPSBwcm9wcy50YWJsZTtcbiAgICB0aGlzLmR5bmFtb0RCTWV0YWRhdGEgPSB0aGlzLmRhdGFTdG9yZU1ldGFkYXRhIGFzIER5bmFtb0RCTWV0YWRhdGE7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgdG8gcmVzb2x2ZSB0aGUgYWN0dWFsIHRhYmxlIG5hbWUgd2hlbiBwb3NzaWJsZS5cbiAgICogXG4gICAqIFVzZXMgc3RhY2sucmVzb2x2ZSgpIHRvIGNvbnZlcnQgQ0RLIHRva2VucyB0byBhY3R1YWwgdmFsdWVzIGZvciBleHBsaWNpdCB0YWJsZSBuYW1lc1xuICAgKiAoZS5nLiwgJ2FjbWUtcHJvZHVjdC1jYXRhbG9nJykgYW5kIGR5bmFtaWMgbmFtZXMgKGUuZy4sIGAke3N0YWNrLnN0YWNrTmFtZX0tb3JkZXJzYCkuXG4gICAqIEZhbGxzIGJhY2sgdG8gY29uc3RydWN0IG5vZGUgSUQgZm9yIGF1dG8tZ2VuZXJhdGVkIG5hbWVzIG9yIGNyb3NzLXN0YWNrIHJlZmVyZW5jZXMuXG4gICAqIFxuICAgKiBOb3RlOiBUaGlzIGlzIGNhbGxlZCBmcm9tIEJhc2VDaGFpbUJpbmRlciBjb25zdHJ1Y3RvciBiZWZvcmUgdGhpcy50YWJsZSBpcyBzZXQsXG4gICAqIHNvIHdlIGFjY2VzcyB0aGUgdGFibGUgZnJvbSBiYXNlUHJvcHMgaW5zdGVhZC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRSZXNvdXJjZU5hbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcm9wcyA9IHRoaXMuYmFzZVByb3BzIGFzIENoYWltRHluYW1vREJCaW5kZXJQcm9wcztcbiAgICBjb25zdCBjZm5UYWJsZSA9IHByb3BzLnRhYmxlLm5vZGUuZGVmYXVsdENoaWxkIGFzIGR5bmFtb2RiLkNmblRhYmxlO1xuICAgIGNvbnN0IHN0YWNrID0gY2RrLlN0YWNrLm9mKHRoaXMpO1xuICAgIFxuICAgIC8vIFRyeSB0byByZXNvbHZlIHRoZSB0YWJsZSBuYW1lIHRva2VuXG4gICAgLy8gVGhpcyB3b3JrcyBmb3IgZXhwbGljaXQgbmFtZXMgbGlrZSAnYWNtZS1wcm9kdWN0LWNhdGFsb2cnXG4gICAgLy8gYW5kIGR5bmFtaWMgbmFtZXMgbGlrZSBgJHtzdGFjay5zdGFja05hbWV9LW9yZGVyc2BcbiAgICBjb25zdCByZXNvbHZlZE5hbWUgPSBzdGFjay5yZXNvbHZlKGNmblRhYmxlLnRhYmxlTmFtZSk7XG4gICAgXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBzdGlsbCBhbiB1bnJlc29sdmVkIHRva2VuXG4gICAgaWYgKCFyZXNvbHZlZE5hbWUgfHwgY2RrLlRva2VuLmlzVW5yZXNvbHZlZChyZXNvbHZlZE5hbWUpKSB7XG4gICAgICAvLyBGYWxsYmFjayB0byBjb25zdHJ1Y3QgSUQgZm9yIGF1dG8tZ2VuZXJhdGVkIG5hbWVzXG4gICAgICByZXR1cm4gcHJvcHMudGFibGUubm9kZS5pZDtcbiAgICB9XG4gICAgXG4gICAgLy8gUmV0dXJuIHRoZSBhY3R1YWwgcmVzb2x2ZWQgdGFibGUgbmFtZVxuICAgIHJldHVybiByZXNvbHZlZE5hbWU7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBEeW5hbW9EQiB0YWJsZSBtZXRhZGF0YS5cbiAgICovXG4gIHByb3RlY3RlZCBleHRyYWN0TWV0YWRhdGEoKTogRHluYW1vREJNZXRhZGF0YSB7XG4gICAgY29uc3QgcHJvcHMgPSB0aGlzLmJhc2VQcm9wcyBhcyBDaGFpbUR5bmFtb0RCQmluZGVyUHJvcHM7XG4gICAgY29uc3QgdGFibGUgPSBwcm9wcy50YWJsZTtcbiAgICBjb25zdCBzdGFjayA9IGNkay5TdGFjay5vZih0aGlzKTtcblxuICAgIC8vIFZhbGlkYXRlIHRhYmxlXG4gICAgdGhpcy52YWxpZGF0ZVRhYmxlKHRhYmxlKTtcblxuICAgIC8vIEdldCBDbG91ZEZvcm1hdGlvbiByZXNvdXJjZSBmb3IgZGV0YWlsZWQgbWV0YWRhdGFcbiAgICBjb25zdCBjZm5UYWJsZSA9IHRoaXMuZ2V0Q2ZuVGFibGUodGFibGUpO1xuXG4gICAgLy8gRXh0cmFjdCBrZXkgc2NoZW1hXG4gICAgY29uc3QgeyBwYXJ0aXRpb25LZXksIHNvcnRLZXkgfSA9IHRoaXMuZXh0cmFjdEtleVNjaGVtYShjZm5UYWJsZSk7XG5cbiAgICAvLyBFeHRyYWN0IGluZGV4ZXNcbiAgICBjb25zdCBnbG9iYWxTZWNvbmRhcnlJbmRleGVzID0gdGhpcy5leHRyYWN0R1NJcyhjZm5UYWJsZSk7XG4gICAgY29uc3QgbG9jYWxTZWNvbmRhcnlJbmRleGVzID0gdGhpcy5leHRyYWN0TFNJcyhjZm5UYWJsZSk7XG5cbiAgICAvLyBFeHRyYWN0IFRUTFxuICAgIGNvbnN0IHR0bEF0dHJpYnV0ZSA9IHRoaXMuZXh0cmFjdFRUTChjZm5UYWJsZSk7XG5cbiAgICAvLyBFeHRyYWN0IHN0cmVhbSBpbmZvXG4gICAgY29uc3QgeyBzdHJlYW1FbmFibGVkLCBzdHJlYW1WaWV3VHlwZSB9ID0gdGhpcy5leHRyYWN0U3RyZWFtSW5mbyhjZm5UYWJsZSk7XG5cbiAgICAvLyBFeHRyYWN0IGJpbGxpbmcgbW9kZVxuICAgIGNvbnN0IGJpbGxpbmdNb2RlID0gdGhpcy5leHRyYWN0QmlsbGluZ01vZGUoY2ZuVGFibGUpO1xuXG4gICAgLy8gUmVzb2x2ZSB0YWJsZSBuYW1lIGZyb20gdG9rZW4gKHNhbWUgbG9naWMgYXMgZ2V0UmVzb3VyY2VOYW1lKVxuICAgIGNvbnN0IHJlc29sdmVkVGFibGVOYW1lID0gc3RhY2sucmVzb2x2ZShjZm5UYWJsZS50YWJsZU5hbWUpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9ICghcmVzb2x2ZWRUYWJsZU5hbWUgfHwgY2RrLlRva2VuLmlzVW5yZXNvbHZlZChyZXNvbHZlZFRhYmxlTmFtZSkpIFxuICAgICAgPyB0YWJsZS50YWJsZU5hbWUgIC8vIEtlZXAgdG9rZW4gaWYgY2FuJ3QgcmVzb2x2ZVxuICAgICAgOiByZXNvbHZlZFRhYmxlTmFtZTtcblxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnZHluYW1vZGInLFxuICAgICAgLy8gUmVtb3ZlZCBkdXBsaWNhdGUgZmllbGRzIGluIHYxLjE6XG4gICAgICAvLyAtIGFybiAodXNlIHRhYmxlQXJuIGluc3RlYWQpXG4gICAgICAvLyAtIG5hbWUgKHVzZSB0YWJsZU5hbWUgaW5zdGVhZClcbiAgICAgIC8vIC0gYWNjb3VudCAodXNlIHRvcC1sZXZlbCBhY2NvdW50SWQgaW5zdGVhZClcbiAgICAgIHRhYmxlTmFtZSxcbiAgICAgIHRhYmxlQXJuOiB0YWJsZS50YWJsZUFybixcbiAgICAgIHJlZ2lvbjogc3RhY2sucmVnaW9uLFxuICAgICAgcGFydGl0aW9uS2V5LFxuICAgICAgc29ydEtleSxcbiAgICAgIGdsb2JhbFNlY29uZGFyeUluZGV4ZXMsXG4gICAgICBsb2NhbFNlY29uZGFyeUluZGV4ZXMsXG4gICAgICB0dGxBdHRyaWJ1dGUsXG4gICAgICBzdHJlYW1FbmFibGVkLFxuICAgICAgc3RyZWFtVmlld1R5cGUsXG4gICAgICBiaWxsaW5nTW9kZSxcbiAgICAgIGVuY3J5cHRpb25LZXlBcm46IHRhYmxlLmVuY3J5cHRpb25LZXk/LmtleUFybixcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoYXQgdGhlIHRhYmxlIGlzIGEgY29uY3JldGUgRHluYW1vREIgVGFibGUgY29uc3RydWN0LlxuICAgKiBcbiAgICogTm90ZTogV2UgdXNlIGR1Y2sgdHlwaW5nIGZvciBpbnN0YW5jZW9mIGNoZWNrIHRvIGhhbmRsZSBjcm9zcy1wYWNrYWdlXG4gICAqIHR5cGUgY29tcGF0aWJpbGl0eSBpc3N1ZXMgaW4gbW9ub3JlcG8gc2V0dXBzIChlLmcuLCBwbnBtIHdpdGggaXNvbGF0ZWQgbm9kZV9tb2R1bGVzKS5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVUYWJsZSh0YWJsZTogZHluYW1vZGIuSVRhYmxlKTogdm9pZCB7XG4gICAgaWYgKCF0YWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEeW5hbW9EQiB0YWJsZSBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIC8vIER1Y2sgdHlwaW5nIGNoZWNrOiBhIGNvbmNyZXRlIFRhYmxlIGhhcyBub2RlLmRlZmF1bHRDaGlsZCAoQ2ZuVGFibGUpXG4gICAgLy8gVGhpcyBoYW5kbGVzIGNyb3NzLXBhY2thZ2UgdHlwZSBjb21wYXRpYmlsaXR5IGluIG1vbm9yZXBvc1xuICAgIGNvbnN0IGlzQ29uY3JldGVUYWJsZSA9IHRhYmxlIGluc3RhbmNlb2YgZHluYW1vZGIuVGFibGUgfHwgXG4gICAgICAodGFibGUubm9kZSAmJiB0YWJsZS5ub2RlLmRlZmF1bHRDaGlsZCAmJiBcbiAgICAgICAodGFibGUubm9kZS5kZWZhdWx0Q2hpbGQgYXMgYW55KS5jZm5SZXNvdXJjZVR5cGUgPT09ICdBV1M6OkR5bmFtb0RCOjpUYWJsZScpO1xuXG4gICAgaWYgKCFpc0NvbmNyZXRlVGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RhYmxlIG11c3QgYmUgYSBjb25jcmV0ZSBEeW5hbW9EQiBUYWJsZSBjb25zdHJ1Y3QuIEltcG9ydGVkIHRhYmxlcyBhcmUgbm90IHN1cHBvcnRlZC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghdGFibGUudGFibGVOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhYmxlIG11c3QgaGF2ZSBhIHZhbGlkIHRhYmxlIG5hbWUnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRhYmxlLnRhYmxlQXJuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RhYmxlIG11c3QgaGF2ZSBhIHZhbGlkIHRhYmxlIEFSTicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgQ2xvdWRGb3JtYXRpb24gdGFibGUgcmVzb3VyY2UuXG4gICAqIFVzZXMgZHVjayB0eXBpbmcgZm9yIGNyb3NzLXBhY2thZ2UgY29tcGF0aWJpbGl0eS5cbiAgICovXG4gIHByaXZhdGUgZ2V0Q2ZuVGFibGUodGFibGU6IGR5bmFtb2RiLklUYWJsZSk6IGR5bmFtb2RiLkNmblRhYmxlIHtcbiAgICAvLyBVc2UgZHVjayB0eXBpbmcgY2hlY2sgZm9yIGNyb3NzLXBhY2thZ2UgY29tcGF0aWJpbGl0eVxuICAgIGNvbnN0IGNmblRhYmxlID0gdGFibGUubm9kZT8uZGVmYXVsdENoaWxkIGFzIGR5bmFtb2RiLkNmblRhYmxlIHwgdW5kZWZpbmVkO1xuICAgIFxuICAgIGlmICghY2ZuVGFibGUgfHwgKGNmblRhYmxlIGFzIGFueSkuY2ZuUmVzb3VyY2VUeXBlICE9PSAnQVdTOjpEeW5hbW9EQjo6VGFibGUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBhY2Nlc3MgQ2xvdWRGb3JtYXRpb24gcmVzb3VyY2UgZm9yIGltcG9ydGVkIHRhYmxlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNmblRhYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgcGFydGl0aW9uIGtleSBhbmQgc29ydCBrZXkgZnJvbSBrZXkgc2NoZW1hLlxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0S2V5U2NoZW1hKGNmblRhYmxlOiBkeW5hbW9kYi5DZm5UYWJsZSk6IHtcbiAgICBwYXJ0aXRpb25LZXk6IHN0cmluZztcbiAgICBzb3J0S2V5Pzogc3RyaW5nO1xuICB9IHtcbiAgICBjb25zdCBrZXlTY2hlbWEgPSBjZm5UYWJsZS5rZXlTY2hlbWE7XG5cbiAgICBpZiAoIWtleVNjaGVtYSB8fCAhQXJyYXkuaXNBcnJheShrZXlTY2hlbWEpIHx8IGtleVNjaGVtYS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGFibGUgbXVzdCBoYXZlIGEga2V5IHNjaGVtYScpO1xuICAgIH1cblxuICAgIGxldCBwYXJ0aXRpb25LZXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc29ydEtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5U2NoZW1hKSB7XG4gICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcgJiYgJ2F0dHJpYnV0ZU5hbWUnIGluIGtleSAmJiAna2V5VHlwZScgaW4ga2V5KSB7XG4gICAgICAgIGlmIChrZXkua2V5VHlwZSA9PT0gJ0hBU0gnKSB7XG4gICAgICAgICAgcGFydGl0aW9uS2V5ID0ga2V5LmF0dHJpYnV0ZU5hbWU7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5LmtleVR5cGUgPT09ICdSQU5HRScpIHtcbiAgICAgICAgICBzb3J0S2V5ID0ga2V5LmF0dHJpYnV0ZU5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXBhcnRpdGlvbktleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZXh0cmFjdCBwYXJ0aXRpb24ga2V5IGZyb20gdGFibGUga2V5IHNjaGVtYScpO1xuICAgIH1cblxuICAgIHJldHVybiB7IHBhcnRpdGlvbktleSwgc29ydEtleSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgR2xvYmFsIFNlY29uZGFyeSBJbmRleCBtZXRhZGF0YS5cbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdEdTSXMoY2ZuVGFibGU6IGR5bmFtb2RiLkNmblRhYmxlKTogR1NJTWV0YWRhdGFbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZ3NpcyA9IGNmblRhYmxlLmdsb2JhbFNlY29uZGFyeUluZGV4ZXM7XG4gICAgaWYgKCFnc2lzIHx8ICFBcnJheS5pc0FycmF5KGdzaXMpIHx8IGdzaXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBnc2lzLm1hcCgoZ3NpOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGtleVNjaGVtYSA9IGdzaS5rZXlTY2hlbWEgfHwgW107XG4gICAgICBsZXQgcGFydGl0aW9uS2V5ID0gJyc7XG4gICAgICBsZXQgc29ydEtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlTY2hlbWEpIHtcbiAgICAgICAgaWYgKGtleS5rZXlUeXBlID09PSAnSEFTSCcpIHtcbiAgICAgICAgICBwYXJ0aXRpb25LZXkgPSBrZXkuYXR0cmlidXRlTmFtZTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkua2V5VHlwZSA9PT0gJ1JBTkdFJykge1xuICAgICAgICAgIHNvcnRLZXkgPSBrZXkuYXR0cmlidXRlTmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbmRleE5hbWU6IGdzaS5pbmRleE5hbWUsXG4gICAgICAgIHBhcnRpdGlvbktleSxcbiAgICAgICAgc29ydEtleSxcbiAgICAgICAgcHJvamVjdGlvblR5cGU6IGdzaS5wcm9qZWN0aW9uPy5wcm9qZWN0aW9uVHlwZSB8fCAnQUxMJyxcbiAgICAgICAgbm9uS2V5QXR0cmlidXRlczogZ3NpLnByb2plY3Rpb24/Lm5vbktleUF0dHJpYnV0ZXMsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgTG9jYWwgU2Vjb25kYXJ5IEluZGV4IG1ldGFkYXRhLlxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0TFNJcyhjZm5UYWJsZTogZHluYW1vZGIuQ2ZuVGFibGUpOiBMU0lNZXRhZGF0YVtdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsc2lzID0gY2ZuVGFibGUubG9jYWxTZWNvbmRhcnlJbmRleGVzO1xuICAgIGlmICghbHNpcyB8fCAhQXJyYXkuaXNBcnJheShsc2lzKSB8fCBsc2lzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gbHNpcy5tYXAoKGxzaTogYW55KSA9PiB7XG4gICAgICBjb25zdCBrZXlTY2hlbWEgPSBsc2kua2V5U2NoZW1hIHx8IFtdO1xuICAgICAgbGV0IHNvcnRLZXkgPSAnJztcblxuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5U2NoZW1hKSB7XG4gICAgICAgIGlmIChrZXkua2V5VHlwZSA9PT0gJ1JBTkdFJykge1xuICAgICAgICAgIHNvcnRLZXkgPSBrZXkuYXR0cmlidXRlTmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpbmRleE5hbWU6IGxzaS5pbmRleE5hbWUsXG4gICAgICAgIHNvcnRLZXksXG4gICAgICAgIHByb2plY3Rpb25UeXBlOiBsc2kucHJvamVjdGlvbj8ucHJvamVjdGlvblR5cGUgfHwgJ0FMTCcsXG4gICAgICAgIG5vbktleUF0dHJpYnV0ZXM6IGxzaS5wcm9qZWN0aW9uPy5ub25LZXlBdHRyaWJ1dGVzLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IFRUTCBhdHRyaWJ1dGUgbmFtZS5cbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdFRUTChjZm5UYWJsZTogZHluYW1vZGIuQ2ZuVGFibGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHR0bFNwZWMgPSBjZm5UYWJsZS50aW1lVG9MaXZlU3BlY2lmaWNhdGlvbjtcbiAgICBpZiAodHRsU3BlYyAmJiB0eXBlb2YgdHRsU3BlYyA9PT0gJ29iamVjdCcgJiYgJ2VuYWJsZWQnIGluIHR0bFNwZWMpIHtcbiAgICAgIGlmICh0dGxTcGVjLmVuYWJsZWQgJiYgJ2F0dHJpYnV0ZU5hbWUnIGluIHR0bFNwZWMpIHtcbiAgICAgICAgcmV0dXJuIHR0bFNwZWMuYXR0cmlidXRlTmFtZSBhcyBzdHJpbmc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdCBzdHJlYW0gY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdFN0cmVhbUluZm8oY2ZuVGFibGU6IGR5bmFtb2RiLkNmblRhYmxlKToge1xuICAgIHN0cmVhbUVuYWJsZWQ/OiBib29sZWFuO1xuICAgIHN0cmVhbVZpZXdUeXBlPzogc3RyaW5nO1xuICB9IHtcbiAgICBjb25zdCBzdHJlYW1TcGVjID0gY2ZuVGFibGUuc3RyZWFtU3BlY2lmaWNhdGlvbjtcbiAgICBpZiAoc3RyZWFtU3BlYyAmJiB0eXBlb2Ygc3RyZWFtU3BlYyA9PT0gJ29iamVjdCcgJiYgJ3N0cmVhbVZpZXdUeXBlJyBpbiBzdHJlYW1TcGVjKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHJlYW1FbmFibGVkOiB0cnVlLFxuICAgICAgICBzdHJlYW1WaWV3VHlwZTogc3RyZWFtU3BlYy5zdHJlYW1WaWV3VHlwZSBhcyBzdHJpbmcsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBzdHJlYW1FbmFibGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgYmlsbGluZyBtb2RlLlxuICAgKi9cbiAgcHJpdmF0ZSBleHRyYWN0QmlsbGluZ01vZGUoY2ZuVGFibGU6IGR5bmFtb2RiLkNmblRhYmxlKTogJ1BBWV9QRVJfUkVRVUVTVCcgfCAnUFJPVklTSU9ORUQnIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBiaWxsaW5nTW9kZSA9IGNmblRhYmxlLmJpbGxpbmdNb2RlO1xuICAgIGlmIChiaWxsaW5nTW9kZSA9PT0gJ1BBWV9QRVJfUkVRVUVTVCcgfHwgYmlsbGluZ01vZGUgPT09ICdQUk9WSVNJT05FRCcpIHtcbiAgICAgIHJldHVybiBiaWxsaW5nTW9kZTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chaim API endpoint configuration.
|
|
3
|
+
*
|
|
4
|
+
* This is the single source of truth for all Chaim API URLs.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Default Chaim API base URL.
|
|
8
|
+
* Can be overridden via:
|
|
9
|
+
* - CDK context: `chaimApiBaseUrl`
|
|
10
|
+
* - Environment variable: `CHAIM_API_BASE_URL`
|
|
11
|
+
*/
|
|
12
|
+
export declare const DEFAULT_CHAIM_API_BASE_URL = "https://api.chaim.co";
|
|
13
|
+
/**
|
|
14
|
+
* Chaim ingestion API endpoints (relative paths).
|
|
15
|
+
*/
|
|
16
|
+
export declare const CHAIM_ENDPOINTS: {
|
|
17
|
+
/** Request presigned S3 upload URL with HMAC authentication */
|
|
18
|
+
readonly PRESIGN: "/ingest/presign";
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Default request timeout in milliseconds.
|
|
22
|
+
*/
|
|
23
|
+
export declare const DEFAULT_REQUEST_TIMEOUT_MS = 30000;
|
|
24
|
+
/**
|
|
25
|
+
* Default maximum snapshot size in bytes (10MB).
|
|
26
|
+
*/
|
|
27
|
+
export declare const DEFAULT_MAX_SNAPSHOT_BYTES: number;
|
|
28
|
+
/**
|
|
29
|
+
* Current schema version for snapshot payloads.
|
|
30
|
+
* Increment when making changes to LocalSnapshotPayload.
|
|
31
|
+
*
|
|
32
|
+
* Version history:
|
|
33
|
+
* - 1.0: Initial schema
|
|
34
|
+
* - 1.1: Added operation identity, normalized identity fields (bindingId, tableId, entityId),
|
|
35
|
+
* enhanced DELETE metadata (reason, scope), content hashing (contentHash, schemaHash),
|
|
36
|
+
* producer metadata (component, version, runtime, mode), and removed duplicate
|
|
37
|
+
* dataStore fields (arn, name, account)
|
|
38
|
+
* - 2.0: BREAKING - Removed redundant top-level fields (appId, stackName, datastoreType, tableId, entityId),
|
|
39
|
+
* made identity object required, all binding metadata now in identity object only
|
|
40
|
+
* - 3.0: BREAKING - Complete restructuring into logical sections: providerIdentity (cloud/infra metadata),
|
|
41
|
+
* identity (binding metadata with moved stableResourceKey/resourceId/entityId), operation (event tracking),
|
|
42
|
+
* resolution (token status), resource (simplified, provider-focused, renamed from dataStore),
|
|
43
|
+
* producer (explicit component tracking). Renamed schemaVersion to snapshotVersion.
|
|
44
|
+
*
|
|
45
|
+
* @see LocalSnapshotPayload.snapshotVersion
|
|
46
|
+
*/
|
|
47
|
+
export declare const SNAPSHOT_SCHEMA_VERSION: "3.0";
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Chaim API endpoint configuration.
|
|
4
|
+
*
|
|
5
|
+
* This is the single source of truth for all Chaim API URLs.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.SNAPSHOT_SCHEMA_VERSION = exports.DEFAULT_MAX_SNAPSHOT_BYTES = exports.DEFAULT_REQUEST_TIMEOUT_MS = exports.CHAIM_ENDPOINTS = exports.DEFAULT_CHAIM_API_BASE_URL = void 0;
|
|
9
|
+
/**
|
|
10
|
+
* Default Chaim API base URL.
|
|
11
|
+
* Can be overridden via:
|
|
12
|
+
* - CDK context: `chaimApiBaseUrl`
|
|
13
|
+
* - Environment variable: `CHAIM_API_BASE_URL`
|
|
14
|
+
*/
|
|
15
|
+
exports.DEFAULT_CHAIM_API_BASE_URL = 'https://api.chaim.co';
|
|
16
|
+
/**
|
|
17
|
+
* Chaim ingestion API endpoints (relative paths).
|
|
18
|
+
*/
|
|
19
|
+
exports.CHAIM_ENDPOINTS = {
|
|
20
|
+
/** Request presigned S3 upload URL with HMAC authentication */
|
|
21
|
+
PRESIGN: '/ingest/presign',
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Default request timeout in milliseconds.
|
|
25
|
+
*/
|
|
26
|
+
exports.DEFAULT_REQUEST_TIMEOUT_MS = 30000;
|
|
27
|
+
/**
|
|
28
|
+
* Default maximum snapshot size in bytes (10MB).
|
|
29
|
+
*/
|
|
30
|
+
exports.DEFAULT_MAX_SNAPSHOT_BYTES = 10 * 1024 * 1024;
|
|
31
|
+
/**
|
|
32
|
+
* Current schema version for snapshot payloads.
|
|
33
|
+
* Increment when making changes to LocalSnapshotPayload.
|
|
34
|
+
*
|
|
35
|
+
* Version history:
|
|
36
|
+
* - 1.0: Initial schema
|
|
37
|
+
* - 1.1: Added operation identity, normalized identity fields (bindingId, tableId, entityId),
|
|
38
|
+
* enhanced DELETE metadata (reason, scope), content hashing (contentHash, schemaHash),
|
|
39
|
+
* producer metadata (component, version, runtime, mode), and removed duplicate
|
|
40
|
+
* dataStore fields (arn, name, account)
|
|
41
|
+
* - 2.0: BREAKING - Removed redundant top-level fields (appId, stackName, datastoreType, tableId, entityId),
|
|
42
|
+
* made identity object required, all binding metadata now in identity object only
|
|
43
|
+
* - 3.0: BREAKING - Complete restructuring into logical sections: providerIdentity (cloud/infra metadata),
|
|
44
|
+
* identity (binding metadata with moved stableResourceKey/resourceId/entityId), operation (event tracking),
|
|
45
|
+
* resolution (token status), resource (simplified, provider-focused, renamed from dataStore),
|
|
46
|
+
* producer (explicit component tracking). Renamed schemaVersion to snapshotVersion.
|
|
47
|
+
*
|
|
48
|
+
* @see LocalSnapshotPayload.snapshotVersion
|
|
49
|
+
*/
|
|
50
|
+
exports.SNAPSHOT_SCHEMA_VERSION = '3.0';
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW0tZW5kcG9pbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9jaGFpbS1lbmRwb2ludHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQUVIOzs7OztHQUtHO0FBQ1UsUUFBQSwwQkFBMEIsR0FBRyxzQkFBc0IsQ0FBQztBQUVqRTs7R0FFRztBQUNVLFFBQUEsZUFBZSxHQUFHO0lBQzdCLCtEQUErRDtJQUMvRCxPQUFPLEVBQUUsaUJBQWlCO0NBQ2xCLENBQUM7QUFFWDs7R0FFRztBQUNVLFFBQUEsMEJBQTBCLEdBQUcsS0FBSyxDQUFDO0FBRWhEOztHQUVHO0FBQ1UsUUFBQSwwQkFBMEIsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUUzRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ1UsUUFBQSx1QkFBdUIsR0FBRyxLQUFjLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENoYWltIEFQSSBlbmRwb2ludCBjb25maWd1cmF0aW9uLlxuICogXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBhbGwgQ2hhaW0gQVBJIFVSTHMuXG4gKi9cblxuLyoqXG4gKiBEZWZhdWx0IENoYWltIEFQSSBiYXNlIFVSTC5cbiAqIENhbiBiZSBvdmVycmlkZGVuIHZpYTpcbiAqIC0gQ0RLIGNvbnRleHQ6IGBjaGFpbUFwaUJhc2VVcmxgXG4gKiAtIEVudmlyb25tZW50IHZhcmlhYmxlOiBgQ0hBSU1fQVBJX0JBU0VfVVJMYFxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9DSEFJTV9BUElfQkFTRV9VUkwgPSAnaHR0cHM6Ly9hcGkuY2hhaW0uY28nO1xuXG4vKipcbiAqIENoYWltIGluZ2VzdGlvbiBBUEkgZW5kcG9pbnRzIChyZWxhdGl2ZSBwYXRocykuXG4gKi9cbmV4cG9ydCBjb25zdCBDSEFJTV9FTkRQT0lOVFMgPSB7XG4gIC8qKiBSZXF1ZXN0IHByZXNpZ25lZCBTMyB1cGxvYWQgVVJMIHdpdGggSE1BQyBhdXRoZW50aWNhdGlvbiAqL1xuICBQUkVTSUdOOiAnL2luZ2VzdC9wcmVzaWduJyxcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogRGVmYXVsdCByZXF1ZXN0IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9SRVFVRVNUX1RJTUVPVVRfTVMgPSAzMDAwMDtcblxuLyoqXG4gKiBEZWZhdWx0IG1heGltdW0gc25hcHNob3Qgc2l6ZSBpbiBieXRlcyAoMTBNQikuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX01BWF9TTkFQU0hPVF9CWVRFUyA9IDEwICogMTAyNCAqIDEwMjQ7XG5cbi8qKlxuICogQ3VycmVudCBzY2hlbWEgdmVyc2lvbiBmb3Igc25hcHNob3QgcGF5bG9hZHMuXG4gKiBJbmNyZW1lbnQgd2hlbiBtYWtpbmcgY2hhbmdlcyB0byBMb2NhbFNuYXBzaG90UGF5bG9hZC5cbiAqIFxuICogVmVyc2lvbiBoaXN0b3J5OlxuICogLSAxLjA6IEluaXRpYWwgc2NoZW1hXG4gKiAtIDEuMTogQWRkZWQgb3BlcmF0aW9uIGlkZW50aXR5LCBub3JtYWxpemVkIGlkZW50aXR5IGZpZWxkcyAoYmluZGluZ0lkLCB0YWJsZUlkLCBlbnRpdHlJZCksXG4gKiAgICAgICAgZW5oYW5jZWQgREVMRVRFIG1ldGFkYXRhIChyZWFzb24sIHNjb3BlKSwgY29udGVudCBoYXNoaW5nIChjb250ZW50SGFzaCwgc2NoZW1hSGFzaCksXG4gKiAgICAgICAgcHJvZHVjZXIgbWV0YWRhdGEgKGNvbXBvbmVudCwgdmVyc2lvbiwgcnVudGltZSwgbW9kZSksIGFuZCByZW1vdmVkIGR1cGxpY2F0ZVxuICogICAgICAgIGRhdGFTdG9yZSBmaWVsZHMgKGFybiwgbmFtZSwgYWNjb3VudClcbiAqIC0gMi4wOiBCUkVBS0lORyAtIFJlbW92ZWQgcmVkdW5kYW50IHRvcC1sZXZlbCBmaWVsZHMgKGFwcElkLCBzdGFja05hbWUsIGRhdGFzdG9yZVR5cGUsIHRhYmxlSWQsIGVudGl0eUlkKSxcbiAqICAgICAgICBtYWRlIGlkZW50aXR5IG9iamVjdCByZXF1aXJlZCwgYWxsIGJpbmRpbmcgbWV0YWRhdGEgbm93IGluIGlkZW50aXR5IG9iamVjdCBvbmx5XG4gKiAtIDMuMDogQlJFQUtJTkcgLSBDb21wbGV0ZSByZXN0cnVjdHVyaW5nIGludG8gbG9naWNhbCBzZWN0aW9uczogcHJvdmlkZXJJZGVudGl0eSAoY2xvdWQvaW5mcmEgbWV0YWRhdGEpLFxuICogICAgICAgIGlkZW50aXR5IChiaW5kaW5nIG1ldGFkYXRhIHdpdGggbW92ZWQgc3RhYmxlUmVzb3VyY2VLZXkvcmVzb3VyY2VJZC9lbnRpdHlJZCksIG9wZXJhdGlvbiAoZXZlbnQgdHJhY2tpbmcpLFxuICogICAgICAgIHJlc29sdXRpb24gKHRva2VuIHN0YXR1cyksIHJlc291cmNlIChzaW1wbGlmaWVkLCBwcm92aWRlci1mb2N1c2VkLCByZW5hbWVkIGZyb20gZGF0YVN0b3JlKSxcbiAqICAgICAgICBwcm9kdWNlciAoZXhwbGljaXQgY29tcG9uZW50IHRyYWNraW5nKS4gUmVuYW1lZCBzY2hlbWFWZXJzaW9uIHRvIHNuYXBzaG90VmVyc2lvbi5cbiAqIFxuICogQHNlZSBMb2NhbFNuYXBzaG90UGF5bG9hZC5zbmFwc2hvdFZlcnNpb25cbiAqL1xuZXhwb3J0IGNvbnN0IFNOQVBTSE9UX1NDSEVNQV9WRVJTSU9OID0gJzMuMCcgYXMgY29uc3Q7Il19
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export { ChaimDynamoDBBinder, ChaimDynamoDBBinderProps } from './binders/chaim-dynamodb-binder';
|
|
2
|
+
export { BaseChaimBinder } from './binders/base-chaim-binder';
|
|
3
|
+
export { ChaimCredentials, IChaimCredentials, } from './types/credentials';
|
|
4
|
+
export { FailureMode } from './types/failure-mode';
|
|
5
|
+
export { BaseBinderProps, validateBinderProps, } from './types/base-binder-props';
|
|
6
|
+
export { TableBindingConfig } from './types/table-binding-config';
|
|
7
|
+
export { BaseDataStoreMetadata, DynamoDBMetadata, GSIMetadata, LSIMetadata, DataStoreMetadata, } from './types/data-store-metadata';
|
|
8
|
+
export { LocalSnapshotPayload, PublishedSnapshotPayload, ProviderIdentity, BindingIdentity, OperationMetadata, ResolutionMetadata, DeleteMetadata, HashMetadata, ResourceMetadata, ProducerMetadata, IngestResponse, CustomResourceResponseData, } from './types/snapshot-payload';
|
|
9
|
+
export { SnapshotAction, UploadUrlRequest, UploadUrlResponse, SnapshotRefUpsertRequest, SnapshotRefDeleteRequest, SnapshotRefRequest, SnapshotRefResponse, CloudFormationRequestType, } from './types/ingest-contract';
|
|
10
|
+
export { DEFAULT_CHAIM_API_BASE_URL, CHAIM_ENDPOINTS, DEFAULT_REQUEST_TIMEOUT_MS, DEFAULT_MAX_SNAPSHOT_BYTES, SNAPSHOT_SCHEMA_VERSION, } from './config/chaim-endpoints';
|
|
11
|
+
export { SchemaService } from './services/schema-service';
|
|
12
|
+
export { IngestionService, IngestionConfig, INGESTION_ENDPOINTS, DEFAULT_INGESTION_CONFIG, } from './services/ingestion-service';
|
|
13
|
+
export { pruneStackSnapshots, pruneOldSnapshots, CleanupOptions, TTLCleanupOptions, CleanupResult, } from './services/snapshot-cleanup';
|
|
14
|
+
export { SnapshotCachePolicy, DEFAULT_SNAPSHOT_CACHE_POLICY, SNAPSHOT_CACHE_POLICY_CONTEXT_KEY, } from './types/snapshot-cache-policy';
|
|
15
|
+
export { SchemaData, Field, PrimaryKey } from '@chaim-tools/chaim-bprint-spec';
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SNAPSHOT_CACHE_POLICY_CONTEXT_KEY = exports.DEFAULT_SNAPSHOT_CACHE_POLICY = exports.SnapshotCachePolicy = exports.pruneOldSnapshots = exports.pruneStackSnapshots = exports.DEFAULT_INGESTION_CONFIG = exports.INGESTION_ENDPOINTS = exports.IngestionService = exports.SchemaService = exports.SNAPSHOT_SCHEMA_VERSION = exports.DEFAULT_MAX_SNAPSHOT_BYTES = exports.DEFAULT_REQUEST_TIMEOUT_MS = exports.CHAIM_ENDPOINTS = exports.DEFAULT_CHAIM_API_BASE_URL = exports.TableBindingConfig = exports.validateBinderProps = exports.FailureMode = exports.ChaimCredentials = exports.BaseChaimBinder = exports.ChaimDynamoDBBinder = void 0;
|
|
4
|
+
// Main construct exports
|
|
5
|
+
var chaim_dynamodb_binder_1 = require("./binders/chaim-dynamodb-binder");
|
|
6
|
+
Object.defineProperty(exports, "ChaimDynamoDBBinder", { enumerable: true, get: function () { return chaim_dynamodb_binder_1.ChaimDynamoDBBinder; } });
|
|
7
|
+
// Base class export (for extension by future data store binders)
|
|
8
|
+
var base_chaim_binder_1 = require("./binders/base-chaim-binder");
|
|
9
|
+
Object.defineProperty(exports, "BaseChaimBinder", { enumerable: true, get: function () { return base_chaim_binder_1.BaseChaimBinder; } });
|
|
10
|
+
// Credentials factory
|
|
11
|
+
var credentials_1 = require("./types/credentials");
|
|
12
|
+
Object.defineProperty(exports, "ChaimCredentials", { enumerable: true, get: function () { return credentials_1.ChaimCredentials; } });
|
|
13
|
+
// Failure mode enum
|
|
14
|
+
var failure_mode_1 = require("./types/failure-mode");
|
|
15
|
+
Object.defineProperty(exports, "FailureMode", { enumerable: true, get: function () { return failure_mode_1.FailureMode; } });
|
|
16
|
+
// Type exports
|
|
17
|
+
var base_binder_props_1 = require("./types/base-binder-props");
|
|
18
|
+
Object.defineProperty(exports, "validateBinderProps", { enumerable: true, get: function () { return base_binder_props_1.validateBinderProps; } });
|
|
19
|
+
// Binding configuration
|
|
20
|
+
var table_binding_config_1 = require("./types/table-binding-config");
|
|
21
|
+
Object.defineProperty(exports, "TableBindingConfig", { enumerable: true, get: function () { return table_binding_config_1.TableBindingConfig; } });
|
|
22
|
+
// Config exports
|
|
23
|
+
var chaim_endpoints_1 = require("./config/chaim-endpoints");
|
|
24
|
+
Object.defineProperty(exports, "DEFAULT_CHAIM_API_BASE_URL", { enumerable: true, get: function () { return chaim_endpoints_1.DEFAULT_CHAIM_API_BASE_URL; } });
|
|
25
|
+
Object.defineProperty(exports, "CHAIM_ENDPOINTS", { enumerable: true, get: function () { return chaim_endpoints_1.CHAIM_ENDPOINTS; } });
|
|
26
|
+
Object.defineProperty(exports, "DEFAULT_REQUEST_TIMEOUT_MS", { enumerable: true, get: function () { return chaim_endpoints_1.DEFAULT_REQUEST_TIMEOUT_MS; } });
|
|
27
|
+
Object.defineProperty(exports, "DEFAULT_MAX_SNAPSHOT_BYTES", { enumerable: true, get: function () { return chaim_endpoints_1.DEFAULT_MAX_SNAPSHOT_BYTES; } });
|
|
28
|
+
Object.defineProperty(exports, "SNAPSHOT_SCHEMA_VERSION", { enumerable: true, get: function () { return chaim_endpoints_1.SNAPSHOT_SCHEMA_VERSION; } });
|
|
29
|
+
// Service exports
|
|
30
|
+
var schema_service_1 = require("./services/schema-service");
|
|
31
|
+
Object.defineProperty(exports, "SchemaService", { enumerable: true, get: function () { return schema_service_1.SchemaService; } });
|
|
32
|
+
var ingestion_service_1 = require("./services/ingestion-service");
|
|
33
|
+
Object.defineProperty(exports, "IngestionService", { enumerable: true, get: function () { return ingestion_service_1.IngestionService; } });
|
|
34
|
+
Object.defineProperty(exports, "INGESTION_ENDPOINTS", { enumerable: true, get: function () { return ingestion_service_1.INGESTION_ENDPOINTS; } });
|
|
35
|
+
Object.defineProperty(exports, "DEFAULT_INGESTION_CONFIG", { enumerable: true, get: function () { return ingestion_service_1.DEFAULT_INGESTION_CONFIG; } });
|
|
36
|
+
var snapshot_cleanup_1 = require("./services/snapshot-cleanup");
|
|
37
|
+
Object.defineProperty(exports, "pruneStackSnapshots", { enumerable: true, get: function () { return snapshot_cleanup_1.pruneStackSnapshots; } });
|
|
38
|
+
Object.defineProperty(exports, "pruneOldSnapshots", { enumerable: true, get: function () { return snapshot_cleanup_1.pruneOldSnapshots; } });
|
|
39
|
+
var snapshot_cache_policy_1 = require("./types/snapshot-cache-policy");
|
|
40
|
+
Object.defineProperty(exports, "SnapshotCachePolicy", { enumerable: true, get: function () { return snapshot_cache_policy_1.SnapshotCachePolicy; } });
|
|
41
|
+
Object.defineProperty(exports, "DEFAULT_SNAPSHOT_CACHE_POLICY", { enumerable: true, get: function () { return snapshot_cache_policy_1.DEFAULT_SNAPSHOT_CACHE_POLICY; } });
|
|
42
|
+
Object.defineProperty(exports, "SNAPSHOT_CACHE_POLICY_CONTEXT_KEY", { enumerable: true, get: function () { return snapshot_cache_policy_1.SNAPSHOT_CACHE_POLICY_CONTEXT_KEY; } });
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUJBQXlCO0FBQ3pCLHlFQUFnRztBQUF2Riw0SEFBQSxtQkFBbUIsT0FBQTtBQUU1QixpRUFBaUU7QUFDakUsaUVBQThEO0FBQXJELG9IQUFBLGVBQWUsT0FBQTtBQUV4QixzQkFBc0I7QUFDdEIsbURBRzZCO0FBRjNCLCtHQUFBLGdCQUFnQixPQUFBO0FBSWxCLG9CQUFvQjtBQUNwQixxREFBbUQ7QUFBMUMsMkdBQUEsV0FBVyxPQUFBO0FBRXBCLGVBQWU7QUFDZiwrREFHbUM7QUFEakMsd0hBQUEsbUJBQW1CLE9BQUE7QUFHckIsd0JBQXdCO0FBQ3hCLHFFQUFrRTtBQUF6RCwwSEFBQSxrQkFBa0IsT0FBQTtBQXNDM0IsaUJBQWlCO0FBQ2pCLDREQU1rQztBQUxoQyw2SEFBQSwwQkFBMEIsT0FBQTtBQUMxQixrSEFBQSxlQUFlLE9BQUE7QUFDZiw2SEFBQSwwQkFBMEIsT0FBQTtBQUMxQiw2SEFBQSwwQkFBMEIsT0FBQTtBQUMxQiwwSEFBQSx1QkFBdUIsT0FBQTtBQUd6QixrQkFBa0I7QUFDbEIsNERBQTBEO0FBQWpELCtHQUFBLGFBQWEsT0FBQTtBQUN0QixrRUFLc0M7QUFKcEMscUhBQUEsZ0JBQWdCLE9BQUE7QUFFaEIsd0hBQUEsbUJBQW1CLE9BQUE7QUFDbkIsNkhBQUEsd0JBQXdCLE9BQUE7QUFFMUIsZ0VBTXFDO0FBTG5DLHVIQUFBLG1CQUFtQixPQUFBO0FBQ25CLHFIQUFBLGlCQUFpQixPQUFBO0FBS25CLHVFQUl1QztBQUhyQyw0SEFBQSxtQkFBbUIsT0FBQTtBQUNuQixzSUFBQSw2QkFBNkIsT0FBQTtBQUM3QiwwSUFBQSxpQ0FBaUMsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIE1haW4gY29uc3RydWN0IGV4cG9ydHNcbmV4cG9ydCB7IENoYWltRHluYW1vREJCaW5kZXIsIENoYWltRHluYW1vREJCaW5kZXJQcm9wcyB9IGZyb20gJy4vYmluZGVycy9jaGFpbS1keW5hbW9kYi1iaW5kZXInO1xuXG4vLyBCYXNlIGNsYXNzIGV4cG9ydCAoZm9yIGV4dGVuc2lvbiBieSBmdXR1cmUgZGF0YSBzdG9yZSBiaW5kZXJzKVxuZXhwb3J0IHsgQmFzZUNoYWltQmluZGVyIH0gZnJvbSAnLi9iaW5kZXJzL2Jhc2UtY2hhaW0tYmluZGVyJztcblxuLy8gQ3JlZGVudGlhbHMgZmFjdG9yeVxuZXhwb3J0IHtcbiAgQ2hhaW1DcmVkZW50aWFscyxcbiAgSUNoYWltQ3JlZGVudGlhbHMsXG59IGZyb20gJy4vdHlwZXMvY3JlZGVudGlhbHMnO1xuXG4vLyBGYWlsdXJlIG1vZGUgZW51bVxuZXhwb3J0IHsgRmFpbHVyZU1vZGUgfSBmcm9tICcuL3R5cGVzL2ZhaWx1cmUtbW9kZSc7XG5cbi8vIFR5cGUgZXhwb3J0c1xuZXhwb3J0IHtcbiAgQmFzZUJpbmRlclByb3BzLFxuICB2YWxpZGF0ZUJpbmRlclByb3BzLFxufSBmcm9tICcuL3R5cGVzL2Jhc2UtYmluZGVyLXByb3BzJztcblxuLy8gQmluZGluZyBjb25maWd1cmF0aW9uXG5leHBvcnQgeyBUYWJsZUJpbmRpbmdDb25maWcgfSBmcm9tICcuL3R5cGVzL3RhYmxlLWJpbmRpbmctY29uZmlnJztcblxuZXhwb3J0IHtcbiAgQmFzZURhdGFTdG9yZU1ldGFkYXRhLFxuICBEeW5hbW9EQk1ldGFkYXRhLFxuICBHU0lNZXRhZGF0YSxcbiAgTFNJTWV0YWRhdGEsXG4gIERhdGFTdG9yZU1ldGFkYXRhLFxufSBmcm9tICcuL3R5cGVzL2RhdGEtc3RvcmUtbWV0YWRhdGEnO1xuXG4vLyBTbmFwc2hvdCBwYXlsb2FkIHR5cGVzXG5leHBvcnQge1xuICBMb2NhbFNuYXBzaG90UGF5bG9hZCxcbiAgUHVibGlzaGVkU25hcHNob3RQYXlsb2FkLFxuICBQcm92aWRlcklkZW50aXR5LFxuICBCaW5kaW5nSWRlbnRpdHksXG4gIE9wZXJhdGlvbk1ldGFkYXRhLFxuICBSZXNvbHV0aW9uTWV0YWRhdGEsXG4gIERlbGV0ZU1ldGFkYXRhLFxuICBIYXNoTWV0YWRhdGEsXG4gIFJlc291cmNlTWV0YWRhdGEsXG4gIFByb2R1Y2VyTWV0YWRhdGEsXG4gIEluZ2VzdFJlc3BvbnNlLFxuICBDdXN0b21SZXNvdXJjZVJlc3BvbnNlRGF0YSxcbn0gZnJvbSAnLi90eXBlcy9zbmFwc2hvdC1wYXlsb2FkJztcblxuLy8gSW5nZXN0IGNvbnRyYWN0IHR5cGVzXG5leHBvcnQge1xuICBTbmFwc2hvdEFjdGlvbixcbiAgVXBsb2FkVXJsUmVxdWVzdCxcbiAgVXBsb2FkVXJsUmVzcG9uc2UsXG4gIFNuYXBzaG90UmVmVXBzZXJ0UmVxdWVzdCxcbiAgU25hcHNob3RSZWZEZWxldGVSZXF1ZXN0LFxuICBTbmFwc2hvdFJlZlJlcXVlc3QsXG4gIFNuYXBzaG90UmVmUmVzcG9uc2UsXG4gIENsb3VkRm9ybWF0aW9uUmVxdWVzdFR5cGUsXG59IGZyb20gJy4vdHlwZXMvaW5nZXN0LWNvbnRyYWN0JztcblxuLy8gQ29uZmlnIGV4cG9ydHNcbmV4cG9ydCB7XG4gIERFRkFVTFRfQ0hBSU1fQVBJX0JBU0VfVVJMLFxuICBDSEFJTV9FTkRQT0lOVFMsXG4gIERFRkFVTFRfUkVRVUVTVF9USU1FT1VUX01TLFxuICBERUZBVUxUX01BWF9TTkFQU0hPVF9CWVRFUyxcbiAgU05BUFNIT1RfU0NIRU1BX1ZFUlNJT04sXG59IGZyb20gJy4vY29uZmlnL2NoYWltLWVuZHBvaW50cyc7XG5cbi8vIFNlcnZpY2UgZXhwb3J0c1xuZXhwb3J0IHsgU2NoZW1hU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvc2NoZW1hLXNlcnZpY2UnO1xuZXhwb3J0IHtcbiAgSW5nZXN0aW9uU2VydmljZSxcbiAgSW5nZXN0aW9uQ29uZmlnLFxuICBJTkdFU1RJT05fRU5EUE9JTlRTLFxuICBERUZBVUxUX0lOR0VTVElPTl9DT05GSUcsXG59IGZyb20gJy4vc2VydmljZXMvaW5nZXN0aW9uLXNlcnZpY2UnO1xuZXhwb3J0IHtcbiAgcHJ1bmVTdGFja1NuYXBzaG90cyxcbiAgcHJ1bmVPbGRTbmFwc2hvdHMsXG4gIENsZWFudXBPcHRpb25zLFxuICBUVExDbGVhbnVwT3B0aW9ucyxcbiAgQ2xlYW51cFJlc3VsdCxcbn0gZnJvbSAnLi9zZXJ2aWNlcy9zbmFwc2hvdC1jbGVhbnVwJztcbmV4cG9ydCB7XG4gIFNuYXBzaG90Q2FjaGVQb2xpY3ksXG4gIERFRkFVTFRfU05BUFNIT1RfQ0FDSEVfUE9MSUNZLFxuICBTTkFQU0hPVF9DQUNIRV9QT0xJQ1lfQ09OVEVYVF9LRVksXG59IGZyb20gJy4vdHlwZXMvc25hcHNob3QtY2FjaGUtcG9saWN5JztcblxuLy8gUmUtZXhwb3J0IHNjaGVtYSB0eXBlcyBmcm9tIGJwcmludC1zcGVjIGZvciBjb252ZW5pZW5jZVxuZXhwb3J0IHsgU2NoZW1hRGF0YSwgRmllbGQsIFByaW1hcnlLZXkgfSBmcm9tICdAY2hhaW0tdG9vbHMvY2hhaW0tYnByaW50LXNwZWMnO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"provider":"aws","accountId":"123456789012","region":"us-east-1","stackName":"TestStack","datastoreType":"dynamodb","resourceName":"TestTable","resourceId":"TestTable__User","appId":"test-app","schema":{"schemaVersion":"1.0","namespace":"test"},"dataStore":{"type":"dynamodb","arn":"arn:aws:dynamodb:us-east-1:123456789012:table/TestTable","name":"TestTable"},"context":{"account":"123456789012","region":"us-east-1"},"capturedAt":"2024-01-01T00:00:00.000Z"}
|