cdk-serverless 1.1.44 → 2.0.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.
Files changed (134) hide show
  1. package/README.md +3 -116
  2. package/docs/constructs/.nojekyll +1 -0
  3. package/docs/constructs/assets/highlight.css +92 -0
  4. package/docs/constructs/assets/main.js +58 -0
  5. package/docs/constructs/assets/search.js +1 -0
  6. package/docs/constructs/assets/style.css +1338 -0
  7. package/docs/constructs/classes/AssetCdn.html +165 -0
  8. package/docs/constructs/classes/BaseApi.html +152 -0
  9. package/docs/constructs/classes/CognitoAuthentication.html +172 -0
  10. package/docs/constructs/classes/LambdaFunction.html +1101 -0
  11. package/docs/constructs/classes/RestApi.html +306 -0
  12. package/docs/constructs/classes/SingleTableDatastore.html +155 -0
  13. package/docs/constructs/classes/Workflow.html +170 -0
  14. package/docs/constructs/index.html +122 -0
  15. package/docs/constructs/interfaces/AssetCdnProps.html +89 -0
  16. package/docs/constructs/interfaces/BaseApiProps.html +158 -0
  17. package/docs/constructs/interfaces/CognitoAuthenticationProps.html +151 -0
  18. package/docs/constructs/interfaces/ICognitoAuthentication.html +86 -0
  19. package/docs/constructs/interfaces/IJwtAuthentication.html +96 -0
  20. package/docs/constructs/interfaces/LambdaFunctionProps.html +189 -0
  21. package/docs/constructs/interfaces/LambdaTracingOptions.html +85 -0
  22. package/docs/constructs/interfaces/RestApiProps.html +227 -0
  23. package/docs/constructs/interfaces/SingleTableDatastoreProps.html +109 -0
  24. package/docs/constructs/interfaces/SingleTableDesign.html +113 -0
  25. package/docs/constructs/interfaces/WorkflowProps.html +105 -0
  26. package/docs/constructs/modules.html +85 -0
  27. package/docs/constructs/types/LambdaOptions.html +58 -0
  28. package/docs/lambda/.nojekyll +1 -0
  29. package/docs/lambda/assets/highlight.css +36 -0
  30. package/docs/lambda/assets/main.js +58 -0
  31. package/docs/lambda/assets/search.js +1 -0
  32. package/docs/lambda/assets/style.css +1338 -0
  33. package/docs/lambda/classes/auth.ApiGatewayv1CognitoAuthorizer.html +323 -0
  34. package/docs/lambda/classes/auth.ApiGatewayv1JwtAuthorizer.html +322 -0
  35. package/docs/lambda/classes/auth.ApiGatewayv2CognitoAuthorizer.html +324 -0
  36. package/docs/lambda/classes/auth.ApiGatewayv2JwtAuthorizer.html +320 -0
  37. package/docs/lambda/classes/auth.AppSyncCognitoAuthorizer.html +314 -0
  38. package/docs/lambda/classes/auth.CognitoAuthorizer.html +303 -0
  39. package/docs/lambda/classes/auth.JwtAuthorizer.html +298 -0
  40. package/docs/lambda/classes/errors.BadRequestError.html +193 -0
  41. package/docs/lambda/classes/errors.ForbiddenError.html +193 -0
  42. package/docs/lambda/classes/errors.HttpError.html +199 -0
  43. package/docs/lambda/classes/errors.NotFoundError.html +193 -0
  44. package/docs/lambda/classes/errors.UnauthenticatedError.html +193 -0
  45. package/docs/lambda/functions/api.createAppSyncHandler.html +98 -0
  46. package/docs/lambda/functions/api.createHttpHandler.html +95 -0
  47. package/docs/lambda/functions/api.createOpenApiHandler.html +95 -0
  48. package/docs/lambda/functions/api.createOpenApiHandlerWithRequestBody.html +95 -0
  49. package/docs/lambda/functions/api.createOpenApiHandlerWithRequestBodyNoResponse.html +93 -0
  50. package/docs/lambda/index.html +140 -0
  51. package/docs/lambda/interfaces/api.AppSyncHandlerContext.html +123 -0
  52. package/docs/lambda/interfaces/api.HttpHandlerContext.html +122 -0
  53. package/docs/lambda/interfaces/api.HttpResponseContext.html +117 -0
  54. package/docs/lambda/interfaces/api.Operation.html +109 -0
  55. package/docs/lambda/interfaces/api.OperationWithRequestBody.html +123 -0
  56. package/docs/lambda/modules/api.html +100 -0
  57. package/docs/lambda/modules/auth.html +88 -0
  58. package/docs/lambda/modules/errors.html +86 -0
  59. package/docs/lambda/modules.html +81 -0
  60. package/docs/lambda/types/api.APIGatewayv1Handler.html +79 -0
  61. package/docs/lambda/types/api.AppSyncHandler.html +100 -0
  62. package/docs/lambda/types/api.HttpHandler.html +101 -0
  63. package/docs/projen/.nojekyll +1 -0
  64. package/docs/projen/assets/highlight.css +85 -0
  65. package/docs/projen/assets/main.js +58 -0
  66. package/docs/projen/assets/search.js +1 -0
  67. package/docs/projen/assets/style.css +1338 -0
  68. package/docs/projen/classes/Datastore.html +180 -0
  69. package/docs/projen/classes/RestApi.html +184 -0
  70. package/docs/projen/classes/ServerlessProject.html +1246 -0
  71. package/docs/projen/classes/Workflow.html +178 -0
  72. package/docs/projen/index.html +112 -0
  73. package/docs/projen/interfaces/DatastoreOptions.html +75 -0
  74. package/docs/projen/interfaces/RestApiOptions.html +75 -0
  75. package/docs/projen/interfaces/ServerlessProjectOptions.html +1921 -0
  76. package/docs/projen/interfaces/WorkflowOptions.html +75 -0
  77. package/docs/projen/modules.html +65 -0
  78. package/docs/projen/variables/PACKAGE_NAME.html +48 -0
  79. package/lib/constructs/asset-cdn.js +2 -1
  80. package/lib/constructs/{auth.d.ts → authentication.d.ts} +32 -15
  81. package/lib/constructs/authentication.js +136 -0
  82. package/lib/constructs/base-api.d.ts +10 -21
  83. package/lib/constructs/base-api.js +2 -37
  84. package/lib/constructs/func.d.ts +6 -25
  85. package/lib/constructs/func.js +16 -37
  86. package/lib/constructs/index.d.ts +4 -6
  87. package/lib/constructs/index.js +5 -7
  88. package/lib/constructs/rest-api.d.ts +73 -0
  89. package/lib/constructs/rest-api.js +278 -0
  90. package/lib/constructs/table.d.ts +25 -6
  91. package/lib/constructs/table.js +12 -70
  92. package/lib/constructs/workflow.d.ts +18 -0
  93. package/lib/constructs/workflow.js +58 -0
  94. package/lib/lambda/auth.d.ts +144 -0
  95. package/lib/lambda/auth.js +309 -0
  96. package/lib/lambda/errors.d.ts +16 -0
  97. package/lib/lambda/errors.js +35 -0
  98. package/lib/lambda/handler.d.ts +90 -0
  99. package/lib/lambda/handler.js +217 -0
  100. package/lib/lambda/index.d.ts +3 -0
  101. package/lib/lambda/index.js +30 -0
  102. package/lib/projen/core.d.ts +4 -14
  103. package/lib/projen/core.js +25 -29
  104. package/lib/projen/datastore.d.ts +13 -0
  105. package/lib/projen/datastore.js +145 -0
  106. package/lib/projen/index.d.ts +3 -2
  107. package/lib/projen/index.js +5 -3
  108. package/lib/projen/rest-api.d.ts +13 -0
  109. package/lib/projen/rest-api.js +127 -0
  110. package/lib/projen/workflow.d.ts +18 -0
  111. package/lib/projen/workflow.js +99 -0
  112. package/package.json +44 -35
  113. package/CHANGELOG.md +0 -170
  114. package/img/autocomplete.gif +0 -0
  115. package/lib/constructs/auth.js +0 -135
  116. package/lib/constructs/graphql-api.d.ts +0 -44
  117. package/lib/constructs/graphql-api.js +0 -221
  118. package/lib/constructs/http-api.d.ts +0 -58
  119. package/lib/constructs/http-api.js +0 -242
  120. package/lib/constructs/monitoring.d.ts +0 -23
  121. package/lib/constructs/monitoring.js +0 -47
  122. package/lib/constructs/scheduled-func.d.ts +0 -63
  123. package/lib/constructs/scheduled-func.js +0 -54
  124. package/lib/constructs/webhook.d.ts +0 -33
  125. package/lib/constructs/webhook.js +0 -86
  126. package/lib/projen/graphql-api.d.ts +0 -7
  127. package/lib/projen/graphql-api.js +0 -58
  128. package/lib/projen/http-api.d.ts +0 -7
  129. package/lib/projen/http-api.js +0 -43
  130. package/lib/types/index.d.ts +0 -1
  131. package/lib/types/index.js +0 -18
  132. package/lib/types/table.d.ts +0 -34
  133. package/lib/types/table.js +0 -31
  134. package/version.json +0 -3
@@ -0,0 +1,144 @@
1
+ import logger from 'lambda-log';
2
+ /**
3
+ * A generic JWT authorizer base class, presupposing the presence of an issuer, a number of authorization claims, an
4
+ * admin permission claim and optionally a separate URL to a JWKS to use if the issuers well-known URL does not
5
+ * point to it in its metadata.
6
+ */
7
+ export declare abstract class JwtAuthorizer {
8
+ protected issuerUrl: string;
9
+ protected groupClaim: string;
10
+ protected adminClaim: string;
11
+ protected jwksUrl?: string | undefined;
12
+ /**
13
+ * The claims of the authenticated user.
14
+ */
15
+ protected claims?: {
16
+ [name: string]: string | number | boolean | string[];
17
+ };
18
+ protected constructor(issuerUrl: string, groupClaim: string, adminClaim: string, jwksUrl?: string | undefined);
19
+ /**
20
+ * Returns an array of groups the user belongs to, or an empty array if the user
21
+ * is not authenticated or has no groups.
22
+ */
23
+ getGroups(): string[];
24
+ /**
25
+ * Returns true if the user belongs to the specified group, false otherwise.
26
+ * @param group The name of the group to check.
27
+ */
28
+ hasGroup(group: string): boolean;
29
+ /**
30
+ * Authenticates the user and sets the claims.
31
+ */
32
+ abstract authenticate(): Promise<void>;
33
+ /**
34
+ * Returns true if the user is authenticated, false otherwise.
35
+ */
36
+ isAuthenticated(): boolean;
37
+ /**
38
+ * Throws an UnauthenticatedError if the user is not authenticated.
39
+ */
40
+ assertAuthenticated(): void;
41
+ /**
42
+ * Throws a ForbiddenError if the user is not authenticated or does not belong
43
+ * to the specified group.
44
+ * @param group The name of the group to check.
45
+ */
46
+ assertGroup(group: string): void;
47
+ /**
48
+ * Returns true if the user belongs to the 'admin' group, false otherwise.
49
+ */
50
+ isAdmin(): boolean;
51
+ /**
52
+ * Throws a ForbiddenError if the user is not authenticated or is not an admin.
53
+ */
54
+ assertAdmin(): void;
55
+ /**
56
+ * Returns the email of the authenticated user.
57
+ */
58
+ getEMail(): string;
59
+ /**
60
+ * Returns the subject of the authenticated user.
61
+ */
62
+ getSubject(): string;
63
+ /**
64
+ * Returns the value of the claim with the specified name, or undefined if the
65
+ * claim does not exist.
66
+ * @param name The name of the claim to retrieve.
67
+ */
68
+ getClaim(name: string): string | number | boolean | string[] | undefined;
69
+ }
70
+ /**
71
+ * CognitoAuthorizer is an abstract class representing an authorizer
72
+ * that can be used to authenticate and authorize a user through Cognito.
73
+ */
74
+ export declare abstract class CognitoAuthorizer extends JwtAuthorizer {
75
+ protected constructor();
76
+ }
77
+ /**
78
+ * Implements authorization on API Gateway v1 (Rest API) using JWT.
79
+ */
80
+ export declare class ApiGatewayv1JwtAuthorizer extends JwtAuthorizer {
81
+ protected event: AWSLambda.APIGatewayProxyWithCognitoAuthorizerEvent;
82
+ protected _logger: logger.LambdaLog;
83
+ constructor(event: AWSLambda.APIGatewayProxyWithCognitoAuthorizerEvent, //FIXME: Learn about possible requestContext.authorizer sources in API gateway
84
+ adminClaim: string, _logger: logger.LambdaLog);
85
+ /**
86
+ * Authenticates the user using the claims provided by the API Gateway event or
87
+ * by decoding a JWT token from the 'Authorization' header.
88
+ */
89
+ authenticate(): Promise<void>;
90
+ }
91
+ /**
92
+ * Implements JWT Authorization on API Gateway v2 (HTTP API).
93
+ */
94
+ export declare class ApiGatewayv2JwtAuthorizer extends JwtAuthorizer {
95
+ protected event: AWSLambda.APIGatewayProxyEventV2WithJWTAuthorizer;
96
+ protected _logger: logger.LambdaLog;
97
+ constructor(event: AWSLambda.APIGatewayProxyEventV2WithJWTAuthorizer, _logger: logger.LambdaLog);
98
+ /**
99
+ * Authenticates the user using the claims provided by the API Gateway event or
100
+ * by decoding a JWT token from the 'Authorization' header.
101
+ */
102
+ authenticate(): Promise<void>;
103
+ }
104
+ /**
105
+ * ApiGatewayv1CognitoAuthorizer is a specialization of an ApiGatewayv1JwtAuthorizer
106
+ * and implements authentication logic for API Gateway v1 requests when using Cognito..
107
+ */
108
+ export declare class ApiGatewayv1CognitoAuthorizer extends ApiGatewayv1JwtAuthorizer {
109
+ protected event: AWSLambda.APIGatewayProxyWithCognitoAuthorizerEvent;
110
+ protected _logger: logger.LambdaLog;
111
+ /**
112
+ * The event that triggered the authorization check.
113
+ */
114
+ constructor(event: AWSLambda.APIGatewayProxyWithCognitoAuthorizerEvent, _logger: logger.LambdaLog);
115
+ }
116
+ /**
117
+ * ApiGatewayv2CognitoAuthorizer is a class that extends CognitoAuthorizer
118
+ * and implements authentication logic for API Gateway v2 requests with a
119
+ * JWT authorizer.
120
+ */
121
+ export declare class ApiGatewayv2CognitoAuthorizer extends ApiGatewayv2JwtAuthorizer {
122
+ protected event: AWSLambda.APIGatewayProxyEventV2WithJWTAuthorizer;
123
+ protected _logger: logger.LambdaLog;
124
+ /**
125
+ * The event that triggered the authorization check.
126
+ */
127
+ constructor(event: AWSLambda.APIGatewayProxyEventV2WithJWTAuthorizer, _logger: logger.LambdaLog);
128
+ }
129
+ /**
130
+ * AppSyncCognitoAuthorizer is a class that extends CognitoAuthorizer
131
+ * and implements authentication logic for AppSync resolver events with a
132
+ * Cognito authorizer.
133
+ */
134
+ export declare class AppSyncCognitoAuthorizer extends CognitoAuthorizer {
135
+ protected event: AWSLambda.AppSyncResolverEvent<any>;
136
+ /**
137
+ * The event that triggered the authorization check.
138
+ */
139
+ constructor(event: AWSLambda.AppSyncResolverEvent<any>);
140
+ /**
141
+ * Authenticates the user using the claims provided by the AppSync event.
142
+ */
143
+ authenticate(): Promise<void>;
144
+ }
@@ -0,0 +1,309 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ var _a, _b, _c, _d, _e;
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.AppSyncCognitoAuthorizer = exports.ApiGatewayv2CognitoAuthorizer = exports.ApiGatewayv1CognitoAuthorizer = exports.ApiGatewayv2JwtAuthorizer = exports.ApiGatewayv1JwtAuthorizer = exports.CognitoAuthorizer = exports.JwtAuthorizer = void 0;
8
+ const process_1 = require("process");
9
+ const axios_1 = __importDefault(require("axios"));
10
+ const jsonwebtoken_1 = require("jsonwebtoken");
11
+ const jwk_to_pem_1 = __importDefault(require("jwk-to-pem"));
12
+ const errors_1 = require("./errors");
13
+ const cognitoPoolId = (_a = process_1.env.USER_POOL_ID) !== null && _a !== void 0 ? _a : '';
14
+ const cognitoPoolRegion = (_c = (_b = process_1.env.USER_POOL_REGION) !== null && _b !== void 0 ? _b : process_1.env.AWS_REGION) !== null && _c !== void 0 ? _c : 'eu-central-1';
15
+ const jwtIssuerUrl = cognitoPoolId ? `https://cognito-idp.${cognitoPoolRegion}.amazonaws.com/${cognitoPoolId}` : ((_d = process_1.env.JWT_ISSUER_URL) !== null && _d !== void 0 ? _d : '');
16
+ const jwtJwksUrl = cognitoPoolId ? `${jwtIssuerUrl}/.well-known/jwks.json` : process_1.env.JWT_JWKS_URL;
17
+ const jwtGroupClaim = cognitoPoolId ? 'cognito:groups' : ((_e = process_1.env.JWT_GROUP_CLAIM) !== null && _e !== void 0 ? _e : '');
18
+ const jwtAudience = (process_1.env.JWT_AUDIENCE_URL && process_1.env.JWT_AUDIENCE_URL.length > 0) ? process_1.env.JWT_AUDIENCE_URL.split('||') : undefined;
19
+ let cacheKeys;
20
+ const getPublicKeys = async (jwksUrl) => {
21
+ if (!cacheKeys) {
22
+ const publicKeys = (await axios_1.default.get(jwksUrl)).data;
23
+ cacheKeys = publicKeys.keys.reduce((agg, current) => {
24
+ const pem = (0, jwk_to_pem_1.default)(current);
25
+ agg[current.kid] = { instance: current, pem };
26
+ return agg;
27
+ }, {});
28
+ return cacheKeys;
29
+ }
30
+ else {
31
+ return cacheKeys;
32
+ }
33
+ };
34
+ // Grab the JWKS URI from the JWT issuer's metadata
35
+ const getJwksUri = async (discoveryUri, jwksUri) => {
36
+ if (jwksUri) {
37
+ return jwksUri;
38
+ }
39
+ const wellKnownUri = `${discoveryUri}/.well-known`;
40
+ const issuerMetadata = (await axios_1.default.get(wellKnownUri)).data;
41
+ if (!issuerMetadata.jwks_uri) {
42
+ throw new Error('Issuer does not offer JWKS endpoint');
43
+ }
44
+ return issuerMetadata.jwks_uri;
45
+ };
46
+ const promisedVerify = (token, issuerUri, jwksUri) => {
47
+ return new Promise((resolve, reject) => {
48
+ (0, jsonwebtoken_1.verify)(token, (header, cb) => {
49
+ if (!header.kid) {
50
+ cb(new Error('no key id found'));
51
+ }
52
+ getJwksUri(issuerUri, jwksUri).then(getPublicKeys).then((keys) => {
53
+ cb(null, keys[header.kid].pem);
54
+ }, cb);
55
+ }, { issuer: issuerUri, audience: jwtAudience }, (err, decoded) => {
56
+ if (err) {
57
+ reject(err);
58
+ }
59
+ else {
60
+ resolve(decoded);
61
+ }
62
+ });
63
+ });
64
+ };
65
+ /**
66
+ * A generic JWT authorizer base class, presupposing the presence of an issuer, a number of authorization claims, an
67
+ * admin permission claim and optionally a separate URL to a JWKS to use if the issuers well-known URL does not
68
+ * point to it in its metadata.
69
+ */
70
+ class JwtAuthorizer {
71
+ constructor(issuerUrl, groupClaim, adminClaim, jwksUrl) {
72
+ this.issuerUrl = issuerUrl;
73
+ this.groupClaim = groupClaim;
74
+ this.adminClaim = adminClaim;
75
+ this.jwksUrl = jwksUrl;
76
+ }
77
+ /**
78
+ * Returns an array of groups the user belongs to, or an empty array if the user
79
+ * is not authenticated or has no groups.
80
+ */
81
+ getGroups() {
82
+ if (!this.isAuthenticated() || !this.claims.hasOwnProperty(this.groupClaim)) {
83
+ return [];
84
+ }
85
+ return this.claims[this.groupClaim];
86
+ }
87
+ /**
88
+ * Returns true if the user belongs to the specified group, false otherwise.
89
+ * @param group The name of the group to check.
90
+ */
91
+ hasGroup(group) {
92
+ // 'cognito:groups': [ 'admin' ],
93
+ return this.getGroups().includes(group);
94
+ }
95
+ /**
96
+ * Returns true if the user is authenticated, false otherwise.
97
+ */
98
+ isAuthenticated() {
99
+ return this.claims !== undefined;
100
+ }
101
+ /**
102
+ * Throws an UnauthenticatedError if the user is not authenticated.
103
+ */
104
+ assertAuthenticated() {
105
+ if (!this.isAuthenticated()) {
106
+ throw new errors_1.UnauthenticatedError();
107
+ }
108
+ }
109
+ /**
110
+ * Throws a ForbiddenError if the user is not authenticated or does not belong
111
+ * to the specified group.
112
+ * @param group The name of the group to check.
113
+ */
114
+ assertGroup(group) {
115
+ this.assertAuthenticated();
116
+ if (!this.hasGroup(group)) {
117
+ throw new errors_1.ForbiddenError();
118
+ }
119
+ }
120
+ /**
121
+ * Returns true if the user belongs to the 'admin' group, false otherwise.
122
+ */
123
+ isAdmin() {
124
+ return this.hasGroup(this.adminClaim);
125
+ }
126
+ /**
127
+ * Throws a ForbiddenError if the user is not authenticated or is not an admin.
128
+ */
129
+ assertAdmin() {
130
+ this.assertGroup(this.adminClaim);
131
+ }
132
+ /**
133
+ * Returns the email of the authenticated user.
134
+ */
135
+ getEMail() {
136
+ this.assertAuthenticated();
137
+ return this.claims.email;
138
+ }
139
+ /**
140
+ * Returns the subject of the authenticated user.
141
+ */
142
+ getSubject() {
143
+ this.assertAuthenticated();
144
+ return this.claims.sub;
145
+ }
146
+ /**
147
+ * Returns the value of the claim with the specified name, or undefined if the
148
+ * claim does not exist.
149
+ * @param name The name of the claim to retrieve.
150
+ */
151
+ getClaim(name) {
152
+ this.assertAuthenticated();
153
+ return this.claims[name];
154
+ }
155
+ }
156
+ exports.JwtAuthorizer = JwtAuthorizer;
157
+ /**
158
+ * CognitoAuthorizer is an abstract class representing an authorizer
159
+ * that can be used to authenticate and authorize a user through Cognito.
160
+ */
161
+ class CognitoAuthorizer extends JwtAuthorizer {
162
+ constructor() {
163
+ super(jwtIssuerUrl, jwtGroupClaim, 'admin');
164
+ }
165
+ }
166
+ exports.CognitoAuthorizer = CognitoAuthorizer;
167
+ /**
168
+ * Implements authorization on API Gateway v1 (Rest API) using JWT.
169
+ */
170
+ class ApiGatewayv1JwtAuthorizer extends JwtAuthorizer {
171
+ constructor(event, //FIXME: Learn about possible requestContext.authorizer sources in API gateway
172
+ adminClaim, _logger) {
173
+ super(jwtIssuerUrl, jwtGroupClaim, adminClaim, jwtJwksUrl);
174
+ this.event = event;
175
+ this._logger = _logger;
176
+ }
177
+ /**
178
+ * Authenticates the user using the claims provided by the API Gateway event or
179
+ * by decoding a JWT token from the 'Authorization' header.
180
+ */
181
+ async authenticate() {
182
+ // Could be almost the exact same code as Cognito if we can specify our own Authorizer in the event's request context
183
+ if (this.event.requestContext.authorizer && this.event.requestContext.authorizer.claims) {
184
+ this.claims = this.event.requestContext.authorizer.claims;
185
+ }
186
+ if (this.claims) {
187
+ return;
188
+ }
189
+ const authHeader = this.event.headers.authorization;
190
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
191
+ return;
192
+ }
193
+ const token = authHeader.substring('Bearer '.length);
194
+ // Verify the token and set the claims on the event and this object
195
+ try {
196
+ const claims = await promisedVerify(token, this.issuerUrl, this.jwksUrl);
197
+ this._logger.debug(JSON.stringify(claims));
198
+ this.event.requestContext.authorizer = { claims };
199
+ this.claims = claims;
200
+ }
201
+ catch (err) {
202
+ this._logger.error(err);
203
+ }
204
+ }
205
+ }
206
+ exports.ApiGatewayv1JwtAuthorizer = ApiGatewayv1JwtAuthorizer;
207
+ /**
208
+ * Implements JWT Authorization on API Gateway v2 (HTTP API).
209
+ */
210
+ class ApiGatewayv2JwtAuthorizer extends JwtAuthorizer {
211
+ constructor(event, _logger) {
212
+ super(jwtIssuerUrl, 'cognito:groups', 'admin', jwtJwksUrl);
213
+ this.event = event;
214
+ this._logger = _logger;
215
+ }
216
+ /**
217
+ * Authenticates the user using the claims provided by the API Gateway event or
218
+ * by decoding a JWT token from the 'Authorization' header.
219
+ */
220
+ async authenticate() {
221
+ var _a, _b;
222
+ // Try to get the claims from the event
223
+ this.claims = (_b = (_a = this.event.requestContext.authorizer) === null || _a === void 0 ? void 0 : _a.jwt) === null || _b === void 0 ? void 0 : _b.claims;
224
+ // If no pool ID is defined or claims exist, return early
225
+ if (!cognitoPoolId || this.claims) {
226
+ return;
227
+ }
228
+ // Extract the token from the Authorization header
229
+ const authHeader = this.event.headers.authorization;
230
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
231
+ return;
232
+ }
233
+ const token = authHeader.substring('Bearer '.length);
234
+ // Verify the token and set the claims on the event and this object
235
+ try {
236
+ const claims = await promisedVerify(token, this.issuerUrl, this.jwksUrl);
237
+ this._logger.debug(JSON.stringify(claims));
238
+ this.event.requestContext.authorizer = {
239
+ jwt: {
240
+ claims,
241
+ scopes: ['openid', 'email'],
242
+ },
243
+ integrationLatency: 0,
244
+ principalId: 'toolbox',
245
+ };
246
+ this.claims = claims;
247
+ }
248
+ catch (err) {
249
+ this._logger.error(err);
250
+ }
251
+ }
252
+ }
253
+ exports.ApiGatewayv2JwtAuthorizer = ApiGatewayv2JwtAuthorizer;
254
+ /**
255
+ * ApiGatewayv1CognitoAuthorizer is a specialization of an ApiGatewayv1JwtAuthorizer
256
+ * and implements authentication logic for API Gateway v1 requests when using Cognito..
257
+ */
258
+ class ApiGatewayv1CognitoAuthorizer extends ApiGatewayv1JwtAuthorizer {
259
+ /**
260
+ * The event that triggered the authorization check.
261
+ */
262
+ constructor(event, _logger) {
263
+ super(event, 'admin', _logger);
264
+ this.event = event;
265
+ this._logger = _logger;
266
+ }
267
+ }
268
+ exports.ApiGatewayv1CognitoAuthorizer = ApiGatewayv1CognitoAuthorizer;
269
+ /**
270
+ * ApiGatewayv2CognitoAuthorizer is a class that extends CognitoAuthorizer
271
+ * and implements authentication logic for API Gateway v2 requests with a
272
+ * JWT authorizer.
273
+ */
274
+ class ApiGatewayv2CognitoAuthorizer extends ApiGatewayv2JwtAuthorizer {
275
+ /**
276
+ * The event that triggered the authorization check.
277
+ */
278
+ constructor(event, _logger) {
279
+ super(event, _logger);
280
+ this.event = event;
281
+ this._logger = _logger;
282
+ }
283
+ }
284
+ exports.ApiGatewayv2CognitoAuthorizer = ApiGatewayv2CognitoAuthorizer;
285
+ /**
286
+ * AppSyncCognitoAuthorizer is a class that extends CognitoAuthorizer
287
+ * and implements authentication logic for AppSync resolver events with a
288
+ * Cognito authorizer.
289
+ */
290
+ class AppSyncCognitoAuthorizer extends CognitoAuthorizer {
291
+ /**
292
+ * The event that triggered the authorization check.
293
+ */
294
+ constructor(event) {
295
+ super();
296
+ this.event = event;
297
+ }
298
+ /**
299
+ * Authenticates the user using the claims provided by the AppSync event.
300
+ */
301
+ async authenticate() {
302
+ // Try to get the claims from the event
303
+ if (this.event.identity) {
304
+ this.claims = this.event.identity.claims;
305
+ }
306
+ }
307
+ }
308
+ exports.AppSyncCognitoAuthorizer = AppSyncCognitoAuthorizer;
309
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYW1iZGEvYXV0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEscUNBQThCO0FBQzlCLGtEQUEwQjtBQUMxQiwrQ0FBcUU7QUFDckUsNERBQWtDO0FBRWxDLHFDQUFnRTtBQUVoRSxNQUFNLGFBQWEsR0FBRyxNQUFBLGFBQUcsQ0FBQyxZQUFZLG1DQUFJLEVBQUUsQ0FBQztBQUM3QyxNQUFNLGlCQUFpQixHQUFHLE1BQUEsTUFBQSxhQUFHLENBQUMsZ0JBQWdCLG1DQUFJLGFBQUcsQ0FBQyxVQUFVLG1DQUFJLGNBQWMsQ0FBQztBQUVuRixNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixpQkFBaUIsa0JBQWtCLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQUEsYUFBRyxDQUFDLGNBQWMsbUNBQUksRUFBRSxDQUFDLENBQUM7QUFDNUksTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksd0JBQXdCLENBQUMsQ0FBQyxDQUFDLGFBQUcsQ0FBQyxZQUFZLENBQUM7QUFDOUYsTUFBTSxhQUFhLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFBLGFBQUcsQ0FBQyxlQUFlLG1DQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3JGLE1BQU0sV0FBVyxHQUFHLENBQUMsYUFBRyxDQUFDLGdCQUFnQixJQUFJLGFBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQTZCN0gsSUFBSSxTQUEwQyxDQUFDO0FBRS9DLE1BQU0sYUFBYSxHQUFHLEtBQUssRUFBRSxPQUFlLEVBQWdDLEVBQUU7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bkgsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFEWCxVQUFLLEdBQUwsS0FBSyxDQUFxRDtRQUFZLFlBQU8sR0FBUCxPQUFPLENBQWtCO0lBRXJILENBQUM7Q0FDRjtBQVJELHNFQVFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQWEsNkJBQThCLFNBQVEseUJBQXlCO0lBRTFFOztPQUVHO0lBQ0gsWUFBc0IsS0FBd0QsRUFBWSxPQUF5QjtRQUNqSCxLQUFLLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBREYsVUFBSyxHQUFMLEtBQUssQ0FBbUQ7UUFBWSxZQUFPLEdBQVAsT0FBTyxDQUFrQjtJQUVuSCxDQUFDO0NBQ0Y7QUFSRCxzRUFRQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFhLHdCQUF5QixTQUFRLGlCQUFpQjtJQUU3RDs7T0FFRztJQUNILFlBQXNCLEtBQTBDO1FBQzlELEtBQUssRUFBRSxDQUFDO1FBRFksVUFBSyxHQUFMLEtBQUssQ0FBcUM7SUFFaEUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFlBQVk7UUFDdkIsdUNBQXVDO1FBQ3ZDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7WUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQTZDLENBQUMsTUFBTSxDQUFDO1NBQ2hGO0lBQ0gsQ0FBQztDQUVGO0FBbkJELDREQW1CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVudiB9IGZyb20gJ3Byb2Nlc3MnO1xuaW1wb3J0IEF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCB7IHZlcmlmeSwgSnd0SGVhZGVyLCBTaWduaW5nS2V5Q2FsbGJhY2sgfSBmcm9tICdqc29ud2VidG9rZW4nO1xuaW1wb3J0IGp3a1RvUGVtIGZyb20gJ2p3ay10by1wZW0nO1xuaW1wb3J0IGxvZ2dlciBmcm9tICdsYW1iZGEtbG9nJztcbmltcG9ydCB7IEZvcmJpZGRlbkVycm9yLCBVbmF1dGhlbnRpY2F0ZWRFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcblxuY29uc3QgY29nbml0b1Bvb2xJZCA9IGVudi5VU0VSX1BPT0xfSUQgPz8gJyc7XG5jb25zdCBjb2duaXRvUG9vbFJlZ2lvbiA9IGVudi5VU0VSX1BPT0xfUkVHSU9OID8/IGVudi5BV1NfUkVHSU9OID8/ICdldS1jZW50cmFsLTEnO1xuXG5jb25zdCBqd3RJc3N1ZXJVcmwgPSBjb2duaXRvUG9vbElkID8gYGh0dHBzOi8vY29nbml0by1pZHAuJHtjb2duaXRvUG9vbFJlZ2lvbn0uYW1hem9uYXdzLmNvbS8ke2NvZ25pdG9Qb29sSWR9YCA6IChlbnYuSldUX0lTU1VFUl9VUkwgPz8gJycpO1xuY29uc3Qgand0Sndrc1VybCA9IGNvZ25pdG9Qb29sSWQgPyBgJHtqd3RJc3N1ZXJVcmx9Ly53ZWxsLWtub3duL2p3a3MuanNvbmAgOiBlbnYuSldUX0pXS1NfVVJMO1xuY29uc3Qgand0R3JvdXBDbGFpbSA9IGNvZ25pdG9Qb29sSWQgPyAnY29nbml0bzpncm91cHMnIDogKGVudi5KV1RfR1JPVVBfQ0xBSU0gPz8gJycpO1xuY29uc3Qgand0QXVkaWVuY2UgPSAoZW52LkpXVF9BVURJRU5DRV9VUkwgJiYgZW52LkpXVF9BVURJRU5DRV9VUkwubGVuZ3RoID4gMCkgPyBlbnYuSldUX0FVRElFTkNFX1VSTC5zcGxpdCgnfHwnKSA6IHVuZGVmaW5lZDtcblxuaW50ZXJmYWNlIFB1YmxpY0tleSB7XG4gIGFsZzogc3RyaW5nO1xuICBlOiBzdHJpbmc7XG4gIGtpZDogc3RyaW5nO1xuICBrdHk6IHN0cmluZztcbiAgbjogc3RyaW5nO1xuICB1c2U6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFB1YmxpY0tleU1ldGEge1xuICBpbnN0YW5jZTogUHVibGljS2V5O1xuICBwZW06IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFB1YmxpY0tleXMge1xuICBrZXlzOiBQdWJsaWNLZXlbXTtcbn1cblxuaW50ZXJmYWNlIElzc3Vlck1ldGFkYXRhIHtcbiAgandrc191cmk/OiBzdHJpbmc7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbmludGVyZmFjZSBNYXBPZktpZFRvUHVibGljS2V5IHtcbiAgW2tleTogc3RyaW5nXTogUHVibGljS2V5TWV0YTtcbn1cblxubGV0IGNhY2hlS2V5czogTWFwT2ZLaWRUb1B1YmxpY0tleSB8IHVuZGVmaW5lZDtcblxuY29uc3QgZ2V0UHVibGljS2V5cyA9IGFzeW5jIChqd2tzVXJsOiBzdHJpbmcpOiBQcm9taXNlPE1hcE9mS2lkVG9QdWJsaWNLZXk+ID0+IHtcbiAgaWYgKCFjYWNoZUtleXMpIHtcbiAgICBjb25zdCBwdWJsaWNLZXlzOiBQdWJsaWNLZXlzID0gKGF3YWl0IEF4aW9zLmdldDxQdWJsaWNLZXlzPihqd2tzVXJsKSkuZGF0YTtcbiAgICBjYWNoZUtleXMgPSBwdWJsaWNLZXlzLmtleXMucmVkdWNlKChhZ2csIGN1cnJlbnQpID0+IHtcbiAgICAgIGNvbnN0IHBlbSA9IGp3a1RvUGVtKGN1cnJlbnQgYXMgandrVG9QZW0uSldLKTtcbiAgICAgIGFnZ1tjdXJyZW50LmtpZF0gPSB7IGluc3RhbmNlOiBjdXJyZW50LCBwZW0gfTtcbiAgICAgIHJldHVybiBhZ2c7XG4gICAgfSwge30gYXMgTWFwT2ZLaWRUb1B1YmxpY0tleSk7XG4gICAgcmV0dXJuIGNhY2hlS2V5cztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY2FjaGVLZXlzO1xuICB9XG59O1xuXG4vLyBHcmFiIHRoZSBKV0tTIFVSSSBmcm9tIHRoZSBKV1QgaXNzdWVyJ3MgbWV0YWRhdGFcbmNvbnN0IGdldEp3a3NVcmkgPSBhc3luYyAoZGlzY292ZXJ5VXJpOiBzdHJpbmcsIGp3a3NVcmk/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBpZiAoandrc1VyaSkge1xuICAgIHJldHVybiBqd2tzVXJpO1xuICB9XG4gIGNvbnN0IHdlbGxLbm93blVyaSA9IGAke2Rpc2NvdmVyeVVyaX0vLndlbGwta25vd25gO1xuICBjb25zdCBpc3N1ZXJNZXRhZGF0YSA9IChhd2FpdCBBeGlvcy5nZXQ8SXNzdWVyTWV0YWRhdGE+KHdlbGxLbm93blVyaSkpLmRhdGE7XG4gIGlmICghaXNzdWVyTWV0YWRhdGEuandrc191cmkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0lzc3VlciBkb2VzIG5vdCBvZmZlciBKV0tTIGVuZHBvaW50Jyk7XG4gIH1cbiAgcmV0dXJuIGlzc3Vlck1ldGFkYXRhLmp3a3NfdXJpO1xufTtcblxuY29uc3QgcHJvbWlzZWRWZXJpZnkgPSAodG9rZW46IHN0cmluZywgaXNzdWVyVXJpOiBzdHJpbmcsIGp3a3NVcmk/OiBzdHJpbmcpOiBQcm9taXNlPHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9PiA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdmVyaWZ5KHRva2VuLCAoaGVhZGVyOiBKd3RIZWFkZXIsIGNiOiBTaWduaW5nS2V5Q2FsbGJhY2spID0+IHtcbiAgICAgIGlmICghaGVhZGVyLmtpZCkge1xuICAgICAgICBjYihuZXcgRXJyb3IoJ25vIGtleSBpZCBmb3VuZCcpKTtcbiAgICAgIH1cbiAgICAgIGdldEp3a3NVcmkoaXNzdWVyVXJpLCBqd2tzVXJpKS50aGVuKGdldFB1YmxpY0tleXMpLnRoZW4oKGtleXMpID0+IHtcbiAgICAgICAgY2IobnVsbCwga2V5c1toZWFkZXIua2lkIV0ucGVtKTtcbiAgICAgIH0sIGNiKTtcbiAgICB9LCB7IGlzc3VlcjogaXNzdWVyVXJpLCBhdWRpZW5jZTogand0QXVkaWVuY2UgfSwgKGVyciwgZGVjb2RlZCkgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoZGVjb2RlZCBhcyB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBBIGdlbmVyaWMgSldUIGF1dGhvcml6ZXIgYmFzZSBjbGFzcywgcHJlc3VwcG9zaW5nIHRoZSBwcmVzZW5jZSBvZiBhbiBpc3N1ZXIsIGEgbnVtYmVyIG9mIGF1dGhvcml6YXRpb24gY2xhaW1zLCBhblxuICogYWRtaW4gcGVybWlzc2lvbiBjbGFpbSBhbmQgb3B0aW9uYWxseSBhIHNlcGFyYXRlIFVSTCB0byBhIEpXS1MgdG8gdXNlIGlmIHRoZSBpc3N1ZXJzIHdlbGwta25vd24gVVJMIGRvZXMgbm90XG4gKiBwb2ludCB0byBpdCBpbiBpdHMgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBKd3RBdXRob3JpemVyIHtcblxuICAvKipcbiAgICogVGhlIGNsYWltcyBvZiB0aGUgYXV0aGVudGljYXRlZCB1c2VyLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNsYWltcz86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBzdHJpbmdbXSB9O1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgaXNzdWVyVXJsOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIGdyb3VwQ2xhaW06IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgYWRtaW5DbGFpbTogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBqd2tzVXJsPzogc3RyaW5nLFxuICApIHtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGdyb3VwcyB0aGUgdXNlciBiZWxvbmdzIHRvLCBvciBhbiBlbXB0eSBhcnJheSBpZiB0aGUgdXNlclxuICAgKiBpcyBub3QgYXV0aGVudGljYXRlZCBvciBoYXMgbm8gZ3JvdXBzLlxuICAgKi9cbiAgcHVibGljIGdldEdyb3VwcygpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLmlzQXV0aGVudGljYXRlZCgpIHx8ICF0aGlzLmNsYWltcyEuaGFzT3duUHJvcGVydHkodGhpcy5ncm91cENsYWltKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jbGFpbXMhW3RoaXMuZ3JvdXBDbGFpbV0gYXMgdW5rbm93biBhcyBzdHJpbmdbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHVzZXIgYmVsb25ncyB0byB0aGUgc3BlY2lmaWVkIGdyb3VwLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEBwYXJhbSBncm91cCBUaGUgbmFtZSBvZiB0aGUgZ3JvdXAgdG8gY2hlY2suXG4gICAqL1xuICBwdWJsaWMgaGFzR3JvdXAoZ3JvdXA6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vICdjb2duaXRvOmdyb3Vwcyc6IFsgJ2FkbWluJyBdLFxuICAgIHJldHVybiB0aGlzLmdldEdyb3VwcygpLmluY2x1ZGVzKGdyb3VwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdGVzIHRoZSB1c2VyIGFuZCBzZXRzIHRoZSBjbGFpbXMuXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgYXV0aGVudGljYXRlKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgaXNBdXRoZW50aWNhdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNsYWltcyAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhbiBVbmF1dGhlbnRpY2F0ZWRFcnJvciBpZiB0aGUgdXNlciBpcyBub3QgYXV0aGVudGljYXRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3NlcnRBdXRoZW50aWNhdGVkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgdGhyb3cgbmV3IFVuYXV0aGVudGljYXRlZEVycm9yKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhIEZvcmJpZGRlbkVycm9yIGlmIHRoZSB1c2VyIGlzIG5vdCBhdXRoZW50aWNhdGVkIG9yIGRvZXMgbm90IGJlbG9uZ1xuICAgKiB0byB0aGUgc3BlY2lmaWVkIGdyb3VwLlxuICAgKiBAcGFyYW0gZ3JvdXAgVGhlIG5hbWUgb2YgdGhlIGdyb3VwIHRvIGNoZWNrLlxuICAgKi9cbiAgcHVibGljIGFzc2VydEdyb3VwKGdyb3VwOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2VydEF1dGhlbnRpY2F0ZWQoKTtcbiAgICBpZiAoIXRoaXMuaGFzR3JvdXAoZ3JvdXApKSB7XG4gICAgICB0aHJvdyBuZXcgRm9yYmlkZGVuRXJyb3IoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB1c2VyIGJlbG9uZ3MgdG8gdGhlICdhZG1pbicgZ3JvdXAsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBpc0FkbWluKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc0dyb3VwKHRoaXMuYWRtaW5DbGFpbSk7XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGEgRm9yYmlkZGVuRXJyb3IgaWYgdGhlIHVzZXIgaXMgbm90IGF1dGhlbnRpY2F0ZWQgb3IgaXMgbm90IGFuIGFkbWluLlxuICAgKi9cbiAgcHVibGljIGFzc2VydEFkbWluKCk6IHZvaWQge1xuICAgIHRoaXMuYXNzZXJ0R3JvdXAodGhpcy5hZG1pbkNsYWltKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlbWFpbCBvZiB0aGUgYXV0aGVudGljYXRlZCB1c2VyLlxuICAgKi9cbiAgcHVibGljIGdldEVNYWlsKCk6IHN0cmluZyB7XG4gICAgdGhpcy5hc3NlcnRBdXRoZW50aWNhdGVkKCk7XG4gICAgcmV0dXJuIHRoaXMuY2xhaW1zIS5lbWFpbCBhcyBzdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc3ViamVjdCBvZiB0aGUgYXV0aGVudGljYXRlZCB1c2VyLlxuICAgKi9cbiAgcHVibGljIGdldFN1YmplY3QoKTogc3RyaW5nIHtcbiAgICB0aGlzLmFzc2VydEF1dGhlbnRpY2F0ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5jbGFpbXMhLnN1YiBhcyBzdHJpbmc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGNsYWltIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBvciB1bmRlZmluZWQgaWYgdGhlXG4gICAqIGNsYWltIGRvZXMgbm90IGV4aXN0LlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY2xhaW0gdG8gcmV0cmlldmUuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2xhaW0obmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICB0aGlzLmFzc2VydEF1dGhlbnRpY2F0ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5jbGFpbXMhW25hbWVdO1xuICB9XG59XG5cbi8qKlxuICogQ29nbml0b0F1dGhvcml6ZXIgaXMgYW4gYWJzdHJhY3QgY2xhc3MgcmVwcmVzZW50aW5nIGFuIGF1dGhvcml6ZXJcbiAqIHRoYXQgY2FuIGJlIHVzZWQgdG8gYXV0aGVudGljYXRlIGFuZCBhdXRob3JpemUgYSB1c2VyIHRocm91Z2ggQ29nbml0by5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvZ25pdG9BdXRob3JpemVyIGV4dGVuZHMgSnd0QXV0aG9yaXplciB7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKGp3dElzc3VlclVybCwgand0R3JvdXBDbGFpbSwgJ2FkbWluJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIGF1dGhvcml6YXRpb24gb24gQVBJIEdhdGV3YXkgdjEgKFJlc3QgQVBJKSB1c2luZyBKV1QuXG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlHYXRld2F5djFKd3RBdXRob3JpemVyIGV4dGVuZHMgSnd0QXV0aG9yaXplciB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGV2ZW50OiBBV1NMYW1iZGEuQVBJR2F0ZXdheVByb3h5V2l0aENvZ25pdG9BdXRob3JpemVyRXZlbnQsIC8vRklYTUU6IExlYXJuIGFib3V0IHBvc3NpYmxlIHJlcXVlc3RDb250ZXh0LmF1dGhvcml6ZXIgc291cmNlcyBpbiBBUEkgZ2F0ZXdheVxuICAgIGFkbWluQ2xhaW06IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX2xvZ2dlcjogbG9nZ2VyLkxhbWJkYUxvZyxcbiAgKSB7XG4gICAgc3VwZXIoand0SXNzdWVyVXJsLCBqd3RHcm91cENsYWltLCBhZG1pbkNsYWltLCBqd3RKd2tzVXJsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdGVzIHRoZSB1c2VyIHVzaW5nIHRoZSBjbGFpbXMgcHJvdmlkZWQgYnkgdGhlIEFQSSBHYXRld2F5IGV2ZW50IG9yXG4gICAqIGJ5IGRlY29kaW5nIGEgSldUIHRva2VuIGZyb20gdGhlICdBdXRob3JpemF0aW9uJyBoZWFkZXIuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYXV0aGVudGljYXRlKCk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgLy8gQ291bGQgYmUgYWxtb3N0IHRoZSBleGFjdCBzYW1lIGNvZGUgYXMgQ29nbml0byBpZiB3ZSBjYW4gc3BlY2lmeSBvdXIgb3duIEF1dGhvcml6ZXIgaW4gdGhlIGV2ZW50J3MgcmVxdWVzdCBjb250ZXh0XG4gICAgaWYgKHRoaXMuZXZlbnQucmVxdWVzdENvbnRleHQuYXV0aG9yaXplciAmJiB0aGlzLmV2ZW50LnJlcXVlc3RDb250ZXh0LmF1dGhvcml6ZXIuY2xhaW1zKSB7XG4gICAgICB0aGlzLmNsYWltcyA9IHRoaXMuZXZlbnQucmVxdWVzdENvbnRleHQuYXV0aG9yaXplci5jbGFpbXM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2xhaW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYXV0aEhlYWRlciA9IHRoaXMuZXZlbnQuaGVhZGVycy5hdXRob3JpemF0aW9uO1xuICAgIGlmICghYXV0aEhlYWRlciB8fCAhYXV0aEhlYWRlci5zdGFydHNXaXRoKCdCZWFyZXIgJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdG9rZW4gPSBhdXRoSGVhZGVyLnN1YnN0cmluZygnQmVhcmVyICcubGVuZ3RoKTtcblxuICAgIC8vIFZlcmlmeSB0aGUgdG9rZW4gYW5kIHNldCB0aGUgY2xhaW1zIG9uIHRoZSBldmVudCBhbmQgdGhpcyBvYmplY3RcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2xhaW1zOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IGF3YWl0IHByb21pc2VkVmVyaWZ5KHRva2VuLCB0aGlzLmlzc3VlclVybCwgdGhpcy5qd2tzVXJsKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZyhKU09OLnN0cmluZ2lmeShjbGFpbXMpKTtcblxuICAgICAgdGhpcy5ldmVudC5yZXF1ZXN0Q29udGV4dC5hdXRob3JpemVyID0geyBjbGFpbXMgfTtcbiAgICAgIHRoaXMuY2xhaW1zID0gY2xhaW1zO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICB0aGlzLl9sb2dnZXIuZXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIEpXVCBBdXRob3JpemF0aW9uIG9uIEFQSSBHYXRld2F5IHYyIChIVFRQIEFQSSkuXG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlHYXRld2F5djJKd3RBdXRob3JpemVyIGV4dGVuZHMgSnd0QXV0aG9yaXplciB7XG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBldmVudDogQVdTTGFtYmRhLkFQSUdhdGV3YXlQcm94eUV2ZW50VjJXaXRoSldUQXV0aG9yaXplciwgcHJvdGVjdGVkIF9sb2dnZXI6IGxvZ2dlci5MYW1iZGFMb2cpIHtcbiAgICBzdXBlcihqd3RJc3N1ZXJVcmwsICdjb2duaXRvOmdyb3VwcycsICdhZG1pbicsIGp3dEp3a3NVcmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0ZXMgdGhlIHVzZXIgdXNpbmcgdGhlIGNsYWltcyBwcm92aWRlZCBieSB0aGUgQVBJIEdhdGV3YXkgZXZlbnQgb3JcbiAgICogYnkgZGVjb2RpbmcgYSBKV1QgdG9rZW4gZnJvbSB0aGUgJ0F1dGhvcml6YXRpb24nIGhlYWRlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBhdXRoZW50aWNhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gVHJ5IHRvIGdldCB0aGUgY2xhaW1zIGZyb20gdGhlIGV2ZW50XG4gICAgdGhpcy5jbGFpbXMgPSB0aGlzLmV2ZW50LnJlcXVlc3RDb250ZXh0LmF1dGhvcml6ZXI/Lmp3dD8uY2xhaW1zO1xuXG4gICAgLy8gSWYgbm8gcG9vbCBJRCBpcyBkZWZpbmVkIG9yIGNsYWltcyBleGlzdCwgcmV0dXJuIGVhcmx5XG4gICAgaWYgKCFjb2duaXRvUG9vbElkIHx8IHRoaXMuY2xhaW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRXh0cmFjdCB0aGUgdG9rZW4gZnJvbSB0aGUgQXV0aG9yaXphdGlvbiBoZWFkZXJcbiAgICBjb25zdCBhdXRoSGVhZGVyID0gdGhpcy5ldmVudC5oZWFkZXJzLmF1dGhvcml6YXRpb247XG4gICAgaWYgKCFhdXRoSGVhZGVyIHx8ICFhdXRoSGVhZGVyLnN0YXJ0c1dpdGgoJ0JlYXJlciAnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB0b2tlbiA9IGF1dGhIZWFkZXIuc3Vic3RyaW5nKCdCZWFyZXIgJy5sZW5ndGgpO1xuXG4gICAgLy8gVmVyaWZ5IHRoZSB0b2tlbiBhbmQgc2V0IHRoZSBjbGFpbXMgb24gdGhlIGV2ZW50IGFuZCB0aGlzIG9iamVjdFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjbGFpbXM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9ID0gYXdhaXQgcHJvbWlzZWRWZXJpZnkodG9rZW4sIHRoaXMuaXNzdWVyVXJsLCB0aGlzLmp3a3NVcmwpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKEpTT04uc3RyaW5naWZ5KGNsYWltcykpO1xuXG4gICAgICB0aGlzLmV2ZW50LnJlcXVlc3RDb250ZXh0LmF1dGhvcml6ZXIgPSB7XG4gICAgICAgIGp3dDoge1xuICAgICAgICAgIGNsYWltcyxcbiAgICAgICAgICBzY29wZXM6IFsnb3BlbmlkJywgJ2VtYWlsJ10sXG4gICAgICAgIH0sXG4gICAgICAgIGludGVncmF0aW9uTGF0ZW5jeTogMCxcbiAgICAgICAgcHJpbmNpcGFsSWQ6ICd0b29sYm94JyxcbiAgICAgIH07XG4gICAgICB0aGlzLmNsYWltcyA9IGNsYWltcztcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmVycm9yKGVycik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQXBpR2F0ZXdheXYxQ29nbml0b0F1dGhvcml6ZXIgaXMgYSBzcGVjaWFsaXphdGlvbiBvZiBhbiBBcGlHYXRld2F5djFKd3RBdXRob3JpemVyXG4gKiBhbmQgaW1wbGVtZW50cyBhdXRoZW50aWNhdGlvbiBsb2dpYyBmb3IgQVBJIEdhdGV3YXkgdjEgcmVxdWVzdHMgd2hlbiB1c2luZyBDb2duaXRvLi5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwaUdhdGV3YXl2MUNvZ25pdG9BdXRob3JpemVyIGV4dGVuZHMgQXBpR2F0ZXdheXYxSnd0QXV0aG9yaXplciB7XG5cbiAgLyoqXG4gICAqIFRoZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgYXV0aG9yaXphdGlvbiBjaGVjay5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBldmVudDogQVdTTGFtYmRhLkFQSUdhdGV3YXlQcm94eVdpdGhDb2duaXRvQXV0aG9yaXplckV2ZW50LCBwcm90ZWN0ZWQgX2xvZ2dlcjogbG9nZ2VyLkxhbWJkYUxvZykge1xuICAgIHN1cGVyKGV2ZW50LCAnYWRtaW4nLCBfbG9nZ2VyKTtcbiAgfVxufVxuXG4vKipcbiAqIEFwaUdhdGV3YXl2MkNvZ25pdG9BdXRob3JpemVyIGlzIGEgY2xhc3MgdGhhdCBleHRlbmRzIENvZ25pdG9BdXRob3JpemVyXG4gKiBhbmQgaW1wbGVtZW50cyBhdXRoZW50aWNhdGlvbiBsb2dpYyBmb3IgQVBJIEdhdGV3YXkgdjIgcmVxdWVzdHMgd2l0aCBhXG4gKiBKV1QgYXV0aG9yaXplci5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwaUdhdGV3YXl2MkNvZ25pdG9BdXRob3JpemVyIGV4dGVuZHMgQXBpR2F0ZXdheXYySnd0QXV0aG9yaXplciB7XG5cbiAgLyoqXG4gICAqIFRoZSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUgYXV0aG9yaXphdGlvbiBjaGVjay5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBldmVudDogQVdTTGFtYmRhLkFQSUdhdGV3YXlQcm94eUV2ZW50VjJXaXRoSldUQXV0aG9yaXplciwgcHJvdGVjdGVkIF9sb2dnZXI6IGxvZ2dlci5MYW1iZGFMb2cpIHtcbiAgICBzdXBlcihldmVudCwgX2xvZ2dlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBTeW5jQ29nbml0b0F1dGhvcml6ZXIgaXMgYSBjbGFzcyB0aGF0IGV4dGVuZHMgQ29nbml0b0F1dGhvcml6ZXJcbiAqIGFuZCBpbXBsZW1lbnRzIGF1dGhlbnRpY2F0aW9uIGxvZ2ljIGZvciBBcHBTeW5jIHJlc29sdmVyIGV2ZW50cyB3aXRoIGFcbiAqIENvZ25pdG8gYXV0aG9yaXplci5cbiAqL1xuZXhwb3J0IGNsYXNzIEFwcFN5bmNDb2duaXRvQXV0aG9yaXplciBleHRlbmRzIENvZ25pdG9BdXRob3JpemVyIHtcblxuICAvKipcbiAgICogVGhlIGV2ZW50IHRoYXQgdHJpZ2dlcmVkIHRoZSBhdXRob3JpemF0aW9uIGNoZWNrLlxuICAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGV2ZW50OiBBV1NMYW1iZGEuQXBwU3luY1Jlc29sdmVyRXZlbnQ8YW55Pikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQXV0aGVudGljYXRlcyB0aGUgdXNlciB1c2luZyB0aGUgY2xhaW1zIHByb3ZpZGVkIGJ5IHRoZSBBcHBTeW5jIGV2ZW50LlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGF1dGhlbnRpY2F0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBUcnkgdG8gZ2V0IHRoZSBjbGFpbXMgZnJvbSB0aGUgZXZlbnRcbiAgICBpZiAodGhpcy5ldmVudC5pZGVudGl0eSkge1xuICAgICAgdGhpcy5jbGFpbXMgPSAodGhpcy5ldmVudC5pZGVudGl0eSBhcyBBV1NMYW1iZGEuQXBwU3luY0lkZW50aXR5Q29nbml0bykuY2xhaW1zO1xuICAgIH1cbiAgfVxuXG59XG4iXX0=
@@ -0,0 +1,16 @@
1
+ export declare class HttpError extends Error {
2
+ readonly statusCode: number;
3
+ constructor(statusCode: number, message?: string);
4
+ }
5
+ export declare class BadRequestError extends HttpError {
6
+ constructor(message?: string);
7
+ }
8
+ export declare class UnauthenticatedError extends HttpError {
9
+ constructor(message?: string);
10
+ }
11
+ export declare class ForbiddenError extends HttpError {
12
+ constructor(message?: string);
13
+ }
14
+ export declare class NotFoundError extends HttpError {
15
+ constructor(message?: string);
16
+ }
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NotFoundError = exports.ForbiddenError = exports.UnauthenticatedError = exports.BadRequestError = exports.HttpError = void 0;
4
+ class HttpError extends Error {
5
+ constructor(statusCode, message) {
6
+ super(message);
7
+ this.statusCode = statusCode;
8
+ }
9
+ }
10
+ exports.HttpError = HttpError;
11
+ class BadRequestError extends HttpError {
12
+ constructor(message) {
13
+ super(400, message);
14
+ }
15
+ }
16
+ exports.BadRequestError = BadRequestError;
17
+ class UnauthenticatedError extends HttpError {
18
+ constructor(message) {
19
+ super(401, message);
20
+ }
21
+ }
22
+ exports.UnauthenticatedError = UnauthenticatedError;
23
+ class ForbiddenError extends HttpError {
24
+ constructor(message) {
25
+ super(403, message);
26
+ }
27
+ }
28
+ exports.ForbiddenError = ForbiddenError;
29
+ class NotFoundError extends HttpError {
30
+ constructor(message) {
31
+ super(404, message);
32
+ }
33
+ }
34
+ exports.NotFoundError = NotFoundError;
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xhbWJkYS9lcnJvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsTUFBYSxTQUFVLFNBQVEsS0FBSztJQUNsQyxZQUE0QixVQUFrQixFQUFFLE9BQWdCO1FBQzlELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQURXLGVBQVUsR0FBVixVQUFVLENBQVE7SUFFOUMsQ0FBQztDQUNGO0FBSkQsOEJBSUM7QUFFRCxNQUFhLGVBQWdCLFNBQVEsU0FBUztJQUM1QyxZQUFZLE9BQWdCO1FBQzFCLEtBQUssQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEIsQ0FBQztDQUNGO0FBSkQsMENBSUM7QUFFRCxNQUFhLG9CQUFxQixTQUFRLFNBQVM7SUFDakQsWUFBWSxPQUFnQjtRQUMxQixLQUFLLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3RCLENBQUM7Q0FDRjtBQUpELG9EQUlDO0FBRUQsTUFBYSxjQUFlLFNBQVEsU0FBUztJQUMzQyxZQUFZLE9BQWdCO1FBQzFCLEtBQUssQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEIsQ0FBQztDQUNGO0FBSkQsd0NBSUM7QUFFRCxNQUFhLGFBQWMsU0FBUSxTQUFTO0lBQzFDLFlBQVksT0FBZ0I7UUFDMUIsS0FBSyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0QixDQUFDO0NBQ0Y7QUFKRCxzQ0FJQyIsInNvdXJjZXNDb250ZW50IjpbIlxuZXhwb3J0IGNsYXNzIEh0dHBFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHN0YXR1c0NvZGU6IG51bWJlciwgbWVzc2FnZT86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCYWRSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBIdHRwRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDAwLCBtZXNzYWdlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5hdXRoZW50aWNhdGVkRXJyb3IgZXh0ZW5kcyBIdHRwRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDAxLCBtZXNzYWdlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRm9yYmlkZGVuRXJyb3IgZXh0ZW5kcyBIdHRwRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoNDAzLCBtZXNzYWdlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm90Rm91bmRFcnJvciBleHRlbmRzIEh0dHBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcig0MDQsIG1lc3NhZ2UpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,90 @@
1
+ import logger from 'lambda-log';
2
+ import { CognitoAuthorizer, JwtAuthorizer } from './auth';
3
+ /**
4
+ * An object containing the properties for an HTTP response.
5
+ */
6
+ export interface HttpResponseContext {
7
+ statusCode?: number;
8
+ headers: {
9
+ [name: string]: string;
10
+ };
11
+ json: boolean;
12
+ }
13
+ /**
14
+ * An object containing the properties for an HTTP request handler.
15
+ */
16
+ export interface HttpHandlerContext {
17
+ event: AWSLambda.APIGatewayProxyWithCognitoAuthorizerEvent;
18
+ lambdaContext: AWSLambda.Context;
19
+ logger: logger.LambdaLog;
20
+ response: HttpResponseContext;
21
+ auth: JwtAuthorizer;
22
+ }
23
+ /**
24
+ * A type definition for an HTTP handler.
25
+ */
26
+ export type HttpHandler<T, R> = (context: HttpHandlerContext, body: T) => Promise<R>;
27
+ /**
28
+ * An object containing the properties for an OpenAPI operation.
29
+ */
30
+ export interface Operation {
31
+ responses: {
32
+ [statusCode: number]: {
33
+ content: {
34
+ 'application/json': any;
35
+ };
36
+ } | any;
37
+ };
38
+ }
39
+ /**
40
+ * A type definition for an API Gateway v1 request handler.
41
+ */
42
+ export type APIGatewayv1Handler = AWSLambda.Handler<AWSLambda.APIGatewayProxyWithCognitoAuthorizerEvent, AWSLambda.APIGatewayProxyResult | undefined>;
43
+ /**
44
+ * An object containing the properties for an OpenAPI operation with a request body.
45
+ */
46
+ export interface OperationWithRequestBody extends Operation {
47
+ requestBody: {
48
+ content: {
49
+ 'application/json': any;
50
+ };
51
+ };
52
+ }
53
+ /**
54
+ * A factory function that creates an HTTP request handler for an OpenAPI operation with a request body.
55
+ */
56
+ export declare const createOpenApiHandlerWithRequestBody: <OP extends OperationWithRequestBody, SC extends number = 200>(handler: HttpHandler<OP["requestBody"]["content"]["application/json"], OP["responses"][SC]["content"]["application/json"]>) => APIGatewayv1Handler;
57
+ /**
58
+ * A factory function that creates an HTTP request handler for an OpenAPI operation with a request body and no response.
59
+ */
60
+ export declare const createOpenApiHandlerWithRequestBodyNoResponse: <OP extends OperationWithRequestBody>(handler: HttpHandler<OP["requestBody"]["content"]["application/json"], void>) => APIGatewayv1Handler;
61
+ /**
62
+ * A factory function that creates an HTTP request handler for an OpenAPI operation.
63
+ */
64
+ export declare const createOpenApiHandler: <OP extends Operation, SC extends number = 200>(handler: HttpHandler<any, OP["responses"][SC]["content"]["application/json"]>) => APIGatewayv1Handler;
65
+ /**
66
+ * A factory function that creates an HTTP request handler.
67
+ */
68
+ export declare const createHttpHandler: <T, R>(handler: HttpHandler<T, R>) => APIGatewayv1Handler;
69
+ /**
70
+ * The context for the AppSync resolver function.
71
+ * Contains information about the event, lambda context, logger, and Cognito authorizer.
72
+ */
73
+ export interface AppSyncHandlerContext<T> {
74
+ event: AWSLambda.AppSyncResolverEvent<T>;
75
+ lambdaContext: AWSLambda.Context;
76
+ logger: logger.LambdaLog;
77
+ cognitoAuth: CognitoAuthorizer;
78
+ }
79
+ /**
80
+ * A function that handles an AppSync resolver event.
81
+ * Receives the context object and returns the response.
82
+ */
83
+ export type AppSyncHandler<T, R> = (context: AppSyncHandlerContext<T>) => Promise<R>;
84
+ /**
85
+ * Creates an AppSync resolver handler from the given AppSyncHandler.
86
+ * Returns a function that can be used as an AppSync resolver.
87
+ *
88
+ * @param handler The AppSyncHandler to use as the resolver.
89
+ */
90
+ export declare const createAppSyncHandler: <T, R>(handler: AppSyncHandler<T, R>) => import("aws-lambda").AppSyncResolverHandler<T, R, Record<string, any> | null>;