cloudstructs 0.4.9 → 0.4.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/.gitattributes +6 -0
  2. package/.jsii +10 -10
  3. package/assets/email-receiver/s3.lambda/index.js +38 -0
  4. package/assets/email-receiver/whitelist.lambda/index.js +46 -0
  5. package/assets/slack-app/provider.lambda/index.js +6335 -0
  6. package/assets/slack-events/events.lambda/index.js +112 -0
  7. package/assets/slack-textract/detect.lambda/index.js +20542 -0
  8. package/assets/url-shortener/shortener.lambda/index.js +101 -0
  9. package/changelog.md +1 -6
  10. package/lib/codecommit-mirror/index.js +2 -2
  11. package/lib/ecs-service-roller/index.js +2 -2
  12. package/lib/email-receiver/receiver.js +6 -7
  13. package/lib/email-receiver/s3-function.d.ts +13 -0
  14. package/lib/email-receiver/s3-function.js +23 -0
  15. package/lib/email-receiver/{receiver.s3.d.ts → s3.lambda.d.ts} +0 -0
  16. package/lib/email-receiver/s3.lambda.js +11 -0
  17. package/lib/email-receiver/whitelist-function.d.ts +13 -0
  18. package/lib/email-receiver/whitelist-function.js +23 -0
  19. package/lib/email-receiver/{receiver.whitelist.d.ts → whitelist.lambda.d.ts} +0 -0
  20. package/lib/email-receiver/whitelist.lambda.js +19 -0
  21. package/lib/saml-identity-provider/index.js +2 -2
  22. package/lib/slack-app/manifest.js +1 -1
  23. package/lib/slack-app/provider-function.d.ts +13 -0
  24. package/lib/slack-app/provider-function.js +23 -0
  25. package/lib/slack-app/provider.d.ts +2 -2
  26. package/lib/slack-app/provider.js +3 -3
  27. package/lib/slack-app/{provider.handler.d.ts → provider.lambda.d.ts} +0 -0
  28. package/lib/slack-app/provider.lambda.js +101 -0
  29. package/lib/slack-app/slack-app.js +2 -2
  30. package/lib/slack-events/events-function.d.ts +13 -0
  31. package/lib/slack-events/events-function.js +23 -0
  32. package/lib/slack-events/{index.handler.d.ts → events.lambda.d.ts} +0 -0
  33. package/lib/slack-events/{index.handler.js → events.lambda.js} +1 -1
  34. package/lib/slack-events/index.js +4 -4
  35. package/lib/slack-textract/detect-function.d.ts +13 -0
  36. package/lib/slack-textract/detect-function.js +23 -0
  37. package/lib/slack-textract/{index.handler.d.ts → detect.lambda.d.ts} +0 -0
  38. package/lib/slack-textract/{index.handler.js → detect.lambda.js} +1 -1
  39. package/lib/slack-textract/index.js +4 -4
  40. package/lib/state-machine-cr-provider/index.js +1 -1
  41. package/lib/static-website/index.js +1 -1
  42. package/lib/toolkit-cleaner/clean-images-function.js +2 -1
  43. package/lib/toolkit-cleaner/clean-objects-function.js +2 -1
  44. package/lib/toolkit-cleaner/get-stack-names-function.js +2 -1
  45. package/lib/toolkit-cleaner/index.js +1 -1
  46. package/lib/url-shortener/index.js +4 -4
  47. package/lib/url-shortener/shortener-function.d.ts +13 -0
  48. package/lib/url-shortener/shortener-function.js +23 -0
  49. package/lib/url-shortener/{index.handler.d.ts → shortener.lambda.d.ts} +0 -0
  50. package/lib/url-shortener/shortener.lambda.js +79 -0
  51. package/node_modules/@types/cacheable-request/node_modules/@types/node/README.md +1 -1
  52. package/node_modules/@types/cacheable-request/node_modules/@types/node/crypto.d.ts +1 -1
  53. package/node_modules/@types/cacheable-request/node_modules/@types/node/events.d.ts +31 -3
  54. package/node_modules/@types/cacheable-request/node_modules/@types/node/package.json +2 -2
  55. package/node_modules/@types/cacheable-request/node_modules/@types/node/url.d.ts +27 -1
  56. package/node_modules/@types/cacheable-request/node_modules/@types/node/util.d.ts +1 -1
  57. package/node_modules/@types/is-stream/node_modules/@types/node/README.md +1 -1
  58. package/node_modules/@types/is-stream/node_modules/@types/node/crypto.d.ts +1 -1
  59. package/node_modules/@types/is-stream/node_modules/@types/node/events.d.ts +31 -3
  60. package/node_modules/@types/is-stream/node_modules/@types/node/package.json +2 -2
  61. package/node_modules/@types/is-stream/node_modules/@types/node/url.d.ts +27 -1
  62. package/node_modules/@types/is-stream/node_modules/@types/node/util.d.ts +1 -1
  63. package/node_modules/@types/keyv/node_modules/@types/node/README.md +1 -1
  64. package/node_modules/@types/keyv/node_modules/@types/node/crypto.d.ts +1 -1
  65. package/node_modules/@types/keyv/node_modules/@types/node/events.d.ts +31 -3
  66. package/node_modules/@types/keyv/node_modules/@types/node/package.json +2 -2
  67. package/node_modules/@types/keyv/node_modules/@types/node/url.d.ts +27 -1
  68. package/node_modules/@types/keyv/node_modules/@types/node/util.d.ts +1 -1
  69. package/node_modules/@types/responselike/node_modules/@types/node/README.md +1 -1
  70. package/node_modules/@types/responselike/node_modules/@types/node/crypto.d.ts +1 -1
  71. package/node_modules/@types/responselike/node_modules/@types/node/events.d.ts +31 -3
  72. package/node_modules/@types/responselike/node_modules/@types/node/package.json +2 -2
  73. package/node_modules/@types/responselike/node_modules/@types/node/url.d.ts +27 -1
  74. package/node_modules/@types/responselike/node_modules/@types/node/util.d.ts +1 -1
  75. package/package.json +26 -13
  76. package/releasetag.txt +1 -1
  77. package/version.txt +1 -1
  78. package/lib/email-receiver/receiver.s3.js +0 -11
  79. package/lib/email-receiver/receiver.whitelist.js +0 -19
  80. package/lib/slack-app/provider.handler.js +0 -101
  81. package/lib/url-shortener/index.handler.js +0 -79
@@ -778,7 +778,7 @@ declare module 'url' {
778
778
  * @param fn Invoked for each name-value pair in the query
779
779
  * @param thisArg To be used as `this` value for when `fn` is called
780
780
  */
781
- forEach<TThis = this>(callback: (this: TThis, value: string, name: string, searchParams: this) => void, thisArg?: TThis): void;
781
+ forEach<TThis = this>(callback: (this: TThis, value: string, name: string, searchParams: URLSearchParams) => void, thisArg?: TThis): void;
782
782
  /**
783
783
  * Returns the value of the first name-value pair whose name is `name`. If there
784
784
  * are no such pairs, `null` is returned.
@@ -855,6 +855,32 @@ declare module 'url' {
855
855
  values(): IterableIterator<string>;
856
856
  [Symbol.iterator](): IterableIterator<[string, string]>;
857
857
  }
858
+
859
+ import { URL as _URL, URLSearchParams as _URLSearchParams } from 'url';
860
+ global {
861
+ interface URLSearchParams extends _URLSearchParams {}
862
+ interface URL extends _URL {}
863
+ interface Global {
864
+ URL: typeof _URL;
865
+ URLSearchParams: typeof _URLSearchParams;
866
+ }
867
+ /**
868
+ * `URL` class is a global reference for `require('url').URL`
869
+ * https://nodejs.org/api/url.html#the-whatwg-url-api
870
+ * @since v10.0.0
871
+ */
872
+ var URL: typeof globalThis extends { webkitURL: infer URL } ? URL : typeof _URL;
873
+ /**
874
+ * `URLSearchParams` class is a global reference for `require('url').URLSearchParams`
875
+ * https://nodejs.org/api/url.html#class-urlsearchparams
876
+ * @since v10.0.0
877
+ */
878
+ var URLSearchParams: {
879
+ prototype: URLSearchParams;
880
+ new(init?: string[][] | Record<string, string> | string | URLSearchParams): URLSearchParams;
881
+ toString(): string;
882
+ };
883
+ }
858
884
  }
859
885
  declare module 'node:url' {
860
886
  export * from 'url';
@@ -317,7 +317,7 @@ declare module 'util' {
317
317
  * @return The representation of `object`.
318
318
  */
319
319
  export function inspect(object: any, showHidden?: boolean, depth?: number | null, color?: boolean): string;
320
- export function inspect(object: any, options: InspectOptions): string;
320
+ export function inspect(object: any, options?: InspectOptions): string;
321
321
  export namespace inspect {
322
322
  let colors: NodeJS.Dict<[number, number]>;
323
323
  let styles: {
@@ -8,7 +8,7 @@ This package contains type definitions for Node.js (https://nodejs.org/).
8
8
  Files were exported from https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node.
9
9
 
10
10
  ### Additional Details
11
- * Last updated: Tue, 18 Jan 2022 18:31:37 GMT
11
+ * Last updated: Tue, 01 Feb 2022 08:31:29 GMT
12
12
  * Dependencies: none
13
13
  * Global values: `AbortController`, `AbortSignal`, `__dirname`, `__filename`, `console`, `exports`, `gc`, `global`, `module`, `process`, `require`
14
14
 
@@ -250,7 +250,7 @@ declare module 'crypto' {
250
250
  */
251
251
  function createHmac(algorithm: string, key: BinaryLike | KeyObject, options?: stream.TransformOptions): Hmac;
252
252
  // https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings
253
- type BinaryToTextEncoding = 'base64' | 'base64url' | 'hex';
253
+ type BinaryToTextEncoding = 'base64' | 'base64url' | 'hex' | 'binary';
254
254
  type CharacterEncoding = 'utf8' | 'utf-8' | 'utf16le' | 'latin1';
255
255
  type LegacyCharacterEncoding = 'ascii' | 'binary' | 'ucs2' | 'ucs-2';
256
256
  type Encoding = BinaryToTextEncoding | CharacterEncoding | LegacyCharacterEncoding;
@@ -50,7 +50,7 @@ declare module 'events' {
50
50
  listener: (...args: any[]) => void,
51
51
  opts?: {
52
52
  once: boolean;
53
- }
53
+ },
54
54
  ): any;
55
55
  }
56
56
  interface StaticEventEmitterOptions {
@@ -154,7 +154,11 @@ declare module 'events' {
154
154
  * ```
155
155
  * @since v11.13.0, v10.16.0
156
156
  */
157
- static once(emitter: NodeEventTarget, eventName: string | symbol, options?: StaticEventEmitterOptions): Promise<any[]>;
157
+ static once(
158
+ emitter: NodeEventTarget,
159
+ eventName: string | symbol,
160
+ options?: StaticEventEmitterOptions,
161
+ ): Promise<any[]>;
158
162
  static once(emitter: DOMEventTarget, eventName: string, options?: StaticEventEmitterOptions): Promise<any[]>;
159
163
  /**
160
164
  * ```js
@@ -214,7 +218,11 @@ declare module 'events' {
214
218
  * @param eventName The name of the event being listened for
215
219
  * @return that iterates `eventName` events emitted by the `emitter`
216
220
  */
217
- static on(emitter: NodeJS.EventEmitter, eventName: string, options?: StaticEventEmitterOptions): AsyncIterableIterator<any>;
221
+ static on(
222
+ emitter: NodeJS.EventEmitter,
223
+ eventName: string,
224
+ options?: StaticEventEmitterOptions,
225
+ ): AsyncIterableIterator<any>;
218
226
  /**
219
227
  * A class method that returns the number of listeners for the given `eventName`registered on the given `emitter`.
220
228
  *
@@ -260,6 +268,26 @@ declare module 'events' {
260
268
  * @since v15.2.0, v14.17.0
261
269
  */
262
270
  static getEventListeners(emitter: DOMEventTarget | NodeJS.EventEmitter, name: string | symbol): Function[];
271
+ /**
272
+ * By default `EventEmitter`s will print a warning if more than `10` listeners are
273
+ * added for a particular event. This is a useful default that helps finding
274
+ * memory leaks. The `EventEmitter.setMaxListeners()` method allows the default limit to be
275
+ * modified (if eventTargets is empty) or modify the limit specified in every `EventTarget` | `EventEmitter` passed as arguments.
276
+ * The value can be set to`Infinity` (or `0`) to indicate an unlimited number of listeners.
277
+ *
278
+ * ```js
279
+ * EventEmitter.setMaxListeners(20);
280
+ * // Equivalent to
281
+ * EventEmitter.defaultMaxListeners = 20;
282
+ *
283
+ * const eventTarget = new EventTarget();
284
+ * // Only way to increase limit for `EventTarget` instances
285
+ * // as these doesn't expose its own `setMaxListeners` method
286
+ * EventEmitter.setMaxListeners(20, eventTarget);
287
+ * ```
288
+ * @since v15.3.0, v14.17.0
289
+ */
290
+ static setMaxListeners(n?: number, ...eventTargets: Array<DOMEventTarget | NodeJS.EventEmitter>): void;
263
291
  /**
264
292
  * This symbol shall be used to install a listener for only monitoring `'error'`
265
293
  * events. Listeners installed using this symbol are called before the regular
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@types/node",
3
- "version": "17.0.10",
3
+ "version": "17.0.14",
4
4
  "description": "TypeScript definitions for Node.js",
5
5
  "homepage": "https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node",
6
6
  "license": "MIT",
@@ -220,6 +220,6 @@
220
220
  },
221
221
  "scripts": {},
222
222
  "dependencies": {},
223
- "typesPublisherContentHash": "a2e243404f102a5fd5fbcaefab0a775ffcb1db4d09832612decbd69815f1890b",
223
+ "typesPublisherContentHash": "6e8e93afce4fec9d11be4e66edf9445da476955206bcb7287f6832ff443d5f7c",
224
224
  "typeScriptVersion": "3.8"
225
225
  }
@@ -778,7 +778,7 @@ declare module 'url' {
778
778
  * @param fn Invoked for each name-value pair in the query
779
779
  * @param thisArg To be used as `this` value for when `fn` is called
780
780
  */
781
- forEach<TThis = this>(callback: (this: TThis, value: string, name: string, searchParams: this) => void, thisArg?: TThis): void;
781
+ forEach<TThis = this>(callback: (this: TThis, value: string, name: string, searchParams: URLSearchParams) => void, thisArg?: TThis): void;
782
782
  /**
783
783
  * Returns the value of the first name-value pair whose name is `name`. If there
784
784
  * are no such pairs, `null` is returned.
@@ -855,6 +855,32 @@ declare module 'url' {
855
855
  values(): IterableIterator<string>;
856
856
  [Symbol.iterator](): IterableIterator<[string, string]>;
857
857
  }
858
+
859
+ import { URL as _URL, URLSearchParams as _URLSearchParams } from 'url';
860
+ global {
861
+ interface URLSearchParams extends _URLSearchParams {}
862
+ interface URL extends _URL {}
863
+ interface Global {
864
+ URL: typeof _URL;
865
+ URLSearchParams: typeof _URLSearchParams;
866
+ }
867
+ /**
868
+ * `URL` class is a global reference for `require('url').URL`
869
+ * https://nodejs.org/api/url.html#the-whatwg-url-api
870
+ * @since v10.0.0
871
+ */
872
+ var URL: typeof globalThis extends { webkitURL: infer URL } ? URL : typeof _URL;
873
+ /**
874
+ * `URLSearchParams` class is a global reference for `require('url').URLSearchParams`
875
+ * https://nodejs.org/api/url.html#class-urlsearchparams
876
+ * @since v10.0.0
877
+ */
878
+ var URLSearchParams: {
879
+ prototype: URLSearchParams;
880
+ new(init?: string[][] | Record<string, string> | string | URLSearchParams): URLSearchParams;
881
+ toString(): string;
882
+ };
883
+ }
858
884
  }
859
885
  declare module 'node:url' {
860
886
  export * from 'url';
@@ -317,7 +317,7 @@ declare module 'util' {
317
317
  * @return The representation of `object`.
318
318
  */
319
319
  export function inspect(object: any, showHidden?: boolean, depth?: number | null, color?: boolean): string;
320
- export function inspect(object: any, options: InspectOptions): string;
320
+ export function inspect(object: any, options?: InspectOptions): string;
321
321
  export namespace inspect {
322
322
  let colors: NodeJS.Dict<[number, number]>;
323
323
  let styles: {
package/package.json CHANGED
@@ -9,17 +9,30 @@
9
9
  "build": "npx projen build",
10
10
  "bump": "npx projen bump",
11
11
  "bundle": "npx projen bundle",
12
+ "bundle:email-receiver/s3.lambda": "npx projen bundle:email-receiver/s3.lambda",
13
+ "bundle:email-receiver/s3.lambda:watch": "npx projen bundle:email-receiver/s3.lambda:watch",
14
+ "bundle:email-receiver/whitelist.lambda": "npx projen bundle:email-receiver/whitelist.lambda",
15
+ "bundle:email-receiver/whitelist.lambda:watch": "npx projen bundle:email-receiver/whitelist.lambda:watch",
16
+ "bundle:slack-app/provider.lambda": "npx projen bundle:slack-app/provider.lambda",
17
+ "bundle:slack-app/provider.lambda:watch": "npx projen bundle:slack-app/provider.lambda:watch",
18
+ "bundle:slack-events/events.lambda": "npx projen bundle:slack-events/events.lambda",
19
+ "bundle:slack-events/events.lambda:watch": "npx projen bundle:slack-events/events.lambda:watch",
20
+ "bundle:slack-textract/detect.lambda": "npx projen bundle:slack-textract/detect.lambda",
21
+ "bundle:slack-textract/detect.lambda:watch": "npx projen bundle:slack-textract/detect.lambda:watch",
12
22
  "bundle:toolkit-cleaner/clean-images.lambda": "npx projen bundle:toolkit-cleaner/clean-images.lambda",
13
23
  "bundle:toolkit-cleaner/clean-images.lambda:watch": "npx projen bundle:toolkit-cleaner/clean-images.lambda:watch",
14
24
  "bundle:toolkit-cleaner/clean-objects.lambda": "npx projen bundle:toolkit-cleaner/clean-objects.lambda",
15
25
  "bundle:toolkit-cleaner/clean-objects.lambda:watch": "npx projen bundle:toolkit-cleaner/clean-objects.lambda:watch",
16
26
  "bundle:toolkit-cleaner/get-stack-names.lambda": "npx projen bundle:toolkit-cleaner/get-stack-names.lambda",
17
27
  "bundle:toolkit-cleaner/get-stack-names.lambda:watch": "npx projen bundle:toolkit-cleaner/get-stack-names.lambda:watch",
28
+ "bundle:url-shortener/shortener.lambda": "npx projen bundle:url-shortener/shortener.lambda",
29
+ "bundle:url-shortener/shortener.lambda:watch": "npx projen bundle:url-shortener/shortener.lambda:watch",
18
30
  "clobber": "npx projen clobber",
19
31
  "compat": "npx projen compat",
20
32
  "compile": "npx projen compile",
21
33
  "default": "npx projen default",
22
34
  "docgen": "npx projen docgen",
35
+ "eject": "npx projen eject",
23
36
  "eslint": "npx projen eslint",
24
37
  "integ:slack-app:assert": "npx projen integ:slack-app:assert",
25
38
  "integ:slack-app:deploy": "npx projen integ:slack-app:deploy",
@@ -80,7 +93,7 @@
80
93
  "json-schema": "^0.4.0",
81
94
  "nock": "^13.2.2",
82
95
  "npm-check-updates": "^12",
83
- "projen": "^0.51.5",
96
+ "projen": "^0.52.14",
84
97
  "standard-version": "^9",
85
98
  "ts-jest": "^26.5.6",
86
99
  "ts-node": "^10.4.0",
@@ -105,7 +118,7 @@
105
118
  ],
106
119
  "main": "lib/index.js",
107
120
  "license": "Apache-2.0",
108
- "version": "0.4.9",
121
+ "version": "0.4.13",
109
122
  "jest": {
110
123
  "testMatch": [
111
124
  "<rootDir>/src/**/__tests__/**/*.ts?(x)",
@@ -160,17 +173,17 @@
160
173
  ".": "./lib/index.js",
161
174
  "./package.json": "./package.json",
162
175
  "./.jsii": "./.jsii",
163
- "./codecommit-mirror": "./lib/codecommit-mirror/index.js",
164
- "./ecs-service-roller": "./lib/ecs-service-roller/index.js",
165
- "./email-receiver": "./lib/email-receiver/index.js",
166
- "./saml-identity-provider": "./lib/saml-identity-provider/index.js",
167
- "./slack-app": "./lib/slack-app/index.js",
168
- "./slack-events": "./lib/slack-events/index.js",
169
- "./slack-textract": "./lib/slack-textract/index.js",
170
- "./state-machine-cr-provider": "./lib/state-machine-cr-provider/index.js",
171
- "./static-website": "./lib/static-website/index.js",
172
- "./toolkit-cleaner": "./lib/toolkit-cleaner/index.js",
173
- "./url-shortener": "./lib/url-shortener/index.js"
176
+ "./lib/codecommit-mirror": "./lib/codecommit-mirror/index.js",
177
+ "./lib/ecs-service-roller": "./lib/ecs-service-roller/index.js",
178
+ "./lib/email-receiver": "./lib/email-receiver/index.js",
179
+ "./lib/saml-identity-provider": "./lib/saml-identity-provider/index.js",
180
+ "./lib/slack-app": "./lib/slack-app/index.js",
181
+ "./lib/slack-events": "./lib/slack-events/index.js",
182
+ "./lib/slack-textract": "./lib/slack-textract/index.js",
183
+ "./lib/state-machine-cr-provider": "./lib/state-machine-cr-provider/index.js",
184
+ "./lib/static-website": "./lib/static-website/index.js",
185
+ "./lib/toolkit-cleaner": "./lib/toolkit-cleaner/index.js",
186
+ "./lib/url-shortener": "./lib/url-shortener/index.js"
174
187
  },
175
188
  "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"npx projen\"."
176
189
  }
package/releasetag.txt CHANGED
@@ -1 +1 @@
1
- v0.4.9
1
+ v0.4.13
package/version.txt CHANGED
@@ -1 +1 @@
1
- 0.4.9
1
+ 0.4.13
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.handler = void 0;
4
- /* eslint-disable no-console */
5
- async function handler(event) {
6
- console.log('Event: %j', event);
7
- const message = JSON.parse(event.Records[0].Sns.Message);
8
- return message;
9
- }
10
- exports.handler = handler;
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjZWl2ZXIuczMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW1haWwtcmVjZWl2ZXIvcmVjZWl2ZXIuczMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStCO0FBQ3hCLEtBQUssVUFBVSxPQUFPLENBQUMsS0FBeUI7SUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFaEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQXlCLENBQUM7SUFFakYsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQU5ELDBCQU1DIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQ6IEFXU0xhbWJkYS5TTlNFdmVudCk6IFByb21pc2U8QVdTTGFtYmRhLlNFU01lc3NhZ2U+IHtcbiAgY29uc29sZS5sb2coJ0V2ZW50OiAlaicsIGV2ZW50KTtcblxuICBjb25zdCBtZXNzYWdlID0gSlNPTi5wYXJzZShldmVudC5SZWNvcmRzWzBdLlNucy5NZXNzYWdlKSBhcyBBV1NMYW1iZGEuU0VTTWVzc2FnZTtcblxuICByZXR1cm4gbWVzc2FnZTtcbn1cbiJdfQ==
@@ -1,19 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.handler = void 0;
4
- /* eslint-disable no-console */
5
- async function handler(event) {
6
- console.log('Event: %j', event);
7
- const sesNotification = event.Records[0].ses;
8
- if (!process.env.SOURCE_WHITELIST) {
9
- console.log('Missing SOURCE_WHITELIST');
10
- return { disposition: 'STOP_RULE' };
11
- }
12
- if (!new RegExp(process.env.SOURCE_WHITELIST).test(sesNotification.mail.source)) {
13
- console.log(`${sesNotification.mail.source} does not match /${process.env.SOURCE_WHITELIST}/`);
14
- return { disposition: 'STOP_RULE' };
15
- }
16
- return { disposition: 'CONTINUE' };
17
- }
18
- exports.handler = handler;
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjZWl2ZXIud2hpdGVsaXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VtYWlsLXJlY2VpdmVyL3JlY2VpdmVyLndoaXRlbGlzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBK0I7QUFDeEIsS0FBSyxVQUFVLE9BQU8sQ0FBQyxLQUF5QjtJQUNyRCxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUVoQyxNQUFNLGVBQWUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUU3QyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRTtRQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDeEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQztLQUNyQztJQUVELElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDL0UsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxvQkFBb0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFDL0YsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsQ0FBQztLQUNyQztJQUVELE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDckMsQ0FBQztBQWhCRCwwQkFnQkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcihldmVudDogQVdTTGFtYmRhLlNFU0V2ZW50KTogUHJvbWlzZTx7IGRpc3Bvc2l0aW9uOiBzdHJpbmcgfT4ge1xuICBjb25zb2xlLmxvZygnRXZlbnQ6ICVqJywgZXZlbnQpO1xuXG4gIGNvbnN0IHNlc05vdGlmaWNhdGlvbiA9IGV2ZW50LlJlY29yZHNbMF0uc2VzO1xuXG4gIGlmICghcHJvY2Vzcy5lbnYuU09VUkNFX1dISVRFTElTVCkge1xuICAgIGNvbnNvbGUubG9nKCdNaXNzaW5nIFNPVVJDRV9XSElURUxJU1QnKTtcbiAgICByZXR1cm4geyBkaXNwb3NpdGlvbjogJ1NUT1BfUlVMRScgfTtcbiAgfVxuXG4gIGlmICghbmV3IFJlZ0V4cChwcm9jZXNzLmVudi5TT1VSQ0VfV0hJVEVMSVNUKS50ZXN0KHNlc05vdGlmaWNhdGlvbi5tYWlsLnNvdXJjZSkpIHtcbiAgICBjb25zb2xlLmxvZyhgJHtzZXNOb3RpZmljYXRpb24ubWFpbC5zb3VyY2V9IGRvZXMgbm90IG1hdGNoIC8ke3Byb2Nlc3MuZW52LlNPVVJDRV9XSElURUxJU1R9L2ApO1xuICAgIHJldHVybiB7IGRpc3Bvc2l0aW9uOiAnU1RPUF9SVUxFJyB9O1xuICB9XG5cbiAgcmV0dXJuIHsgZGlzcG9zaXRpb246ICdDT05USU5VRScgfTtcbn1cbiJdfQ==
@@ -1,101 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.handler = void 0;
4
- const aws_sdk_1 = require("aws-sdk"); // eslint-disable-line import/no-extraneous-dependencies
5
- const got_1 = require("got");
6
- const secretsmanager = new aws_sdk_1.SecretsManager({ apiVersion: '2017-10-17' });
7
- const slackClient = got_1.default.extend({
8
- prefixUrl: 'https://slack.com/api',
9
- });
10
- async function handler(event) {
11
- var _a, _b;
12
- console.log('Event: %j', event);
13
- const data = await secretsmanager.getSecretValue({
14
- SecretId: event.ResourceProperties.configurationTokenSecretArn,
15
- }).promise();
16
- if (!data.SecretString) {
17
- throw new Error('No secret string found in configuration token secret');
18
- }
19
- const secret = JSON.parse(data.SecretString);
20
- let accessToken = secret.accessToken;
21
- if (!accessToken || isExpired((_a = secret.exp) !== null && _a !== void 0 ? _a : 0)) {
22
- if (!secret.refreshToken) {
23
- throw new Error('No refresh token found in configuration token secret');
24
- }
25
- console.log('Refreshing access token');
26
- const rotate = await slackClient.get('tooling.tokens.rotate', {
27
- searchParams: { refresh_token: secret.refreshToken },
28
- }).json();
29
- if (!rotate.ok) {
30
- throw new Error(`Failed to refresh access token: ${rotate.error}`);
31
- }
32
- console.log('Access token refreshed');
33
- accessToken = rotate.token;
34
- console.log('Saving access token');
35
- const putSecretValue = await secretsmanager.putSecretValue({
36
- SecretId: event.ResourceProperties.configurationTokenSecretArn,
37
- SecretString: JSON.stringify({
38
- accessToken,
39
- refreshToken: rotate.refresh_token,
40
- exp: rotate.exp,
41
- }),
42
- }).promise();
43
- console.log(`Successfully saved access token in secret ${putSecretValue.ARN}`);
44
- }
45
- const operation = event.RequestType.toLowerCase();
46
- const request = getManifestRequest(event);
47
- console.log(`Calling ${operation} manifest API: %j`, request);
48
- const response = await slackClient.post(`apps.manifest.${operation}`, {
49
- headers: { Authorization: `Bearer ${accessToken}` },
50
- json: request,
51
- }).json();
52
- if (!response.ok) {
53
- const errors = response.errors
54
- ? response.errors.map((err) => `${err.message} at ${err.pointer}`).join('\n')
55
- : '';
56
- throw new Error(`Failed to ${operation} manifest: ${response.error}.${errors ? `\n${errors}}` : ''}`);
57
- }
58
- console.log(`Successfully ${operation}d Slack app ${(_b = event.PhysicalResourceId) !== null && _b !== void 0 ? _b : response.app_id}`);
59
- if (event.RequestType === 'Create' && response.credentials) {
60
- console.log('Saving app credentials');
61
- const putSecretValue = await secretsmanager.putSecretValue({
62
- SecretId: event.ResourceProperties.credentialsSecretArn,
63
- SecretString: JSON.stringify({
64
- appId: response.app_id,
65
- clientId: response.credentials.client_id,
66
- clientSecret: response.credentials.client_secret,
67
- verificationToken: response.credentials.verification_token,
68
- signingSecret: response.credentials.signing_secret,
69
- }),
70
- }).promise();
71
- console.log(`Successfully saved app credentials in secret ${putSecretValue.ARN}`);
72
- }
73
- return {
74
- PhysicalResourceId: response.app_id,
75
- Data: {
76
- appId: response.app_id,
77
- },
78
- };
79
- }
80
- exports.handler = handler;
81
- function isExpired(iat) {
82
- return (iat - (Date.now() / 1000)) < 0;
83
- }
84
- function getManifestRequest(event) {
85
- switch (event.RequestType) {
86
- case 'Create':
87
- return {
88
- manifest: event.ResourceProperties.manifest,
89
- };
90
- case 'Update':
91
- return {
92
- app_id: event.PhysicalResourceId,
93
- manifest: event.ResourceProperties.manifest,
94
- };
95
- case 'Delete':
96
- return {
97
- app_id: event.PhysicalResourceId,
98
- };
99
- }
100
- }
101
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXIuaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zbGFjay1hcHAvcHJvdmlkZXIuaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxxQ0FBeUMsQ0FBQyx3REFBd0Q7QUFDbEcsNkJBQXNCO0FBaUR0QixNQUFNLGNBQWMsR0FBRyxJQUFJLHdCQUFjLENBQUMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztBQUV4RSxNQUFNLFdBQVcsR0FBRyxhQUFHLENBQUMsTUFBTSxDQUFDO0lBQzdCLFNBQVMsRUFBRSx1QkFBdUI7Q0FDbkMsQ0FBQyxDQUFDO0FBRUksS0FBSyxVQUFVLE9BQU8sQ0FBQyxLQUFxQjs7SUFDakQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFaEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxjQUFjLENBQUMsY0FBYyxDQUFDO1FBQy9DLFFBQVEsRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsMkJBQTJCO0tBQy9ELENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUViLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1FBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztLQUN6RTtJQUVELE1BQU0sTUFBTSxHQUFnQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUUxRCxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO0lBRXJDLElBQUksQ0FBQyxXQUFXLElBQUksU0FBUyxPQUFDLE1BQU0sQ0FBQyxHQUFHLG1DQUFJLENBQUMsQ0FBQyxFQUFFO1FBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztTQUN6RTtRQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUN2QyxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEVBQUU7WUFDNUQsWUFBWSxFQUFFLEVBQUUsYUFBYSxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUU7U0FDckQsQ0FBQyxDQUFDLElBQUksRUFBa0IsQ0FBQztRQUUxQixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRTtZQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ3BFO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBRXRDLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBRTNCLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNuQyxNQUFNLGNBQWMsR0FBRyxNQUFNLGNBQWMsQ0FBQyxjQUFjLENBQUM7WUFDekQsUUFBUSxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQywyQkFBMkI7WUFDOUQsWUFBWSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQzNCLFdBQVc7Z0JBQ1gsWUFBWSxFQUFFLE1BQU0sQ0FBQyxhQUFhO2dCQUNsQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUc7YUFDaEIsQ0FBQztTQUNILENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMsNkNBQTZDLGNBQWMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0tBQ2hGO0lBRUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNsRCxNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUxQyxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsU0FBUyxtQkFBbUIsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM5RCxNQUFNLFFBQVEsR0FBRyxNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLFNBQVMsRUFBRSxFQUFFO1FBQ3BFLE9BQU8sRUFBRSxFQUFFLGFBQWEsRUFBRSxVQUFVLFdBQVcsRUFBRSxFQUFFO1FBQ25ELElBQUksRUFBRSxPQUFPO0tBQ2QsQ0FBQyxDQUFDLElBQUksRUFBb0IsQ0FBQztJQUU1QixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtRQUNoQixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTTtZQUM1QixDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sT0FBTyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzdFLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsU0FBUyxjQUFjLFFBQVEsQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ3ZHO0lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsU0FBUyxlQUFlLE1BQUEsS0FBSyxDQUFDLGtCQUFrQixtQ0FBSSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUVuRyxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUU7UUFDMUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sY0FBYyxHQUFHLE1BQU0sY0FBYyxDQUFDLGNBQWMsQ0FBQztZQUN6RCxRQUFRLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQjtZQUN2RCxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDM0IsS0FBSyxFQUFFLFFBQVEsQ0FBQyxNQUFNO2dCQUN0QixRQUFRLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTO2dCQUN4QyxZQUFZLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxhQUFhO2dCQUNoRCxpQkFBaUIsRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLGtCQUFrQjtnQkFDMUQsYUFBYSxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsY0FBYzthQUNuRCxDQUFDO1NBQ0gsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnREFBZ0QsY0FBYyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7S0FDbkY7SUFFRCxPQUFPO1FBQ0wsa0JBQWtCLEVBQUUsUUFBUSxDQUFDLE1BQU07UUFDbkMsSUFBSSxFQUFFO1lBQ0osS0FBSyxFQUFFLFFBQVEsQ0FBQyxNQUFNO1NBQ3ZCO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFuRkQsMEJBbUZDO0FBRUQsU0FBUyxTQUFTLENBQUMsR0FBVztJQUM1QixPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLEtBQXFCO0lBQy9DLFFBQVEsS0FBSyxDQUFDLFdBQVcsRUFBRTtRQUN6QixLQUFLLFFBQVE7WUFDWCxPQUFPO2dCQUNMLFFBQVEsRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsUUFBUTthQUM1QyxDQUFDO1FBQ0osS0FBSyxRQUFRO1lBQ1gsT0FBTztnQkFDTCxNQUFNLEVBQUUsS0FBSyxDQUFDLGtCQUFrQjtnQkFDaEMsUUFBUSxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRO2FBQzVDLENBQUM7UUFDSixLQUFLLFFBQVE7WUFDWCxPQUFPO2dCQUNMLE1BQU0sRUFBRSxLQUFLLENBQUMsa0JBQW1CO2FBQ2xDLENBQUM7S0FDTDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG5pbXBvcnQgeyBPbkV2ZW50UmVxdWVzdCwgT25FdmVudFJlc3BvbnNlIH0gZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcy9saWIvcHJvdmlkZXItZnJhbWV3b3JrL3R5cGVzJztcbmltcG9ydCB7IFNlY3JldHNNYW5hZ2VyIH0gZnJvbSAnYXdzLXNkayc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgZ290IGZyb20gJ2dvdCc7XG5cbmludGVyZmFjZSBTbGFja1NlY3JldCB7XG4gIGFjY2Vzc1Rva2VuPzogc3RyaW5nO1xuICByZWZyZXNoVG9rZW4/OiBzdHJpbmc7XG4gIGV4cD86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFJvdGF0ZVJlc3BvbnNlIHtcbiAgb2s6IGJvb2xlYW47XG4gIGVycm9yPzogc3RyaW5nO1xuICB0b2tlbjogc3RyaW5nO1xuICByZWZyZXNoX3Rva2VuOiBzdHJpbmc7XG4gIHRlYW1faWQ6IHN0cmluZztcbiAgdXNlcl9pZDogc3RyaW5nO1xuICBpYXQ6IG51bWJlcjtcbiAgZXhwOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBNYW5pZmVzdENyZWF0ZVJlcXVlc3Qge1xuICBtYW5pZmVzdDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgTWFuaWZlc3RVcGRhdGVSZXF1ZXN0IGV4dGVuZHMgTWFuaWZlc3RDcmVhdGVSZXF1ZXN0IHtcbiAgYXBwX2lkOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBNYW5pZmVzdERlbGV0ZVJlcXVlc3Qge1xuICBhcHBfaWQ6IHN0cmluZztcbn1cblxudHlwZSBNYW5pZmVzdFJlcXVlc3QgPSBNYW5pZmVzdENyZWF0ZVJlcXVlc3QgfCBNYW5pZmVzdFVwZGF0ZVJlcXVlc3QgfCBNYW5pZmVzdERlbGV0ZVJlcXVlc3Q7XG5cbmludGVyZmFjZSBNYW5pZmVzdFJlc3BvbnNlIHtcbiAgb2s6IGJvb2xlYW47XG4gIGVycm9yPzogc3RyaW5nO1xuICBlcnJvcnM/OiB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIHBvaW50ZXI6IHN0cmluZztcbiAgfVtdO1xuICBhcHBfaWQ/OiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxzPzoge1xuICAgIGNsaWVudF9pZDogc3RyaW5nO1xuICAgIGNsaWVudF9zZWNyZXQ6IHN0cmluZztcbiAgICB2ZXJpZmljYXRpb25fdG9rZW46IHN0cmluZztcbiAgICBzaWduaW5nX3NlY3JldDogc3RyaW5nO1xuICB9O1xufVxuXG5jb25zdCBzZWNyZXRzbWFuYWdlciA9IG5ldyBTZWNyZXRzTWFuYWdlcih7IGFwaVZlcnNpb246ICcyMDE3LTEwLTE3JyB9KTtcblxuY29uc3Qgc2xhY2tDbGllbnQgPSBnb3QuZXh0ZW5kKHtcbiAgcHJlZml4VXJsOiAnaHR0cHM6Ly9zbGFjay5jb20vYXBpJyxcbn0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcihldmVudDogT25FdmVudFJlcXVlc3QpOiBQcm9taXNlPE9uRXZlbnRSZXNwb25zZT4ge1xuICBjb25zb2xlLmxvZygnRXZlbnQ6ICVqJywgZXZlbnQpO1xuXG4gIGNvbnN0IGRhdGEgPSBhd2FpdCBzZWNyZXRzbWFuYWdlci5nZXRTZWNyZXRWYWx1ZSh7XG4gICAgU2VjcmV0SWQ6IGV2ZW50LlJlc291cmNlUHJvcGVydGllcy5jb25maWd1cmF0aW9uVG9rZW5TZWNyZXRBcm4sXG4gIH0pLnByb21pc2UoKTtcblxuICBpZiAoIWRhdGEuU2VjcmV0U3RyaW5nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBzZWNyZXQgc3RyaW5nIGZvdW5kIGluIGNvbmZpZ3VyYXRpb24gdG9rZW4gc2VjcmV0Jyk7XG4gIH1cblxuICBjb25zdCBzZWNyZXQ6IFNsYWNrU2VjcmV0ID0gSlNPTi5wYXJzZShkYXRhLlNlY3JldFN0cmluZyk7XG5cbiAgbGV0IGFjY2Vzc1Rva2VuID0gc2VjcmV0LmFjY2Vzc1Rva2VuO1xuXG4gIGlmICghYWNjZXNzVG9rZW4gfHwgaXNFeHBpcmVkKHNlY3JldC5leHAgPz8gMCkpIHtcbiAgICBpZiAoIXNlY3JldC5yZWZyZXNoVG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcmVmcmVzaCB0b2tlbiBmb3VuZCBpbiBjb25maWd1cmF0aW9uIHRva2VuIHNlY3JldCcpO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCdSZWZyZXNoaW5nIGFjY2VzcyB0b2tlbicpO1xuICAgIGNvbnN0IHJvdGF0ZSA9IGF3YWl0IHNsYWNrQ2xpZW50LmdldCgndG9vbGluZy50b2tlbnMucm90YXRlJywge1xuICAgICAgc2VhcmNoUGFyYW1zOiB7IHJlZnJlc2hfdG9rZW46IHNlY3JldC5yZWZyZXNoVG9rZW4gfSxcbiAgICB9KS5qc29uPFJvdGF0ZVJlc3BvbnNlPigpO1xuXG4gICAgaWYgKCFyb3RhdGUub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJlZnJlc2ggYWNjZXNzIHRva2VuOiAke3JvdGF0ZS5lcnJvcn1gKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coJ0FjY2VzcyB0b2tlbiByZWZyZXNoZWQnKTtcblxuICAgIGFjY2Vzc1Rva2VuID0gcm90YXRlLnRva2VuO1xuXG4gICAgY29uc29sZS5sb2coJ1NhdmluZyBhY2Nlc3MgdG9rZW4nKTtcbiAgICBjb25zdCBwdXRTZWNyZXRWYWx1ZSA9IGF3YWl0IHNlY3JldHNtYW5hZ2VyLnB1dFNlY3JldFZhbHVlKHtcbiAgICAgIFNlY3JldElkOiBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuY29uZmlndXJhdGlvblRva2VuU2VjcmV0QXJuLFxuICAgICAgU2VjcmV0U3RyaW5nOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGFjY2Vzc1Rva2VuLFxuICAgICAgICByZWZyZXNoVG9rZW46IHJvdGF0ZS5yZWZyZXNoX3Rva2VuLFxuICAgICAgICBleHA6IHJvdGF0ZS5leHAsXG4gICAgICB9KSxcbiAgICB9KS5wcm9taXNlKCk7XG4gICAgY29uc29sZS5sb2coYFN1Y2Nlc3NmdWxseSBzYXZlZCBhY2Nlc3MgdG9rZW4gaW4gc2VjcmV0ICR7cHV0U2VjcmV0VmFsdWUuQVJOfWApO1xuICB9XG5cbiAgY29uc3Qgb3BlcmF0aW9uID0gZXZlbnQuUmVxdWVzdFR5cGUudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgcmVxdWVzdCA9IGdldE1hbmlmZXN0UmVxdWVzdChldmVudCk7XG5cbiAgY29uc29sZS5sb2coYENhbGxpbmcgJHtvcGVyYXRpb259IG1hbmlmZXN0IEFQSTogJWpgLCByZXF1ZXN0KTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzbGFja0NsaWVudC5wb3N0KGBhcHBzLm1hbmlmZXN0LiR7b3BlcmF0aW9ufWAsIHtcbiAgICBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthY2Nlc3NUb2tlbn1gIH0sXG4gICAganNvbjogcmVxdWVzdCxcbiAgfSkuanNvbjxNYW5pZmVzdFJlc3BvbnNlPigpO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBlcnJvcnMgPSByZXNwb25zZS5lcnJvcnNcbiAgICAgID8gcmVzcG9uc2UuZXJyb3JzLm1hcCgoZXJyKSA9PiBgJHtlcnIubWVzc2FnZX0gYXQgJHtlcnIucG9pbnRlcn1gKS5qb2luKCdcXG4nKVxuICAgICAgOiAnJztcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byAke29wZXJhdGlvbn0gbWFuaWZlc3Q6ICR7cmVzcG9uc2UuZXJyb3J9LiR7ZXJyb3JzID8gYFxcbiR7ZXJyb3JzfX1gIDogJyd9YCk7XG4gIH1cblxuICBjb25zb2xlLmxvZyhgU3VjY2Vzc2Z1bGx5ICR7b3BlcmF0aW9ufWQgU2xhY2sgYXBwICR7ZXZlbnQuUGh5c2ljYWxSZXNvdXJjZUlkID8/IHJlc3BvbnNlLmFwcF9pZH1gKTtcblxuICBpZiAoZXZlbnQuUmVxdWVzdFR5cGUgPT09ICdDcmVhdGUnICYmIHJlc3BvbnNlLmNyZWRlbnRpYWxzKSB7XG4gICAgY29uc29sZS5sb2coJ1NhdmluZyBhcHAgY3JlZGVudGlhbHMnKTtcbiAgICBjb25zdCBwdXRTZWNyZXRWYWx1ZSA9IGF3YWl0IHNlY3JldHNtYW5hZ2VyLnB1dFNlY3JldFZhbHVlKHtcbiAgICAgIFNlY3JldElkOiBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMuY3JlZGVudGlhbHNTZWNyZXRBcm4sXG4gICAgICBTZWNyZXRTdHJpbmc6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgYXBwSWQ6IHJlc3BvbnNlLmFwcF9pZCxcbiAgICAgICAgY2xpZW50SWQ6IHJlc3BvbnNlLmNyZWRlbnRpYWxzLmNsaWVudF9pZCxcbiAgICAgICAgY2xpZW50U2VjcmV0OiByZXNwb25zZS5jcmVkZW50aWFscy5jbGllbnRfc2VjcmV0LFxuICAgICAgICB2ZXJpZmljYXRpb25Ub2tlbjogcmVzcG9uc2UuY3JlZGVudGlhbHMudmVyaWZpY2F0aW9uX3Rva2VuLFxuICAgICAgICBzaWduaW5nU2VjcmV0OiByZXNwb25zZS5jcmVkZW50aWFscy5zaWduaW5nX3NlY3JldCxcbiAgICAgIH0pLFxuICAgIH0pLnByb21pc2UoKTtcbiAgICBjb25zb2xlLmxvZyhgU3VjY2Vzc2Z1bGx5IHNhdmVkIGFwcCBjcmVkZW50aWFscyBpbiBzZWNyZXQgJHtwdXRTZWNyZXRWYWx1ZS5BUk59YCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIFBoeXNpY2FsUmVzb3VyY2VJZDogcmVzcG9uc2UuYXBwX2lkLFxuICAgIERhdGE6IHtcbiAgICAgIGFwcElkOiByZXNwb25zZS5hcHBfaWQsXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNFeHBpcmVkKGlhdDogbnVtYmVyKSB7XG4gIHJldHVybiAoaWF0IC0gKERhdGUubm93KCkgLyAxMDAwKSkgPCAwO1xufVxuXG5mdW5jdGlvbiBnZXRNYW5pZmVzdFJlcXVlc3QoZXZlbnQ6IE9uRXZlbnRSZXF1ZXN0KTogTWFuaWZlc3RSZXF1ZXN0IHtcbiAgc3dpdGNoIChldmVudC5SZXF1ZXN0VHlwZSkge1xuICAgIGNhc2UgJ0NyZWF0ZSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtYW5pZmVzdDogZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzLm1hbmlmZXN0LFxuICAgICAgfTtcbiAgICBjYXNlICdVcGRhdGUnOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXBwX2lkOiBldmVudC5QaHlzaWNhbFJlc291cmNlSWQsXG4gICAgICAgIG1hbmlmZXN0OiBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMubWFuaWZlc3QsXG4gICAgICB9O1xuICAgIGNhc2UgJ0RlbGV0ZSc6XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcHBfaWQ6IGV2ZW50LlBoeXNpY2FsUmVzb3VyY2VJZCEsXG4gICAgICB9O1xuICB9XG59XG4iXX0=
@@ -1,79 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.handler = void 0;
4
- /* eslint-disable no-console */
5
- const aws_sdk_1 = require("aws-sdk"); // eslint-disable-line import/no-extraneous-dependencies
6
- function base62Encode(int) {
7
- const characterSet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
8
- if (int === 0)
9
- return '0';
10
- let s = '';
11
- while (int > 0) {
12
- s = characterSet[int % 62] + s;
13
- int = Math.floor(int / 62);
14
- }
15
- return s;
16
- }
17
- ;
18
- function getEnv(name) {
19
- const value = process.env[name];
20
- if (!value) {
21
- throw new Error(`The environment variable ${name} is not defined`);
22
- }
23
- return value;
24
- }
25
- const documentClient = new aws_sdk_1.DynamoDB.DocumentClient({ apiVersion: '2012-08-10' });
26
- const s3 = new aws_sdk_1.S3({ apiVersion: '2006-03-01' });
27
- async function handler(event) {
28
- var _a, _b;
29
- try {
30
- console.log('Event: %j', event);
31
- const body = JSON.parse((_a = event.body) !== null && _a !== void 0 ? _a : '{}');
32
- if (!body.url) {
33
- return {
34
- statusCode: 400,
35
- body: '',
36
- };
37
- }
38
- // Get next counter value
39
- const update = await documentClient.update({
40
- TableName: getEnv('TABLE_NAME'),
41
- Key: { key: 'counter' },
42
- UpdateExpression: 'ADD #value :incr',
43
- ExpressionAttributeNames: { '#value': 'value' },
44
- ExpressionAttributeValues: { ':incr': 1 },
45
- ReturnValues: 'UPDATED_NEW',
46
- }).promise();
47
- const value = (_b = update.Attributes) === null || _b === void 0 ? void 0 : _b.value;
48
- if (!value) {
49
- throw new Error('Cannot get next counter value');
50
- }
51
- const key = base62Encode(value);
52
- console.log('Key: %j', key);
53
- // Put zero-byte object with redirection on S3
54
- const putObject = await s3.putObject({
55
- Bucket: getEnv('BUCKET_NAME'),
56
- Key: key,
57
- WebsiteRedirectLocation: body.url,
58
- ACL: 'public-read',
59
- }).promise();
60
- console.log('Put object: %j', putObject);
61
- // Return short url
62
- return {
63
- statusCode: 201,
64
- body: JSON.stringify({
65
- url: body.url,
66
- shortUrl: `https://${getEnv('DOMAIN_NAME')}/${key}`,
67
- }),
68
- };
69
- }
70
- catch (err) {
71
- console.log(err);
72
- return {
73
- statusCode: 500,
74
- body: '',
75
- };
76
- }
77
- }
78
- exports.handler = handler;
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91cmwtc2hvcnRlbmVyL2luZGV4LmhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQStCO0FBQy9CLHFDQUF1QyxDQUFDLHdEQUF3RDtBQUVoRyxTQUFTLFlBQVksQ0FBQyxHQUFXO0lBQy9CLE1BQU0sWUFBWSxHQUFHLGdFQUFnRSxDQUFDO0lBQ3RGLElBQUksR0FBRyxLQUFLLENBQUM7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUMxQixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDWCxPQUFPLEdBQUcsR0FBRyxDQUFDLEVBQUU7UUFDZCxDQUFDLEdBQUcsWUFBWSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0tBQzVCO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBQUEsQ0FBQztBQUVGLFNBQVMsTUFBTSxDQUFDLElBQVk7SUFDMUIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVoQyxJQUFJLENBQUMsS0FBSyxFQUFFO1FBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDO0tBQ3BFO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxrQkFBUSxDQUFDLGNBQWMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO0FBRWpGLE1BQU0sRUFBRSxHQUFHLElBQUksWUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7QUFFekMsS0FBSyxVQUFVLE9BQU8sQ0FBQyxLQUFxQzs7SUFDakUsSUFBSTtRQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWhDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLE9BQUMsS0FBSyxDQUFDLElBQUksbUNBQUksSUFBSSxDQUFDLENBQUM7UUFFNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDYixPQUFPO2dCQUNMLFVBQVUsRUFBRSxHQUFHO2dCQUNmLElBQUksRUFBRSxFQUFFO2FBQ1QsQ0FBQztTQUNIO1FBRUQseUJBQXlCO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLE1BQU0sY0FBYyxDQUFDLE1BQU0sQ0FBQztZQUN6QyxTQUFTLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQztZQUMvQixHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFO1lBQ3ZCLGdCQUFnQixFQUFFLGtCQUFrQjtZQUNwQyx3QkFBd0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUU7WUFDL0MseUJBQXlCLEVBQUUsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFO1lBQ3pDLFlBQVksRUFBRSxhQUFhO1NBQzVCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUViLE1BQU0sS0FBSyxTQUFHLE1BQU0sQ0FBQyxVQUFVLDBDQUFFLEtBQUssQ0FBQztRQUV2QyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1NBQ2xEO1FBRUQsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRTVCLDhDQUE4QztRQUM5QyxNQUFNLFNBQVMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDbkMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUM7WUFDN0IsR0FBRyxFQUFFLEdBQUc7WUFDUix1QkFBdUIsRUFBRSxJQUFJLENBQUMsR0FBRztZQUNqQyxHQUFHLEVBQUUsYUFBYTtTQUNuQixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRXpDLG1CQUFtQjtRQUNuQixPQUFPO1lBQ0wsVUFBVSxFQUFFLEdBQUc7WUFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDbkIsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO2dCQUNiLFFBQVEsRUFBRSxXQUFXLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxHQUFHLEVBQUU7YUFDcEQsQ0FBQztTQUNILENBQUM7S0FDSDtJQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVqQixPQUFPO1lBQ0wsVUFBVSxFQUFFLEdBQUc7WUFDZixJQUFJLEVBQUUsRUFBRTtTQUNULENBQUM7S0FDSDtBQUNILENBQUM7QUF6REQsMEJBeURDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuaW1wb3J0IHsgRHluYW1vREIsIFMzIH0gZnJvbSAnYXdzLXNkayc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5cbmZ1bmN0aW9uIGJhc2U2MkVuY29kZShpbnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGNoYXJhY3RlclNldCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSc7XG4gIGlmIChpbnQgPT09IDApIHJldHVybiAnMCc7XG4gIGxldCBzID0gJyc7XG4gIHdoaWxlIChpbnQgPiAwKSB7XG4gICAgcyA9IGNoYXJhY3RlclNldFtpbnQgJSA2Ml0gKyBzO1xuICAgIGludCA9IE1hdGguZmxvb3IoaW50IC8gNjIpO1xuICB9XG4gIHJldHVybiBzO1xufTtcblxuZnVuY3Rpb24gZ2V0RW52KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHZhbHVlID0gcHJvY2Vzcy5lbnZbbmFtZV07XG5cbiAgaWYgKCF2YWx1ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlICR7bmFtZX0gaXMgbm90IGRlZmluZWRgKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuY29uc3QgZG9jdW1lbnRDbGllbnQgPSBuZXcgRHluYW1vREIuRG9jdW1lbnRDbGllbnQoeyBhcGlWZXJzaW9uOiAnMjAxMi0wOC0xMCcgfSk7XG5cbmNvbnN0IHMzID0gbmV3IFMzKHsgYXBpVmVyc2lvbjogJzIwMDYtMDMtMDEnIH0pO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlcihldmVudDogQVdTTGFtYmRhLkFQSUdhdGV3YXlQcm94eUV2ZW50KTogUHJvbWlzZTxBV1NMYW1iZGEuQVBJR2F0ZXdheVByb3h5UmVzdWx0PiB7XG4gIHRyeSB7XG4gICAgY29uc29sZS5sb2coJ0V2ZW50OiAlaicsIGV2ZW50KTtcblxuICAgIGNvbnN0IGJvZHkgPSBKU09OLnBhcnNlKGV2ZW50LmJvZHkgPz8gJ3t9Jyk7XG5cbiAgICBpZiAoIWJvZHkudXJsKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXNDb2RlOiA0MDAsXG4gICAgICAgIGJvZHk6ICcnLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBHZXQgbmV4dCBjb3VudGVyIHZhbHVlXG4gICAgY29uc3QgdXBkYXRlID0gYXdhaXQgZG9jdW1lbnRDbGllbnQudXBkYXRlKHtcbiAgICAgIFRhYmxlTmFtZTogZ2V0RW52KCdUQUJMRV9OQU1FJyksXG4gICAgICBLZXk6IHsga2V5OiAnY291bnRlcicgfSxcbiAgICAgIFVwZGF0ZUV4cHJlc3Npb246ICdBREQgI3ZhbHVlIDppbmNyJyxcbiAgICAgIEV4cHJlc3Npb25BdHRyaWJ1dGVOYW1lczogeyAnI3ZhbHVlJzogJ3ZhbHVlJyB9LFxuICAgICAgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczogeyAnOmluY3InOiAxIH0sXG4gICAgICBSZXR1cm5WYWx1ZXM6ICdVUERBVEVEX05FVycsXG4gICAgfSkucHJvbWlzZSgpO1xuXG4gICAgY29uc3QgdmFsdWUgPSB1cGRhdGUuQXR0cmlidXRlcz8udmFsdWU7XG5cbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgbmV4dCBjb3VudGVyIHZhbHVlJyk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5ID0gYmFzZTYyRW5jb2RlKHZhbHVlKTtcbiAgICBjb25zb2xlLmxvZygnS2V5OiAlaicsIGtleSk7XG5cbiAgICAvLyBQdXQgemVyby1ieXRlIG9iamVjdCB3aXRoIHJlZGlyZWN0aW9uIG9uIFMzXG4gICAgY29uc3QgcHV0T2JqZWN0ID0gYXdhaXQgczMucHV0T2JqZWN0KHtcbiAgICAgIEJ1Y2tldDogZ2V0RW52KCdCVUNLRVRfTkFNRScpLFxuICAgICAgS2V5OiBrZXksXG4gICAgICBXZWJzaXRlUmVkaXJlY3RMb2NhdGlvbjogYm9keS51cmwsXG4gICAgICBBQ0w6ICdwdWJsaWMtcmVhZCcsXG4gICAgfSkucHJvbWlzZSgpO1xuICAgIGNvbnNvbGUubG9nKCdQdXQgb2JqZWN0OiAlaicsIHB1dE9iamVjdCk7XG5cbiAgICAvLyBSZXR1cm4gc2hvcnQgdXJsXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1c0NvZGU6IDIwMSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdXJsOiBib2R5LnVybCxcbiAgICAgICAgc2hvcnRVcmw6IGBodHRwczovLyR7Z2V0RW52KCdET01BSU5fTkFNRScpfS8ke2tleX1gLFxuICAgICAgfSksXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgY29uc29sZS5sb2coZXJyKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXNDb2RlOiA1MDAsXG4gICAgICBib2R5OiAnJyxcbiAgICB9O1xuICB9XG59XG4iXX0=