cognito-srp
Version:
Secure Remote Password protocol implementation compatible with Amazon Cognito.
65 lines (64 loc) • 2.55 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const express = require("express");
const cors = require("cors");
const bodyParser = require("body-parser");
const handler_builder_1 = require("handler-builder");
const getPort = require("get-port");
const matchAwsJson = (request) => {
const type = request.header('content-type');
return type === 'application/json' || /application\/x-amz-json-.*/.test(type);
};
class AwsEndpoint {
constructor(service, handlers, app) {
this.service = service;
if (!app) {
app = express();
}
app.use(cors());
app.use(bodyParser.json({ type: matchAwsJson }));
app.options('/', cors());
const builder = this.getHandlerBuilder();
const handler = builder.build(handlers);
app.post('/', (request, response, next) => {
handler(request, response).then(null, next);
});
this.app = app;
}
start(port) {
return __awaiter(this, void 0, void 0, function* () {
if (!port) {
port = yield getPort();
}
this.server = yield this.app.listen(port);
return port;
});
}
stop() {
this.server.close();
}
getHandlerBuilder() {
return new handler_builder_1.default((request) => {
const [service, action] = request.header('x-amz-target').split('.');
if (service !== this.service) {
throw new Error(`expected target service to be ${this.service}, not ${service}.`);
}
return action;
}, (request, response) => {
response.status(400).send({
__type: 'InvalidAction',
message: 'Cannot process requested action: ' + request.header('x-amz-target')
});
return Promise.resolve();
});
}
}
exports.AwsEndpoint = AwsEndpoint;