@aws-amplify/backend-notifications 0.0.0-test-20260708085627
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 +235 -0
- package/lib/campaign-association-asset/index.js +48413 -0
- package/lib/constants.d.ts +122 -0
- package/lib/constants.js +125 -0
- package/lib/construct.d.ts +283 -0
- package/lib/construct.js +824 -0
- package/lib/factory.d.ts +53 -0
- package/lib/factory.js +158 -0
- package/lib/handler-asset/index.js +530 -0
- package/lib/index.d.ts +7 -0
- package/lib/index.js +5 -0
- package/lib/lambda/campaign-association/handler.d.ts +29 -0
- package/lib/lambda/campaign-association/handler.js +80 -0
- package/lib/lambda/campaign-association/integration.d.ts +59 -0
- package/lib/lambda/campaign-association/integration.js +108 -0
- package/lib/lambda/campaign-association/onboarding.d.ts +25 -0
- package/lib/lambda/campaign-association/onboarding.js +74 -0
- package/lib/lambda/identify/device_resolver.d.ts +18 -0
- package/lib/lambda/identify/device_resolver.js +56 -0
- package/lib/lambda/identify/handler.d.ts +17 -0
- package/lib/lambda/identify/handler.js +124 -0
- package/lib/lambda/identify/mapping.d.ts +61 -0
- package/lib/lambda/identify/mapping.js +171 -0
- package/lib/lambda/identify/merge_resolver.d.ts +26 -0
- package/lib/lambda/identify/merge_resolver.js +36 -0
- package/lib/lambda/identify/principal.d.ts +68 -0
- package/lib/lambda/identify/principal.js +48 -0
- package/lib/lambda/identify/profile_resolver.d.ts +35 -0
- package/lib/lambda/identify/profile_resolver.js +65 -0
- package/lib/lambda/identify/types.d.ts +90 -0
- package/lib/lambda/identify/types.js +10 -0
- package/lib/lambda/identify/validation.d.ts +15 -0
- package/lib/lambda/identify/validation.js +99 -0
- package/lib/lambda/push/delivery.d.ts +49 -0
- package/lib/lambda/push/delivery.js +120 -0
- package/lib/lambda/push/device_lookup.d.ts +35 -0
- package/lib/lambda/push/device_lookup.js +88 -0
- package/lib/lambda/push/eum_client.d.ts +31 -0
- package/lib/lambda/push/eum_client.js +140 -0
- package/lib/lambda/push/event.d.ts +32 -0
- package/lib/lambda/push/event.js +122 -0
- package/lib/lambda/push/fixtures/real_journey_event.d.ts +19 -0
- package/lib/lambda/push/fixtures/real_journey_event.js +22 -0
- package/lib/lambda/push/handler.d.ts +15 -0
- package/lib/lambda/push/handler.js +86 -0
- package/lib/lambda/push/message_template.d.ts +72 -0
- package/lib/lambda/push/message_template.js +270 -0
- package/lib/lambda/push/payload.d.ts +25 -0
- package/lib/lambda/push/payload.js +53 -0
- package/lib/lambda/push/types.d.ts +153 -0
- package/lib/lambda/push/types.js +4 -0
- package/lib/lambda/shared/retry.d.ts +18 -0
- package/lib/lambda/shared/retry.js +45 -0
- package/lib/object_types.d.ts +63 -0
- package/lib/object_types.js +131 -0
- package/lib/push-handler-asset/index.js +75517 -0
- package/lib/types.d.ts +125 -0
- package/lib/types.js +2 -0
- package/package.json +49 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* Customer Profiles serializes writes to a single profile: concurrent
|
|
5
|
+
* UpdateProfile / PutProfileObject calls against the same profile fail with a
|
|
6
|
+
* `BadRequestException: Failed to update profile due to concurrent update
|
|
7
|
+
* in-progress.` This is a TRANSIENT, idempotent condition (the write is safe to
|
|
8
|
+
* repeat), so the correct handling is a short bounded retry with jittered
|
|
9
|
+
* backoff rather than surfacing a 5xx to the caller.
|
|
10
|
+
*/
|
|
11
|
+
export const isTransientConcurrentUpdate = (err) => {
|
|
12
|
+
const name = err?.name ?? '';
|
|
13
|
+
const msg = err?.message ?? '';
|
|
14
|
+
return (((name === 'BadRequestException' ||
|
|
15
|
+
name === 'ThrottlingException' ||
|
|
16
|
+
name === 'TooManyRequestsException') &&
|
|
17
|
+
/concurrent update in-progress|too many requests|rate exceeded/i.test(msg)) ||
|
|
18
|
+
name === 'ThrottlingException' ||
|
|
19
|
+
name === 'TooManyRequestsException');
|
|
20
|
+
};
|
|
21
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
22
|
+
/**
|
|
23
|
+
* Run `fn`, retrying on transient concurrent-update / throttling errors with
|
|
24
|
+
* exponential backoff + full jitter. Non-transient errors propagate immediately.
|
|
25
|
+
*/
|
|
26
|
+
export const withTransientRetry = async (fn, opts = {}) => {
|
|
27
|
+
const attempts = opts.attempts ?? 6;
|
|
28
|
+
const baseDelayMs = opts.baseDelayMs ?? 80;
|
|
29
|
+
let lastErr;
|
|
30
|
+
for (let i = 0; i < attempts; i++) {
|
|
31
|
+
try {
|
|
32
|
+
return await fn();
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
lastErr = err;
|
|
36
|
+
if (!isTransientConcurrentUpdate(err) || i === attempts - 1) {
|
|
37
|
+
throw err;
|
|
38
|
+
}
|
|
39
|
+
const ceiling = baseDelayMs * 2 ** i;
|
|
40
|
+
await sleep(Math.floor(Math.random() * ceiling));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
throw lastErr;
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGFtYmRhL3NoYXJlZC9yZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxxRUFBcUU7QUFDckUsc0NBQXNDO0FBRXRDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLEdBQVksRUFBVyxFQUFFO0lBQ25FLE1BQU0sSUFBSSxHQUFJLEdBQXlCLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUNwRCxNQUFNLEdBQUcsR0FBSSxHQUE0QixFQUFFLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDekQsT0FBTyxDQUNMLENBQUMsQ0FBQyxJQUFJLEtBQUsscUJBQXFCO1FBQzlCLElBQUksS0FBSyxxQkFBcUI7UUFDOUIsSUFBSSxLQUFLLDBCQUEwQixDQUFDO1FBQ3BDLGdFQUFnRSxDQUFDLElBQUksQ0FDbkUsR0FBRyxDQUNKLENBQUM7UUFDSixJQUFJLEtBQUsscUJBQXFCO1FBQzlCLElBQUksS0FBSywwQkFBMEIsQ0FDcEMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLE1BQU0sS0FBSyxHQUFHLENBQUMsRUFBVSxFQUFpQixFQUFFLENBQzFDLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFcEQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxFQUNyQyxFQUFvQixFQUNwQixPQUFvRCxFQUFFLEVBQzFDLEVBQUU7SUFDZCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQztJQUNwQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztJQUMzQyxJQUFJLE9BQWdCLENBQUM7SUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQztZQUNILE9BQU8sTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUNwQixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLE9BQU8sR0FBRyxHQUFHLENBQUM7WUFDZCxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLFFBQVEsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDNUQsTUFBTSxHQUFHLENBQUM7WUFDWixDQUFDO1lBQ0QsTUFBTSxPQUFPLEdBQUcsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNuRCxDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sT0FBTyxDQUFDO0FBQ2hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCBBbWF6b24uY29tLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBDdXN0b21lciBQcm9maWxlcyBzZXJpYWxpemVzIHdyaXRlcyB0byBhIHNpbmdsZSBwcm9maWxlOiBjb25jdXJyZW50XG4gKiBVcGRhdGVQcm9maWxlIC8gUHV0UHJvZmlsZU9iamVjdCBjYWxscyBhZ2FpbnN0IHRoZSBzYW1lIHByb2ZpbGUgZmFpbCB3aXRoIGFcbiAqIGBCYWRSZXF1ZXN0RXhjZXB0aW9uOiBGYWlsZWQgdG8gdXBkYXRlIHByb2ZpbGUgZHVlIHRvIGNvbmN1cnJlbnQgdXBkYXRlXG4gKiBpbi1wcm9ncmVzcy5gIFRoaXMgaXMgYSBUUkFOU0lFTlQsIGlkZW1wb3RlbnQgY29uZGl0aW9uICh0aGUgd3JpdGUgaXMgc2FmZSB0b1xuICogcmVwZWF0KSwgc28gdGhlIGNvcnJlY3QgaGFuZGxpbmcgaXMgYSBzaG9ydCBib3VuZGVkIHJldHJ5IHdpdGggaml0dGVyZWRcbiAqIGJhY2tvZmYgcmF0aGVyIHRoYW4gc3VyZmFjaW5nIGEgNXh4IHRvIHRoZSBjYWxsZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1RyYW5zaWVudENvbmN1cnJlbnRVcGRhdGUgPSAoZXJyOiB1bmtub3duKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IG5hbWUgPSAoZXJyIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZSA/PyAnJztcbiAgY29uc3QgbXNnID0gKGVyciBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfSk/Lm1lc3NhZ2UgPz8gJyc7XG4gIHJldHVybiAoXG4gICAgKChuYW1lID09PSAnQmFkUmVxdWVzdEV4Y2VwdGlvbicgfHxcbiAgICAgIG5hbWUgPT09ICdUaHJvdHRsaW5nRXhjZXB0aW9uJyB8fFxuICAgICAgbmFtZSA9PT0gJ1Rvb01hbnlSZXF1ZXN0c0V4Y2VwdGlvbicpICYmXG4gICAgICAvY29uY3VycmVudCB1cGRhdGUgaW4tcHJvZ3Jlc3N8dG9vIG1hbnkgcmVxdWVzdHN8cmF0ZSBleGNlZWRlZC9pLnRlc3QoXG4gICAgICAgIG1zZyxcbiAgICAgICkpIHx8XG4gICAgbmFtZSA9PT0gJ1Rocm90dGxpbmdFeGNlcHRpb24nIHx8XG4gICAgbmFtZSA9PT0gJ1Rvb01hbnlSZXF1ZXN0c0V4Y2VwdGlvbidcbiAgKTtcbn07XG5cbmNvbnN0IHNsZWVwID0gKG1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+ID0+XG4gIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG5cbi8qKlxuICogUnVuIGBmbmAsIHJldHJ5aW5nIG9uIHRyYW5zaWVudCBjb25jdXJyZW50LXVwZGF0ZSAvIHRocm90dGxpbmcgZXJyb3JzIHdpdGhcbiAqIGV4cG9uZW50aWFsIGJhY2tvZmYgKyBmdWxsIGppdHRlci4gTm9uLXRyYW5zaWVudCBlcnJvcnMgcHJvcGFnYXRlIGltbWVkaWF0ZWx5LlxuICovXG5leHBvcnQgY29uc3Qgd2l0aFRyYW5zaWVudFJldHJ5ID0gYXN5bmMgPFQ+KFxuICBmbjogKCkgPT4gUHJvbWlzZTxUPixcbiAgb3B0czogeyBhdHRlbXB0cz86IG51bWJlcjsgYmFzZURlbGF5TXM/OiBudW1iZXIgfSA9IHt9LFxuKTogUHJvbWlzZTxUPiA9PiB7XG4gIGNvbnN0IGF0dGVtcHRzID0gb3B0cy5hdHRlbXB0cyA/PyA2O1xuICBjb25zdCBiYXNlRGVsYXlNcyA9IG9wdHMuYmFzZURlbGF5TXMgPz8gODA7XG4gIGxldCBsYXN0RXJyOiB1bmtub3duO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dGVtcHRzOyBpKyspIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsYXN0RXJyID0gZXJyO1xuICAgICAgaWYgKCFpc1RyYW5zaWVudENvbmN1cnJlbnRVcGRhdGUoZXJyKSB8fCBpID09PSBhdHRlbXB0cyAtIDEpIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgY29uc3QgY2VpbGluZyA9IGJhc2VEZWxheU1zICogMiAqKiBpO1xuICAgICAgYXdhaXQgc2xlZXAoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2VpbGluZykpO1xuICAgIH1cbiAgfVxuICB0aHJvdyBsYXN0RXJyO1xufTtcbiJdfQ==
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { CfnObjectType } from 'aws-cdk-lib/aws-customerprofiles';
|
|
2
|
+
export type FieldMap = CfnObjectType.FieldMapProperty;
|
|
3
|
+
export type KeyMap = CfnObjectType.KeyMapProperty;
|
|
4
|
+
/**
|
|
5
|
+
* AmplifyProfile — the AUTHENTICATED person profile object type.
|
|
6
|
+
*
|
|
7
|
+
* Single searchable identity key `cognitoUserKey` (PROFILE + UNIQUE) sourced
|
|
8
|
+
* from `cognitoSub`. The Lambda ingests a minimal `{cognitoSub}` object via
|
|
9
|
+
* PutProfileObject purely for the atomic find-or-create by that UNIQUE key;
|
|
10
|
+
* person / targeting attributes are written separately by UpdateProfile.
|
|
11
|
+
*
|
|
12
|
+
* `allowProfileCreation` stays true so ingesting an object with a new
|
|
13
|
+
* `cognitoSub` creates the profile, and re-ingesting an existing one resolves
|
|
14
|
+
* to it in place. (Customer Profiles requires the ingested object to carry the
|
|
15
|
+
* object type's UNIQUE key — the reason guest profiles need their own type.)
|
|
16
|
+
*/
|
|
17
|
+
export declare const AMPLIFY_PROFILE_FIELDS: FieldMap[];
|
|
18
|
+
export declare const AMPLIFY_PROFILE_KEYS: KeyMap[];
|
|
19
|
+
/**
|
|
20
|
+
* AmplifyGuestProfile — the GUEST person profile object type.
|
|
21
|
+
*
|
|
22
|
+
* A distinct object type is required: Customer Profiles allows EXACTLY ONE
|
|
23
|
+
* `UNIQUE` key per object type and `PutProfileObject` rejects an object that
|
|
24
|
+
* does not carry that UNIQUE key. The authed `AmplifyProfile` reserves its
|
|
25
|
+
* UNIQUE key for `cognitoSub`, so guest profiles get their own type whose
|
|
26
|
+
* single UNIQUE key is `cognitoIdentityKey`, sourced from the Identity Pool
|
|
27
|
+
* `cognitoIdentityId` (e.g. `us-east-1:<uuid>`).
|
|
28
|
+
*
|
|
29
|
+
* Guest profiles are created in the SAME domain, so a SearchProfiles by
|
|
30
|
+
* `cognitoIdentityKey` and a later MergeProfiles into the authed profile work
|
|
31
|
+
* uniformly. On sign-in the guest profile is folded into the authed
|
|
32
|
+
* (sub-keyed) profile via MergeProfiles (see merge_resolver).
|
|
33
|
+
*/
|
|
34
|
+
export declare const AMPLIFY_GUEST_PROFILE_FIELDS: FieldMap[];
|
|
35
|
+
export declare const AMPLIFY_GUEST_PROFILE_KEYS: KeyMap[];
|
|
36
|
+
/**
|
|
37
|
+
* AmplifyDevice — one object per stable device.
|
|
38
|
+
*
|
|
39
|
+
* UNIQUE object key = `deviceId` (stable), so a push-token refresh for the same
|
|
40
|
+
* device upserts the same object in place. The full ingested object carries the
|
|
41
|
+
* device schema: `deviceToken` (mutable push token), `channelType`, `platform`,
|
|
42
|
+
* `appVersion`, `createdAt` (immutable first-registration time, preserved
|
|
43
|
+
* across writes by the handler) and `updatedAt` (server-set on every write).
|
|
44
|
+
* Those non-key fields are NOT mapped to a target: Customer Profiles stores the
|
|
45
|
+
* ingested object verbatim and returns it from ListProfileObjects, so they
|
|
46
|
+
* survive refreshes without a field mapping. Only the key fields need targets,
|
|
47
|
+
* and CP requires targets under a reserved namespace (there is no `_object.*`
|
|
48
|
+
* namespace), so the keys map into `_profile.Attributes.*`.
|
|
49
|
+
*
|
|
50
|
+
* TWO profile-resolution keys (both PROFILE, not UNIQUE) let a device merge into
|
|
51
|
+
* EITHER the authed profile (via `cognitoUserKey` from `cognitoSub`) or the
|
|
52
|
+
* GUEST profile (via `cognitoIdentityKey` from `cognitoIdentityId`), depending
|
|
53
|
+
* on which identity field the ingested object carries. The object always
|
|
54
|
+
* carries the UNIQUE `deviceId`, so ingestion is valid for both.
|
|
55
|
+
*/
|
|
56
|
+
export declare const AMPLIFY_DEVICE_FIELDS: FieldMap[];
|
|
57
|
+
export declare const AMPLIFY_DEVICE_KEYS: KeyMap[];
|
|
58
|
+
export declare const OBJECT_TYPE_NAMES: {
|
|
59
|
+
profile: string;
|
|
60
|
+
guestProfile: string;
|
|
61
|
+
device: string;
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=object_types.d.ts.map
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { COGNITO_IDENTITY_FIELD, COGNITO_IDENTITY_KEY, COGNITO_USER_KEY, OBJECT_TYPE_DEVICE, OBJECT_TYPE_GUEST_PROFILE, OBJECT_TYPE_PROFILE, } from './constants.js';
|
|
2
|
+
const field = (name, source, target) => ({
|
|
3
|
+
name,
|
|
4
|
+
objectTypeField: {
|
|
5
|
+
contentType: 'STRING',
|
|
6
|
+
source: `_source.${source}`,
|
|
7
|
+
target,
|
|
8
|
+
},
|
|
9
|
+
});
|
|
10
|
+
/**
|
|
11
|
+
* AmplifyProfile — the AUTHENTICATED person profile object type.
|
|
12
|
+
*
|
|
13
|
+
* Single searchable identity key `cognitoUserKey` (PROFILE + UNIQUE) sourced
|
|
14
|
+
* from `cognitoSub`. The Lambda ingests a minimal `{cognitoSub}` object via
|
|
15
|
+
* PutProfileObject purely for the atomic find-or-create by that UNIQUE key;
|
|
16
|
+
* person / targeting attributes are written separately by UpdateProfile.
|
|
17
|
+
*
|
|
18
|
+
* `allowProfileCreation` stays true so ingesting an object with a new
|
|
19
|
+
* `cognitoSub` creates the profile, and re-ingesting an existing one resolves
|
|
20
|
+
* to it in place. (Customer Profiles requires the ingested object to carry the
|
|
21
|
+
* object type's UNIQUE key — the reason guest profiles need their own type.)
|
|
22
|
+
*/
|
|
23
|
+
export const AMPLIFY_PROFILE_FIELDS = [
|
|
24
|
+
field('cognitoSub', 'cognitoSub', '_profile.Attributes.cognitoSub'),
|
|
25
|
+
];
|
|
26
|
+
export const AMPLIFY_PROFILE_KEYS = [
|
|
27
|
+
{
|
|
28
|
+
// Searchable AUTHENTICATED identity key: SearchProfiles(cognitoUserKey,...).
|
|
29
|
+
name: COGNITO_USER_KEY,
|
|
30
|
+
objectTypeKeyList: [
|
|
31
|
+
{
|
|
32
|
+
standardIdentifiers: ['PROFILE', 'UNIQUE'],
|
|
33
|
+
fieldNames: ['cognitoSub'],
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
/**
|
|
39
|
+
* AmplifyGuestProfile — the GUEST person profile object type.
|
|
40
|
+
*
|
|
41
|
+
* A distinct object type is required: Customer Profiles allows EXACTLY ONE
|
|
42
|
+
* `UNIQUE` key per object type and `PutProfileObject` rejects an object that
|
|
43
|
+
* does not carry that UNIQUE key. The authed `AmplifyProfile` reserves its
|
|
44
|
+
* UNIQUE key for `cognitoSub`, so guest profiles get their own type whose
|
|
45
|
+
* single UNIQUE key is `cognitoIdentityKey`, sourced from the Identity Pool
|
|
46
|
+
* `cognitoIdentityId` (e.g. `us-east-1:<uuid>`).
|
|
47
|
+
*
|
|
48
|
+
* Guest profiles are created in the SAME domain, so a SearchProfiles by
|
|
49
|
+
* `cognitoIdentityKey` and a later MergeProfiles into the authed profile work
|
|
50
|
+
* uniformly. On sign-in the guest profile is folded into the authed
|
|
51
|
+
* (sub-keyed) profile via MergeProfiles (see merge_resolver).
|
|
52
|
+
*/
|
|
53
|
+
export const AMPLIFY_GUEST_PROFILE_FIELDS = [
|
|
54
|
+
field(COGNITO_IDENTITY_FIELD, COGNITO_IDENTITY_FIELD, '_profile.Attributes.cognitoIdentityId'),
|
|
55
|
+
];
|
|
56
|
+
export const AMPLIFY_GUEST_PROFILE_KEYS = [
|
|
57
|
+
{
|
|
58
|
+
// Searchable GUEST identity key: SearchProfiles(cognitoIdentityKey,...).
|
|
59
|
+
// The single UNIQUE key on the guest object type.
|
|
60
|
+
name: COGNITO_IDENTITY_KEY,
|
|
61
|
+
objectTypeKeyList: [
|
|
62
|
+
{
|
|
63
|
+
standardIdentifiers: ['PROFILE', 'UNIQUE'],
|
|
64
|
+
fieldNames: [COGNITO_IDENTITY_FIELD],
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
/**
|
|
70
|
+
* AmplifyDevice — one object per stable device.
|
|
71
|
+
*
|
|
72
|
+
* UNIQUE object key = `deviceId` (stable), so a push-token refresh for the same
|
|
73
|
+
* device upserts the same object in place. The full ingested object carries the
|
|
74
|
+
* device schema: `deviceToken` (mutable push token), `channelType`, `platform`,
|
|
75
|
+
* `appVersion`, `createdAt` (immutable first-registration time, preserved
|
|
76
|
+
* across writes by the handler) and `updatedAt` (server-set on every write).
|
|
77
|
+
* Those non-key fields are NOT mapped to a target: Customer Profiles stores the
|
|
78
|
+
* ingested object verbatim and returns it from ListProfileObjects, so they
|
|
79
|
+
* survive refreshes without a field mapping. Only the key fields need targets,
|
|
80
|
+
* and CP requires targets under a reserved namespace (there is no `_object.*`
|
|
81
|
+
* namespace), so the keys map into `_profile.Attributes.*`.
|
|
82
|
+
*
|
|
83
|
+
* TWO profile-resolution keys (both PROFILE, not UNIQUE) let a device merge into
|
|
84
|
+
* EITHER the authed profile (via `cognitoUserKey` from `cognitoSub`) or the
|
|
85
|
+
* GUEST profile (via `cognitoIdentityKey` from `cognitoIdentityId`), depending
|
|
86
|
+
* on which identity field the ingested object carries. The object always
|
|
87
|
+
* carries the UNIQUE `deviceId`, so ingestion is valid for both.
|
|
88
|
+
*/
|
|
89
|
+
export const AMPLIFY_DEVICE_FIELDS = [
|
|
90
|
+
field('cognitoSub', 'cognitoSub', '_profile.Attributes.cognitoSub'),
|
|
91
|
+
field(COGNITO_IDENTITY_FIELD, COGNITO_IDENTITY_FIELD, '_profile.Attributes.cognitoIdentityId'),
|
|
92
|
+
field('deviceId', 'deviceId', '_profile.Attributes.deviceId'),
|
|
93
|
+
];
|
|
94
|
+
export const AMPLIFY_DEVICE_KEYS = [
|
|
95
|
+
{
|
|
96
|
+
// Profile-resolution key (authed): merges the device into the sub's profile.
|
|
97
|
+
name: COGNITO_USER_KEY,
|
|
98
|
+
objectTypeKeyList: [
|
|
99
|
+
{
|
|
100
|
+
standardIdentifiers: ['PROFILE'],
|
|
101
|
+
fieldNames: ['cognitoSub'],
|
|
102
|
+
},
|
|
103
|
+
],
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
// Profile-resolution key (guest): merges the device into the guest profile.
|
|
107
|
+
name: COGNITO_IDENTITY_KEY,
|
|
108
|
+
objectTypeKeyList: [
|
|
109
|
+
{
|
|
110
|
+
standardIdentifiers: ['PROFILE'],
|
|
111
|
+
fieldNames: [COGNITO_IDENTITY_FIELD],
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
// Stable unique object key: token refresh updates this object in place.
|
|
117
|
+
name: 'deviceId',
|
|
118
|
+
objectTypeKeyList: [
|
|
119
|
+
{
|
|
120
|
+
standardIdentifiers: ['UNIQUE'],
|
|
121
|
+
fieldNames: ['deviceId'],
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
},
|
|
125
|
+
];
|
|
126
|
+
export const OBJECT_TYPE_NAMES = {
|
|
127
|
+
profile: OBJECT_TYPE_PROFILE,
|
|
128
|
+
guestProfile: OBJECT_TYPE_GUEST_PROFILE,
|
|
129
|
+
device: OBJECT_TYPE_DEVICE,
|
|
130
|
+
};
|
|
131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0X3R5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL29iamVjdF90eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLG9CQUFvQixFQUNwQixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6QixtQkFBbUIsR0FDcEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUt4QixNQUFNLEtBQUssR0FBRyxDQUFDLElBQVksRUFBRSxNQUFjLEVBQUUsTUFBYyxFQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLElBQUk7SUFDSixlQUFlLEVBQUU7UUFDZixXQUFXLEVBQUUsUUFBUTtRQUNyQixNQUFNLEVBQUUsV0FBVyxNQUFNLEVBQUU7UUFDM0IsTUFBTTtLQUNQO0NBQ0YsQ0FBQyxDQUFDO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQWU7SUFDaEQsS0FBSyxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsZ0NBQWdDLENBQUM7Q0FDcEUsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFhO0lBQzVDO1FBQ0UsNkVBQTZFO1FBQzdFLElBQUksRUFBRSxnQkFBZ0I7UUFDdEIsaUJBQWlCLEVBQUU7WUFDakI7Z0JBQ0UsbUJBQW1CLEVBQUUsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDO2dCQUMxQyxVQUFVLEVBQUUsQ0FBQyxZQUFZLENBQUM7YUFDM0I7U0FDRjtLQUNGO0NBQ0YsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQWU7SUFDdEQsS0FBSyxDQUNILHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsdUNBQXVDLENBQ3hDO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFhO0lBQ2xEO1FBQ0UseUVBQXlFO1FBQ3pFLGtEQUFrRDtRQUNsRCxJQUFJLEVBQUUsb0JBQW9CO1FBQzFCLGlCQUFpQixFQUFFO1lBQ2pCO2dCQUNFLG1CQUFtQixFQUFFLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQztnQkFDMUMsVUFBVSxFQUFFLENBQUMsc0JBQXNCLENBQUM7YUFDckM7U0FDRjtLQUNGO0NBQ0YsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQWU7SUFDL0MsS0FBSyxDQUFDLFlBQVksRUFBRSxZQUFZLEVBQUUsZ0NBQWdDLENBQUM7SUFDbkUsS0FBSyxDQUNILHNCQUFzQixFQUN0QixzQkFBc0IsRUFDdEIsdUNBQXVDLENBQ3hDO0lBQ0QsS0FBSyxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsOEJBQThCLENBQUM7Q0FDOUQsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFhO0lBQzNDO1FBQ0UsNkVBQTZFO1FBQzdFLElBQUksRUFBRSxnQkFBZ0I7UUFDdEIsaUJBQWlCLEVBQUU7WUFDakI7Z0JBQ0UsbUJBQW1CLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ2hDLFVBQVUsRUFBRSxDQUFDLFlBQVksQ0FBQzthQUMzQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLDRFQUE0RTtRQUM1RSxJQUFJLEVBQUUsb0JBQW9CO1FBQzFCLGlCQUFpQixFQUFFO1lBQ2pCO2dCQUNFLG1CQUFtQixFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUNoQyxVQUFVLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQzthQUNyQztTQUNGO0tBQ0Y7SUFDRDtRQUNFLHdFQUF3RTtRQUN4RSxJQUFJLEVBQUUsVUFBVTtRQUNoQixpQkFBaUIsRUFBRTtZQUNqQjtnQkFDRSxtQkFBbUIsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFDL0IsVUFBVSxFQUFFLENBQUMsVUFBVSxDQUFDO2FBQ3pCO1NBQ0Y7S0FDRjtDQUNGLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRztJQUMvQixPQUFPLEVBQUUsbUJBQW1CO0lBQzVCLFlBQVksRUFBRSx5QkFBeUI7SUFDdkMsTUFBTSxFQUFFLGtCQUFrQjtDQUMzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDZm5PYmplY3RUeXBlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWN1c3RvbWVycHJvZmlsZXMnO1xuaW1wb3J0IHtcbiAgQ09HTklUT19JREVOVElUWV9GSUVMRCxcbiAgQ09HTklUT19JREVOVElUWV9LRVksXG4gIENPR05JVE9fVVNFUl9LRVksXG4gIE9CSkVDVF9UWVBFX0RFVklDRSxcbiAgT0JKRUNUX1RZUEVfR1VFU1RfUFJPRklMRSxcbiAgT0JKRUNUX1RZUEVfUFJPRklMRSxcbn0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuXG5leHBvcnQgdHlwZSBGaWVsZE1hcCA9IENmbk9iamVjdFR5cGUuRmllbGRNYXBQcm9wZXJ0eTtcbmV4cG9ydCB0eXBlIEtleU1hcCA9IENmbk9iamVjdFR5cGUuS2V5TWFwUHJvcGVydHk7XG5cbmNvbnN0IGZpZWxkID0gKG5hbWU6IHN0cmluZywgc291cmNlOiBzdHJpbmcsIHRhcmdldDogc3RyaW5nKTogRmllbGRNYXAgPT4gKHtcbiAgbmFtZSxcbiAgb2JqZWN0VHlwZUZpZWxkOiB7XG4gICAgY29udGVudFR5cGU6ICdTVFJJTkcnLFxuICAgIHNvdXJjZTogYF9zb3VyY2UuJHtzb3VyY2V9YCxcbiAgICB0YXJnZXQsXG4gIH0sXG59KTtcblxuLyoqXG4gKiBBbXBsaWZ5UHJvZmlsZSDigJQgdGhlIEFVVEhFTlRJQ0FURUQgcGVyc29uIHByb2ZpbGUgb2JqZWN0IHR5cGUuXG4gKlxuICogU2luZ2xlIHNlYXJjaGFibGUgaWRlbnRpdHkga2V5IGBjb2duaXRvVXNlcktleWAgKFBST0ZJTEUgKyBVTklRVUUpIHNvdXJjZWRcbiAqIGZyb20gYGNvZ25pdG9TdWJgLiBUaGUgTGFtYmRhIGluZ2VzdHMgYSBtaW5pbWFsIGB7Y29nbml0b1N1Yn1gIG9iamVjdCB2aWFcbiAqIFB1dFByb2ZpbGVPYmplY3QgcHVyZWx5IGZvciB0aGUgYXRvbWljIGZpbmQtb3ItY3JlYXRlIGJ5IHRoYXQgVU5JUVVFIGtleTtcbiAqIHBlcnNvbiAvIHRhcmdldGluZyBhdHRyaWJ1dGVzIGFyZSB3cml0dGVuIHNlcGFyYXRlbHkgYnkgVXBkYXRlUHJvZmlsZS5cbiAqXG4gKiBgYWxsb3dQcm9maWxlQ3JlYXRpb25gIHN0YXlzIHRydWUgc28gaW5nZXN0aW5nIGFuIG9iamVjdCB3aXRoIGEgbmV3XG4gKiBgY29nbml0b1N1YmAgY3JlYXRlcyB0aGUgcHJvZmlsZSwgYW5kIHJlLWluZ2VzdGluZyBhbiBleGlzdGluZyBvbmUgcmVzb2x2ZXNcbiAqIHRvIGl0IGluIHBsYWNlLiAoQ3VzdG9tZXIgUHJvZmlsZXMgcmVxdWlyZXMgdGhlIGluZ2VzdGVkIG9iamVjdCB0byBjYXJyeSB0aGVcbiAqIG9iamVjdCB0eXBlJ3MgVU5JUVVFIGtleSDigJQgdGhlIHJlYXNvbiBndWVzdCBwcm9maWxlcyBuZWVkIHRoZWlyIG93biB0eXBlLilcbiAqL1xuZXhwb3J0IGNvbnN0IEFNUExJRllfUFJPRklMRV9GSUVMRFM6IEZpZWxkTWFwW10gPSBbXG4gIGZpZWxkKCdjb2duaXRvU3ViJywgJ2NvZ25pdG9TdWInLCAnX3Byb2ZpbGUuQXR0cmlidXRlcy5jb2duaXRvU3ViJyksXG5dO1xuXG5leHBvcnQgY29uc3QgQU1QTElGWV9QUk9GSUxFX0tFWVM6IEtleU1hcFtdID0gW1xuICB7XG4gICAgLy8gU2VhcmNoYWJsZSBBVVRIRU5USUNBVEVEIGlkZW50aXR5IGtleTogU2VhcmNoUHJvZmlsZXMoY29nbml0b1VzZXJLZXksLi4uKS5cbiAgICBuYW1lOiBDT0dOSVRPX1VTRVJfS0VZLFxuICAgIG9iamVjdFR5cGVLZXlMaXN0OiBbXG4gICAgICB7XG4gICAgICAgIHN0YW5kYXJkSWRlbnRpZmllcnM6IFsnUFJPRklMRScsICdVTklRVUUnXSxcbiAgICAgICAgZmllbGROYW1lczogWydjb2duaXRvU3ViJ10sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG5dO1xuXG4vKipcbiAqIEFtcGxpZnlHdWVzdFByb2ZpbGUg4oCUIHRoZSBHVUVTVCBwZXJzb24gcHJvZmlsZSBvYmplY3QgdHlwZS5cbiAqXG4gKiBBIGRpc3RpbmN0IG9iamVjdCB0eXBlIGlzIHJlcXVpcmVkOiBDdXN0b21lciBQcm9maWxlcyBhbGxvd3MgRVhBQ1RMWSBPTkVcbiAqIGBVTklRVUVgIGtleSBwZXIgb2JqZWN0IHR5cGUgYW5kIGBQdXRQcm9maWxlT2JqZWN0YCByZWplY3RzIGFuIG9iamVjdCB0aGF0XG4gKiBkb2VzIG5vdCBjYXJyeSB0aGF0IFVOSVFVRSBrZXkuIFRoZSBhdXRoZWQgYEFtcGxpZnlQcm9maWxlYCByZXNlcnZlcyBpdHNcbiAqIFVOSVFVRSBrZXkgZm9yIGBjb2duaXRvU3ViYCwgc28gZ3Vlc3QgcHJvZmlsZXMgZ2V0IHRoZWlyIG93biB0eXBlIHdob3NlXG4gKiBzaW5nbGUgVU5JUVVFIGtleSBpcyBgY29nbml0b0lkZW50aXR5S2V5YCwgc291cmNlZCBmcm9tIHRoZSBJZGVudGl0eSBQb29sXG4gKiBgY29nbml0b0lkZW50aXR5SWRgIChlLmcuIGB1cy1lYXN0LTE6PHV1aWQ+YCkuXG4gKlxuICogR3Vlc3QgcHJvZmlsZXMgYXJlIGNyZWF0ZWQgaW4gdGhlIFNBTUUgZG9tYWluLCBzbyBhIFNlYXJjaFByb2ZpbGVzIGJ5XG4gKiBgY29nbml0b0lkZW50aXR5S2V5YCBhbmQgYSBsYXRlciBNZXJnZVByb2ZpbGVzIGludG8gdGhlIGF1dGhlZCBwcm9maWxlIHdvcmtcbiAqIHVuaWZvcm1seS4gT24gc2lnbi1pbiB0aGUgZ3Vlc3QgcHJvZmlsZSBpcyBmb2xkZWQgaW50byB0aGUgYXV0aGVkXG4gKiAoc3ViLWtleWVkKSBwcm9maWxlIHZpYSBNZXJnZVByb2ZpbGVzIChzZWUgbWVyZ2VfcmVzb2x2ZXIpLlxuICovXG5leHBvcnQgY29uc3QgQU1QTElGWV9HVUVTVF9QUk9GSUxFX0ZJRUxEUzogRmllbGRNYXBbXSA9IFtcbiAgZmllbGQoXG4gICAgQ09HTklUT19JREVOVElUWV9GSUVMRCxcbiAgICBDT0dOSVRPX0lERU5USVRZX0ZJRUxELFxuICAgICdfcHJvZmlsZS5BdHRyaWJ1dGVzLmNvZ25pdG9JZGVudGl0eUlkJyxcbiAgKSxcbl07XG5cbmV4cG9ydCBjb25zdCBBTVBMSUZZX0dVRVNUX1BST0ZJTEVfS0VZUzogS2V5TWFwW10gPSBbXG4gIHtcbiAgICAvLyBTZWFyY2hhYmxlIEdVRVNUIGlkZW50aXR5IGtleTogU2VhcmNoUHJvZmlsZXMoY29nbml0b0lkZW50aXR5S2V5LC4uLikuXG4gICAgLy8gVGhlIHNpbmdsZSBVTklRVUUga2V5IG9uIHRoZSBndWVzdCBvYmplY3QgdHlwZS5cbiAgICBuYW1lOiBDT0dOSVRPX0lERU5USVRZX0tFWSxcbiAgICBvYmplY3RUeXBlS2V5TGlzdDogW1xuICAgICAge1xuICAgICAgICBzdGFuZGFyZElkZW50aWZpZXJzOiBbJ1BST0ZJTEUnLCAnVU5JUVVFJ10sXG4gICAgICAgIGZpZWxkTmFtZXM6IFtDT0dOSVRPX0lERU5USVRZX0ZJRUxEXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbl07XG5cbi8qKlxuICogQW1wbGlmeURldmljZSDigJQgb25lIG9iamVjdCBwZXIgc3RhYmxlIGRldmljZS5cbiAqXG4gKiBVTklRVUUgb2JqZWN0IGtleSA9IGBkZXZpY2VJZGAgKHN0YWJsZSksIHNvIGEgcHVzaC10b2tlbiByZWZyZXNoIGZvciB0aGUgc2FtZVxuICogZGV2aWNlIHVwc2VydHMgdGhlIHNhbWUgb2JqZWN0IGluIHBsYWNlLiBUaGUgZnVsbCBpbmdlc3RlZCBvYmplY3QgY2FycmllcyB0aGVcbiAqIGRldmljZSBzY2hlbWE6IGBkZXZpY2VUb2tlbmAgKG11dGFibGUgcHVzaCB0b2tlbiksIGBjaGFubmVsVHlwZWAsIGBwbGF0Zm9ybWAsXG4gKiBgYXBwVmVyc2lvbmAsIGBjcmVhdGVkQXRgIChpbW11dGFibGUgZmlyc3QtcmVnaXN0cmF0aW9uIHRpbWUsIHByZXNlcnZlZFxuICogYWNyb3NzIHdyaXRlcyBieSB0aGUgaGFuZGxlcikgYW5kIGB1cGRhdGVkQXRgIChzZXJ2ZXItc2V0IG9uIGV2ZXJ5IHdyaXRlKS5cbiAqIFRob3NlIG5vbi1rZXkgZmllbGRzIGFyZSBOT1QgbWFwcGVkIHRvIGEgdGFyZ2V0OiBDdXN0b21lciBQcm9maWxlcyBzdG9yZXMgdGhlXG4gKiBpbmdlc3RlZCBvYmplY3QgdmVyYmF0aW0gYW5kIHJldHVybnMgaXQgZnJvbSBMaXN0UHJvZmlsZU9iamVjdHMsIHNvIHRoZXlcbiAqIHN1cnZpdmUgcmVmcmVzaGVzIHdpdGhvdXQgYSBmaWVsZCBtYXBwaW5nLiBPbmx5IHRoZSBrZXkgZmllbGRzIG5lZWQgdGFyZ2V0cyxcbiAqIGFuZCBDUCByZXF1aXJlcyB0YXJnZXRzIHVuZGVyIGEgcmVzZXJ2ZWQgbmFtZXNwYWNlICh0aGVyZSBpcyBubyBgX29iamVjdC4qYFxuICogbmFtZXNwYWNlKSwgc28gdGhlIGtleXMgbWFwIGludG8gYF9wcm9maWxlLkF0dHJpYnV0ZXMuKmAuXG4gKlxuICogVFdPIHByb2ZpbGUtcmVzb2x1dGlvbiBrZXlzIChib3RoIFBST0ZJTEUsIG5vdCBVTklRVUUpIGxldCBhIGRldmljZSBtZXJnZSBpbnRvXG4gKiBFSVRIRVIgdGhlIGF1dGhlZCBwcm9maWxlICh2aWEgYGNvZ25pdG9Vc2VyS2V5YCBmcm9tIGBjb2duaXRvU3ViYCkgb3IgdGhlXG4gKiBHVUVTVCBwcm9maWxlICh2aWEgYGNvZ25pdG9JZGVudGl0eUtleWAgZnJvbSBgY29nbml0b0lkZW50aXR5SWRgKSwgZGVwZW5kaW5nXG4gKiBvbiB3aGljaCBpZGVudGl0eSBmaWVsZCB0aGUgaW5nZXN0ZWQgb2JqZWN0IGNhcnJpZXMuIFRoZSBvYmplY3QgYWx3YXlzXG4gKiBjYXJyaWVzIHRoZSBVTklRVUUgYGRldmljZUlkYCwgc28gaW5nZXN0aW9uIGlzIHZhbGlkIGZvciBib3RoLlxuICovXG5leHBvcnQgY29uc3QgQU1QTElGWV9ERVZJQ0VfRklFTERTOiBGaWVsZE1hcFtdID0gW1xuICBmaWVsZCgnY29nbml0b1N1YicsICdjb2duaXRvU3ViJywgJ19wcm9maWxlLkF0dHJpYnV0ZXMuY29nbml0b1N1YicpLFxuICBmaWVsZChcbiAgICBDT0dOSVRPX0lERU5USVRZX0ZJRUxELFxuICAgIENPR05JVE9fSURFTlRJVFlfRklFTEQsXG4gICAgJ19wcm9maWxlLkF0dHJpYnV0ZXMuY29nbml0b0lkZW50aXR5SWQnLFxuICApLFxuICBmaWVsZCgnZGV2aWNlSWQnLCAnZGV2aWNlSWQnLCAnX3Byb2ZpbGUuQXR0cmlidXRlcy5kZXZpY2VJZCcpLFxuXTtcblxuZXhwb3J0IGNvbnN0IEFNUExJRllfREVWSUNFX0tFWVM6IEtleU1hcFtdID0gW1xuICB7XG4gICAgLy8gUHJvZmlsZS1yZXNvbHV0aW9uIGtleSAoYXV0aGVkKTogbWVyZ2VzIHRoZSBkZXZpY2UgaW50byB0aGUgc3ViJ3MgcHJvZmlsZS5cbiAgICBuYW1lOiBDT0dOSVRPX1VTRVJfS0VZLFxuICAgIG9iamVjdFR5cGVLZXlMaXN0OiBbXG4gICAgICB7XG4gICAgICAgIHN0YW5kYXJkSWRlbnRpZmllcnM6IFsnUFJPRklMRSddLFxuICAgICAgICBmaWVsZE5hbWVzOiBbJ2NvZ25pdG9TdWInXSxcbiAgICAgIH0sXG4gICAgXSxcbiAgfSxcbiAge1xuICAgIC8vIFByb2ZpbGUtcmVzb2x1dGlvbiBrZXkgKGd1ZXN0KTogbWVyZ2VzIHRoZSBkZXZpY2UgaW50byB0aGUgZ3Vlc3QgcHJvZmlsZS5cbiAgICBuYW1lOiBDT0dOSVRPX0lERU5USVRZX0tFWSxcbiAgICBvYmplY3RUeXBlS2V5TGlzdDogW1xuICAgICAge1xuICAgICAgICBzdGFuZGFyZElkZW50aWZpZXJzOiBbJ1BST0ZJTEUnXSxcbiAgICAgICAgZmllbGROYW1lczogW0NPR05JVE9fSURFTlRJVFlfRklFTERdLFxuICAgICAgfSxcbiAgICBdLFxuICB9LFxuICB7XG4gICAgLy8gU3RhYmxlIHVuaXF1ZSBvYmplY3Qga2V5OiB0b2tlbiByZWZyZXNoIHVwZGF0ZXMgdGhpcyBvYmplY3QgaW4gcGxhY2UuXG4gICAgbmFtZTogJ2RldmljZUlkJyxcbiAgICBvYmplY3RUeXBlS2V5TGlzdDogW1xuICAgICAge1xuICAgICAgICBzdGFuZGFyZElkZW50aWZpZXJzOiBbJ1VOSVFVRSddLFxuICAgICAgICBmaWVsZE5hbWVzOiBbJ2RldmljZUlkJ10sXG4gICAgICB9LFxuICAgIF0sXG4gIH0sXG5dO1xuXG5leHBvcnQgY29uc3QgT0JKRUNUX1RZUEVfTkFNRVMgPSB7XG4gIHByb2ZpbGU6IE9CSkVDVF9UWVBFX1BST0ZJTEUsXG4gIGd1ZXN0UHJvZmlsZTogT0JKRUNUX1RZUEVfR1VFU1RfUFJPRklMRSxcbiAgZGV2aWNlOiBPQkpFQ1RfVFlQRV9ERVZJQ0UsXG59O1xuIl19
|